链接到其他语言环境中的相应路径(rails)

时间:2016-09-14 13:48:39

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

我在Ruby on Rails 4中有一个多语言应用程序。为此,我使用以下域:

  • 瑞典语:exempel.se
  • 英文:example.com
  • 法语:fr.example.com
  • 西班牙语:es.example.com

我希望能够链接到另一个相应语言环境中的相应路径。例如,如果我在www.exempel.se/denna-bloggpost,我希望能够轻松地链接到(英语/西班牙语/法语)到例如www.example.com/this-here-blog-post和es.example.com/este-posto-de-bloggo(对不起,不会说西班牙语:))。

我理解这是通过link_to 'Spanish', locale => :es完成的,但这会给我一个不是我想要的网址www.exempel.se/denna-bloggpost?locale=es。我希望能够访问es.example.com/esto-posto-de-bloggo

似乎default_url_options与此有关,但我无法使其发挥作用。

我该如何解决这个问题?

编辑(2017-03-30):我还需要这个部分中的hreflang解决方案。

我正在使用route_translator gem。

我已经看到了几种解决方案,但它们都包含?locale=en的解决方案,或者只是简化(例如,仅适用于单个控制器)。我希望的是一个可以做到这样的解决方案:

<% I18n.available_locales.each |locale| do %>
 <% I18n.t(this route e.g. /denna-bloggpost) #=> /este-posto-de-bloggo, /this-blog-post, /le-post-du-blog %>
<% end %>

3 个答案:

答案 0 :(得分:1)

为了创建这样的动态映射,您必须在应用程序配置中定义类似的内容:

APP_CONFIG = {
  # ...
  base_urls: {
    se: 'exempel.se',
    en: 'example.com',
    fr: 'fr.example.com',
    es: 'es.example.com'
  }
  # ...
}

(当然,它不一定需要采用这种格式;这只是一个例子。)

在区域设置切换菜单中,您可以像这样定义链接:

link_to("French", "#{APP_CONFIG[:base_urls][:fr]}#{request.env['PATH_INFO']}")

为了在您的应用中实际设置区域设置,您可以在ApplicationController中放置类似的内容:

class ApplicationController
  before_action :set_locale

  def set_locale
    I18n.locale = APP_CONFIG[:base_urls].key(request.host) || I18n.default_locale
  end
end

有关详细信息,请参阅此处:http://guides.rubyonrails.org/i18n.html#managing-the-locale-across-requests

答案 1 :(得分:1)

您可以使用route_translator为您生成的特定于语言环境的路由。运行rake routes以查看这些内容。然后:

# Create links for every other locale
<% (I18n.available_locales - I18n.locale).each |locale| do %>
  # Example URL helper here - replace with your own!
  <%= Rails.application.routes.url_helpers.send("posts_#{locale}_url",
 'denna-bloggpost') %>
<% end %>

答案 2 :(得分:0)

这个问题已被多次回答。我认为最简单的方法是

<%= link_to "ру", request.params.merge( locale: 'ru' ) %>