当用户访问应用程序时,无论使用何种控制器,我都希望根据特定条件将其重定向到他的(右)语言(参见下文)。
我已经尝试了太多的路线组合,但没有成功。查看示例:
get '/', to: redirect('/:locale/home')
结果呢?用户被重定向到/:locale/home
,换句话说,那里没有语言,只有原始:locale
。
当用户访问http://myapp.com/
时,我真的想将他重定向到http://myapp.com/en-US/
。
这是我的ApplicationController
:
[...]
def set_locale
extracted_locale = params[:locale] || extract_locale_from_accept_language_headerw
I18n.locale = (I18n::available_locales.include? extracted_locale.to_sym) ?
extracted_locale : I18n.default_locale
end
Rails.application.routes.default_url_options[:locale]= I18n.locale
private
def extract_locale_from_accept_language_header
request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}-[a-zA-Z]{2}/).first
end
end
标准是:如果用户没有通过URL传递任何语言,没问题!我们得到他的http_accept_language
和voilà!顺便说一句,它现在是无用的http_accept_language
因为总是会有一个参数向应用程序解释用户正在搜索的语言,但我只是出于安全原因而提出。
有人可以解释我如何设计一条能够满足我想要的路线吗?我的意思是:
http://myapp.com/
=> http://myapp.com/en-US
http://myapp.com/about-us
=> http://myapp.com/pt-BR/about-us
我错过了什么吗?表达自己不好?请随时报告。
答案 0 :(得分:0)
阅读Rails Internationalization (I18n)部分从网址参数设置区域设置
简而言之,您的路线应该是这样的:
get '/:locale' => 'home#index'
get '/:locale/about-us' => 'home#about_us'
scope "(:locale)", locale: /en|nl/ do
resources :books
end
并在application_controller.rb中设置默认位置
def default_url_options(options={})
{ locale: I18n.locale }
end