【问题标题】:set locale automatically in ruby on rails [duplicate]在 ruby​​ on rails 中自动设置语言环境[重复]
【发布时间】:2012-11-09 15:23:49
【问题描述】:

如何在 ruby​​ on rails 上自动设置语言环境?例如,如果网页在西班牙打开,则 locale=es,同样,如果在英国打开,则 locale=en 之类的?

请帮帮我。

【问题讨论】:

  • 看看this link中的2.6.2使用GeoIP(或类似)数据库
  • @NickGinanto 这是一篇相当老的帖子。我最终继续使用 I18n 宝石。使用 gems 使应用程序能够根据用户浏览器的语言设置尊重用户的首选语言环境。这意味着如果他们愿意,他们就有机会查看其他语言环境。

标签: ruby-on-rails ruby locale


【解决方案1】:

您可以在 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

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

查看关于 I18n 的 RubyOnRails Guide 以获取更多说明。


我强烈建议拥有一组受支持的语言环境并回退到默认语言环境。像这样的:

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

【讨论】:

  • 这适用于真实用户,但对机器人和搜索引擎来说很糟糕 - 所有这些都会收到 500 个错误,因为在请求中没有 env['HTTP_ACCEPT_LANGUAGE'] 如果您仍然想使用此代码,则它为零检查:如果 !request.env['HTTP_ACCEPT_LANGUAGE'].blank?
  • 这就是为什么我添加了强烈推荐的后备@RomanKlevtcov
  • 哦,现在看到了,抱歉。我们也可以更新代码:
【解决方案2】:

尝试使用 gem geocoder 和 i18n_data gem 并使用 before_filter 到一个方法

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

【讨论】:

  • 安装了两个 gem,但是没有运气 :(...使用你的想法来实现获取位置/国家数据,然后我可以根据它设置语言环境。但遗憾的是它没有显示任何价值。但我非常喜欢处理你的代码而不是使用“geoip”。可能你能不能给我一个替代指针。谢谢
  • 将 gem 'geocoder' 和 gem 'i18n_data' 添加到您的 gemfile。重新启动您的应用程序。在任何视图或控制器中检查上述行。看看它是否有效。请注意,它在开发中不起作用,因为 request.location.country 会给你保留,因为你的 request.ip 将是 127.0.0.1
  • 我在生产模式下运行它不起作用:(。我将值存储到@country=I18nData.country_code(request.location.country) 并做了render :text =&gt; "country= #{@country}" 国家的值出现了null!
  • 您是否通过代理运行?
  • 我认为基于 geoip 的本地化是无稽之谈。考虑两种情况:你来自墨西哥,你去日本旅游。您可以通过日本的免费 WiFi 和 BAM 访问您最喜欢的应用程序:您使用日语获得它,但您什么也看不懂。第二个:您的一位德国客户在她最喜欢的星巴克连接到 WiFi。 WiFi 提供商 (BT WiFi) 位于英国,因此用户拥有基于英国的 IP 和 BAM:他获得了该应用程序的英文版本。我会选择带有 HTTP_ACCEPT_LANGUAGE 标头的解决方案,因为您可以使用他们的首选语言来取悦用户。
【解决方案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

更多信息here类似问题。

【讨论】:

    【解决方案4】:

    如果我明白你的意思,你将不得不使用地理定位,根据他的 ip 获取用户位置,然后根据它设置区域设置,但你不能忘记设置一些默认值,以防万一你可以'无法获取用户的 ip。

    对不起,我还没有在 ruby​​ 上使用地理定位。我对 ruby​​gems 进行了快速研究,但找不到任何宝石来简化您的工作。 =(

    【讨论】:

    • 查看我的答案以获得合适的宝石
    【解决方案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
    

    本质上,这会从诸如 application.co.id 或 example.com 之类的 url 中去除最终标识符(.en、.id 等),并基于此设置语言环境。如果用户来自您不支持的语言环境,它将返回到默认语言环境 - 英语,除非另有设置。

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多