给rails系统加i18n,根据浏览器的头去识别用户语言。记录一下相关实现:
1. 添加i18n配置
# config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
config.i18n.available_locales = [:en, :cn]
config.i18n.default_locale = :cn
2. 获取语言设置
# app/controller/application_controller.rb
before_action :set_locale
# set local {{{
def set_locale
I18n.locale = get_locale
end
# }}}
# locale {{{
def get_locale
locale = I18n.default_locale
if params[:locale]
locale = params[:locale].downcase
elsif cookies[:locale]
locale = cookies[:locale]
elsif locale = get_accept_language
locale
end
# set cookies
if cookies[:locale] != locale
cookies[:locale] = locale
end
locale
end
def get_accept_language
begin
first_lang = request.env['HTTP_ACCEPT_LANGUAGE'].split(';').first
default_lang = first_lang[0,2].downcase
if default_lang == 'zh'
first_lang[3,2].downcase
else
default_lang
end
rescue
nil
end
end
# }}}
说明:locale的值优先从url地址读取,次之从cookie,最后从浏览器头判断。英文浏览器的头为Accept-Language:en-US,en;,取en即前两位。中文浏览器头为Accept-Language:zh-CN,zh;,取cn即3-5位,转为小写。
3.编辑语言文件
# config/locales/en.yml
en:
hello: "Hello world"
# config/locales/cn.yml
cn:
hello: "你好"
4. 在模板文件中应用
# app/views/home/index.html.erb
<p><%= t('hello'); %></p>
<ul>
<% I18n.available_locales.each.each do |locale| %>
<li><%= link_to locale, params.merge(locale: locale) %></li>
<% end %>
</ul>
说明:点击生成的链接可以手动切换语言,测试的时候方便一些。