是否有可能干涸yaml?

问题描述 投票:3回答:2

我使用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")为德国用户(I18n.locale ==:de)返回train,他选择英语作为他的to_language

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

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

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

en:
  all_words
de:
  all_words

谢谢

ruby-on-rails-4 yaml dry cross-reference
2个回答
6
投票
all_words: &all_words
  words:
    en:
      passport: "passport"
      ticket: "ticket"
      train: "train"

en:
  <<: *all_words

de:
  <<: *all_words

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

查看这个讨论什么&,*,<<意思的SO


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个翻译的列表,这更容易维护。

© www.soinside.com 2019 - 2024. All rights reserved.