我使用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
谢谢
all_words: &all_words
words:
en:
passport: "passport"
ticket: "ticket"
train: "train"
en:
<<: *all_words
de:
<<: *all_words
然后,您可以指定密钥,它将覆盖包含的默认值。
查看这个讨论什么&,*,<<意思的SO。
是的,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个翻译的列表,这更容易维护。