在轨道上的ruby中自动设置区域设置

Raj*_*ajG 10 ruby locale ruby-on-rails

如何在rails上的ruby上自动设置语言环境?例如,如果网页在西班牙打开,那么locale = es,同样如果它在英国,那么locale = en和类似的?

请帮帮我.

MrY*_*iji 25

你可以在你的实现中实现它ApplicationController:

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    I18n.locale = extract_locale_from_headers
  end

  private

  def extract_locale_from_headers
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first.presence || 'en'
  end
end
Run Code Online (Sandbox Code Playgroud)

它将"检查"收到的请求,找到客户端浏览器的语言并将其设置为I18n语言环境.

请查看关于I18n 的RubyOnRails指南以获取进一步的说明.


你甚至可以"过滤器"的提取从,如果你的应用程序不支持此语言环境的头区域(强烈推荐!),并使用"默认语言环境"ApplicationController.像这样的东西:

ALLOWED_LOCALES = %w( fr en es ).freeze
DEFAULT_LOCALE = 'en'.freeze

def extract_locale_from_headers
  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
Run Code Online (Sandbox Code Playgroud)

或修订版(2018年)

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    I18n.locale = extract_locale_from_headers
  end

  private

  def extract_locale_from_headers
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first.presence || 'en'
  end
end
Run Code Online (Sandbox Code Playgroud)


Nic*_*nto 8

尝试使用gem geocoderi18n_data gem并有一个before_filter到一个方法

def checklocale
  I18n.locale =  I18nData.country_code(request.location.country) 
end
Run Code Online (Sandbox Code Playgroud)

  • 我认为基于geoip的本地化是无稽之谈.想想两个场景:你来自墨西哥,你去了日本.你可以通过日本的免费WiFi和BAM来购买你最喜欢的应用程序:你用日语得到它,你什么都看不懂.第二个:你的德国客户在她最喜欢的星巴克连接到WiFi.WiFi提供商(BT WiFi)位于英国,因此用户拥有英国的IP和BAM:他获得了应用程序的英文版本.我会使用HTTP_ACCEPT_LANGUAGE标题来寻找解决方案,因为您可以使用他们的首选语言取悦您的用户. (5认同)