Rails生产:区域切换

时间:2014-12-23 19:46:06

标签: ruby-on-rails ruby-on-rails-4

在我的应用中,我使用会话切换了区域设置。逻辑保留在控制器中:

class SetLanguageController < ApplicationController

  def russian
    I18n.locale = :ru
    set_session_and_redirect
  end

  def english
    I18n.locale = :en
    set_session_and_redirect
  end

  private

  def set_session_and_redirect
    session[:locale] = I18n.locale
    redirect_to :back
    rescue ActionController::RedirectBackError
      redirect_to :root
  end

end

切换适用于链接:

link_to_unless I18n.locale == :ru, "Русский", rus_locale_path
link_to_unless I18n.locale == :en, "English", eng_locale_path

路由中区域设置的代码(问题不需要,但如果你有意思的话)

get 'rus_locale' => 'set_language#russian'
get 'eng_locale' => 'set_language#english'

它在开发中非常有效,但在生产中

application.rb中

config.i18n.load_path += Dir[Rails.root.join('config','locales', '*.yml').to_s]
config.i18n.default_locale = :ru

如何让它在制作上工作?感谢

2 个答案:

答案 0 :(得分:0)

我解决了在应用程序控制器中设置before_filter的问题,如

  before_filter :set_locale

  def set_locale
    I18n.locale = session[:locale] ? session[:locale] : I18n.default_locale
  end

但是这个解决方案是假的,因为它实际上并没有解决问题的本质 - 以前的代码在开发中工作,但在生产中。如果你知道如何更加巧妙地修复它,那么你会很开心

答案 1 :(得分:0)

强大的 I18n 实施:

添加一个 locales.rb 初始值设定项来定义您支持的 I18n.available_locales

# config/initializers/locales.rb

# Permitted locales available for the application
I18n.available_locales = [:en, :fr]

在每种语言的语言环境文件中设置一个 language_name 值(例如 fr.yml):

fr:
  language_name: "Français"

当您添加更多语言时,此 ERB 可让您在它们之间切换:

  // app/views/layouts/_languages.html.erb
  <span class="languages">
   <% I18n.available_locales.each do |locale| %>
      <% if I18n.locale == locale %>
        <%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ), {style: "display:none" } %>
      <% else %>
        <%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
      <% end %>
    <% end %>
  </span>

对于控制器,我们通过检测用户浏览器的 Accept-Language HTTP 标头(使用 http_accept_language gem)自动为用户找到正确的语言。

设置 session cookie 以跨请求保留区域设置。

或者(可选)使用 default_url_options?locale= 参数插入到您应用的网址中。我两个都做。

控制器:

class ApplicationController < ActionController::Base
  before_action :set_locale

  private

  def set_locale
    I18n.locale = begin
      extract_locale ||
        session[:locale] ||
          http_accept_language.compatible_language_from(I18n.available_locales) ||
            I18n.default_locale
    end
    session[:locale] = I18n.locale
  end

  def extract_locale
    parsed_locale = params[:locale].dup
    I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
  end

  def default_url_options
    { locale: I18n.locale }
  end
end