我正在使用子域来确定Rails 4网站中的区域设置。我有一个完全按照我想要的方式使用区域设置切换器,但现在我需要翻译路线,我不确定最好的方法。
我查看了https://github.com/kwi/i18n_routing i18n路由gem,但这不适用于子域,它似乎通过添加/ locale来改变路径,这不是我需要的。
其他宝石似乎与Rails 4过时了。
修改
基本上我希望能够使用相同的视图帮助程序,但是更改URL以使用所选子域反映的任何语言。这只是路线翻译。
我有特定于语言的模板,我可以制作语言导航模板,但我真的不想担心更改erb路径和url erb标签
结束修改
来自routes.rb的样本
scope module: 'countries', shallow: true do
get 'south_american', to: 'south_america#index', as: :south_america
scope module: 'south_america' do
get 'south-america-weather', to: 'weather#index', as: :south_america_weather
get 'south-america-gps-maps', to: 'gps#index', as: :south_america_gps
get 'south-america-accommodation', to: 'hotels#index', as: :south_america_hotels
get 'south-america-vacations', to: 'vacations#index', as: :south_america_vacations
get 'south-america-facts', to: 'facts#index', as: :south_america_facts
end
以south_america_hotels_path为例,将为
生成一个网址南美洲-住宿
这很棒,但我怎么翻译这个,这样当我在西班牙子域名时,south_america_hotels_path将生成以下网址
酒店预订烯sudamerica
更新
此外,对于网址而言,这将如何工作,而不仅仅是一条路径 south_america_hotels_url将生成
en.some_site /南美洲-住宿
当我在西班牙语子域上时,我会得到
es.some_site /酒店预订烯sudamerica
以及所涉及的不同语言环境。
我很高兴使用yml文件进行网址的翻译或在routes.rb文件中定义其他路由,或者是一个选项,但我更喜欢在routes.rb中定义网址,但我无法找到一种方法来提供相同的语言特定网址:作为基于子域的路径/网址选项。
更新并进一步澄清以回复之前的回复。
更改网址不是一个选项,他们需要匹配现有的网址。我只需要知道如何从视图助手的角度转换它们,而不必更改视图助手。
答案 0 :(得分:15)
修改强>
这个宝石是我推荐的方法。支持多种语言而无需重新加载路由(我的例子没有)。你必须改变很少的东西,但它比下面的代码更加一致。 route translator
原始答案(不工作):
这对我有用,你可以尝试一下,在你的路线中,例如你可以把:
AppName::Application.routes.draw do
get "/#{I18n.t("index")}", :to => "pages#index", :as => "index"
get "/#{I18n.t("contact")}", :to => "pages#contact", :as => "contact"
end
这将在您运行应用程序时获取默认语言环境中的路由,但是在运行时,当您更改语言环境时,您需要重新绘制路由以获取新语言环境的路由。
I18n.locale = :es #different locale
AppName::Application.reload_routes!
假设您的default_locale为:en
,此示例将采用以下第一条路线:
en:
index: "index-in-english"
contact: "contact-in-english"
当应用重新加载路线时,它将从您的新语言环境中获取翻译,在此示例中来自
es:
index: "index-in-spanish"
contact: "contact-in-spanish"
通过这种方式,它将呈现页面#index和页面#contact,它只会改变路径,您不必触摸您的代码。希望这可以帮助你
答案 1 :(得分:2)
根据我的经验,域名不应该是决定语言环境的唯一因素。如果你只是将当前的语言环境放入cookie中,那么用户最终可以选择它,这样就容易多了!
现在转到你问题的翻译部分。我认为你应该改变你使用路由的方式。
如果您将国家/地区视为资源,将行动视为不同的部分,您将使您的生活更轻松。模型to_param
方法可以帮助您:
resource :country do
get :weather, on: :member
...
end
这会产生像south-america/weather
这样的网址,但从我的角度来看,在可读性和搜索引擎优化方面甚至更好。谷歌过去很喜欢路径。
对于路径的不同翻译,您可以遍历您的域并为每个细分提供翻译:http://guides.rubyonrails.org/routing.html#translated-paths
答案 2 :(得分:1)
要在Rails 4+应用中翻译路线,请查看route_translator gem。它允许转换路由并附带许多配置选项,例如向生成的路径添加区域设置部分,或支持基于子域的应用程序。