more I18nKey simplifications

pull/6024/head
Thibault Duplessis 2020-02-11 18:11:50 -06:00
parent 8d18894a56
commit 863a0d303f
10 changed files with 73 additions and 87 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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