как установить локаль автоматически на рубине на рельсах? Например, если веб-страницы открываются в Испании, то locale = es, аналогично, если это в объединенном королевстве, то locale = en и alike?
Пожалуйста, помогите мне.
как установить локаль автоматически на рубине на рельсах? Например, если веб-страницы открываются в Испании, то locale = es, аналогично, если это в объединенном королевстве, то locale = en и alike?
Пожалуйста, помогите мне.
попробуйте использовать gem geocoder
и i18n_data gem и у вас есть before_filter метод, который делает
def checklocale
I18n.locale = I18nData.country_code(request.location.country)
end
Вы можете реализовать это так в вашем ApplicationController
:
class ApplicationController < ActionController::Base
before_filter :set_locale
# [...]
def set_locale
I18n.locale = extract_locale_from_accept_language_header
end
private
def extract_locale_from_accept_language_header
request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first.presence || 'en'
end
# [...]
end
Он "проверит" полученный запрос, найдет язык браузера клиента и установит его в качестве вашей локали I18n.
Посмотрите руководство RubyOnRails о I18n для получения дальнейших инструкций.
Вы даже можете "отфильтровать" извлеченную локаль из заголовка, если ваше приложение не поддерживает эту локаль (настоятельно рекомендуется !), И использовать "локаль по умолчанию" с else
. Что-то вроде этого:
def extract_locale_from_accept_language_header
case request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
when 'en'
'en'
when 'fr'
'fr'
when 'es'
'es'
else
'en'
end
end
Или пересмотренная версия (2018)
ALLOWED_LOCALES = %w( fr en es ).freeze
DEFAULT_LOCALE = 'en'.freeze
def extract_locale_from_header
browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
if ALLOWED_LOCALES.include?(browser_locale)
browser_locale
else
DEFAULT_LOCALE
end
end
Включить это ApplicationController
или BaseController
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
Это означает, что для параметра locale
задано значение по умолчанию или использовать язык из запроса, приоритет - тот, который был отправлен в запросе. Если вы хотите развернуть это для пользователя, сеанса, запросите, вы можете это сделать.
def set_locale
I18n.locale = @user.locale || session[:locale] || params[:locale] || I18n.default_locale
end
Подробнее здесь Подобный вопрос.
Если я получу то, что означает u, вам придется работать с геолокацией, получить местоположение пользователя на основе его ip, а затем установить локаль на основе этого, но u не должен забывать устанавливать некоторые значения по умолчанию в случае, t не получает ничего от ip пользователя.
Мне жаль, но я еще не работал с геолокацией на рубине. Я быстро исследовал rubygems и не смог найти камень, чтобы упростить вашу работу. = (
В Rails Guide включите этот код в ApplicationController
before_action :set_locale
def set_locale
I18n.locale = extract_locale_from_tld || I18n.default_locale
end
# Get locale from top-level domain or return nil if such locale is not available
# You have to put something like:
# 127.0.0.1 application.com
# 127.0.0.1 application.it
# 127.0.0.1 application.pl
# in your /etc/hosts file to try this out locally
def extract_locale_from_tld
parsed_locale = request.host.split('.').last
I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
end
По существу, это разделяет окончательный идентификатор (.en,.id и т.д.) из url, например application.co.id или example.com, и устанавливает локаль на основе этого. Если пользователь приходит из локали, которую вы не поддерживаете, он возвращается к языку по умолчанию - по-английски, если не указано иное.