【发布时间】: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