将Rails 3中的服务条款文档国际化的最佳做法是什么?我可以想到两个选择:
<li><%= I18n.t :tos_paragraph_1 %></li><li><%= I18n.t :tos_paragraph_2 %></li>
这些似乎都不是一个好的解决方案。有什么想法吗?
答案 0 :(得分:6)
有一些解决方案,但如果我在生产项目中这样做,我可能会做类似以下的事情:
config/locales/terms/
中为您翻译的服务条款创建文件,为其命名terms.en.html
,将en
替换为每个翻译的区域设置,将html
替换为文件格式(例如,您可以使用Haml,Markdown等)。创建以下帮助器方法(将它们放在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
和自定义后端一起传入根据需要读取文件,但对于一次性交易,我相信帮助者工作充分。
答案 1 :(得分:1)
为每种语言创建一个部分是绝对的。
Rails方式是您建议的每种语言的.yml的第二个选项。
该文档提供了很好的示例,让您可以根据每个页面组织yml。因此,您拥有所有变量的快捷方式。