使用rails-i18n进行反向转换

时间:2012-09-27 09:41:41

标签: ruby-on-rails ruby internationalization translation rails-i18n

我很高兴使用内置的rails i18n支持将字符串翻译成不同的语言,效果很好。最近虽然我需要的东西超出了这个宝石的默认行为。

由于缺乏更好的词,我会称之为“inverse translation”。基本上我的想法是我在某种语言中有一些字符串,并且我希望能够使用另一种语言环境调用方法,并且如果在语言环境中存在映射,则返回转换为该语言环境的字符串字符串。

例如,假设我有config/locales/en.yml

en:
  hello: Hello World!

config/locales/ja.yml

ja:
  hello: Konnichi wa!

然后当我在英语语言环境中调用此方法l2l_translate(“locale to locale translate”)时,将字符串和语言环境作为参数,我将返回日语翻译:

I18n.locale = :en
l2l_translate("Hello World!", :ja) #=> "Konnichi wa!"

此外,这更棘手,我希望能够反向匹配插值字符串。所以说我有:

配置/区域设置/ en.yml

en:
  minutes: "%d minutes"

配置/区域设置/ ja.yml

ja:
  minutes: "%d分"

然后我应该能够像英语一样翻译成日语:

l2l_translate("5 minutes", :ja) #=> "5分"

所以基本上字符串应该与英语翻译字符串的正则表达式匹配,并且“5”被拉出并作为参数“%d”发送到日语翻译。

显然这里存在潜在的问题,如果:1)没有匹配,或者2)有多个匹配。例如,可以通过引发异常来处理这些异常,或者通过在前一种情况下返回nil并在后一种情况下返回一组翻译来处理。无论如何,这些都是小问题。

我的基本问题是:这样的事情是否存在?如果没有,有没有人对如何开发它有任何建议(比如作为宝石)?

我特别想到的应用程序是日语服务的API包装器。我希望能够指定日语中的模式,这些模式可以匹配并翻译成其他语言。默认的i18n支持不会这样做,我不知道会有任何其他宝石。

非常感谢任何建议或意见!有关i18n-rails逆向转换主题的信息,请参阅2010年的this discussion

1 个答案:

答案 0 :(得分:2)

我们使用gettext,这是一个标准的unix i18n解决方案。对于Rails,您可以使用gettext_i18n_rails。需要注意的是,Gettext_i18n_rails支持的FastGettext似乎没有完整的gettext支持,而且复数化等一些高级功能没有按预期工作。