在Rails 3中使用标记使整个文本国际化

时间:2011-02-04 08:38:58

标签: ruby-on-rails ruby-on-rails-3 internationalization translation

将Rails 3中的服务条款文档国际化的最佳做法是什么?我可以想到两个选择:

  • 为每个区域设置创建一个部分区域,并根据当前用户的区域设置选择要加载的区域设置。
  • <li><%= I18n.t :tos_paragraph_1 %></li><li><%= I18n.t :tos_paragraph_2 %></li>

这些似乎都不是一个好的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

有一些解决方案,但如果我在生产项目中这样做,我可能会做类似以下的事情:

  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
    
  3. 现在,在您的观看中,只要您需要以用户的语言获取服务条款的内容,就可以使用localized_document_for('terms', I18n.locale)。现在,您用来获取文档的代码是DRY(您可以通过在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 :(得分:1)

为每种语言创建一个部分是绝对的。

Rails方式是您建议的每种语言的.yml的第二个选项。

该文档提供了很好的示例,让您可以根据每个页面组织yml。因此,您拥有所有变量的快捷方式。

请参阅http://guides.rubyonrails.org/i18n.html