i18n quantity selection
This commit is contained in:
parent
0629a2170d
commit
08b57725d9
|
@ -2,7 +2,7 @@ package lila.i18n
|
|||
|
||||
import play.api.i18n.Lang
|
||||
|
||||
sealed trait I18nQuantity
|
||||
private sealed trait I18nQuantity
|
||||
|
||||
/*
|
||||
* Ported from
|
||||
|
@ -11,7 +11,7 @@ sealed trait I18nQuantity
|
|||
* Removed: boilerplate, lag, shi
|
||||
* Added: type safety, tp, io, ia
|
||||
*/
|
||||
object I18nQuantity {
|
||||
private object I18nQuantity {
|
||||
|
||||
case object Zero extends I18nQuantity
|
||||
case object One extends I18nQuantity
|
||||
|
@ -21,7 +21,6 @@ object I18nQuantity {
|
|||
case object Other extends I18nQuantity
|
||||
|
||||
type Language = String
|
||||
type Count = Int
|
||||
type Selector = Count => I18nQuantity
|
||||
|
||||
def apply(lang: Lang, c: Count): I18nQuantity =
|
||||
|
|
|
@ -4,43 +4,43 @@ import play.api.i18n.Lang
|
|||
import play.api.mvc.RequestHeader
|
||||
import play.twirl.api.Html
|
||||
|
||||
sealed trait Translation extends Any
|
||||
private sealed trait Translation extends Any
|
||||
|
||||
case class Literal(message: String) extends AnyVal with Translation {
|
||||
private case class Literal(message: String) extends AnyVal with Translation {
|
||||
|
||||
def format(args: Seq[Any]): String =
|
||||
if (args.isEmpty) message
|
||||
else message.format(args: _*)
|
||||
}
|
||||
|
||||
case class Plurals(messages: Map[I18nQuantity, String]) extends AnyVal with Translation {
|
||||
private case class Plurals(messages: Map[I18nQuantity, String]) extends AnyVal with Translation {
|
||||
|
||||
def format(count: Count, args: Seq[Any]): Option[String] =
|
||||
// TODO real quantity selection
|
||||
messages.collectFirst {
|
||||
case (quantity, message) => message.format(args: _*)
|
||||
}
|
||||
def format(quantity: I18nQuantity, args: Seq[Any]): Option[String] =
|
||||
messages.get(quantity)
|
||||
.orElse(messages.get(I18nQuantity.Other))
|
||||
.orElse(messages.headOption.map(_._2))
|
||||
.map(_.format(args: _*))
|
||||
}
|
||||
|
||||
object Translator {
|
||||
|
||||
def literal(key: MessageKey, args: Seq[Any], lang: Lang): String =
|
||||
findTranslation(key, lang) flatMap {
|
||||
formatTranslation(key, _, 1 /* grmbl */ , args)
|
||||
formatTranslation(key, _, I18nQuantity.Other /* grmbl */ , args)
|
||||
} getOrElse key
|
||||
|
||||
def plural(key: MessageKey, count: Count, args: Seq[Any], lang: Lang): String =
|
||||
findTranslation(key, lang) flatMap {
|
||||
formatTranslation(key, _, count, args)
|
||||
formatTranslation(key, _, I18nQuantity(lang, count), args)
|
||||
} getOrElse key
|
||||
|
||||
private def findTranslation(key: MessageKey, lang: Lang): Option[Translation] =
|
||||
I18nDb.all.get(lang) orElse I18nDb.all.get(defaultLang) flatMap (_ get key)
|
||||
|
||||
private def formatTranslation(key: MessageKey, translation: Translation, count: Count, args: Seq[Any]): Option[String] = try {
|
||||
private def formatTranslation(key: MessageKey, translation: Translation, quantity: I18nQuantity, args: Seq[Any]): Option[String] = try {
|
||||
translation match {
|
||||
case literal: Literal => Some(literal.format(args))
|
||||
case plurals: Plurals => plurals.format(count, args)
|
||||
case plurals: Plurals => plurals.format(quantity, args)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
|
|
|
@ -6,7 +6,7 @@ package object i18n extends PackageObject with WithPlay {
|
|||
|
||||
type Count = Int
|
||||
type MessageKey = String
|
||||
type Messages = Map[Lang, Map[MessageKey, Translation]]
|
||||
private[i18n]type Messages = Map[Lang, Map[MessageKey, Translation]]
|
||||
|
||||
private[i18n] def logger = lila.log("i18n")
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ package db
|
|||
import play.api.i18n.Lang
|
||||
|
||||
// format: OFF
|
||||
object Registry {
|
||||
private[i18n] object Registry {
|
||||
|
||||
def load = Map[Lang, Map[MessageKey, Translation]]($content)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue