次のコードは、最初にparamに基づいて、次に以前に設定されたCookieに基づいて、次に。を要求することによってロケールを割り当てるために機能していますHTTP_ACCEPT_LANGUAGE
。
def set_locale
if params[:locale]
I18n.locale = params[:locale]
elsif cookies[:locale]
I18n.locale = cookies[:locale]
else
I18n.locale = sanitizeLocale(request.env["HTTP_ACCEPT_LANGUAGE"]) # e.g. "en,es;q=0.8,de-de;q=0.5,en-us;q=0.3"
end
cookies[:locale] = I18n.locale
end
def sanitizeLocale(locale)
@locale, lang_weight = cookies[:locale] || begin
if accept_lang = request.env["HTTP_ACCEPT_LANGUAGE"] # e.g. "en,es;q=0.8,de-de;q=0.5,en-us;q=0.3"
accept_lang.to_s.split(',').collect {|l| x,y = l.split(';q='); [x.split('-').first, (y||1).to_f]}.sort_by(&:last).reverse.find {|lang, lang_weight| %w[es en it fr de].include?(lang)}
# returns ["en", 1.0]
end
end || 'en' # default
return @locale
end
params[:locale]
私の質問は、与えられたものとcookies[:locale]
に対しての両方をどのようにチェックできるかsanitizeLocale
です。es en it fr de
入力に基づいてenなどの有効な値のみを取得することに興味があります。
sanitizeLocale
私はその値を同じように渡そうとしていますがHTTP_ACCEPT_LANGUAGE
、何らかの理由で私は理解できず、機能しておらず、指定された値がのように有効なen
場合でも常にデフォルトになっています。params[:locale]
it