2017-08-28 111 views
0

我创建一个多语种的应用程序,我想使应用程序切换到访客浏览器语言设置的语言。我注意到,如果语言设置匹配其中一个可用的语言环境,它就可以很好地工作。但不幸的是,一旦浏览器的语言不匹配的语言环境之一,我会得到的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 =真 那么只有默认值显示在我的案件的英语,但我不能将其更改为德语。

回答

0

config.i18n.enforce_available_locales = true 这可能是压倒一切的默认语言环境的行为。请尝试将其关闭,因此默认语言环境可以踢 并提供可用的语言环境的这样一个白名单: config.i18n.available_locales = [:de, :en]

编辑 尝试在你的应用程序控制器,这样做:

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

如果我改变,那么我没有收到错误,但它不会翻译任何内容,因为它不会访问语言环境。感谢您的尝试。 – trickydiddy

+1

我编辑了答案。尝试添加可用区域设置的白名单:'config.i18n.available_locales = [:de,:en]' –

+0

不幸的是,它仍然无效:/ – trickydiddy

0

喜欢的东西这个?

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 
+0

错误消失了,但它只会是我的情况下的默认语言english ...而且我将无法切换语言..谢谢尝试! – trickydiddy

+1

我改变了答案,尝试使用像这样的散列它接受字符串和文字作为键。 –

+0

不幸的是同样的问题仍然存在......错误消失了,但它只会是默认的语言......我无法切换没有任何意义的语言......非常奇怪......:/感谢您的耐心等待! – trickydiddy

0

既然你的路线通过locale占位符设置地方,在你的application.rb你也应该使用params[:locale]值不是标题解决。因此,在application.rb的set_locale应该

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

请参阅部分从URL设置本地化这里PARAMS http://guides.rubyonrails.org/i18n.html#configure-the-i18n-module

0

也许尝试本作中的应用控制器的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 

然后它应该只尝试设置区域设置,如果它可用。