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

Júl*_*tos 2 translation ruby-on-rails internationalization ruby-on-rails-3

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

  • 为每个语言环境创建一个部分,并根据当前用户的语言环境选择要加载的语言环境.
  • <li><%= I18n.t :tos_paragraph_1 %></li><li><%= I18n.t :tos_paragraph_2 %></li>

这些似乎都不是一个好的解决方案.有任何想法吗?

Mic*_*ley 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
    
    Run Code Online (Sandbox Code Playgroud)

现在,在您的视图中,您可以随时使用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使用自定义的后端读取这些文件作为必要的,但对于一次性的交易,我相信足够的帮手一起工作.