如果HTTP标头支持多种语言,I18n如何设置语言环境

时间:2019-10-24 00:41:45

标签: ruby rails-i18n

如果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的语言环境?

谢谢。

2 个答案:

答案 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,则需要回退到某个东西。如果您出于标题目的阅读规范,则可能会有更好的方法来获取用户的首选语言。