2016-09-14 4 views
1

У меня есть многоязычное приложение в Ruby On Rails 4. За то, что я использую следующие домены:Ссылка на соответствующий путь в других локали (рельсы)

  • Шведские: exempel.se
  • English: example.com
  • Французский: fr.example.com
  • Испанский: es.example.com

Я хочу, чтобы иметь возможность сделать ссылку на соответствующий путь в другом correspo noding locale. Например, если я нахожусь по адресу www.exempel.se/denna-bloggpost, я хочу иметь возможность легко ссылаться на (английский/испанский/французский), например. 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.

Я видел несколько решений для этого, но все они включают решения с ?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 %> 
+0

Считаете ли вы решение, где ссылка на 'www.exempel.se/denna-bloggpost локаль = es', но при нажатии этого перенаправляет вас' es.exempel.com/? Denna-bloggpost'? –

+0

Я бы предпочел не подумать об этом, так как это, скорее всего, смутит Google. – Christoffer

ответ

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 %> 
+0

Спасибо, это, наверное, отлично работает, но это пока не общее решение, так как оно требует «posts_». Таким образом, мне нужно определить это для каждого другого представления и не иметь его в application.html.erb. – Christoffer

+0

@Christoffer: для более общего решения вы можете заменить '' posts ''на' имя_контроллера', например. 'Rails.application.routes.url_helpers.send (" # {имя_контроля} _ # {locale} _url ", params ['slug'])' – gwcodes

+0

Ах, отлично! Тогда это будет сделано! – Christoffer

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

+0

Спасибо за помощь, но ваше решение не работает из-за того, что request.env ['PATH_INFO'] собирает текущий путь, например (/ denna-bloggpost), и добавляет его в base_url для создания «es.example.com/ denna-bloggpost "вместо es.example.com/este-posto-de-bloggo. Я думал, что для этого будет более «элегантное» решение, используя: locale =>: es, но просто скажите Rails, вместо того, чтобы использовать? Locale = es использовать мою url-систему по умолчанию. Разве нет такого решения? – Christoffer

+0

Ах, извините, я забыл этот момент. Таким образом, вам нужно всего лишь создать некоторую функцию, которая отображает текущий маршрут (возможно, с текущей локалью), на соответствующий маршрут для другого языка? Например. 'translate_route (" denna-bloggpost ",: en,: fr) ==" este-posto-de-bloggo "'? Что похоже на очень специфичную для приложения проблему, поэтому мне нужно будет узнать больше о том, как работает ваша модель маршрутизации, но я не думаю, что создание такого метода было бы слишком сложным? –

+0

Кроме того, быстрый поиск по Google нашел меня [это] (https://github.com/enriclluelles/route_translator), что может потенциально помочь ... –

Смежные вопросы