为啥我在 number_to_currency 中的区域设置不起作用?

Posted

技术标签:

【中文标题】为啥我在 number_to_currency 中的区域设置不起作用?【英文标题】:Why don't my locale settings in number_to_currency work?为什么我在 number_to_currency 中的区域设置不起作用? 【发布时间】:2019-07-20 13:20:42 【问题描述】:

根据Rails 3.2 API Docs,要为number_to_currency 使用不同的语言环境,我需要执行以下操作:

<%= number_to_currency(1234567890.506, :locale => :fr) %>

我期待以下输出:

# => 1 234 567 890,51 €

即使我在我的应用程序中确实使用了那个确切的东西并且它不断输出以下内容:

$1,234,567,890.51

当我在我的应用程序中检查 available_locales 时,我得到以下信息:

> I18n.available_locales
=> [:en, :de, :es, :fr, :ja, :pl, :"pt-BR", :ru, :sv, :"zh-CN"]

所以它应该工作,但它没有。

我错过了什么?

更新 1

根据@s3tjan 的评论,我对相关的 Rails 问题进行了一些挖掘,这使我找到了我的application.rb,在那里我发现了I18n.enforce_available_locales = false。我将其更改为 true 并重新启动服务器。

当我再次尝试上述操作时,我现在收到此错误:

ActionView::Template::Error (:fr is not a valid locale):

不知道如何解决这个问题。

更新 2

所以我才意识到我的config/locales 中从未有过语言环境文件。我真正想要的是使用英镑作为货币,所以我在config/locales 中添加了一个en-GB.yml 文件,然后我重新启动了我的服务器和控制台。

在我的application.rb 中,我有以下内容:

I18n.enforce_available_locales = true

然后我检查了我的控制台并得到了这个:

[1] pry(main)> I18n.available_locales
=> [:en, :de, :es, :fr, :ja, :pl, :"pt-BR", :ru, :sv, :"zh-CN", :"en-GB"]
[2] pry(main)> 

所以:"en-GB" 已成功添加到我的应用的加载路径中。

但是当我在我看来这样做时:

<%= number_to_currency(1234567890.506, :locale => :"en-GB") %>

这是我得到的错误:

:"en-GB" is not a valid locale excluded from capture due to environment or should_capture callback

ActionView::Template::Error (:"en-GB" is not a valid locale):

所以还是不行。

更新 3

我的en-GB.yml 文件直接取自https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en-GB.yml

所以看起来一模一样。但是我仍然遇到同样的错误:

ActionView::Template::Error (:"en-GB" is not a valid locale):

【问题讨论】:

它在 Rails 5.2 上运行良好可能是您的 Rails 版本的问题。检查问题 #117 github.com/r18n/r18n/issues/117 @s3tjan 我检查了它并用我发现的内容更新了我的问题。 en-GB.yml的内容是什么? 【参考方案1】:

简介:

删除自定义语言 ymls 并添加正确版本的 i18n-rails gem。这解决了这个特殊问题。

原答案:

好吧,我猜你的 en-GB.yml 是空的。所以它实际上找到了文件并在I18n.available_locales 中添加了语言环境,但这并不包括所有翻译都可用。

当你查看这样一个 yml file 的格式时,你会发现它们都是以

开头的
---
language-code
  some_keys: ...

这是实际加载到内存中的内容,因此提供了所有可用的翻译。可用区域设置仅由在 config/locales 中找到的文件定义。

当您检查 number_to_currency 的 source 时,它会从选项中获取语言环境并将其传递给 I18n 查找的键。

I18n.translate(:'number.format', :locale => options[:locale], :default => )

由于您只是说en-GB 可用,但内存中没有沿区域设置的实际键,因此您会遇到翻译问题。

我建议您要么使用链接的 yml 文件的内容并将其粘贴到您的 en-GB.yml 中,要么删除您的 en-GB.yml 并找到 3.2 工作的i18n-rails 版本并使用它。 i18n-rails 提供了大量的默认翻译,这些翻译在所有默认 rails 中都被使用。

加法: 在您添加 en-GB.yml 文件之前,它实际上像预期的那样工作。 当没有找到语言环境时,它默认为here 中的美元,因为currency 变量将是空的

【讨论】:

我更新了我的问题以反映我的en-GB.yml 的样子。我还没有机会阅读您的完整回复,我必须在路上奔跑,但我想同时更新一下。 由于您使用的是 3.2 更好地使用:github.com/svenfuchs/rails-i18n/blob/rails-3-x/rails/locale/… 而不是主版本。 好的......所以我终于有机会阅读整个答案。是的,这几乎就是我所做的。我刚刚用 3.2 版本替换了en-GB.yml,但我仍然收到错误:ActionView::Template::Error (:"en-GB" is not a valid locale): Thoughts? 您可以尝试删除您的 yml 文件并使用gem 'rails-i18n', '~&gt; 3.0'。这行得通吗? 很高兴听到您成功了 :) 做了一个小概要,以防万一有人遇到同样的问题。【参考方案2】:

不知何故,我找到了适合我的解决方案。

首先,您需要有一个包含您的需求的语言环境文件。

这里是fr.yml文件的例子

例如,将此文件复制并粘贴到 app/config/locales/ 中

然后重启你的控制台,

然后试试 number_to_currency(1000.51, locale: :fr)

当然,您将获得 '1 000,51 €'

Here 是所有受支持国家/地区语言环境文件的完整列表。

除非您没有包含所需格式的语言环境文件,否则您将无法获得所需的结果。

【讨论】:

我试过了,但 number_to_currency 由于某种原因在我的控制台中不起作用。想法?【参考方案3】:

我的 rails 版本是 3.2.22.5,ruby 是 2.4.2(我没有安装低于 2.x.x)

我使用区域设置 yml https://github.com/svenfuchs/rails-i18n/blob/rails-3-x/rails/locale/en-GB.yml

这很好用

 <%= number_to_currency(1234567890.506, :locale => :"en-GB") %>

 <%= number_to_currency(1234567890.506, :locale => "en-GB") %>

结果

£1,234,567,890.51

我也添加了fr.yml

fr:
  ...
  number:
    currency:
      format:
        ...
        unit: €

然后这也是工作

<%= number_to_currency(1234567890.506, :locale => :fr) %>

结果

1,234,567,890.51 欧元

我没有更改或添加配置。我只添加控制器、视图和语言环境文件。并进行测试。

你可以直接翻译,所以测试一下

I18n.translate(:'number.currency.format', :locale => "en-GB", :default => )

如果出现同样的错误,请检查文件的名称、扩展名、路径

你必须重启服务器

【讨论】:

不...这不起作用。我仍然收到错误"en-GB" is not a valid locale excluded from capture due to environment or should_capture callback ActionView::Template::Error ("en-GB" is not a valid locale):

以上是关于为啥我在 number_to_currency 中的区域设置不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 jdoconfig.xml 中出现错误?

为啥我在 Selenium 中收到 AssertionError?

为啥我在 listView 中得到最后一个标题? [关闭]

为啥我在通知中收到弃用警告..?

为啥我在 Python 中没有得到 333

为啥我在验收测试中出现错误?