ruby-on-rails 如何在短语中使用用户可配置的名词进行本地化

4nkexdtk  于 2023-08-08  发布在  Ruby
关注(0)|答案(1)|浏览(119)

我在一个Ruby on Rails项目中使用I18 n(但这个问题更普遍)。该应用程序允许公司/组织/医院/市政当局/...提供项目/实习/作业/实验/...作为学习计划的一部分。为此,该应用程序允许用户为某些术语配置网站的不同部分,以减少要约人的困惑。
例如,在网站的某些部分,一个项目会被称为“实习”,在其他地方,它会被称为“实验”,在其他地方,它只会被称为“项目”。为了在本地化中处理此问题,为“current_project_word”及其复数形式提供了一些可用变量。单词也只能从一个固定的集合中选择,以确保我们知道每个单词在所有支持的语言中的不同翻译。
在语言环境中,这类似于:

en:
  ...:
    offer_project: Click the "offer %{projects_word}" button to offer a %{project_word}

字符串
这将很好地向一些用户显示提供实习机会的选项,而向其他用户显示提供实验、项目、作业等的选项,具体取决于应用程序中的上下文。
问题是,句子中有一些词会受到所用的特定词的影响。例如,它是“一个项目”,但“一个实验”。在其他语言中,这个问题可能会更严重,例如在德语中,每个词都有三种性别之一,这与使用哪一个冠词有关(复杂的格系统使问题更加复杂)。同样,在荷兰语和德语中,指示代词和句子中其他地方的术语引用也会根据单词的不同而以类似的方式变化(因此,并不总是前面的单词或后面的单词受到影响)。
当然,我会尝试重新组织句子,使句子的其余部分固定不变,而不管实际使用的单词是什么,但这不可能适用于每种语言的每一个句子,有时会产生相当笨拙的句子(德语和荷兰语比英语更是如此)。
我的问题是,有没有更好的方法可以让句子中的其他单词根据实际使用的单词而变化。或者,是否有一种通用的本地化方法来解决这个问题,或者使这个问题变得不那么严重?或者,有没有一种方法可以在I18 n字符串中运行代码,这样我就可以做像offer_project: Offer %{determine_article(project_word)} %{project_word}这样的事情,并让一些方法实现这些不同单词的规则/查找这些单词的不同形式,而不需要定义一百万个变量?

q3qa4bjr

q3qa4bjr1#

简而言之,不,没有内置的功能,比如文章(只有复数化,我不确定在英语之外有多好)。另外,i18n中的插值是简单的字符串替换,它不会在占位符中运行任何代码。
鉴于这些单词都是事先已知的,我只需要两个不同的区域设置条目,一个用于裸单词,一个用于文章。然后我的琴弦就会变成:

offer_project: Click the "offer %{projects_word}" button to offer %{article} %{project_word}
  articles:
    default: a
    experiment: an

字符串
……然后我会把查找信息嵌套起来:

I18n.t "offer_project", projects_word: pw.pluralize, project_word: pw, article: I18n.t(pw, scope: :articles, default: :default)

相关问题