如何在Ruby on Rails的自动设置的地点? 举例来说,如果网页被打开了在西班牙那么区域= ES,同样如果是在英国那么区域= EN和喜爱呢?
请帮助我。
如何在Ruby on Rails的自动设置的地点? 举例来说,如果网页被打开了在西班牙那么区域= ES,同样如果是在英国那么区域= EN和喜爱呢?
请帮助我。
尝试使用gem geocoder
和i18n_data宝石 ,有一个的before_filter到确实的方法
def checklocale
I18n.locale = I18nData.country_code(request.location.country)
end
你可以像这样在你实现它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
包括这是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
更多信息这里类似的问题。
如果我得到什么ü意味着,你也会有地理位置工作的基础上,他的IP获取用户的位置,然后基于它的语言环境,但你一定不能忘了设置一些默认的情况下,你无法得到什么用户的IP。
我很抱歉地说,但我没有与地理位置上红宝石尚未奏效。 我做了RubyGems的快速研发和不可能发现任何宝石来简化您的工作。 =(
从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等),并基于该语言环境。 如果用户来自于你不支持的语言环境,它返回到默认的语言环境 - 英语,除非另外设定。