ブラウザのロケールをbrowserlocale request.env['HTTP_ACCEPT_LANGUAGE']
とURLで設定します。Rails I18n set_locale
ユーザーはURL(例:myapp.com)を訪問した場合、それは
HTTP_ACCEPT_LANGUAGE
をチェックし右のURLにリダイレクトする必要があります(例:myapp.com/en -browserlocale
がエン場合)ユーザーが言語メニューを使用して別の言語を選択すると、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はコントローラーに関して既に設定されているからです。
誰にも解決策がありますか?たぶんミドルウェアで解決しますか?
application_controller「」が一致した場合には、呼び出されない - >あなたはロケールを設定しないで終わりますリダイレクトなし。少なくとも私はそれを実装したときに起こったことです。 –
新しいRails(4.1.0)アプリをチェックインしたところ、期待通りに機能しています。 redirect( "/#{I18n.locale}") 'に' match 'の代わりに:redirect( "/#{I18n.locale}") 'を実行する必要があります。その最初のリクエストはapplication_controller.rbを使用しません。 – etagwerker
何らかの理由でそれが私のためには機能しません(これは4.0のテストでこれをテストしました) - とにかく私は次のソリューションを考え出しました:http://stackoverflow.com/questions/23188986/アプリケーションコントローラ未実行時アクセス時ドメインリダイレクトなし –