more I18nKey simplifications
parent
8d18894a56
commit
863a0d303f
|
@ -1,13 +1,14 @@
|
|||
package lila.app
|
||||
package templating
|
||||
|
||||
import play.api.i18n.Lang
|
||||
import chess.format.Forsyth
|
||||
import chess.{ Status => S, Color, Clock, Mode }
|
||||
import controllers.routes
|
||||
|
||||
import lila.app.ui.ScalatagsTemplate._
|
||||
import lila.game.{ Game, Namer, Player, Pov }
|
||||
import lila.i18n.{ I18nKeys => trans, enLang }
|
||||
import lila.i18n.{ I18nKeys => trans, defaultLang }
|
||||
import lila.user.{ Title, User }
|
||||
import lila.api.Context
|
||||
|
||||
|
@ -74,32 +75,25 @@ trait GameHelper { self: I18nHelper with UserHelper with AiHelper with StringHel
|
|||
s"$p1 plays $p2 in a $mode $speedAndClock game of $variant. $result after $moves. Click to replay, analyse, and discuss the game!"
|
||||
}
|
||||
|
||||
def variantName(variant: chess.variant.Variant)(implicit ctx: Context) = variant match {
|
||||
def variantName(variant: chess.variant.Variant)(implicit lang: Lang) = variant match {
|
||||
case chess.variant.Standard => trans.standard.txt()
|
||||
case chess.variant.FromPosition => trans.fromPosition.txt()
|
||||
case v => v.name
|
||||
}
|
||||
|
||||
def variantNameNoCtx(variant: chess.variant.Variant) = variant match {
|
||||
case chess.variant.Standard => trans.standard.literalTxtTo(enLang)
|
||||
case chess.variant.FromPosition => trans.fromPosition.literalTxtTo(enLang)
|
||||
case v => v.name
|
||||
}
|
||||
def variantNameNoCtx(variant: chess.variant.Variant) = variantName(variant)(defaultLang)
|
||||
|
||||
def shortClockName(clock: Option[Clock.Config])(implicit ctx: Context): Frag =
|
||||
clock.fold[Frag](trans.unlimited())(shortClockName)
|
||||
|
||||
def shortClockName(clock: Clock.Config): Frag = raw(clock.show)
|
||||
|
||||
def modeName(mode: Mode)(implicit ctx: Context): String = mode match {
|
||||
def modeName(mode: Mode)(implicit lang: Lang): String = mode match {
|
||||
case Mode.Casual => trans.casual.txt()
|
||||
case Mode.Rated => trans.rated.txt()
|
||||
}
|
||||
|
||||
def modeNameNoCtx(mode: Mode): String = mode match {
|
||||
case Mode.Casual => trans.casual.literalTxtTo(enLang)
|
||||
case Mode.Rated => trans.rated.literalTxtTo(enLang)
|
||||
}
|
||||
def modeNameNoCtx(mode: Mode): String = modeName(mode)(defaultLang)
|
||||
|
||||
def playerUsername(player: Player, withRating: Boolean = true, withTitle: Boolean = true): Frag =
|
||||
player.aiLevel.fold[Frag](
|
||||
|
@ -178,7 +172,7 @@ trait GameHelper { self: I18nHelper with UserHelper with AiHelper with StringHel
|
|||
}
|
||||
}
|
||||
|
||||
def gameEndStatus(game: Game)(implicit ctx: Context): String = game.status match {
|
||||
def gameEndStatus(game: Game)(implicit lang: Lang): String = game.status match {
|
||||
case S.Aborted => trans.gameAborted.txt()
|
||||
case S.Mate => trans.checkmate.txt()
|
||||
case S.Resign =>
|
||||
|
|
|
@ -5,29 +5,21 @@ import scalatags.Text.RawFrag
|
|||
|
||||
final class I18nKey(val key: String, val db: I18nDb.Ref) {
|
||||
|
||||
def literalTo(lang: Lang, args: Seq[Any] = Nil): RawFrag =
|
||||
def apply(args: Any*)(implicit lang: Lang): RawFrag =
|
||||
Translator.frag.literal(key, db, args, lang)
|
||||
|
||||
def pluralTo(lang: Lang, count: Count, args: Seq[Any] = Nil): RawFrag =
|
||||
def plural(count: Count, args: Any*)(implicit lang: Lang): RawFrag =
|
||||
Translator.frag.plural(key, db, count, args, lang)
|
||||
|
||||
def literalTxtTo(lang: Lang, args: Seq[Any] = Nil): String =
|
||||
def pluralSame(count: Int)(implicit lang: Lang): RawFrag = plural(count, count)
|
||||
|
||||
def txt(args: Any*)(implicit lang: Lang): String =
|
||||
Translator.txt.literal(key, db, args, lang)
|
||||
|
||||
def pluralTxtTo(lang: Lang, count: Count, args: Seq[Any] = Nil): String =
|
||||
def pluralTxt(count: Count, args: Any*)(implicit lang: Lang): String =
|
||||
Translator.txt.plural(key, db, count, args, lang)
|
||||
|
||||
/* Implicit lang convenience functions */
|
||||
|
||||
// frag
|
||||
def apply(args: Any*)(implicit lang: Lang): RawFrag = literalTo(lang, args)
|
||||
def plural(count: Count, args: Any*)(implicit lang: Lang): RawFrag = pluralTo(lang, count, args)
|
||||
def pluralSame(count: Int)(implicit lang: Lang): RawFrag = plural(count, count)
|
||||
|
||||
// txt
|
||||
def txt(args: Any*)(implicit lang: Lang): String = literalTxtTo(lang, args)
|
||||
def pluralTxt(count: Count, args: Any*)(implicit lang: Lang): String = pluralTxtTo(lang, count, args)
|
||||
def pluralSameTxt(count: Int)(implicit lang: Lang): String = pluralTxt(count, count)
|
||||
def pluralSameTxt(count: Int)(implicit lang: Lang): String = pluralTxt(count, count)
|
||||
}
|
||||
|
||||
object I18nKey {
|
||||
|
|
|
@ -25,14 +25,14 @@ The Lichess team"""
|
|||
val editUrl = s"$baseUrl/account/profile"
|
||||
mailgun send Mailgun.Message(
|
||||
to = email,
|
||||
subject = trans.welcome_subject.literalTxtTo(lang, List(user.username)),
|
||||
subject = trans.welcome_subject.txt(user.username),
|
||||
text = s"""
|
||||
${trans.welcome_text.literalTxtTo(lang, List(profileUrl, editUrl))}
|
||||
${trans.welcome_text.txt(profileUrl, editUrl)}
|
||||
|
||||
${Mailgun.txt.serviceNote}
|
||||
""",
|
||||
htmlBody = standardEmail(
|
||||
trans.welcome_text.literalTxtTo(lang, List(profileUrl, editUrl))
|
||||
trans.welcome_text.txt(profileUrl, editUrl)
|
||||
).some
|
||||
)
|
||||
}
|
||||
|
|
|
@ -23,20 +23,20 @@ final class EmailChange(
|
|||
lila.log("auth").info(s"Change email URL ${user.username} $email $url")
|
||||
mailgun send Mailgun.Message(
|
||||
to = email,
|
||||
subject = trans.emailChange_subject.literalTxtTo(lang, List(user.username)),
|
||||
subject = trans.emailChange_subject.txt(user.username),
|
||||
text = s"""
|
||||
${trans.emailChange_intro.literalTxtTo(lang)}
|
||||
${trans.emailChange_click.literalTxtTo(lang)}
|
||||
${trans.emailChange_intro.txt()}
|
||||
${trans.emailChange_click.txt()}
|
||||
|
||||
$url
|
||||
|
||||
${trans.common_orPaste.literalTxtTo(lang)}
|
||||
${trans.common_orPaste.txt()}
|
||||
|
||||
${Mailgun.txt.serviceNote}
|
||||
""",
|
||||
htmlBody = emailMessage(
|
||||
pDesc(trans.emailChange_intro.literalTo(lang)),
|
||||
p(trans.emailChange_click.literalTo(lang)),
|
||||
pDesc(trans.emailChange_intro()),
|
||||
p(trans.emailChange_click()),
|
||||
potentialAction(metaName("Change email address"), Mailgun.html.url(url)),
|
||||
serviceNote
|
||||
).some
|
||||
|
|
|
@ -48,25 +48,25 @@ final class EmailConfirmMailgun(
|
|||
lila.log("auth").info(s"Confirm URL ${user.username} ${email.value} $url")
|
||||
mailgun send Mailgun.Message(
|
||||
to = email,
|
||||
subject = trans.emailConfirm_subject.literalTxtTo(lang, List(user.username)),
|
||||
subject = trans.emailConfirm_subject.txt(user.username),
|
||||
text = s"""
|
||||
${trans.emailConfirm_click.literalTxtTo(lang)}
|
||||
${trans.emailConfirm_click.txt()}
|
||||
|
||||
$url
|
||||
|
||||
${trans.common_orPaste.literalTxtTo(lang)}
|
||||
${trans.common_orPaste.txt()}
|
||||
|
||||
${Mailgun.txt.serviceNote}
|
||||
${trans.emailConfirm_ignore.literalTxtTo(lang, List("https://lichess.org"))}
|
||||
${trans.emailConfirm_ignore.txt("https://lichess.org")}
|
||||
""",
|
||||
htmlBody = emailMessage(
|
||||
pDesc(trans.emailConfirm_click.literalTo(lang)),
|
||||
pDesc(trans.emailConfirm_click()),
|
||||
potentialAction(metaName("Activate account"), Mailgun.html.url(url)),
|
||||
publisher(
|
||||
small(
|
||||
trans.common_note.literalTo(lang, List(Mailgun.html.noteLink)),
|
||||
trans.common_note(Mailgun.html.noteLink),
|
||||
" ",
|
||||
trans.emailConfirm_ignore.literalTo(lang)
|
||||
trans.emailConfirm_ignore()
|
||||
)
|
||||
)
|
||||
).some
|
||||
|
|
|
@ -26,16 +26,16 @@ final class MagicLink(
|
|||
to = email,
|
||||
subject = trans.logInToLichess.txt(user.username),
|
||||
text = s"""
|
||||
${trans.passwordReset_clickOrIgnore.literalTxtTo(lang)}
|
||||
${trans.passwordReset_clickOrIgnore.txt()}
|
||||
|
||||
$url
|
||||
|
||||
${trans.common_orPaste.literalTxtTo(lang)}
|
||||
${trans.common_orPaste.txt()}
|
||||
|
||||
${Mailgun.txt.serviceNote}
|
||||
""",
|
||||
htmlBody = emailMessage(
|
||||
p(trans.passwordReset_clickOrIgnore.literalTo(lang)),
|
||||
p(trans.passwordReset_clickOrIgnore()),
|
||||
potentialAction(metaName("Log in"), Mailgun.html.url(url)),
|
||||
serviceNote
|
||||
).some
|
||||
|
|
|
@ -82,9 +82,9 @@ object Mailgun {
|
|||
object txt {
|
||||
|
||||
def serviceNote(implicit lang: Lang): String = s"""
|
||||
${trans.common_note.literalTo(lang, List("https://lichess.org")).render}
|
||||
${trans.common_note("https://lichess.org").render}
|
||||
|
||||
${trans.common_contact.literalTo(lang, List("https://lichess.org/contact")).render}"""
|
||||
${trans.common_contact("https://lichess.org/contact").render}"""
|
||||
}
|
||||
|
||||
object html {
|
||||
|
@ -104,9 +104,9 @@ ${trans.common_contact.literalTo(lang, List("https://lichess.org/contact")).rend
|
|||
|
||||
def serviceNote(implicit lang: Lang) = publisher(
|
||||
small(
|
||||
trans.common_note.literalTo(lang, List(Mailgun.html.noteLink)),
|
||||
trans.common_note(Mailgun.html.noteLink),
|
||||
" ",
|
||||
trans.common_contact.literalTo(lang, List(noteContact))
|
||||
trans.common_contact(noteContact)
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -124,7 +124,7 @@ ${trans.common_contact.literalTo(lang, List("https://lichess.org/contact")).rend
|
|||
def url(u: String)(implicit lang: Lang) = frag(
|
||||
meta(itemprop := "url", content := u),
|
||||
p(a(itemprop := "target", href := u)(u)),
|
||||
p(trans.common_orPaste.literalTo(lang))
|
||||
p(trans.common_orPaste(lang))
|
||||
)
|
||||
|
||||
private[Mailgun] def wrap(subject: String, body: Frag): Frag = frag(
|
||||
|
|
|
@ -23,21 +23,21 @@ final class PasswordReset(
|
|||
val url = s"$baseUrl/password/reset/confirm/$token"
|
||||
mailgun send Mailgun.Message(
|
||||
to = email,
|
||||
subject = trans.passwordReset_subject.literalTxtTo(lang, List(user.username)),
|
||||
subject = trans.passwordReset_subject.txt(user.username),
|
||||
text = s"""
|
||||
${trans.passwordReset_intro.literalTxtTo(lang)}
|
||||
${trans.passwordReset_intro.txt()}
|
||||
|
||||
${trans.passwordReset_clickOrIgnore.literalTxtTo(lang)}
|
||||
${trans.passwordReset_clickOrIgnore.txt()}
|
||||
|
||||
$url
|
||||
|
||||
${trans.common_orPaste.literalTxtTo(lang)}
|
||||
${trans.common_orPaste.txt()}
|
||||
|
||||
${Mailgun.txt.serviceNote}
|
||||
""",
|
||||
htmlBody = emailMessage(
|
||||
pDesc(trans.passwordReset_intro.literalTo(lang)),
|
||||
p(trans.passwordReset_clickOrIgnore.literalTo(lang)),
|
||||
pDesc(trans.passwordReset_intro()),
|
||||
p(trans.passwordReset_clickOrIgnore()),
|
||||
potentialAction(metaName("Reset password"), Mailgun.html.url(url)),
|
||||
serviceNote
|
||||
).some
|
||||
|
|
|
@ -58,16 +58,16 @@ final class Reopen(
|
|||
to = email,
|
||||
subject = s"Reopen your lichess.org account: ${user.username}",
|
||||
text = s"""
|
||||
${trans.passwordReset_clickOrIgnore.literalTxtTo(lang)}
|
||||
${trans.passwordReset_clickOrIgnore.txt()}
|
||||
|
||||
$url
|
||||
|
||||
${trans.common_orPaste.literalTxtTo(lang)}
|
||||
${trans.common_orPaste.txt()}
|
||||
|
||||
${Mailgun.txt.serviceNote}
|
||||
""",
|
||||
htmlBody = emailMessage(
|
||||
p(trans.passwordReset_clickOrIgnore.literalTo(lang)),
|
||||
p(trans.passwordReset_clickOrIgnore()),
|
||||
potentialAction(metaName("Log in"), Mailgun.html.url(url)),
|
||||
serviceNote
|
||||
).some
|
||||
|
|
|
@ -3,14 +3,14 @@ package lila.tournament
|
|||
import play.api.i18n.Lang
|
||||
|
||||
import lila.hub.LightTeam._
|
||||
import lila.i18n.I18nKeys
|
||||
import lila.i18n.{ I18nKeys => trans }
|
||||
import lila.rating.BSONHandlers.perfTypeKeyHandler
|
||||
import lila.rating.PerfType
|
||||
import lila.user.{ Title, User }
|
||||
|
||||
sealed trait Condition {
|
||||
|
||||
def name(lang: Lang): String
|
||||
def name(implicit lang: Lang): String
|
||||
|
||||
def withVerdict(verdict: Condition.Verdict) = Condition.WithVerdict(this, verdict)
|
||||
}
|
||||
|
@ -31,10 +31,10 @@ object Condition {
|
|||
case class WithVerdict(condition: Condition, verdict: Verdict)
|
||||
|
||||
case object Titled extends Condition with FlatCond {
|
||||
def name(lang: Lang) = "Only titled players"
|
||||
def name(implicit lang: Lang) = "Only titled players"
|
||||
def apply(user: User) =
|
||||
if (user.title.exists(_ != Title.LM)) Accepted
|
||||
else Refused(name _)
|
||||
else Refused(name(_))
|
||||
}
|
||||
|
||||
case class NbRatedGame(perf: Option[PerfType], nb: Int) extends Condition with FlatCond {
|
||||
|
@ -45,21 +45,21 @@ object Condition {
|
|||
perf match {
|
||||
case Some(p) if user.perfs(p).nb >= nb => Accepted
|
||||
case Some(p) =>
|
||||
Refused { lang =>
|
||||
Refused { implicit lang =>
|
||||
val missing = nb - user.perfs(p).nb
|
||||
I18nKeys.needNbMorePerfGames.pluralTxtTo(lang, missing, List(missing, p.name))
|
||||
trans.needNbMorePerfGames.pluralTxt(missing, missing, p.name)
|
||||
}
|
||||
case None if user.count.rated >= nb => Accepted
|
||||
case None =>
|
||||
Refused { lang =>
|
||||
Refused { implicit lang =>
|
||||
val missing = nb - user.count.rated
|
||||
I18nKeys.needNbMoreGames.pluralTxtTo(lang, missing, List(missing))
|
||||
trans.needNbMoreGames.pluralSameTxt(missing)
|
||||
}
|
||||
}
|
||||
|
||||
def name(lang: Lang) = perf match {
|
||||
case None => I18nKeys.moreThanNbRatedGames.pluralTxtTo(lang, nb, List(nb))
|
||||
case Some(p) => I18nKeys.moreThanNbPerfRatedGames.pluralTxtTo(lang, nb, List(nb, p.name))
|
||||
def name(implicit lang: Lang) = perf match {
|
||||
case None => trans.moreThanNbRatedGames.pluralSameTxt(nb)
|
||||
case Some(p) => trans.moreThanNbPerfRatedGames.pluralTxt(nb, nb, p.name)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -68,50 +68,50 @@ object Condition {
|
|||
def apply(
|
||||
getMaxRating: GetMaxRating
|
||||
)(user: User)(implicit ec: scala.concurrent.ExecutionContext): Fu[Verdict] =
|
||||
if (user.perfs(perf).provisional) fuccess(Refused { lang =>
|
||||
I18nKeys.yourPerfRatingIsProvisional.literalTxtTo(lang, perf.name)
|
||||
if (user.perfs(perf).provisional) fuccess(Refused { implicit lang =>
|
||||
trans.yourPerfRatingIsProvisional.txt(perf.name)
|
||||
})
|
||||
else if (user.perfs(perf).intRating > rating) fuccess(Refused { lang =>
|
||||
I18nKeys.yourPerfRatingIsTooHigh.literalTxtTo(lang, List(perf.name, user.perfs(perf).intRating))
|
||||
else if (user.perfs(perf).intRating > rating) fuccess(Refused { implicit lang =>
|
||||
trans.yourPerfRatingIsTooHigh.txt(perf.name, user.perfs(perf).intRating)
|
||||
})
|
||||
else
|
||||
getMaxRating(perf) map {
|
||||
case r if r <= rating => Accepted
|
||||
case r =>
|
||||
Refused { lang =>
|
||||
I18nKeys.yourTopWeeklyPerfRatingIsTooHigh.literalTxtTo(lang, List(perf.name, r))
|
||||
Refused { implicit lang =>
|
||||
trans.yourTopWeeklyPerfRatingIsTooHigh.txt(perf.name, r)
|
||||
}
|
||||
}
|
||||
|
||||
def maybe(user: User): Boolean =
|
||||
!user.perfs(perf).provisional && user.perfs(perf).intRating <= rating
|
||||
|
||||
def name(lang: Lang) = I18nKeys.ratedLessThanInPerf.literalTxtTo(lang, List(rating, perf.name))
|
||||
def name(implicit lang: Lang) = trans.ratedLessThanInPerf.txt(rating, perf.name)
|
||||
}
|
||||
|
||||
case class MinRating(perf: PerfType, rating: Int) extends Condition with FlatCond {
|
||||
|
||||
def apply(user: User) =
|
||||
if (user.hasTitle) Accepted
|
||||
else if (user.perfs(perf).provisional) Refused { lang =>
|
||||
I18nKeys.yourPerfRatingIsProvisional.literalTxtTo(lang, perf.name)
|
||||
} else if (user.perfs(perf).intRating < rating) Refused { lang =>
|
||||
I18nKeys.yourPerfRatingIsTooLow.literalTxtTo(lang, List(perf.name, user.perfs(perf).intRating))
|
||||
else if (user.perfs(perf).provisional) Refused { implicit lang =>
|
||||
trans.yourPerfRatingIsProvisional.txt(perf.name)
|
||||
} else if (user.perfs(perf).intRating < rating) Refused { implicit lang =>
|
||||
trans.yourPerfRatingIsTooLow.txt(perf.name, user.perfs(perf).intRating)
|
||||
} else Accepted
|
||||
|
||||
def name(lang: Lang) = I18nKeys.ratedMoreThanInPerf.literalTxtTo(lang, List(rating, perf.name))
|
||||
def name(implicit lang: Lang) = trans.ratedMoreThanInPerf.txt(rating, perf.name)
|
||||
}
|
||||
|
||||
case class TeamMember(teamId: TeamID, teamName: TeamName) extends Condition {
|
||||
def name(lang: Lang) = I18nKeys.mustBeInTeam.literalTxtTo(lang, List(teamName))
|
||||
def name(implicit lang: Lang) = trans.mustBeInTeam.txt(teamName)
|
||||
def apply(user: User, getUserTeamIds: User => Fu[List[TeamID]])(
|
||||
implicit ec: scala.concurrent.ExecutionContext
|
||||
) =
|
||||
getUserTeamIds(user) map { userTeamIds =>
|
||||
if (userTeamIds contains teamId) Accepted
|
||||
else
|
||||
Refused { lang =>
|
||||
I18nKeys.youAreNotInTeam.literalTxtTo(lang, List(teamName))
|
||||
Refused { implicit lang =>
|
||||
trans.youAreNotInTeam.txt(teamName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue