type I18NMap
= Map
[String,Map
[Locale,String
]]
def iformat
(args
: Any
*)(key
: String
)(implicit i18nMap
: I18NMap, currentLocale
: Locale
) = { translations <- i18nMap get key
translationForLocale <- translations get currentLocale
} yield translationForLocale
val format
= translationMaybe.
fold(sc.
parts.
mkString("%s"))(identity
) args.
foldLeft(format
)({ case (format,arg
) => format.
replaceFirst("%s",arg.
toString)}) }
def i
(args
: Any
*)(implicit i18nMap
: I18NMap, currentLocale
: Locale
) = { val key
= sc.
parts.
mkString("%s") iformat(args :_*)(key)(i18nMap,currentLocale)
}
}
Map("Hello, my name is %s" ->
Map(EN -> "Hello, my name is %s.",
FR -> "Bonjour, mon nom est %s."),
"salutation" ->
Map(FR -> "Salut, %s!"))
println(i"Hello, my name is $name")
println(iformat"Hi, %s!"("salutation"))
println(i"Hello,this string is untranslated.")
}
b2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewoJICAgIHRyYWl0IExvY2FsZQpjYXNlIG9iamVjdCBFTiBleHRlbmRzIExvY2FsZQpjYXNlIG9iamVjdCBGUiBleHRlbmRzIExvY2FsZQoKdHlwZSBJMThOTWFwID0gTWFwW1N0cmluZyxNYXBbTG9jYWxlLFN0cmluZ11dCgppbXBsaWNpdCBjbGFzcyBJMThOT3BzKHNjOiBTdHJpbmdDb250ZXh0KSB7CiAgZGVmIGlmb3JtYXQoYXJnczogQW55Kikoa2V5OiBTdHJpbmcpKGltcGxpY2l0IGkxOG5NYXA6IEkxOE5NYXAsIGN1cnJlbnRMb2NhbGU6IExvY2FsZSkgPSB7CiAgICB2YWwgdHJhbnNsYXRpb25NYXliZSA9IGZvciB7CiAgICAgIHRyYW5zbGF0aW9ucyA8LSBpMThuTWFwIGdldCBrZXkKICAgICAgdHJhbnNsYXRpb25Gb3JMb2NhbGUgPC0gdHJhbnNsYXRpb25zIGdldCBjdXJyZW50TG9jYWxlCiAgICB9IHlpZWxkIHRyYW5zbGF0aW9uRm9yTG9jYWxlCiAgICB2YWwgZm9ybWF0ID0gdHJhbnNsYXRpb25NYXliZS5mb2xkKHNjLnBhcnRzLm1rU3RyaW5nKCIlcyIpKShpZGVudGl0eSkKICAgIGFyZ3MuZm9sZExlZnQoZm9ybWF0KSh7IGNhc2UgKGZvcm1hdCxhcmcpID0+IGZvcm1hdC5yZXBsYWNlRmlyc3QoIiVzIixhcmcudG9TdHJpbmcpfSkKICB9CgogIGRlZiBpKGFyZ3M6IEFueSopKGltcGxpY2l0IGkxOG5NYXA6IEkxOE5NYXAsIGN1cnJlbnRMb2NhbGU6IExvY2FsZSkgPSB7CiAgICB2YWwga2V5ID0gc2MucGFydHMubWtTdHJpbmcoIiVzIikKICAgIGlmb3JtYXQoYXJncyA6XyopKGtleSkoaTE4bk1hcCxjdXJyZW50TG9jYWxlKQogIH0KfQoKICBpbXBsaWNpdCB2YWwgbXlpMThuOiBJMThOTWFwID0KICAgIE1hcCgiSGVsbG8sIG15IG5hbWUgaXMgJXMiIC0+CiAgICAgICAgTWFwKEVOIC0+ICJIZWxsbywgbXkgbmFtZSBpcyAlcy4iLAogICAgICAgIEZSIC0+ICJCb25qb3VyLCBtb24gbm9tIGVzdCAlcy4iKSwKICAgICJzYWx1dGF0aW9uIiAtPgogICAgICAgIE1hcChGUiAtPiAiU2FsdXQsICVzISIpKQoKICBpbXBsaWNpdCB2YWwgY3VycmVudExvY2FsZTogTG9jYWxlID0gRlIKCiAgdmFsIG5hbWUgPSAiSm9obiIKICBwcmludGxuKGkiSGVsbG8sIG15IG5hbWUgaXMgJG5hbWUiKQoKICBwcmludGxuKGlmb3JtYXQiSGksICVzISIoInNhbHV0YXRpb24iKSkKCiAgcHJpbnRsbihpIkhlbGxvLHRoaXMgc3RyaW5nIGlzIHVudHJhbnNsYXRlZC4iKQp9