我创建一个多语种的应用程序,我想使应用程序切换到访客浏览器语言设置的语言。我注意到,如果语言设置匹配其中一个可用的语言环境,它就可以很好地工作。但不幸的是,一旦浏览器的语言不匹配的语言环境之一,我会得到的I18n :: InvalidLocale错误......(“ES”不是一个有效的区域设置)eventhough我建立了一个默认的语言环境......的I18n :: InvalidLocale错误
我缺少什么? 我该如何做这项工作?任何提示?
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>
UPDATE
当我运行轨道控制台,并检查我注意到I18n.available_locales它给我[:en,:fr,:“zh-CN”,:“zh-TW”,:de]非常奇怪?!因为我没有设置这些区域设置,而且我的应用程序中没有这些设置是默认设置?所以我想config.i18n.available_locales = [:de,:en]设置是必要的。
UPDATE
我已经注意到,如果使用:config.i18n.enforce_available_locales =假 没有翻译正在努力,但我不会得到一个错误。如果我对环境/ development.rb addtionally更新:config.i18n.fallbacks =真 那么只有默认值显示在我的案件的英语,但我不能将其更改为德语。
如果我改变,那么我没有收到错误,但它不会翻译任何内容,因为它不会访问语言环境。感谢您的尝试。 – trickydiddy
我编辑了答案。尝试添加可用区域设置的白名单:'config.i18n.available_locales = [:de,:en]' –
不幸的是,它仍然无效:/ – trickydiddy