rails判断浏览器head设置多语言

给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>
说明:点击生成的链接可以手动切换语言,测试的时候方便一些。