在我的应用中,我使用会话切换了区域设置。逻辑保留在控制器中:
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
如何让它在制作上工作?感谢
答案 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