Rails浏览器语言设置es-419的奇怪行为



我们的应用程序尝试支持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)的问题,或者可能是两个问题:

  1. 解析器没有正确处理es-419的情况,因为它不符合典型的xx-YY格式。

  2. 不知怎的,当它是列表中最后一种首选语言时,它成功地溜走了。

我还没有试图找出这件事的来源,因为我希望有人以前碰到过它,并能建议如何最好地处理它。或者这可能是不被支持的原因?

进一步的背景我使用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

最新更新