带有语言环境的Ruby on Rails路由

时间:2010-12-20 05:48:18

标签: ruby-on-rails internationalization routes

我正在使用本指南:http://edgeguides.rubyonrails.org/i18n.html

我想要的是什么:

/about使用默认的pages#about区域设置转到en

/en/about使用pages#about的区域设置转到en

/es/about使用pages#about的区域设置转到es

我得到了什么:

/about使用root_path的区域设置转到about

/en/about使用pages#about的区域设置转到en

/es/about使用pages#about的区域设置转到es

以下是一些代码:

# config/routes.rb
match '/:locale' => 'pages#news'

scope "(:locale)", :locale => /en|es/ do
  match '/abcd' => 'pages#abcd'
  match '/plan' => 'pages#plan'
  match '/about' => 'pages#about'
  match '/history' => 'pages#history'
  match '/projects' => 'pages#projects'
  match '/donate' => 'pages#donate'
  match '/opportunities' => 'pages#opportunities'
  match '/board' => 'pages#board'
end

root :to => "pages#news"

# app/controller/application_controller.rb
before_filter :set_locale

def set_locale
  # if params[:locale] is nil then I18n.default_locale will be used
  I18n.locale = params[:locale]
end

def default_url_options(options={})
  { :locale => I18n.locale }
end

如果我正确阅读指南,第2.5节说我应该能够访问/about并让它加载默认语言环境。

从2.5:

# config/routes.rb
scope "(:locale)", :locale => /en|nl/ do
  resources :books
end
  

通过这种方法你不会得到一个   访问您的路由错误   资源如   http://localhost:3001/books没有   语言环境。这对你来说非常有用   想要在使用时使用默认语言环境   一个未指定。

3 个答案:

答案 0 :(得分:6)

routes.rb中的第一行是一个包罗万象的路线

match '/:locale' => 'pages#news'

它应该是文件中的最后一行,就在根路径之后。

答案 1 :(得分:4)

另一种方式是:

Possible_locales = /en|es/

match '/:locale' => 'pages#news', :locale => Possible_locales

scope "(:locale)", :locale => Possible_locales do
   ...
end

无需担心路线顺序。

答案 2 :(得分:1)

这篇博文实际上非常详细地解释了它(Rails 4):

正是我正在寻找什么似乎无法正常工作

http://dhampik.com/blog/rails-routes-tricks-with-locales

  scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do
    resources :posts    
    root to: "main#index"
  end

  root to: redirect("/#{I18n.default_locale}", status: 302), as: :redirected_root

  get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false

从root重定向到默认语言并执行很多其他操作。