Автоматически установить языковой стандарт в рубине на рельсах

как установить локаль автоматически на рубине на рельсах? Например, если веб-страницы открываются в Испании, то locale = es, аналогично, если это в объединенном королевстве, то locale = en и alike?

Пожалуйста, помогите мне.

Ответ 1

попробуйте использовать gem geocoder и i18n_data gem и у вас есть before_filter метод, который делает

def checklocale
  I18n.locale =  I18nData.country_code(request.location.country) 
end

Ответ 2

Вы можете реализовать это так в вашем 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

Ответ 3

Включить это 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

Подробнее здесь Подобный вопрос.

Ответ 4

Если я получу то, что означает u, вам придется работать с геолокацией, получить местоположение пользователя на основе его ip, а затем установить локаль на основе этого, но u не должен забывать устанавливать некоторые значения по умолчанию в случае, t не получает ничего от ip пользователя.

Мне жаль, но я еще не работал с геолокацией на рубине. Я быстро исследовал rubygems и не смог найти камень, чтобы упростить вашу работу. = (

Ответ 5

В 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, и устанавливает локаль на основе этого. Если пользователь приходит из локали, которую вы не поддерживаете, он возвращается к языку по умолчанию - по-английски, если не указано иное.