Интернационализация всего текста с разметкой в ​​Rails 3 - PullRequest
2 голосов
/ 04 февраля 2011

Какова лучшая практика для интернационализации, скажем, документа «Условия обслуживания» в Rails 3? Я могу придумать два варианта:

  • Создание частичного для каждой локали и выбор того, какой из них загружать в соответствии с локалью текущего пользователя.
  • <li><%= I18n.t :tos_paragraph_1 %></li><li><%= I18n.t :tos_paragraph_2 %></li>

Ничто из этого не кажется хорошим решением. Есть идеи?

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Есть несколько решений, но если бы я делал это для производственного проекта, я бы, вероятно, сделал что-то вроде следующего:

  1. Создайте файлы для ваших переведенных Условий предоставления услуг в config/locales/terms/, назвав их terms.en.html, заменив en языком для каждого перевода и html форматом файла (например, вы можете использовать Haml, Markdown и т. д.).
  2. Создайте следующие вспомогательные методы (поместите их в app/helpers/application_helper.rb, чтобы использовать их везде, но вы можете поместить их в любой вспомогательный файл, который вам нужен / нужен):

    def localized_document_for(document, locale)
      raise ArgumentError.new('nil is not a valid document') if document.nil?
      raise I18n::InvalidLocale.new('nil is not a valid locale') if locale.nil?
      localized_document = path_for_localized_document(document, locale)
      raise MissingTranslationData unless File.exists?(localized_document)
      # If you're using Markdown, etc. replace with code to parse/format your document
      File.open(localized_document).readlines.join
    end
    
    def path_for_localized_document(document, locale)
      "#{Rails.root}/config/locales/#{document}/#{document}.#{locale.to_s}.html"
    end
    

Теперь, по вашему мнению, вы можете использовать localized_document_for('terms', I18n.locale) в любое время, когда вам нужно получить содержание Условий обслуживания на языке пользователя. Теперь код, который вы используете для извлечения документа, является СУХИМ (вы можете легко извлечь другие документы, создав другой каталог в config/locales и изменив значение аргумента document), и ваши переведенные документы будут храниться в их собственном каталоге и может быть легко отредактирован (и не зависит от YAML, который не имеет никакого значения для хранения одного документа в файле).

Обратите внимание, что если вы хотите сделать это "Rails 3 Way", вы можете использовать I18n::Backend::Chain (см. https://github.com/svenfuchs/i18n/blob/master/lib/i18n/backend/chain.rb), и передать I18n::Backend::Simple.new вместе с пользовательским бэкэндом, который читает файлы по мере необходимости. , но для разовой сделки я считаю, что помощники работают достаточно.

1 голос
/ 04 февраля 2011

Создание партиала для каждого языка определенно не выполняется.

Путь Rails - это второй вариант, который вы предлагаете с .yml для каждого языка.

В документе приведены отличные примеры, позволяющие организовать yml в соответствии с каждой страницей. Таким образом, у вас есть ярлыки для всех ваших переменных.

См. http://guides.rubyonrails.org/i18n.html

...