I18n:使用’t(:test_key)’,’t(’test_key’)’和’t(’。test_key’)’有什么区别?

我正在使用Ruby on Rails 3.1,我想知道如何何时以及为什么我应该使用以下代码而不是另一个代码来国际化我的应用程序( I18n gem ):

t(:test_key) t('test_key') t('.test_key') 

也就是说,使用t(:test_key)t('test_key')t('.test_key')之间的“微妙”区别是什么? 关于这个问题的最佳做法是什么?

我认为前两个是等价的,你只是在翻译中引用主键,例如

 t('hello_world') # t(:hello_world) is an equivalent 

会受到影响

 en: hello_world: "Hello world" 

但是,如果使用点表示法,则称为延迟查找,它将基于控制器/操作表示法在您的翻译结构中更深入

所以如果你在用户/索引模板中使用它

 t('.hello_world') 

它将被解决

 pl: users: index: hello_world: "Witaj świecie" 

您将在Rails指南中找到有关内部化的更多信息

我想这取决于你决定何时想要使用不同的,但我更喜欢在我的视图中尽可能多地使用延迟查找,除非你需要翻译一些键不存在的通用组件在你的观点范围内。

我更喜欢懒惰查找的原因是它使代码看起来更干净,只要你熟悉i18n gem的工作方式,你就不会有任何麻烦,知道在哪里寻找密钥。

另一方面,如果你有这样的组件,他们应该真的生活在局部, 细胞或类似的东西中。

关于非懒惰的一件事,值得一提的是,你可以为他们提供在哪里查找有关密钥的范围。 同样,你是否喜欢t('foo.bar.baz.test_key')t(:test_key, :scope => 'foo.bar.baz')取决于你。

它还需要一些其他选项,但所有这些都在rails指南中得到了很好的记录,所以我不会在这里进一步解释。