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

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

  • 为每个语言环境创建一个部分,并根据当前用户的语言环境选择要加载的语言环境。

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

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

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

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

见http://guides.rubyonrails.org/i18n.html

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

  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) 。 现在,您用来获取文档的代码是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以及根据需要读取文件的自定义后端,但对于一次性交易,我相信帮助程序可以正常工作。