aboutsummaryrefslogtreecommitdiff
path: root/jvm/src/main/scala/xyz/driver/core/messages.scala
diff options
context:
space:
mode:
Diffstat (limited to 'jvm/src/main/scala/xyz/driver/core/messages.scala')
-rw-r--r--jvm/src/main/scala/xyz/driver/core/messages.scala58
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)
+ }
+ }
+}