【问题标题】:Rails 4 i18n, how to translate routes where subdomain is used for the localeRails 4 i18n,如何翻译子域用于区域设置的路由
【发布时间】:2013-12-26 11:49:07
【问题描述】:

我正在使用子域来确定 Rails 4 网站中的语言环境。我完全按照我想要的方式与语言环境切换器一起工作,但现在我需要翻译路线,我不确定最好的方法。

我查看了https://github.com/kwi/i18n_routing i18n 路由 gem,但这不适用于子域,它似乎通过添加 /locale 来更改路径,这不是我需要的。

其他 gem 似乎在 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 为例会生成一个 url

南美洲住宿

这很好,但是我将如何翻译它,以便当我在西班牙子域 south_america_hotels_path 上时会生成以下网址

hoteles-en-sudamerica

更新

此外,这将如何用于 url 而不仅仅是路径,以便 south_america_hotels_url 将生成

en.some_site/south-america-accommodation

当我在西班牙子域上时,我会得到

es.some_site/hoteles-en-sudamerica

对于所涉及的不同语言环境,依此类推。

我很乐意使用 yml 文件来翻译 url 或在 routes.rb 文件中定义额外的路由,这都是一个选项,但我更愿意在 routes.rb 中定义 url 但我无法找到一种方法为基于子域的相同 :as 路径/url 选项提供特定于语言的 url。

针对之前的回复进行更新和进一步澄清。

更改网址不是一种选择,它们需要匹配现有的网址。我只需要知道如何从视图助手的角度翻译它们,而无需更改视图助手。

【问题讨论】:

  • 你看过Rails i18n guide吗?它解释了如何使用子域来设置语言环境。翻译路线不是 Rails 开箱即用的事情。看看rails-translate-routesroute_translator
  • @janfoeh 我对我处理子域的方式非常满意,只是路由翻译给我带来了麻烦,你指向的宝石不适合我的需要。当然,这可以在不使用 gem 的情况下完成

标签: ruby-on-rails routing ruby-on-rails-4 rails-i18n


【解决方案1】:

编辑:

这颗宝石是我推荐的方法。支持多种语言而无需重新加载路线(我的示例没有)。你只需要改变很少的东西,但它比下面的代码更一致。 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"

这样你会渲染 pages#index 和 pages#contact 并且它只会改变路由,你不需要去修改你的代码。希望对你有帮助

【讨论】:

  • 太棒了。非常感谢您的详细解释,我可以轻松实现这一点,这正是我想要的
【解决方案2】:

要在 Rails 4+ 应用程序中翻译路线,请查看 route_translator gem。它允许翻译路由并附带许多配置选项,例如向生成的路径添加区域设置部分,或支持基于子域的应用程序。

【讨论】:

    【解决方案3】:

    根据我的经验,域不应该是确定语言环境的唯一因素。如果你只是把当前的语言环境放入一个cookie中,那就更容易了,这样用户就可以选择了!

    现在到您问题的翻译部分。我认为你应该改变你使用路由的方式。

    如果您将国家/地区视为资源,而将行动视为不同的部分,您的生活将会变得更轻松。模型to_param 方法可以帮助您:

    resource :country do
      get :weather, on: :member
      ...
    end
    

    这将产生像south-america/weather 这样的网址,但从我的角度来看,这在可读性和搜索引擎优化方面甚至更好。 google 过去非常喜欢路径。

    对于路径的不同翻译,您可以遍历域并为每个段提供翻译:http://guides.rubyonrails.org/routing.html#translated-paths

    【讨论】:

    • 不能更改 url 结构。 url 需要与正在迁移到 Rails 的现有站点的 url 匹配
    • 也没有涉及到资源。
    • 在这种情况下,我会使用 rack-rewrite 来处理迁移逻辑
    • 这不是一个选项。我的客户想要/需要这些网址。我只需要知道如何翻译它们。
    • 顺便说一句,我同意你所说的。这不是我的决定。
    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多