7

ブラウザのロケールをbrowserlocale request.env['HTTP_ACCEPT_LANGUAGE']とURLで設定します。Rails I18n set_locale

  1. ユーザーはURL(例:myapp.com)を訪問した場合、それはHTTP_ACCEPT_LANGUAGEをチェックし右のURLにリダイレクトする必要があります(例:myapp.com/en - browserlocaleがエン場合)

  2. ユーザーが言語メニューを使用して別の言語を選択すると、URLはたとえばmyapp.com/deに変更されます。ここで

私がこれまでに得た私のものです:

Myapp::Application.routes.draw do 
    # set language path 
    scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do 

    root :to => "mycontrollers#new" 
    ... 

    end 

    match '*path', to: redirect("/#{I18n.locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" } 

    match '', to: redirect("/#{I18n.locale}") 
end 

問題がroutesfileが最初に実行されますとHTTP_ACCEPT_LANGUAGEが持っているということです。私のルートで

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :set_locale 

private 

    # set the language 
    def set_locale 
    if params[:locale].blank? 
     I18n.locale = extract_locale_from_accept_language_header 
    else 
     I18n.locale = params[:locale] 
    end 
    end 

    # pass in language as a default url parameter 
    def default_url_options(options = {}) 
    {locale: I18n.locale} 
    end 

    # extract the language from the clients browser 
    def extract_locale_from_accept_language_header 
    browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z]{2}/).try(:first).try(:to_sym) 
    if I18n.available_locales.include? browser_locale 
     browser_locale 
    else 
     I18n.default_locale 
    end 
    end 
end 

は、私が得たファイル何の効果もありません。なぜなら、url-paramはコントローラーに関して既に設定されているからです。

誰にも解決策がありますか?たぶんミドルウェアで解決しますか?

答えて

8

あなたのルートでいくつかの変更があります。

まず:

scope :path => ":locale" do 
    ... 
end 

第二:それはしかし冗長思わ

match '', to: redirect("/#{I18n.locale}") 

私はあなたがここでやろうとしているものを参照してください。

私はその行を取り除くだけset_locale方法を変更し、このように取得したい:

# set the language 
def set_locale 
    if params[:locale].blank? 
    redirect_to "/#{extract_locale_from_accept_language_header}" 
    else 
    I18n.locale = params[:locale] 
    end 
end 
+0

application_controller「」が一致した場合には、呼び出されない - >あなたはロケールを設定しないで終わりますリダイレクトなし。少なくとも私はそれを実装したときに起こったことです。 –

+0

新しいRails(4.1.0)アプリをチェックインしたところ、期待通りに機能しています。 redirect( "/#{I18n.locale}") 'に' match 'の代わりに:redirect( "/#{I18n.locale}") 'を実行する必要があります。その最初のリクエストはapplication_controller.rbを使用しません。 – etagwerker

+0

何らかの理由でそれが私のためには機能しません(これは4.0のテストでこれをテストしました) - とにかく私は次のソリューションを考え出しました:http://stackoverflow.com/questions/23188986/アプリケーションコントローラ未実行時アクセス時ドメインリダイレクトなし –

関連する問題