2017-08-28 57 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 

然後它應該只嘗試設置區域設置,如果它可用。