7

在过去的几个小时里,我一直在挠头,寻找答案,但我在任何地方都找不到。

我的宝石文件:

# Use globalize for translating models
gem "globalize", github: "ncri/globalize" # for Rails 4.2
gem 'globalize-accessors', '~> 0.1.5'

# Use friendly_id for slugs
gem 'friendly_id', '~> 5.1.0'
gem 'friendly_id-globalize', '~> 1.0.0.alpha1'

情况如下:

我有两种语言“en”和“fr”

2 个模型: pages 和 pages_translations pages 有一个 slug 列, pages_translations 也有一个 slug 列。

如果我查看页面 -> en/pages/slug-en,它可以工作。

如果我查看页面-> fr/pages-slug-fr,它可以工作。

所以我假设friendly_id 和globalize 配置正确。

但是我的问题是我无法使用以下方法使语言切换器工作:

  <% if I18n.locale != :en %>
    <li>
    <%= link_to t('menu.languages.short_en'), url_for(locale: 'en') %>
    </li>
<% end %>

路线变成 en/pages/slug-fr (即语言改变,但不是 slug)。

我已经在初始化程序中激活了 config.use :finders。

我的页面模型:

translates :title, :slug, :blurb, :content, :seo_title, :seo_description, :seo_keywords
  globalize_accessors :locales => [:en, :fr], :attributes => [:title, :slug, :blurb, :content, :seo_title, :seo_description, :seo_keywords]

    extend FriendlyId
      friendly_id :slug, :use => :globalize
      validates :slug, presence: true, uniqueness: { case_sensitive: false }

那么我需要做什么才能在我的语言切换器上设置正确的路径?理想情况下,我希望它适用于任何模型,而不仅仅是 Page 模型。

谢谢!- 文森特

4

1 回答 1

0

我相信您url_for在全局布局中针对不同的控制器。在这种情况下,您必须在每个控制器中设置某些记录(您可以制作助手或将所有内容移动到路由器/中间件级别)。url_for(page)必须运行I18n.with_locale并且可能需要https://github.com/norman/friendly_id-globalize

可以在此处找到更多信息:https ://github.com/norman/friendly_id-globalize/issues/7和http://www.cantierecreativo.net/blog/2015/02/10/alternate-sitemap/(在一些语言,但示例可以帮助您理解整个概念)。

TL;博士

# app/views/layouts/application.html.slim
ul.switch_locale
  - I18n.available_locales.each do |locale|
    li= I18n.with_locale(locale) do
      - url = yield(:current_page_url) || url_for(locale: locale)
      = link_to "Switch to #{locale}", url

# app/views/posts/show.html.slim
- content_for(:current_page_url) { post_url(@post) }
于 2015-09-03T13:05:05.173 回答