Языковой стандарт не установлен в Application Controller

Я провел последние несколько часов, пытаясь сделать все возможное, чтобы это работало, гуглил, переделывал, тестировал и т. Д., Но почему-то это не работает.

хорошо, я хотел бы установить I18n.locale - довольно просто.

В основном я реализовал то, что написано в гайде здесь:

http://guides.rubyonrails.org/i18n.html

Application_controller.rb

before_action :set_locale

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

На самом деле моя выглядит так:

class ApplicationController < ActionController::Base
   logger.info "Point A..."
   before_action :set_locale

def set_locale
  logger.info "Point B..."
  I18n.locale = extract_locale_from_accept_language_header
end

 private
    def extract_locale_from_accept_language_header
        ....

Эта проблема заключается в том, что языковой стандарт устанавливается до того, как я могу установить языковой стандарт при первом доступе к странице. Я хотел бы сначала прочитать настройки браузера пользователя, если языковой стандарт еще не установлен. Чтобы дать пользователю возможность попасть на свой локализованный сайт. Если они впоследствии изменят локаль (изменят язык - отлично, тогда локаль будет установлена, и они будут использовать ее, пока не решат снова переключиться).

Я поместил две строки в код выше, и это вывод:

Point A...
Processing by StaticPagesController#home as HTML
  Parameters: {"locale"=>"en"}
Point B...

Я пробовал следующее: - удалил локаль по умолчанию в application.rb: #config.i18n.default_locale = :en - отключил все гемы, которые могли мешать (каждый раз перезапускал сервер)

Любая помощь будет оценена по достоинству. Спасибо, Г


person Georg Keferböck    schedule 19.04.2014    source источник


Ответы (1)


Не могли бы вы попробовать и посмотреть, работает ли это для вас?

def set_locale 
  @locale = extract_locale_from_accept_language_header
  I18n.locale = @locale 
end

ОБНОВИТЬ:

После большого количества комментариев и вставленных журналов кажется, что вы получаете локаль через маршруты. Вот почему вы видите в журнале локаль: en . Но то, что вы на самом деле хотите сделать, отличается: установите локаль на основе заголовков, а не URL-адреса. Удалите ссылки на локали из файлов маршрутов и посмотрите, сработает ли это для вас.

person rodeleon    schedule 19.04.2014
comment
Привет роделеон, Спасибо за ваш ответ. Я пробовал, но это ничего не меняет. Проблема в том, что локаль установлена ​​​​в другом месте, прежде чем я установил ее в set_locale.... ЭТО ОЗНАЧАЕТ: если пользователь не заходит на сайт с языковыми предпочтениями браузера en, но скажем, de - он / она увидит домашнюю страницу в английский вместо немецкого. Как только он/она щелкнет ссылку, она будет использовать локаль, которую я установил ранее в set_locale. - person Georg Keferböck; 19.04.2014
comment
Просто все затянулось на один шаг... Хочу установить локаль - не хочу, чтобы локаль устанавливалась раньше. И согласно документации это то, что я делаю. Он просто не делает этого. - person Georg Keferböck; 19.04.2014
comment
Не могли бы вы обновить ответ и вставить код extract_locale_from_accept_language_header? Вы уверены, что не устанавливаете там неправильный язык? - person rodeleon; 19.04.2014
comment
Локаль установлена ​​правильно - поэтому она переключается после нажатия ссылки на странице. Если вы посмотрите на вывод журнала - между POINT A и POINT B языковой стандарт установлен - не мной. И в этом проблема. Он установлен в другом месте - затем я установил его, но на данный момент уже слишком поздно. Как только пользователь нажимает на ссылку, используется определенная мной локаль. - person Georg Keferböck; 19.04.2014
comment
Нет, в журнале, который вы вставляете, когда видите Параметры: {locale=›en}, это не означает, что языковой стандарт установлен на английский, это означает, что запрос отправляется как параметр locale: en. Это может быть связано с тем, что передается URL-адрес (mysite.com/?locale=en), или у вас есть что-то в представлении, которое устанавливает английский язык. - person rodeleon; 19.04.2014
comment
Не могли бы вы попробовать изменить в config/application.rb локаль по умолчанию на что-то отличное от английского, чтобы увидеть, является ли это поведением по умолчанию, установленным при первом входе на страницу, попробуйте config.i18n.default_locale = :de и перезапустите сервер - person rodeleon; 19.04.2014
comment
Это действительно ценная информация. Я установил язык по умолчанию на :de, и после перезапуска сайт отображается как localhost:3000/de. - person Georg Keferböck; 19.04.2014
comment
Если я снова установлю язык по умолчанию на :en и сделаю следующее: def set_locale logger.info Point B... I18n.locale = :de #@locale = extract_locale_from_accept_language_header #I18n.locale = @locale end - person Georg Keferböck; 19.04.2014
comment
он снова устанавливает его в :en.... что означает, что set_locale игнорируется в первый раз. - person Georg Keferböck; 19.04.2014
comment
Еще один, возможно, интересный вывод: если я уберу английский язык из доступных переменных: config.i18n.available_locales = [:de, :cz] и НЕ определю переменную по умолчанию - она ​​все равно будет использовать :en после перезапуска сервера. - person Georg Keferböck; 19.04.2014
comment
В rake route - :en отображается рядом с :cz и :de (хотя я думал, что полностью удалил en) - person Georg Keferböck; 19.04.2014
comment
Хорошо, теперь я запутался, что вы подразумеваете под рейк-маршрутами, отображающими локали? То, что вы пытаетесь реализовать здесь, - это не использовать URL-адрес для установки локали, а вместо этого использовать заголовки. Вы должны проверить файлы маршрутов и удалить ссылки на локаль. Я думаю, что вы устанавливаете через маршруты локаль страницы индекса на английский язык - person rodeleon; 19.04.2014
comment
И это должно быть причиной того, что вы получаете параметр locale: en в журнале, который вы вставляете - person rodeleon; 19.04.2014
comment
Ну, со ссылкой я имел ввиду: root GET /:locale(.:format) static_pages#home {:locale=›/de|en/} - person Georg Keferböck; 19.04.2014
comment
И ресурсы, которые должны быть доступны на разных языках, ограничены следующим образом: область :locale, локаль: /#{I18n.available_locales.join(|)}/ do - person Georg Keferböck; 19.04.2014
comment
Я выполнил guides.rubyonrails.org/i18n.html шаг за шагом, чтобы убедиться, что я делаю все правильно. - person Georg Keferböck; 19.04.2014
comment
Может быть, эти две строки в route.rb настроены неправильно? получить '*path', to: redirect(/#{I18n.default_locale}/%{path}), ограничения: lambda { |req| !req.path.starts_with? /#{I18n.default_locale}/ } получить '', to: redirect(/#{I18n.default_locale}/) - person Georg Keferböck; 19.04.2014
comment
Хорошо, но вы должны увидеть, что в руководствах также говорится: «В определенных случаях имеет смысл устанавливать локаль из информации, предоставленной клиентом, т. е. не из URL-адреса». Итак, что вы пытаетесь сделать здесь. оба. То, что у вас есть в вашем файле маршрутов, - это получить локаль из URL-адреса, и то, что вы хотите сделать, отличается, получить локаль из заголовков. - person rodeleon; 19.04.2014
comment
Хорошо, теперь все это имеет больше смысла. Не могли бы вы скопировать свое последнее утверждение в поле для ответа, чтобы я мог отметить его как ответ. Спасибо за помощь! - person Georg Keferböck; 19.04.2014