I18n.locale重置为:en在控制器和视图之间

GMA*_*GMA 3 locale ruby-on-rails internationalization spree rails-i18n

我正在尝试使用spree自己的spree_i18ngem 来国际化Rails/Spree应用程序,但我无法让它工作.

我做了一个最小的应用程序,在这里重现了问题.

简而言之,我在ApplicationController中有以下代码:

before_action :set_locale

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
  puts I18n.locale
end
Run Code Online (Sandbox Code Playgroud)

我的视图中的代码应该被翻译(<%= t("whatever") %>).但无论我做什么,文本总是以英文输出.

使用一些额外的调试代码,我可以看到一旦set_locale调用,但执行仍然在控制器内,语言环境是正确的(例如,如果我访问url /?locale=es,那么puts上面的控制器代码输出中的语句es).

但是当执行到达视图时,语言环境已经以某种方式被重置为en.(例如<% raise I18n.locale.to_s %>,在视图中添加会将"en"作为错误消息引发.)

我已经在Spree的Github上打开了一个问题,因为据我所知,我已完全按照他们的指示操作,但仍然没有工作,但我可能仍然遗漏了一些东西.为什么区域设置没有正确设置?

(注意:我应该补充说,Spree.t它不起作用,不仅仅是t.)

编辑:如果你看看我的Github问题的评论,你会看到我的工作.但是,我99%肯定我的解决方案是一个黑客,并且我应该使用更好的方法.赏金可以告诉我什么是我错了.

Ale*_*bio 5

Spree I18n提供了一种设置默认语言的方法:on config/application.rbwith config.i18n.default_locale = :es

并且可以设置要更改的语言.也许就是config/initializers/spree_i18n.rb

SpreeI18n::Config.available_locales = [:en, :es, :de] 
SpreeI18n::Config.supported_locales = [:en, :es, :de] 
Run Code Online (Sandbox Code Playgroud)

之后,您可以set_locale在ApplicationController上删除它,因为它没有任何效果.

有了这个,它就像一个魅力.

编辑:

我更改了错误消息,因为我想确保它有效:

<%= product_description(@product) rescue Spree.t(:product_has_no_description) +
' ' + Spree.t(:action) %>
Run Code Online (Sandbox Code Playgroud)

我添加了一个没有描述的新产品.在localhost上运行服务器

在英语中我看到:"此产品没有描述动作"

在西班牙语中我看到:"Este producto no tiene描述Acción"

在deutsch,我看到:"Produkt hat keine Beschreibung Aktion"

完全是预期的.

您可以在github上看到包含更改的源代码