我正在使用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
由于
答案 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;的意思。