【问题标题】:Rails I18n set_localeRails I18n set_locale
【发布时间】:2012-05-12 02:25:32
【问题描述】:

我想通过客户端 browserlocale request.env['HTTP_ACCEPT_LANGUAGE'] 和 URL 设置语言环境。

  1. 如果用户访问一个 URL(例如:myapp.com),它应该检查 HTTP_ACCEPT_LANGUAGE 并重定向到正确的 URL(例如:myapp.com/en - 如果browserlocale 是 en)

  2. 如果用户随后通过语言菜单选择不同的语言,则应将 URL 更改为例如:myapp.com/de。

这是我目前得到的:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale

private

  # set the language
  def set_locale
    if params[:locale].blank?
      I18n.locale = extract_locale_from_accept_language_header
    else
      I18n.locale = params[:locale]
    end
  end

  # pass in language as a default url parameter
  def default_url_options(options = {})
    {locale: I18n.locale}
  end

  # extract the language from the clients browser
  def extract_locale_from_accept_language_header
    browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z]{2}/).try(:first).try(:to_sym) 
    if I18n.available_locales.include? browser_locale
      browser_locale
    else
      I18n.default_locale
    end
  end
end

在我的路线文件中,我得到了:

Myapp::Application.routes.draw do
  # set language path
  scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do

    root :to => "mycontrollers#new"
    ...

  end

  match '*path', to: redirect("/#{I18n.locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }

  match '', to: redirect("/#{I18n.locale}")
end

问题是路由文件首先被执行,HTTP_ACCEPT_LANGUAGE 没有效果,因为 url-param 在涉及到控制器时已经设置好了。

有人对此有解决方案吗?也许通过中间件解决?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 internationalization i18n-gem


    【解决方案1】:

    我会更改您路线中的一些内容。

    第一:

    scope :path => ":locale" do
      ... 
    end
    

    第二个:

    我明白你在这里要做什么:

    match '', to: redirect("/#{I18n.locale}")
    

    这似乎是多余的。

    我会去掉那一行,只修改 set_locale 方法,如下所示:

    # set the language
    def set_locale
      if params[:locale].blank?
        redirect_to "/#{extract_locale_from_accept_language_header}"
      else
        I18n.locale = params[:locale]
      end
    end
    

    【讨论】:

    • 应用程序控制器不会被调用,如果匹配'' - >所以你最终没有设置语言环境并且没有重定向。至少在我实现它时是这样的。
    • 我刚刚签入了一个全新的 Rails (4.1.0) 应用程序,它按预期工作。你需要写get '', to: redirect("/#{I18n.locale}"),而不是match '', to: redirect("/#{I18n.locale}")。第一个请求不会使用 application_controller.rb
    • 由于某种原因它对我不起作用(在 4.0 上测试过)——无论如何我想出了以下解决方案:stackoverflow.com/questions/23188986/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多