2014-10-12 68 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。

相關問題