你如何在Rails中构buildi18n yaml文件?
我开始在Rails中填充一个en yaml文件,我已经可以告诉它在太久之前会变得杂乱无章。 有没有一个约定来保持这个文件的组织?
到目前为止,我有这样的结构:
language: resource: pages: # index, show, new, edit page html elements: # h1, title activerecord: attributes: model: property:
现在我有以下的东西,我想适应这种结构,但我不确定如何:
- 导航
- button文字(保存更改,创build帐户等)
- 控制器闪存中的错误消息
- 如何添加多字键。 我使用空格还是下划线? 例如,
t(".update button")
)或t(".update_button")
是否有一个地方文件结构的约定?
我发现最好的总体策略是稍微复制文件结构,以便给出任何翻译,我可以立即find它的来源。 这给了我一些翻译的背景。
大部分应用程序翻译都在视图中find,所以我最大的顶级命名空间通常是views
。
我为控制器名称和操作名称或正在使用的部分创build了子命名空间:
-
views.users.index.title
-
views.articles._sidebar.header
这两个例子都应该明确我们正在翻译的应用程序的哪一部分以及要查找哪个文件。
你提到的导航和button,如果他们是通用的,那么他们属于views.application
命名空间,就像他们的视图对应:
-
views.application._main_nav.links.about_us
– 在我们的应用程序的主要导航部分链接 -
views.application.buttons.save
-
views.application.buttons.create
– 我有一堆这些button准备在需要时使用
Flash消息是从控制器生成的,所以他们的顶级命名空间是… controllers
! 🙂
我们应用与观看相同的逻辑:
-
controllers.users.create.flash.success|alert|notice
同样,如果你想提供像“操作成功”这样的通用Flash消息,你可以写下如下的内容:
-
controllers.application.create.flash.notice
最后,键可以是任何有效的YAML,但请坚持使用句点.
作为分隔符和下划线之间的字符作为惯例。
现在唯一需要解决的就是将rails的翻译到自己的命名空间来清理我们的顶层:)
我知道一个答案已经被接受了,但是这个问题为我提供了一些思考的东西,我想我会分享另一个Rails i18n yml文件结构供您考虑/批评。
鉴于我想
- 保持默认的应用程序结构,以便我可以在我的视图中使用简写“懒”查找,如
t('.some_translation')
, - 避免尽可能多的string重复,特别是不仅仅是相同的字,而且具有相同的上下文/含义,
- 只需要一次更改一个密钥,以反映它到处引用的位置,
对于一个config / locales / en.yml文件,看起来像这样:
activerecord: attributes: user: email: Email name: Name password: Password password_confirmation: Confirmation models: user: User users: fields: email: Email name: Name password: Password confirmation: Confirmation sessions: new: email: Email password: Password
我可以看到有很大的重复,像“电子邮件”和“密码”这样的词语是毫不含糊的,而且在各自的意见中也有相同的含义。 如果我决定改变“电子邮件”到“电子邮件”,那么要去改变它们会有点麻烦,所以我想重新构造string来引用某种字典。 那么,如何将字典散列添加到文件顶部,并使用以下锚点:
dictionary: email: &email Email name: &name Name password: &password Password confirmation: &confirmation Confirmation activerecord: attributes: user: email: *email name: *name password: *password password_confirmation: *confirmation models: user: User users: fields: email: *email name: *name password: *password confirmation: *confirmation sessions: new: email: *email password: *password
每当在视图中获得多个完全相同的单词/短语的实例时,可以将其重构为字典。 如果基本语言中的键的字典翻译对目标语言没有意义,那么只需将目标语言中的引用值更改为静态string或将其作为额外条目添加到目标语言的字典中即可。 我敢肯定,如果语言太大,笨重,每种语言的字典都可能被重构成另一个文件。
这种构buildi18n yaml文件的方法似乎适用于我尝试使用的一些本地testing应用程序。 我希望美好的Localeapp将在未来提供这种锚定/参考的支持。 但是,无论如何,这个词典的谈话不可能是一个原创的想法,那么在YAML中还有其他的关于锚定参考的问题,或者说整个“词典”概念呢? 还是仅仅更好地将默认的后端全部取出并用Redis或其他东西代替呢?
你的问题不容易回答,关于这个话题没有太多可用的材料。 我发现最好的资源是:
- Rails Styleguide ,国际化部分
- I18n wiki中有很多资源,但是我没有find可以回答你的问题的资源。
所以我会直接在这里试一试:
-
导航
我想你的意思是在这里的导航元素,如面包屑,标签,…你必须为他们定义视图,然后坚持规则将所有视图元素在目录
views
中单独的文件(请参阅规则styleguide) 。 -
button文字(保存更改,创build帐户等)
查看元素,进入相同的文件。 如果你在不同的视图中使用相同的button,定义一个公共文件,然后使用它。
-
控制器闪存中的错误消息
我会使用与视图相同的规则。 定义一个单独的目录,包含控制器的文件。
-
如何添加多字键。 我使用空格还是下划线? 例如,t(“。update button”))或t(“。update_button”)
我个人更喜欢使用
.update_button
,而不是.update button
,因为它更明确地表明这是一个关键。
我问这个问题差不多两年了,我想分享一些见解。 我相信最佳的结构是根据MVCangular色(模型,视图,控制器)命名空间翻译。 这将保持语言环境文件整洁,并防止命名空间冲突(例如,范围en.users
可以表示视图或控制器)。
en: controllers: users: show: welcome_flash: "Welcome back!" mailers: users_mailer: welcome_email: subject: "Good of you to join us" views: users: show: notice: "Oh no!
但是使用这样整洁的命名空间打破了Rails中懒惰的查找function。 如果使用惰性查找,Rails将自动为您插入名称空间,并且不会包含您创build的顶级命名空间( views
, controllers
等)。
例如, t('.welcome_flash')
parsing为en.users.show
。 因为用户没有明确的定义,这太臭了。 它是什么? 控制器? 一个看法? 别的东西?
为了解决这个问题, 我创build了gemI18nLazyLookup 。 它允许您使用惰性查找与您自己的自定义名称空间。
您可以使用t_scoped('welcome_flash')
来代替使用t
,并自动将范围parsing为en.controllers.users.show
。 它也适用于视图和邮件程序,您可以按自己喜欢的方式自定义命名空间。
直接编辑yaml文件导致混乱和不可读的文件。
而且,如果有一天,您希望非开发人员添加新的语言,您将很难提供翻译。
我会build议使用localeapp ,它会生成一个yaml文件。
但是,您可以通过网页界面轻松查看和pipe理您的翻译。
并创造额外的访问翻译。
战斗结束后几年,但这是一个(有点完全)不同的答案。
首先,我不喜欢使用基于文件结构的默认名称空间的标准t('.xxx')
样式。 我也不太喜欢根据DOM结构进行翻译的分类。 虽然这是一个非常有条理的翻译的好方法,但它往往是重复的,不是很直观。
我宁愿将我的翻译重新组合成更有用的类别,以便我的翻译员更容易,因为他们可以处理具体的主题,而不是一些奇怪的风格(一些译者甚至不知道MVC的含义)
所以我的翻译文件是这样的结构
fr: theme1: theme11: translationxxx: blabla theme2: translationyyy: blabla
根据需要,“主题”可以是一个模型,一个更抽象的上下文等,这是最直观的翻译。
因为每次在我的视图中编写范围都会很麻烦,所以我在帮助者中添加了一些便利方法来创build一个基于栈的转换上下文。
- 我在视图中通过调用
t_scope([new_scope]
和pop_t
- 我重写了帮助器来使用堆栈的最后一个范围
该答案中提供了翻译范围方法的代码