Link 到其他语言环境中的相应路径 (rails)
Link to corresponding path in other locale (rails)
我在 Rails 4 上的 Ruby 中有一个多语言应用程序。为此,我使用以下域:
- 瑞典语:exempel.se
- 英语:example.com
- 法语:fr.example.com
- 西班牙语:es.example.com
我希望能够link到另一个相应语言环境中的相应路径。例如,如果我在 www.exempel.se/denna-bloggpost,我希望能够轻松地 link 到 (English/Spanish/French) 到例如www.example.com/this-here-blog-post 和 es.example.com/este-posto-de-bloggo(抱歉,不会说西班牙语 :))。
我知道这是用 link_to 'Spanish', locale => :es
完成的,但这给了我 url 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 %>
为了创建这样的动态映射,您可能必须在应用程序配置中定义如下内容:
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
您可以使用 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 %>
这个问题已被多次以多种方式解决。然而我认为最简单的方法是
<%= link_to "ру", request.params.merge( locale: 'ru' ) %>
我在 Rails 4 上的 Ruby 中有一个多语言应用程序。为此,我使用以下域:
- 瑞典语:exempel.se
- 英语:example.com
- 法语:fr.example.com
- 西班牙语:es.example.com
我希望能够link到另一个相应语言环境中的相应路径。例如,如果我在 www.exempel.se/denna-bloggpost,我希望能够轻松地 link 到 (English/Spanish/French) 到例如www.example.com/this-here-blog-post 和 es.example.com/este-posto-de-bloggo(抱歉,不会说西班牙语 :))。
我知道这是用 link_to 'Spanish', locale => :es
完成的,但这给了我 url 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 %>
为了创建这样的动态映射,您可能必须在应用程序配置中定义如下内容:
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
您可以使用 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 %>
这个问题已被多次以多种方式解决。然而我认为最简单的方法是
<%= link_to "ру", request.params.merge( locale: 'ru' ) %>