【问题标题】:I18n::InvalidLocale ErrorI18n::InvalidLocale 错误
【发布时间】:2018-02-05 17:47:38
【问题描述】:

我正在创建一个多语言应用程序,我想让应用程序切换到访问者浏览器语言设置的语言。我注意到如果语言设置与可用的语言环境之一匹配,它会完美运行。但不幸的是,一旦浏览器语言与其中一个语言环境不匹配,即使我设置了默认语言环境,我也会收到 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 然后在我的情况下只显示默认值英语,但我无法将其更改为德语。

【问题讨论】:

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


    【解决方案1】:

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

    编辑 尝试在您的应用程序控制器中执行此操作:

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

    【讨论】:

    • 如果我改变它,那么我不会收到错误,但它不会翻译任何东西,因为它不会访问语言环境。感谢您的尝试。
    • 我已经编辑了答案。尝试添加可用语言环境的白名单:config.i18n.available_locales = [:de, :en]
    • 再次编辑答案。试试这个。
    • 不,它仍然无法正常工作......它会引发错误:I18n.locale = extract_locale_from_accept_language_header || I18n.default_locale 我看不出该代码有什么问题:/
    • 错误是什么?你能复制错误和堆栈跟踪吗
    【解决方案2】:

    这样的?

    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
    

    【讨论】:

    • 错误消失了,但在我的情况下它只会是默认语言英语......而且我将无法切换语言......感谢您的尝试!
    • 我已经改变了答案,尝试像这样使用哈希它接受字符串和文字作为键。
    • 不幸的是,同样的问题仍然存在......错误消失了,但它只是默认语言......我无法切换没有任何意义的语言......非常奇怪...... . :/ 感谢您的耐心等待!
    • 您究竟是如何更改语言环境的?
    • 检查我编辑的问题。我使用路径范围的路线。使用简单的 link_to 辅助方法在语言之间切换... www。 example.com/en/... www。 example.com/de/...
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      也许可以在应用程序控制器中尝试将此作为 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
      

      那么它应该只尝试设置可用的语言环境。

      【讨论】:

        猜你喜欢
        • 2015-12-23
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多