为什么number_to_currency中的语言环境设置不起作用?

时间:2019-02-26 22:11:21

标签: ruby-on-rails internationalization ruby-on-rails-3.2

对于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中从未有一个语言环境文件。我真正想要的是使用英镑作为货币,因此我在en-GB.yml中添加了一个config/locales文件,然后重新启动了服务器和控制台。

在我的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):

3 个答案:

答案 0 :(得分:2)

简介:

删除自定义语言yml,然后添加i18n-rails gem的正确版本。这样就解决了这个特殊问题。

原始答案:

好吧,我的猜测是您的en-GB.yml为空。因此,它实际上找到了文件并在I18n.available_locales中添加了语言环境,但这并不意味着所有翻译都可用。

当您查看此类yml file的格式时,您会发现它们都以

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

这是实际加载到内存中的内容,因此提供了所有可用的翻译。可用的语言环境仅由config/locales中找到的文件定义。

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

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

由于您只是说en-GB可用,但是在内存中没有沿语言环境的实际键,所以您会遇到缺少翻译的问题。

我建议您使用链接的yml文件的内容并将其粘贴到您的en-GB.yml中,或者删除您的en-GB.yml并找到一个有效的3.2版本source并使用它。 i18n-rails提供了许多默认翻译,这些翻译在整个默认rails上都可以使用。

添加: 在添加en-GB.yml文件之前,它实际上已按预期工作。 如果找不到语言环境,则默认情况下i18n-rails中的美元为美元,因为currency变量将为{}且为空。

答案 1 :(得分:1)

以某种方式,我找到了适合我的解决方案。

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

以下是fr.yml文件的示例

对于实例,将此文件复制并粘贴到app / config / locales /

然后重新启动控制台,

然后尝试,number_to_currency(1000.51,语言环境::fr)

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

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

直到,除非您没有包含要求格式的语言环境文件,否则您将无法获得理想的结果。

答案 2 :(得分:1)

我的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 => {})

如果发生相同的错误,请检出文件的名称,扩展名和路径

并且您必须重新启动服务器