我们的应用程序尝试支持ES变体。
为此,我们在ApplicationController中捕获来自传入请求的user_preferred_language。
class ApplicationController < ActionController::Base
before_filter :set_i18n_locale_for_unauthenticated
...
def set_i18n_locale_for_unauthenticated
users_preferred_languages = request.user_preferred_languages
... # Do something with the array of loacle codes
end
end
通常情况下,这可以正常工作,并且区域设置代码数组与客户端浏览器中设置的首选项相匹配。例如,检查user_preferred_languages
阵列可能看起来像
[
[0] "pt-BR",
[1] "pt",
[2] "en-GB",
[3] "en",
[4] "en-US",
[5] "es",
[6] "es-419"
]
但是,如果es-419
(拉丁美洲西班牙语)区域设置在除最后一个位置之外的任何位置,则user_preferred_languages
将返回任何空数组??
我猜这是Rails(或Rack)的问题,或者可能是两个问题:
解析器没有正确处理
es-419
的情况,因为它不符合典型的xx-YY
格式。不知怎的,当它是列表中最后一种首选语言时,它成功地溜走了。
我还没有试图找出这件事的来源,因为我希望有人以前碰到过它,并能建议如何最好地处理它。或者这可能是不被支持的原因?
进一步的背景我使用Chromium作为浏览器。从请求头来看,它似乎在传递语言设置时没有任何问题:
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:pt-BR,pt;q=0.8,en-GB;q=0.6,en;q=0.4,en-US;q=0.2,es-419;q=0.2,es;q=0.2
Cache-Control:no-cache
Connection:keep-alive
这是http_accept_language gem中的一个错误。它在当前的预发布中固定:
gem "http_accept_language", "~> 2.0.0.pre"
您的代码必须调整:
class ApplicationController < ActionController::Base
...
def set_i18n_locale_for_unauthenticated
users_preferred_languages = http_accept_language.user_preferred_languages
end
...
end