我創建一個多語種的應用程序,我想使應用程序切換到訪客瀏覽器語言設置的語言。我注意到,如果語言設置匹配其中一個可用的語言環境,它就可以很好地工作。但不幸的是,一旦瀏覽器的語言不匹配的語言環境之一,我會得到的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