【问题标题】:Operations inside Rails I18n locales' stringsRails I18n 语言环境字符串中的操作
【发布时间】:2010-12-23 10:16:14
【问题描述】:

我正在尝试将操作放在语言环境中以适应不同的语言。例如,在英语中,十亿是 1,000,000,000,但在西班牙语中,十亿是 1,000,000,000,000,所以我希望能够拥有以下内容:

en:
  billion: "You have %{money} billions"
es:
  billion: "Tienes %{money/1000.0} billones"

为了能写:

I18n.t :billion, :money => whatever

并且适合任何语言。

但是,我似乎无法将操作放在语言环境的字符串中。

关于我应该如何做的任何提示?也许我的方法只是“哲学上”的说法是错误的?

谢谢大家!

【问题讨论】:

    标签: ruby-on-rails ruby internationalization


    【解决方案1】:

    根据调查,这是解决方案。很抱歉多次修改。

    I18n.interpolate("%{money} billion", :money => Proc.new{|x| x[:vals] / 1000}, :vals => 12121)
    

    因此,您可以将翻译文件更改为使用 :en 中的 :vals 和 :es 中的 :money。

    en:
      billion: "You have %{money} billions"
    es:
      billion: "Tienes %{money_proc} billones"
    
    I18n.t :billion, {:money => 12121, :money_proc => Proc.new{|x| x[:money]/1000.0}}
    

    【讨论】:

    • 我注意到 I18n gem 本身缺少对现有代码的一些测试。由于您的问题,我已经向 Sven Fuchs 发送了一个拉取请求并添加了测试。
    • 谢谢@Aditya。这似乎是一个逻辑解决方案并且它有效(但是您必须将 x[:money] 转换为整数,否则它会重复字符串)。另一方面,如果允许 Ruby 插值,对于这样一个简单的解决方案来说,这似乎有点难看。我知道这个 Ruby 插值可能会使 YAML 文件有点混乱(正如 tokland 指出的那样),但只有当你像使用 rails 中的其他任何东西一样滥用它们时才会发生这种情况..
    • 我同意它不美观,但这是您使用 i18n gem 进行插值的限制。也许您可能会分叉并扩展 gem 本身以实现更多功能。它基本上是用翻译期间传递的哈希值替换字符串中的标签的正则表达式。抱歉,克里斯托瓦尔。
    【解决方案2】:

    你能把翻译中的“billiones”改成“mil millones”吗?

    【讨论】:

    • 哦,我当然可以这样做,但其他单词或其他语言可能会出现同样的问题。从长远来看,我认为快速修复还不够好;)
    • 是的,但问题的核心是翻译数据中的单个单词。该数据可能会被其他具有相同含义的翻译所取代;在这里,它的意思是“元素的数量乘以 10 的 9 次方”。如果有像billion: "You have %{money} %{numeral}" 这样的额外结构,则需要对代码进行更改,但如果是静态单词,通常会用另一种语言的正确单词替换它。我看到它的方式是有人称它为“十亿”,这可能是模棱两可的,所以也许关键名称是问题?
    【解决方案3】:

    I18n(有良好的判断力)不允许 Ruby 插值,YAML 文件会一团糟。 Rails 助手number_to_human 似乎支持你想要的。

    [edit] 单位被固定在一个冻结的哈希中(ActionView::Helpers::DECIMAL_UNITS),所以 number_to_human 除非你之前做一些调整,否则不会有用。

    【讨论】:

    • 感谢您的回复。据我所知,I18n 确实允许插值:edgeguides.rubyonrails.org/i18n.html
    • @cristobal,对不起!我显然是指 Ruby 插值。
    • 事实证明,单位在这个冻结的哈希中是固定的:ActionView::Helpers::DECIMAL_UNITS。所以如果没有一些调整 number_to_human 将没有用:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多