3

我们的应用程序尝试支持 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(Lantin America Spanish) 区域设置在除最后一个位置之外的任何位置,那么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
4

1 回答 1

3

这是 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
于 2013-07-20T23:01:57.920 回答