Я создаю многоязычное приложение и хочу, чтобы приложение переключалось на язык, установленный в языковых настройках браузера посетителей. Я заметил, что он отлично работает, если языковые настройки соответствуют одной из доступных локалей. Но, к сожалению, как только язык браузера не будет соответствовать одному из языковых стандартов, я получу ошибку 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, тогда в моем случае отображается только значение по умолчанию, английский язык, но я не могу изменить его на немецкий.