2014-10-12 81 views
3

我试图使用狂欢自己的spree_i18n gem来国际化Rails/Spree应用程序,但我无法让它正常工作。I18n.locale重置为:在控制器和视图之间

I made a minimal app which recreates the problem here.

为了削减长话短说,我在我的ApplicationController中下面的代码:

before_action :set_locale 

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
    puts I18n.locale 
end 

和代码在我看来,这应该被翻译(<%= t("whatever") %>)。但无论我做什么,文本总是以英文输出。

随着调试的一些额外的代码,我可以看到,一旦set_locale被调用,但同时执行还是在控制器内,该区域是正确的(例如,如果我访问的URL /?locale=es,然后在上面的控制器代码的puts声明输出es)。

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

我已经opened an issue on Spree's Github因为据我所知我已经完全按照他们的指示操作,但它仍然不能正常工作,但我仍可能遗漏了什么。为什么区域设置不正确?

(注:我要补充的是,Spree.t不工作,要么,不只是t。)

编辑:如果你看一下我的Github上的问题的评论,你会看到,我得到了它的工作。但是,我99%肯定我的解决方案是黑客行为,我应该使用更好的方法。赏金可以告诉我什么是我错误的东西。

回答

5

狂欢的I18n给人一种方法来设置默认语言:上config/application.rbconfig.i18n.default_locale = :es

而改变设置语言的可能性。也许在config/initializers/spree_i18n.rb

SpreeI18n::Config.available_locales = [:en, :es, :de] 
SpreeI18n::Config.supported_locales = [:en, :es, :de] 

之后,你可以在ApplicationController中删除set_locale,因为它没有任何效果。

有了这个地方,它就像一个魅力。

编辑:

我改变错误的消息,因为我想确保它的工作原理:

<%= product_description(@product) rescue Spree.t(:product_has_no_description) + 
' ' + Spree.t(:action) %> 

我添加一个新的产品,而不说明。在本地主机上运行的服务器

英语我看到:“该产品没有说明行动”

在西班牙我看:“埃斯特PRODUCTO没有tienedescripción行动组织”

在德语我看:“PRODUKT帽子keine Beschreibung Aktion“

正是预期的。

你可以看到变化的源在github

2

这是我不清楚如何处理Spree本地化,并在您routes.rb你仅仅将发动机。

基本上你应该开始内routes.rb本地化你的应用程序中加入:

scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do 
    # routing and engines go here 
end 

现在,你需要保持你的params[:locale]跨请求,所以添加到应用程序控制器:

def default_url_options(options={}) 
    logger.debug "default_url_options is passed options: #{options.inspect}\n" 
    { locale: I18n.locale } 
end 

末,检测并根据您的输入数据设置当前请求的区域设置:

before_filter :set_locale 

def set_locale 
    if defined?(params) && params[:locale] 
    I18n.locale = params[:locale] 
    elsif current_user && current_user.language_id.present? 
    I18n.locale = current_user.language.code 
    elsif defined?(request) 
    I18n.locale = extract_locale_from_accept_language_header 
    end 
    I18n.locale ||= I18n.default_locale 
    I18n.locale = :en unless valid_languages.include?(I18n.locale.to_sym) 
end 
0

您可能using/setting以下的app/controllers/application_controller.rb,不工作:

before_action :set_locale 
def set_locale 
    I18n.locale = 
    Spree::Frontend::Config[:locale] = 
    Spree::Backend::Config[:locale] = :LOCALE 
end 

core/lib/spree/core/controller_helpers/common.rb还有另外一个before_filter称为set_user_language。该过滤器被调用并将区域设置重新设置为值session[:locale],或者如果没有定义它,它将使用默认区域设置。

要解决该问题,请在您的before_filter中设置session[:locale] =:LOCALE。

相关问题