如果http标头中的accept_language很简单明了,例如:
'en'
或'en-us'
,设置I18n的语言环境很容易,就像:
I18n.locale = request.env['HTTP_ACCEPT_LANGUAGE']
但是如果http标头很复杂,该怎么办?
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
如何立即设置I18n的语言环境?
谢谢。
答案 0 :(得分:1)
为什么要重新发明轮子? :D http_accept_language
gem超级简单(甚至可以用作Rack中间件)。
答案 1 :(得分:0)
在您提供的示例中,语言已经进行了排序,因此应该非常容易确定基于该语言使用的语言环境。我不希望它们从高到低排序。
header = 'fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5'
langs = header.scan(/([a-z]{2};q=\d.\d)/).flatten
langs.sort_by!{|l| l.split('=').last.to_f}.reverse! # insure sorted by weight may not need this.
available_locals = I18n.available_locales.select{|locale| langs.any?{|l| l.match(locale.to_s)}}
#[;en, :fr, :de] for example
use_language = langs.find{|l| available_locals.include?(l[0..1])}.try(:first, 2)
现在,如果use_locale
为nil,则需要回退到某个东西。如果您出于标题目的阅读规范,则可能会有更好的方法来获取用户的首选语言。