Rails 4 i18n, как переводить маршруты, где субдомен используется для локали

Я использую поддомены для определения локали на веб-сайте Rails 4. У меня это работает с переключателем локали именно так, как я этого хочу, но теперь мне нужно перевести маршруты, и я не уверен, как лучше поступить.

Я просмотрел https://github.com/kwi/i18n_routing гем маршрутизации i18n, но это не работает с субдоменами, это кажется, меняет путь, добавляя /locale, что мне не нужно.

Другие драгоценные камни, кажется, устарели с Rails 4.

Изменить

По сути, я хочу иметь возможность использовать одни и те же помощники представления, но изменить URL-адреса, чтобы использовать любой язык, отражаемый выбранным поддоменом. это как раз о переводе маршрута.

У меня есть шаблоны для конкретного языка, которые работают, и я могу создавать шаблоны навигации для конкретного языка, но мне бы очень хотелось не беспокоиться об изменении тегов erb path и url.

Завершить редактирование

Образец с route.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 генерировал следующий URL-адрес

отели в южной америке

ОБНОВЛЕНИЕ

Кроме того, как это будет работать для URL-адреса, а не просто для пути, чтобы генерировала south_america_hotels_url

en.some_site/южная-америка-размещение

и когда на испанском поддомене я получу

es.some_site/hoteles-en-sudamerica

и так далее для разных задействованных локалей.

Я с удовольствием использую файлы yml для переводов URL-адресов или для определения дополнительных маршрутов в файле route.rb, либо это вариант, но я бы предпочел определить URL-адреса в route.rb, но я не могу найти способ предоставить URL-адреса для конкретного языка для одного и того же параметра :as path/url на основе поддомена.

Обновление и дополнительные разъяснения в ответ на предыдущие ответы.

Изменение URL-адреса не вариант, они должны соответствовать существующим URL-адресам. Мне просто нужно знать, как перевести их с точки зрения хелперов без необходимости менять хелперы.


person jamesc    schedule 09.12.2013    source источник
comment
Вы смотрели руководство по Rails i18n? В нем объясняется, как использовать поддомены для настройки локали. Перевод маршрутов — это то, что Rails не делает из коробки; взгляните на rails-translate-routes или route_translator для этого.   -  person janfoeh    schedule 17.12.2013
comment
@janfoeh Я полностью доволен тем, как я работаю с поддоменами, у меня проблемы только с переводом маршрута. Драгоценные камни, на которые вы указываете, не подходят для моих нужд. Наверняка это можно сделать без использования драгоценного камня   -  person jamesc    schedule 17.12.2013


Ответы (3)


ИЗМЕНИТЬ:

Этот драгоценный камень - мой рекомендуемый способ сделать это. Поддерживает несколько языков без перезагрузки маршрутов (чего не было в моем примере). Вам нужно изменить очень мало вещей, но это более последовательно, чем код ниже. переводчик маршрутов

Исходный ответ (не работает):

Это то, что сработало для меня, вы можете попробовать, например, в своих маршрутах вы можете указать:

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"

Таким образом, вы отобразите страницы #index и страницы #contact, и он изменит только маршрут, вам не нужно трогать свой код. Надеюсь, это поможет вам

person joseramonc    schedule 17.12.2013
comment
Потрясающий. Большое спасибо за подробное объяснение, я могу легко реализовать это, и это именно то, что я искал - person jamesc; 18.12.2013

По моему опыту, домен не должен быть единственным, что определяет локаль. Будет намного проще, если вы просто поместите текущую локаль в файл cookie, чтобы пользователь мог выбрать в конце!

Теперь к части перевода вашего вопроса. Я думаю, вам следует изменить способ использования маршрутизации.

Если вы будете рассматривать страны как ресурсы, а действия как другую часть, вы облегчите себе жизнь. Метод модели to_param может помочь вам в этом:

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

Это приведет к URL-адресам, подобным south-america/weather, но, с моей точки зрения, это даже лучше с точки зрения удобочитаемости и поисковой оптимизации. Google очень любил пути.

Для различных переводов ваших путей вы можете выполнить итерацию по своим доменам и предоставить перевод для каждого сегмента: http://guides.rubyonrails.org/routing.html#translated-paths

person phoet    schedule 11.12.2013
comment
Изменение структуры URL-адреса не вариант. URL-адреса должны совпадать с URL-адресами существующего сайта, который переносится на Rails. - person jamesc; 11.12.2013
comment
Также нет задействованных ресурсов. - person jamesc; 11.12.2013
comment
в этом случае я бы использовал перезапись стойки для обработки логики миграции - person phoet; 11.12.2013
comment
Это не вариант. Мой клиент хочет / нуждается в URL-адресах такими, какие они есть. Мне просто нужно знать, как их перевести. - person jamesc; 11.12.2013
comment
Кстати, я согласен с тем, что вы говорите. Это не мой звонок. - person jamesc; 11.12.2013
comment
у него есть технические ограничения? если речь идет о SEO, перенаправление старых URL-адресов на новую схему с переадресацией 301 является обычной практикой. - person phoet; 12.12.2013
comment
Никаких технических ограничений. У клиента есть URL-адреса, которые ему нужны, и они хотят, чтобы они оставались прежними. У меня есть некоторые технические ограничения в организации контроллеров, поскольку у меня есть автоматизированные навигационные цепочки и карта сайта, которые предполагают наличие иерархии контроллеров, поэтому страны охватывают неглубокие маршруты. Есть более 800 страниц для учета более тысячи маршрутов для очень загруженного веб-сайта. На самом деле, все, что мне нужно знать, это как переводить маршруты. Даже если я разберусь с редиректами, я все равно столкнусь с той же проблемой. - person jamesc; 12.12.2013
comment
Как вы думаете, это возможно достичь? - person jamesc; 12.12.2013
comment
Я думаю, что все, что вы хотите построить, должно быть возможным. Я просто недостаточно знаю о вашей проблемной области, чтобы дать хороший совет. Просто начните с самого простого и двигайтесь дальше! - person phoet; 12.12.2013
comment
Самое простое, что у меня есть, это URL-адрес на английском языке, все, что мне нужно сделать сейчас, это преобразовать те же вспомогательные пути и URL-адреса для создания испанских URL-адресов из испанского поддомена. Таким образом, мои навигационные ссылки и ссылки, используемые на всем сайте, не нужно будет заменять другими путями в тегах link_to erb. Есть смысл? Спасибо за вашу настойчивость в этом. Это ценится. Позор, я не могу добавить несколько голосов благодарности - person jamesc; 12.12.2013
comment
вы пробовали перебирать все ваши поддомены, прописывая маршруты? при использовании правильных областей и всегда одних и тех же имен рельсы должны иметь возможность разрешать все правильные маршруты даже при использовании вспомогательных путей. - person phoet; 13.12.2013
comment
Я просмотрел ссылку, которую вы предоставили в своем ответе по этому поводу, но не был уверен в реализации вашего предложения, поэтому нет, я не пробовал, но хотел бы попробовать, если бы понял предложение :) - person jamesc; 13.12.2013
comment
Маршруты Rails — это просто код. Вы можете загрузить файл yaml со всеми путями и переводами и просто перебирать их. Это должно работать, если все уникально по заданному масштабу, который у вас есть, это страна. - person phoet; 13.12.2013

Чтобы перевести маршруты в приложении Rails 4+, воспользуйтесь route_translator. драгоценный камень. Он позволяет переводить маршруты и поставляется с рядом параметров конфигурации, таких как добавление раздела локали к сгенерированным путям или поддержка приложения на основе субдомена.

person Thomas Klemm    schedule 23.04.2015