使用rails-i18n进行反向转换

Chr*_*erg 5 ruby translation ruby-on-rails internationalization rails-i18n

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

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

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

en:
  hello: Hello World!
Run Code Online (Sandbox Code Playgroud)

并在config/locales/ja.yml:

ja:
  hello: Konnichi wa!
Run Code Online (Sandbox Code Playgroud)

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

I18n.locale = :en
l2l_translate("Hello World!", :ja) #=> "Konnichi wa!"
Run Code Online (Sandbox Code Playgroud)

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

配置/语言环境/ en.yml

en:
  minutes: "%d minutes"
Run Code Online (Sandbox Code Playgroud)

配置/语言环境/ ja.yml

ja:
  minutes: "%d?"
Run Code Online (Sandbox Code Playgroud)

那么我应该能够将英语翻译成日语,如下所示:

l2l_translate("5 minutes", :ja) #=> "5?"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

任何建议或建议将不胜感激!作为参考,请参阅2010年关于i18n-rails反向转换主题的讨论.

Pau*_*hon 2

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