I18n :: InvalidLocale错误

时间:2017-08-28 12:40:49

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

我正在创建一个多语言应用,我想让应用切换到访问者浏览器语言设置的语言。我注意到,如果语言设置与其中一个可用语言环境匹配,它将完美运行。但遗憾的是,只要浏览器语言与其中一个语言环境不匹配,我就会得到I18n :: InvalidLocale错误...(“es”不是有效的语言环境),尽管我设置了默认的语言环境...

我错过了什么? 我怎样才能做到这一点?任何提示?

application.rb中

require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(*Rails.groups)

module Testapp
  class Application < Rails::Application

    config.i18n.default_locale = :en
    config.i18n.enforce_available_locales = true

    config.active_record.raise_in_transactional_callbacks = true
  end
end

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :set_locale

  private

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

  def set_locale
    I18n.locale = extract_locale_from_accept_language_header || I18n.default_locale
  end
end

在我的语言环境中,我有de.yml,en.yml和devise.en.yml文件。

的routes.rb

Rails.application.routes.draw do

  scope "(:locale)", locale: /en|de/ do

    root 'welcomes#index'
    devise_for :users
    get "language" => "welcomes#language"

    get "welcomes/download_pdf"

    resources :welcomes do
      get :download, on: :member
    end

    resources :resumes do
      get :download, on: :member
    end

    get '*path' => redirect('/')

  end
end

index.html.erb

<p><%= link_to "EN", root_path(locale: 'en') %></p>
<p><%= link_to "DE", root_path(locale: 'de') %></p>

更新

我注意到当我运行rails控制台并检查I18n.available_locales它给了我[:en,:fr,:“zh-CN”,:“zh-TW”,:de]很奇怪?!因为我没有设置这些区域设置而我的应用程序中没有那些设置是默认设置吗?所以我想config.i18n.available_locales = [:de,:en]设置是必要的。

更新

我注意到如果使用:config.i18n.enforce_available_locales = false 没有翻译工作,但我不会收到错误。如果我在环境/ development.rb上添加更新:config.i18n.fallbacks = true 然后在我的案例中只显示默认值英语,但我无法将其更改为德语。

4 个答案:

答案 0 :(得分:1)

config.i18n.enforce_available_locales = true 这可能会覆盖默认的区域设置行为。尝试将其关闭,以便默认语言环境可以启动。 并提供可用语言环境的白名单,如下所示: config.i18n.available_locales = [:de, :en]

修改 尝试在应用程序控制器中执行此操作:

def default_url_options(options = {})
    { locale: I18n.locale }
end

答案 1 :(得分:0)

这样的东西?

def extract_locale_from_accept_language_header
  available_locales = {'de' => 'de', 'en' => 'en'}
  available_locales[request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first]
end

答案 2 :(得分:0)

由于您是通过路线中的locale占位符设置区域设置,因此您应在application.rb中使用params[:locale]的值而不是标头解析它。所以在application.rb中,set_locale应该是

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

请参阅此处{URL}参见有关设置区域设置的部分http://guides.rubyonrails.org/i18n.html#configure-the-i18n-module

答案 3 :(得分:0)

也许尝试将其作为应用程序控制器中的before_action。

  def set_locale
    browser_locale = extract_locale_from_accept_language_header.to_sym
    if I18n.available_locales.include?(browser_locale)
      I18n.locale = browser_locale
    else
      I18n.locale = I18n.default_locale
    end
  end

然后它应该只尝试设置语言环境,如果它可用。