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, $name!"("salutation"))
println(i"Hello,this string is untranslated.")
}
b2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewogIHRyYWl0IExvY2FsZQogIGNhc2Ugb2JqZWN0IEVOIGV4dGVuZHMgTG9jYWxlCiAgY2FzZSBvYmplY3QgRlIgZXh0ZW5kcyBMb2NhbGUKCiAgdHlwZSBJMThOTWFwID0gTWFwW1N0cmluZyxNYXBbTG9jYWxlLFN0cmluZ11dCgogIGltcGxpY2l0IGNsYXNzIEkxOE5PcHMoc2M6IFN0cmluZ0NvbnRleHQpIHsKICAgIGRlZiBpZm9ybWF0KGFyZ3M6IEFueSopKGtleTogU3RyaW5nKShpbXBsaWNpdCBpMThuTWFwOiBJMThOTWFwLCBjdXJyZW50TG9jYWxlOiBMb2NhbGUpID0gewogICAgICB2YWwgdHJhbnNsYXRpb25NYXliZSA9IGZvciB7CiAgICAgICAgdHJhbnNsYXRpb25zIDwtIGkxOG5NYXAgZ2V0IGtleQogICAgICAgIHRyYW5zbGF0aW9uRm9yTG9jYWxlIDwtIHRyYW5zbGF0aW9ucyBnZXQgY3VycmVudExvY2FsZQogICAgICB9IHlpZWxkIHRyYW5zbGF0aW9uRm9yTG9jYWxlCiAgICAgIHZhbCBmb3JtYXQgPSB0cmFuc2xhdGlvbk1heWJlLmZvbGQoc2MucGFydHMubWtTdHJpbmcoIiVzIikpKGlkZW50aXR5KQogICAgICBhcmdzLmZvbGRMZWZ0KGZvcm1hdCkoeyBjYXNlIChmb3JtYXQsYXJnKSA9PiBmb3JtYXQucmVwbGFjZUZpcnN0KCIlcyIsYXJnLnRvU3RyaW5nKX0pCiAgICB9CgogICAgZGVmIGkoYXJnczogQW55KikoaW1wbGljaXQgaTE4bk1hcDogSTE4Tk1hcCwgY3VycmVudExvY2FsZTogTG9jYWxlKSA9IHsKICAgICAgdmFsIGtleSA9IHNjLnBhcnRzLm1rU3RyaW5nKCIlcyIpCiAgICAgIGlmb3JtYXQoYXJncyA6XyopKGtleSkoaTE4bk1hcCxjdXJyZW50TG9jYWxlKQogICAgfQogIH0KCiAgaW1wbGljaXQgdmFsIG15aTE4bjogSTE4Tk1hcCA9CiAgICBNYXAoIkhlbGxvLCBteSBuYW1lIGlzICVzIiAtPgogICAgICAgIE1hcChFTiAtPiAiSGVsbG8sIG15IG5hbWUgaXMgJXMuIiwKICAgICAgICBGUiAtPiAiQm9uam91ciwgbW9uIG5vbSBlc3QgJXMuIiksCiAgICAic2FsdXRhdGlvbiIgLT4KICAgICAgICBNYXAoRlIgLT4gIlNhbHV0LCAlcyEiKSkKCiAgaW1wbGljaXQgdmFsIGN1cnJlbnRMb2NhbGU6IExvY2FsZSA9IEZSCgogIHZhbCBuYW1lID0gIkpvaG4iCiAgcHJpbnRsbihpIkhlbGxvLCBteSBuYW1lIGlzICRuYW1lIikKCiAgcHJpbnRsbihpZm9ybWF0IkhpLCAkbmFtZSEiKCJzYWx1dGF0aW9uIikpCgogIHByaW50bG4oaSJIZWxsbyx0aGlzIHN0cmluZyBpcyB1bnRyYW5zbGF0ZWQuIikKfQ==