如何在Ruby on Rails上自动设置区域设置?例如,如果网页在西班牙打开,则locale = es,类似地,如果在英国,则locale = en等等?
请帮忙。
请帮忙。
您可以在您的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
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
尝试使用gem geocoder
和i18n_data gem,并在before_filter中调用一个方法来执行以下操作:
def checklocale
I18n.locale = I18nData.country_code(request.location.country)
end
@country=I18nData.country_code(request.location.country)
时,它只提取“国家名称”吗?谢谢! - RajG将此包含在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
More info here Similar question.
如果我理解正确的话,您将需要使用地理定位功能,根据用户的IP地址获取其位置,然后根据此设置区域设置,但是在无法获取用户的IP地址时,您必须不要忘记设置一些默认值。
很抱歉,但我还没有在Ruby上使用过地理定位功能。我在Rubygems上进行了快速搜索,但未能找到任何可简化您工作的gem。=(
从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等),并根据此设置区域设置。如果用户来自您不支持的语言环境,则返回默认语言环境 - 英语,除非另有设置。