diff options
Diffstat (limited to 'jvm/src/main/scala/xyz/driver/core/messages.scala')
-rw-r--r-- | jvm/src/main/scala/xyz/driver/core/messages.scala | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/jvm/src/main/scala/xyz/driver/core/messages.scala b/jvm/src/main/scala/xyz/driver/core/messages.scala new file mode 100644 index 0000000..6b1bc7e --- /dev/null +++ b/jvm/src/main/scala/xyz/driver/core/messages.scala @@ -0,0 +1,58 @@ +package xyz.driver.core + +import java.util.Locale + +import com.typesafe.config.{Config, ConfigException} +import com.typesafe.scalalogging.Logger + +/** + * Scala internationalization (i18n) support + */ +object messages { + + object Messages { + def messages(config: Config, log: Logger, locale: Locale = Locale.US): Messages = { + val map = config.getConfig(locale.getLanguage) + Messages(map, locale, log) + } + } + + final case class Messages(map: Config, locale: Locale, log: Logger) { + + /** + * Returns message for the key + * + * @param key key + * @return message + */ + def apply(key: String): String = { + try { + map.getString(key) + } catch { + case _: ConfigException => + log.error(s"Message with key '$key' not found for locale '${locale.getLanguage}'") + key + } + } + + /** + * Returns message for the key and formats that with parameters + * + * @example "Hello {0}!" with "Joe" will be "Hello Joe!" + * + * @param key key + * @param params params to be embedded + * @return formatted message + */ + def apply(key: String, params: Any*): String = { + + def format(formatString: String, params: Seq[Any]) = + params.zipWithIndex.foldLeft(formatString) { + case (res, (value, index)) => res.replace(s"{$index}", value.toString) + } + + val template = apply(key) + format(template, params) + } + } +} |