Ruby on Rails 从HTTP请求获取语言环境

示例

有时,根据请求IP设置应用程序区域设置会很有用。您可以使用轻松实现此目标Geocoder。在做的许多事情Geocoder中,它也可以分辨出location的request。

首先,添加Geocoder到您的Gemfile

# 宝石文件
gem 'geocoder'

Geocoder向标准对象  添加location和safe_location方法,Rack::Request因此您可以通过IP地址轻松查找任何HTTP请求的位置。您可以在中的before_action中使用此方法ApplicationController:

class ApplicationController < ActionController::Base
  before_action :set_locale_from_request

  def set_locale_from_request
    country_code = request.location.data["country_code"] #=> "US"
    country_sym = country_code.underscore.to_sym #=> :us

    # 如果请求语言环境可用,则使用它,否则使用I18n默认语言环境
    if I18n.available_locales.include? country_sym
      I18n.locale = country_sym
    end
end

要注意的是这不会在工作development和test环境,为喜欢的东西0.0.0.0和localhost有效有效的Internet IP地址。


局限性和替代方案

Geocoder是非常强大和灵活的,但是需要进行配置以与地理编码服务一起使用(请参阅更多详细信息);其中许多限制使用。还需要牢记的是,对每个请求调用外部服务都可能影响性能。

为了解决这些问题,还值得考虑:

1.离线解决方案

使用类似GeoIP(参见此处)的gem可以针对本地数据文件进行查找。在准确性方面可能需要权衡,因为这些数据文件需要保持最新。

2.使用CloudFlare

通过CloudFlare服务的页面可以选择进行透明的地理编码,并且可以将国家/地区代码添加到页眉(HTTP_CF_IPCOUNTRY)中。可以在这里找到更多细节。