fork download
  1. object Main extends App {
  2. trait Locale
  3. case object EN extends Locale
  4. case object FR extends Locale
  5.  
  6. type I18NMap = Map[String,Map[Locale,String]]
  7.  
  8. implicit class I18NOps(sc: StringContext) {
  9. def iformat(args: Any*)(key: String)(implicit i18nMap: I18NMap, currentLocale: Locale) = {
  10. val translationMaybe = for {
  11. translations <- i18nMap get key
  12. translationForLocale <- translations get currentLocale
  13. } yield translationForLocale
  14. val format = translationMaybe.fold(sc.parts.mkString("%s"))(identity)
  15. args.foldLeft(format)({ case (format,arg) => format.replaceFirst("%s",arg.toString)})
  16. }
  17.  
  18. def i(args: Any*)(implicit i18nMap: I18NMap, currentLocale: Locale) = {
  19. val key = sc.parts.mkString("%s")
  20. iformat(args :_*)(key)(i18nMap,currentLocale)
  21. }
  22. }
  23.  
  24. implicit val myi18n: I18NMap =
  25. Map("Hello, my name is %s" ->
  26. Map(EN -> "Hello, my name is %s.",
  27. FR -> "Bonjour, mon nom est %s."),
  28. "salutation" ->
  29. Map(FR -> "Salut, %s!"))
  30.  
  31. implicit val currentLocale: Locale = FR
  32.  
  33. val name = "John"
  34. println(i"Hello, my name is $name")
  35.  
  36. println(iformat"Hi, %s!"("salutation"))
  37.  
  38. println(i"Hello,this string is untranslated.")
  39. }
Success #stdin #stdout 0.43s 322176KB
stdin
Standard input is empty
stdout
Bonjour, mon nom est John.
Salut, %s!
Hello,this string is untranslated.