重构的Ruby on使用字典Rails的国际化YAML文件(Refactoring Ruby on

2019-06-25 14:46发布

这个 StackOverflow的问题给我吃了什么是国际化的Rails文件结构好想法,所以我想我会分享另一种结构重构Rails的国际化阳明文件供大家参考/批评。

鉴于我想

  1. 保持默认的应用程序结构,使我可以像使用速记“懒”查找t('.some_translation')在我的看法,以及具有地方翻译在应用程序中使用的想法,
  2. 避免尽可能多串的重复成为可能,尤其是与不是一样的,但也有相同的背景/含义的词语,
  3. 只需要改变一下按键有它处处体现出它的引用,

对于配置/区域设置/ 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

你仍然可以继续使用静态字符串(如“用户”以上),但每当你在你的观点得到完全相同的词/短语的多个实例,你可以重构它到字典中。 如果基本语言的一个关键的字典翻译不使一个目标语感,然后就在目标语言的参考价值变出一个静态字符串或将其添加为一个额外的进入目标语言的字典。 我敢肯定,每种语言的字典可重构出到另一个文件,如果他们得到过大而笨重(只要再得到在翻译文件的顶部重新导入所以引用工作)。

结构化国际化YAML文件,这种方式似乎与一些本地测试应用程序我想它在很好地工作。 我希望精彩Localeapp将提供这种锚定/在未来引用的支持。 但无论如何,这一切字典谈话不可能是原来的想法,所以与锚YAML引用,或者只是与一般的整个“字典”的概念有其他问题? 或者只是最好只撕裂了默认的后台完全,取而代之的是Redis的什么的,如果你有超越Rails的默认国际化惯例的需求?

编辑

我想尝试和地址凶猛的工作流程例如在下面在这里,而不是如下面他的回答其他评论的评论中提及。 请原谅我,如果我不似乎越来越被提出的观点,或者如果我只是天真:

要点1:你有一个一般的“名称”属性ActiveRecord的模式,他们都只是指向通用字典的名称:

dictionary:
  name: &name Name

activerecord:
  attributes:
    name: *name
    user:
      name: *name
    product:
      name: *name

要点2:名称为用户模型只需要改变。 其他名称保持不变。

选项1:保持模型的字段名称相同的后端,只是改变前端翻译它指向。

dictionary:
  name: &name Name
  full_name: &full_name Full Name

activerecord:
  attributes:
    name: *name
    user:
      name: *full_name
    product:
      name: *name

选项2:更改用户模型字段的名称为好。 这需要改变任何引用到这个按键代码和change_table / rename_column迁移。

dictionary:
  name: &name Name
  full_name: &full_name Full Name

activerecord:
  attributes:
    name: *name
    user:
      full_name: *full_name
    product:
      name: *name

方案三 :如果你想成为非常彻底,重构包含在“名称”信息出到单独的数据库/ activemodel的领域,这将需要新的字典条目和迁移。 你可以在你的意见决定,你会想如何“全名”,以显示:

dictionary:
  name: &name Name
  name_prefix: &name_prefix Prefix
  first_name: &first_name First
  middle_name: &middle_name Middle
  last_name: &last_name Last
  name_suffix: &name_suffix Suffix

activerecord:
  attributes:
    name: *name
    user:
      name_prefix: *name_prefix
      first_name: *first_name
      middle_name: *middle_name
      last_name: *last_name
      name_suffix: *name_suffix
    product:
      name: *name

要点3:任何人以任何理由需要一个翻译变化,市场在这种情况下。 我会从点2选1的例子遵循

选项1:产品型号字段名称相同,只是改变了前端的翻译。

dictionary:
  name: &name Name
  full_name: &full_name Full Name
  funky_name: &funky_name Ur Phunky Phresh Naym

activerecord:
  attributes:
    name: *name
    user:
      name: *full_name
    product:
      name: *name
sessions: # Sign up page keys
  new:
    name: *funky_name

选项2:“时髦的名字”迫切需要被保存到数据库中,也出于某种原因。 让我们把它叫做一个username ,如果没有一个对象(或funky_name如果由于某种原因,市场营销坚持)。

dictionary:
  name: &name Name
  full_name: &full_name Full Name
  funky_name: &funky_name Ur Phunky Phresh Naym

activerecord:
  attributes:
    name: *name
    user:
      name: *full_name
      username: *funky_name
    product:
      name: *name
sessions: # Sign up page keys
  new:
    name: *name
    funky_name: *funky_name

右,所以我承认我根本不知道我在做什么,但是,我愿意是为了理解为什么在国际化Haml的这种工作方式是在一个Rails应用程序是一个坏主意公开击落。 难读? 维护的噩梦? 难道真的认为“黑客文件格式”如果我使用(我认为是)语言的功能?

再次感谢暴躁的驾驶我得到这一切了。

Answer 1:

TLDNR; 不要砍你的文件格式,提高了轨道的助手,并帮助建立一个标准化的关键结构!

TLDR;

不想下雨的游行,但我有这个技术的几个问题。 在哪里使用点快捷方式和轨道助手键,结构上的差异如何可能有点令人费解的困境。

据我所知,这个问题基本上是关于干涸的区域设置文件,并使用YAML语言的功能来实现这一目标。

首先,锚只有真正保证了YAML工作,所以这种解决方案一般不能被应用到的I18n。 这种技术可能是不可行的,如果你使用不同的后端。 无论是SQL,Redis的或JSON,我不知道有任何人有任何形式的符号链接的功能。 这就是没有去进过多的事实,引擎盖下,翻译其实都是重复的。

我有第二个和更大的问题是关于语言学。 你举的例子,使所有这些术语都在背景和意义完全相等的情况。 不幸的是,这只是曾经在极其简单的例子的情况。

毫无疑问,为您的应用程序的增长或添加其他语言,你会发现,一个人的“名”属性必须是从比如说一书的“名”的属性,它在英语中,我们将称之为“称号”不同 - OK,这个例子实在是令人费解;),但你在越来越多的语言混合,这种情况不会经常发生,并且理想情况下,我们要处理这个问题的一个通用的方法。

我认为在很大程度上,复杂性来自于具有不同的默认值演变,而不存在对关键结构公约的轨道帮手。

让我们再回到您的例子中,你提到2周的事情,我觉得真的是截然不同的:它采用导轨佣工和使用点快捷观看翻译ActiveRecord的属性翻译。

让我给你一个工作流程,是超级频繁的一个例子:

  1. 你在这种情况下,建立与用户的“名称”字段的表单,您要使用通用的“名称”属性翻译(label_tag应该使用这样的:“attributes.name”)。 这是为了让你快速建立和运行,批量转换简单的属性最简单的,DRYest情况。
  2. 过了一会儿,你决定用户的“名”只需要这样来创建在label_tag的查找调用具有更高的优先级(比如一个新的翻译被译为“全名”这种模式:“activerecord.attributes.users.name” ))
  3. 再以后,营销人有这个页面(且仅此页)上显示该领域的标签为“输入你的时髦新鲜的名字”的高招。 我们不是描述的name属性了,我们描述了这种形式的特定视图; 这是在点快捷进来转换:“form.name”喜欢的东西‘:users.new.form.name’。

有没有办法,我们可以处理与共享的“字典”这种情况。 当然我们的区域文件将是干的,但我们的语言/翻译问题是从我们的开发者关注这里(可惜)大不相同。

从有利的一面,我们可以得到什么样的内容我们描述和反映在我们的关键结构和我们的工具更清晰的 - 这对我来说是前进的方向! :)



Answer 2:

我刚刚发布了一个名为国际化,递归查询的宝石,允许定义通过引入特殊的嵌入式标记$ {}包含对其他定义嵌入式引用

https://github.com/annkissam/i18n-recursive-lookup

使用它,你可以重构你的例子:

dictionary:
  email: Email
  name: Name
  password: Password
  confirmation: Confirmation

activerecord:
  attributes:
    user:
      email: ${dictionary.email}
      name: ${dictionary.name}
      password: ${dictionary.password}
      password_confirmation: ${dictionary.confirmation}
  models:
    user: User
users:
  fields:  
    email: ${dictionary.email}
    name: ${dictionary.name}
    password: ${dictionary.password}
    confirmation: ${dictionary.confirmation}
sessions:
  new:
    email: ${dictionary.email}
    password: ${dictionary.password}

这种做法的好处是,让所有的插值/递归查找发生一次编译一次翻译回写到翻译商店。

我知道这可能不是回答什么“正确”的方式干涸的翻译是比较哲学问题,但我认为这是破解使用和标签参考阳明一个更好的选择。



Answer 3:

提高refactiring YAML文件,特别是对那些谁有许多型号:

ru:
  dictionary:
    name: &name "Имя"
    title_ru: &title_ru "Заголовок (ru)"
    title_en: &title_en "Заголовок (en)"
    content_ru: &content_ru "Содержание (ru)"
    content_en: &content_en "Содержание (en)"
    role: &role "Роль"
    created_at: &created_at "Создано в"
    updated_at: &updated_at "Обновлено в"
    published: &published "Опубликовано"

    nomination: &nomination
      name: *name
      title_ru: *title_ru
      title_en: *title_en

    post: &post
      content_ru: *content_ru
      content_en: *content_en
      published: *published

    dates: &dates
      created_at: *created_at
      updated_at: *updated_at

  activerecord:
    attributes:
      article:
        <<: *nomination
        <<: *post
        <<: *dates

      user:
        <<: *dates
        role: *role
        email: "Электропочта"

Userful公司链接



Answer 4:

我刚刚发布了一个名为宝石dry_i18n: https://rubygems.org/gems/dry_i18n

我为了解决你问的问题创造了这个宝石。 有了这个宝石,你将能够重复使用,甚至用钥匙插其嵌套。

我希望这是有益的。



文章来源: Refactoring Ruby on Rails i18n YAML files using dictionaries