aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/com/drivergrp/core/messages.scala
diff options
context:
space:
mode:
authorvlad <vlad@drivergrp.com>2016-07-15 19:41:26 -0400
committervlad <vlad@drivergrp.com>2016-07-15 19:41:26 -0400
commitc0d574dc6134e4f406875ea5a1301ba46602a6ec (patch)
tree606a56d184bd8c4d67f98b5aa3fafa3640a8190f /src/main/scala/com/drivergrp/core/messages.scala
downloaddriver-core-c0d574dc6134e4f406875ea5a1301ba46602a6ec.tar.gz
driver-core-c0d574dc6134e4f406875ea5a1301ba46602a6ec.tar.bz2
driver-core-c0d574dc6134e4f406875ea5a1301ba46602a6ec.zip
Initial commit with standard lib, might be used a example of cake
Diffstat (limited to 'src/main/scala/com/drivergrp/core/messages.scala')
-rw-r--r--src/main/scala/com/drivergrp/core/messages.scala74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/main/scala/com/drivergrp/core/messages.scala b/src/main/scala/com/drivergrp/core/messages.scala
new file mode 100644
index 0000000..cf0bb6c
--- /dev/null
+++ b/src/main/scala/com/drivergrp/core/messages.scala
@@ -0,0 +1,74 @@
+package com.drivergrp.core
+
+
+import java.util.Locale
+
+import com.drivergrp.core.config.ConfigModule
+import com.drivergrp.core.logging.{Logger, LoggerModule}
+
+import scala.collection.JavaConverters._
+import scala.collection.concurrent.TrieMap
+
+/**
+ * Scala internationalization (i18n) support
+ */
+object messages {
+
+ trait MessagesModule {
+
+ def messages: Messages
+ }
+
+ trait ConfigMessagesModule extends MessagesModule {
+ this: ConfigModule with LoggerModule =>
+
+ private val loadedFromConfig = new TrieMap[Locale, Messages]()
+ val locale: Locale = Locale.US
+
+ val messages: Messages = {
+ loadedFromConfig.getOrElseUpdate(locale, {
+ val map = config.getConfig(locale.getISO3Language).root().unwrapped().asScala.mapValues(_.toString).toMap
+ Messages(map, locale, log)
+ })
+ }
+ }
+
+
+ case class Messages(map: Map[String, String], locale: Locale, log: Logger) {
+
+ /**
+ * Returns message for the key
+ *
+ * @param key key
+ * @return message
+ */
+ def apply(key: String): String = {
+ map.get(key) match {
+ case Some(message) => message
+ case None =>
+ log.error(s"Message with key $key not found for locale " + locale.getDisplayName)
+ 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.replaceAll(s"{$index}", value.toString)
+ }
+
+ val template = apply(key)
+ format(template, params)
+ }
+ }
+} \ No newline at end of file