重定向到正确的语言(i18n)

时间:2014-01-21 17:38:53

标签: ruby-on-rails internationalization

目标

当用户访问应用程序时,无论使用何种控制器,我都希望根据特定条件将其重定向到他的(右)语言(参见下文)。

问题

我已经尝试了太多的路线组合,但没有成功。查看示例:

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

TL; DR

标准是:如果用户没有通过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

疑惑?

我错过了什么吗?表达自己不好?请随时报告。

1 个答案:

答案 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