0

我正在尝试使用这个 gem 来确定用户的首选语言,并遇到了一些麻烦。

undefined local variable or method http_accept_language for #<HomeController:0x964f5ec>

我将 gem 包含在 Gemfile 中,运行 bundle install 并多次重新启动服务器。为什么我的应用无法识别 gem?

此外,在我的 ApplicationController 中,我编写了以下方法:

def set_i18n_locale
 http_accept_language.user_preferred_languages
 available = %w{en kr}
 params[:locale] = http_accept_language.preferred_language_from(available)
    if params[:locale]
        I18n.locale = params[:locale]
    end
end

我不明白的一件事是第二行, http_accept_language.user_preferred_languages

https://github.com/iain/http_accept_language,这应该返回一个排序数组。我以为我必须将数组存储到某个变量中并使用它,但作者只是抛出了这样的方法。这是如何运作的?我不能只做以下吗?

available = %w{en kr}
params[:locale] = http_accept_language.language_region_compatible_from(available)

我只是对作者的解释有点困惑。

谢谢您的帮助。

更新: gem,http_accept_language,似乎没有成功安装。它在 gem 列表中,但是当我尝试卸载它时,错误消息显示它没有安装。为什么会这样?

max@max-VirtualBox:~/appe$ gem list

*** LOCAL GEMS ***
...
http_accept_language (1.0.2)
...

max@max-VirtualBox:~/app$ sudo gem uninstall http_accept_language
INFO:  gem "http_accept_language" is not installed
4

5 回答 5

2

尝试使用request.user_preferred_languages而不是http_accept_language.user_preferred_languages.

于 2013-03-18T16:18:27.977 回答
2

文档中指出,从 2.0 版开始,gem 是一个 Rack 中间件,但问题是2012 年 6 月发布的唯一 2.0 版本只是一个 pre-release。因此,要获得 2.0 版本,您需要执行以下操作:

gem 'http_accept_language', '~> 2.0.0.pre'
于 2013-05-01T21:14:33.817 回答
1

我不必使用 gem 来实现我想要的功能。

  def set_i18n_locale
    unless params[:locale]
        params[:locale] = extract_locale_from_accept_language_header
    end
    available = ['en', 'kr']
    if available.include? params[:locale]
        I18n.locale = params[:locale]
    end
  end

  def extract_locale_from_accept_language_header
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
  end

  def default_url_options
    { :locale => I18n.locale }
  end

官方指南敏捷开发帮助很大。

于 2012-12-09T09:57:23.063 回答
0

至于我的解决方案是从 github 应用 @DouweM PR。这是 Gemfile 中的一行:

gem 'http_accept_language', :git => 'https://github.com/DouweM/http_accept_language', :branch => 'no-middleware-no-crash'
于 2013-06-23T12:36:58.907 回答
0

放入您的 Gemfile:

gem 'http_accept_language', '~> 2.0.0.pre'

然后在代码中使用 env aka:

env.http_accept_language

为我工作。

% bundle show|grep acc
    * http_accept_language (2.0.0.pre)
于 2013-09-05T01:54:31.060 回答