i18n quantity selection

This commit is contained in:
Thibault Duplessis 2017-05-27 13:25:24 +02:00
parent 0629a2170d
commit 08b57725d9
4 changed files with 16 additions and 17 deletions

View file

@ -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 =

View file

@ -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 {

View file

@ -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")

View file

@ -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)
}