1

У меня есть простое приложение для рельсов (даже не с базой данных). И в основном я хочу, чтобы он поддерживал два языка. Мой подход к этому должен иметь два маленьких флагов в сноске, один из ГБ (для английского) и один из Германии (для немецкого). Когда пользователь нажимает на один, язык сайта изменяется на соответствующий язык флага страны.Локализуя мое приложение для рельсов

У меня есть [en.yml] и [de.yml] все настройки, и я использовал свои ключи во всех моих взглядах, и я даже испытания, что они работают, поменяв местами [конф. i18n.default_locale] между [en] и [de] в [config/application.rb]. Все хорошо работает в этом отношении.

Я застрял, однако, от того, как я могу достичь механизма изменения языка. Я создал контроллер под названием [Язык] и в ней я определил метод, называемый [Set], но кроме этого, это довольно много пустой, вот что я думаю, что должно произойти:

class LanguageController < ApplicationController 
    def set 
    I18n.locale = params[:lang] 
    redirect_to(:controller => 'home', :action => 'index') 
    end 
end 

Вышеизложенные Безразлично Кажется, он работает. Когда я вызываю [/язык/набор? Lang = "de"], локализованные строки меняются на ключи - это не текст, переведенный на немецкий язык!

Еще одна вещь, за которую я застрял (которой я не мог найти в документах для i18n), - это то, как я могу загружать разные изображения для каждого языка!

Любая помощь будет принята с благодарностью.

Спасибо.

ответ

2

Это:

I18n.locale = params[:lang] 

не сохраняется между запросами, поэтому, когда вы поменяете (= новый запрос) он возвращается обратно на английский.

Вы должны сохранить настройки языка в сеансе:

class LanguageController < ApplicationController 
    def set 
    session[:lang] = params[:lang].to_sym 
    redirect_to(:controller => 'home', :action => 'index') 
    end 
end 

и проверить сессию по каждому запросу. Вы можете сделать это в before_filter в вашем ApplicationController:

class ApplicationController 
    before_filter :set_language 

    def set_language 
    I18n.locale = session[:lang] if session[:lang] 
    end 
end 
+0

Спасибо Мише. Я тоже об этом думал, но в документах не делал этого, советуя не использовать сеансы для этой цели. В любом случае, я сделал то, что вы предлагали, но переведенный текст все еще не отображается, только клавиши, показывают не переведенное значение! – Ciwan

+1

@Ciwan - Я думаю, вы должны называть '.to_sym' на' params [: lang] ', чтобы сделать его символом вместо строки. Кроме того, вы вызываете '/ language/set? Lang =" de "или'/language/set? Lang = de'? Это должно быть последнее. – Mischa

+0

Я видел замечание о том, чтобы не использовать сеансы в руководстве. Думаю, это имеет смысл. Если вы хотите избежать сеансов, вы должны постоянно держать '? Lang = de' в URL-адресе. Существует (платный) [Railscast] (http://railscasts.com/episodes/138-i18n-revised), который объясняет, как это сделать. Несмотря на предупреждение, использование сеансов - самое легкое решение. – Mischa