在红宝石的语言环境自动设置在轨道上(set locale automatically in ruby

2019-07-03 16:36发布

如何在Ruby on Rails的自动设置的地点? 举例来说,如果网页被打开了在西班牙那么区域= ES,同样如果是在英国那么区域= EN和喜爱呢?

请帮助我。

Answer 1:

尝试使用gem geocoder和i18n_data宝石 ,有一个的before_filter到确实的方法

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


Answer 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


Answer 3:

包括这是ApplicationControllerBaseController

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

更多信息这里类似的问题。



Answer 4:

如果我得到什么ü意味着,你也会有地理位置工作的基础上,他的IP获取用户的位置,然后基于它的语言环境,但你一定不能忘了设置一些默认的情况下,你无法得到什么用户的IP。

我很抱歉地说,但我没有与地理位置上红宝石尚未奏效。 我做了RubyGems的快速研发和不可能发现任何宝石来简化您的工作。 =(



Answer 5:

从Rails的指南 ,包括在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

本质上,这条从像application.co.id或example.com一个url最终标识符(.EN,.ID等),并基于该语言环境。 如果用户来自于你不支持的语言环境,它返回到默认的语言环境 - 英语,除非另外设定。



文章来源: set locale automatically in ruby on rails