是否有可能干涸yaml?

时间:2014-12-15 09:53:41

标签: ruby-on-rails-4 yaml dry cross-reference

我正在使用Rails' 4.1.4用于存储某些翻译的YAML语言环境文件,例如:

en:
  words:
    en:
      passport: "passport"
      ticket: "ticket"
      train: "train"
de:
  words:
    en:
      passport: "passport"
      ticket: "ticket"
      train: "train"

有了这个,我可以使用t("words.#{to_language}.train")为已选择英语为train的德语用户(I18n.locale ==:de)返回to_language

我的问题是:有什么方法我不能重复自己,并且有类似下面的代码吗?

en OR de:
  words:
    en:
      passport: "passport"
      ticket: "ticket"
      train: "train"

也许我可以将所有单词内容分配给变量,然后执行:

en:
  all_words
de:
  all_words

由于

2 个答案:

答案 0 :(得分:8)

是的,YAML允许你repeat nodes via reference。特别是,Ruby的YAML有一些非标准的称为"merge key"的东西,它将在你的特定情况下有用。

例如,如果你有,请说:

base_fruits: &default # Alias the keys here into `default`.
  apple: one
  banana: two

然后你可以做

fruit_basket_one:
  <<: *default        # Include all the keys from the alias `default`.
  coconut: three      # Add another key too.

fruit_basket_two:
  <<: *default
  durian: five
  pear: six

所以你可以这样做:

en:
  words:
    en: &all_en_words
      passport: "passport"
      ticket: "ticket"
      train: "train"

de:
  words:
    en:
      <<: *all_en_words
      custom_word: "custom translation"

我想说这可能不是正确的方法。如果de用户想要en个翻译,那么他们应该只使用en。否则,您需要为每对(实际语言,所需语言)提供N ^ 2映射,而不仅仅是N个翻译列表,这更容易维护。

答案 1 :(得分:6)

all_words: &all_words
  words:
    en:
      passport: "passport"
      ticket: "ticket"
      train: "train"

en:
  <<: *all_words

de:
  <<: *all_words

然后,您可以指定密钥,它将覆盖包含的默认值。

查看此SO,讨论&amp;,*,&lt;&lt;的意思。