你如何在Rails中构建i18n yaml文件?

时间:2012-04-23 14:50:15

标签: ruby-on-rails ruby-on-rails-3 internationalization structure yaml

我开始在Rails中填充一个en yaml文件,我已经知道它会在太久之前变得混乱和失控。是否存在保持此文件有序的约定?

到目前为止,我有这样的结构:

language:
  resource:
    pages: # index, show, new, edit
      page html elements: # h1, title
  activerecord:
    attributes:
      model:
        property:

现在我有以下的东西可以融入这个结构,但我不确定如何:

  1. 导航
  2. 按钮文字(保存更改,创建帐户等)
  3. 来自控制器闪存的错误消息
  4. 如何添加多字密钥。我使用空格还是下划线?例如,t(".update button"))或t(".update_button")
  5. 区域设置文件结构是否有约定?

6 个答案:

答案 0 :(得分:60)

我发现最好的整体策略是稍微重现文件结构,以便在给定任何翻译的情况下,我可以立即找到它的调用位置。这给了我一些翻译的背景。

大多数应用程序翻译都在视图中找到,因此我最大的顶级命名空间通常是views

我为控制器名称创建子命名空间,并为ex:

使用操作名称或部分名称
  • views.users.index.title
  • views.articles._sidebar.header

这两个示例都应该明确我们正在翻译的应用程序的哪个部分以及要查找的文件。

你提到导航和按钮,如果它们是通用的,那么它们就像它们的视图对应物一样属于views.application命名空间:

  • views.application._main_nav.links.about_us - 我们应用主要导航部分中的链接
  • views.application.buttons.save
  • views.application.buttons.create - 我有一堆这些按钮可以在需要时使用

Flash消息是从控制器生成的,因此它们的顶级命名空间是...... controllers! :)

我们对视图应用与我们相同的逻辑:

  • controllers.users.create.flash.success|alert|notice

再次,如果你想提供像“操作成功”这样的通用flash消息,你可以这样写:

  • controllers.application.create.flash.notice

最后,密钥可以是任何有效的YAML,但请坚持使用句点.作为分隔符,并在单词之间强调_作为惯例。

现在唯一需要解决的问题是将rails的翻译放入自己的命名空间以清理我们的顶层:)

答案 1 :(得分:48)

我知道答案已被接受,但这个问题为我提供了一些思考的东西,我想我会为Rails i18n yml文件分享另一个结构供您考虑/批评。

鉴于我想

  1. 保留默认的应用结构,以便在我的观看中使用简写的“懒惰”查找,例如t('.some_translation')
  2. 避免尽可能多的字符串重复,特别是单词不仅相同,但也有相同的上下文/含义,
  3. 只需更改一次密钥就可以反映出它所引用的任何地方,
  4. 对于 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
    

    我可以看到存在重大的重复,并且诸如“电子邮件”和“密码”之类的词语的上下文是明确的并且在它们各自的视图中具有相同的含义。如果我决定将“电子邮件”更改为“电子邮件”,那么必须去更改它们会有点烦人,所以我想重构字符串以引用某种字典。那么,如何使用这样的&个锚点将字典哈希添加到文件的顶部:

    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
    

    每当您在视图中获得完全相同的单词/短语的多个实例时,您可以将其重构为字典。如果基本语言中的键的字典翻译对目标语言没有意义,则只需将目标语言中的引用值更改为静态字符串,或将其作为额外条目添加到目标语言的字典中。我确信每种语言的字典都可以重构成另一个文件,如果它们变得太大而且难以处理。

    这种构建i18n yaml文件的方式似乎适用于我尝试过的一些本地测试应用程序。我希望美妙的Localeapp将来会为这种锚定/引用提供支持。但无论如何,所有这些词典谈话都不可能是一个原创的想法,所以YAML中的锚点引用还有其他问题吗,或者可能只是整个“字典”概念?或者仅仅完全删除默认后端并用Redis或其他东西替换它会更好吗?

答案 2 :(得分:8)

您的问题不容易回答,而且该主题的材料不多。我发现最好的资源是:

所以我将在这里直接尝试:

  • 导航

    我认为你的意思是导航元素,如面包屑,标签,...... 您必须为它们定义视图,然后坚持使用规则将所有视图元素移动到目录views中的单独文件中(请参阅规则的样式指南)。

  • 按钮文字(保存更改,创建帐户等)

    查看元素,也可以进入相同的文件。如果在不同视图中使用相同的按钮,请定义一个公共文件,然后使用该文件。

  • 来自控制器闪存的错误消息

    我会使用与视图相同的规则。定义一个单独的目录,包括控制器的文件。

  • 如何添加多字密钥。我使用空格还是下划线?例如,t(“。更新按钮”))或t(“。update_button”)

    我个人更愿意使用.update_button,而不是.update button,因为它更明确地说这只是一个关键。

答案 3 :(得分:8)

在我提出这个问题差不多两年之后,我想分享一些见解。我认为最佳结构是根据MVC角色(模型,视图,控制器)命名空间。这样可以使语言环境文件保持整洁,并防止命名空间冲突(例如,范围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中的延迟查找功能。如果您使用延迟查找,Rails将自动为您插入命名空间,并且它不会包含您创建的顶级命名空间(viewscontrollers等...)。

例如,t('.welcome_flash')的范围解析为en.users.show。这很糟糕,因为用户没有明确定义。它是什么?控制器?一个看法?还有别的吗?

解决此问题I created the gem I18nLazyLookup。它允许您使用自己的自定义命名空间进行延迟查找。

您可以使用t而不是t_scoped('welcome_flash'),而是自动将范围解析为en.controllers.users.show。它也适用于视图和邮件程序,您可以按自己喜欢的方式自定义命名空间。

答案 4 :(得分:6)

直接编辑yaml文件会导致文件混乱和不可读 此外,如果有一天您希望非开发人员添加新语言,那么您很难提供对翻译人员的访问权。

我建议使用生成单个yaml文件的localeapp 但是,您可以在Web界面中轻松查看和管理您的翻译 并创建额外的翻译访问权限。

答案 5 :(得分:0)

战斗结束几年后,但这是一个(有点完全)不同的答案。

首先,我不喜欢基于文件结构的默认命名空间的标准t('.xxx')样式。我也不太喜欢根据DOM结构对翻译进行分类。虽然对于非常结构化的翻译来说这是一个很好的方法,但它通常是重复的,而且不是很直观。

我宁愿将我的翻译重新组合成更有用的类别,以便让我的翻译更容易,因为他们可以处理具体的主题,而不是一些奇怪的风格(有些翻译甚至不知道MVC的含义)< / p>

所以我的翻译文件结构如下

fr:
  theme1:
    theme11:
      translationxxx: blabla
  theme2:
    translationyyy: blabla

根据需要,“主题”可以是模型,更抽象的背景等,对翻译人员来说是最直观的。

因为每次在我的视图中编写范围都会很麻烦,所以我在助手中添加了一些方便的方法来获得基于堆栈的翻译上下文。

  • 我通过调用t_scope([new_scope]pop_t
  • 在我的观看中推送/弹出翻译范围
  • 我覆盖t帮助器以使用堆栈的最后一个范围

that answer

中提供了翻译范围方法的代码