From b498ab54e3bb79134d73a3de43f8ad8849b74c4b Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Mon, 24 Feb 2014 23:57:33 +0100 Subject: [PATCH] make training section translatable --- app/ui/SiteMenu.scala | 2 +- app/views/puzzle/attempt.scala.html | 3 -- app/views/puzzle/history.scala.html | 5 ++- app/views/puzzle/playMode.scala.html | 10 +++--- app/views/puzzle/show.scala.html | 2 +- app/views/puzzle/trainingBox.scala.html | 14 ++++----- app/views/puzzle/viewMode.scala.html | 42 ++++++++++--------------- app/views/puzzle/vote.scala.html | 14 ++++----- conf/messages | 28 +++++++++++++++++ modules/i18n/src/main/I18nKeys.scala | 30 +++++++++++++++++- 10 files changed, 95 insertions(+), 55 deletions(-) delete mode 100644 app/views/puzzle/attempt.scala.html diff --git a/app/ui/SiteMenu.scala b/app/ui/SiteMenu.scala index 09fd9f0f09..31876d4605 100644 --- a/app/ui/SiteMenu.scala +++ b/app/ui/SiteMenu.scala @@ -13,7 +13,7 @@ final class SiteMenu(trans: I18nKeys) { val play = new Elem("play", routes.Lobby.home, trans.play) val game = new Elem("game", routes.Game.realtime, trans.games) - val puzzle = new Elem("puzzle", routes.Puzzle.home, I18nKey untranslated "Training") + val puzzle = new Elem("puzzle", routes.Puzzle.home, trans.training) val tournament = new Elem("tournament", routes.Tournament.home, trans.tournaments) val user = new Elem("user", routes.User.list(page = 1), trans.players) val team = new Elem("team", routes.Team.home(page = 1), trans.teams) diff --git a/app/views/puzzle/attempt.scala.html b/app/views/puzzle/attempt.scala.html deleted file mode 100644 index e052e11171..0000000000 --- a/app/views/puzzle/attempt.scala.html +++ /dev/null @@ -1,3 +0,0 @@ -@(puzzle: lila.puzzle.Puzzle, attempt: lila.puzzle.Attempt)(implicit ctx: Context) - -@attempt diff --git a/app/views/puzzle/history.scala.html b/app/views/puzzle/history.scala.html index 3b7a6ae04d..f61dd9a59f 100644 --- a/app/views/puzzle/history.scala.html +++ b/app/views/puzzle/history.scala.html @@ -2,7 +2,7 @@
- Recently played puzzles + @trans.recentlyPlayedPuzzles()
@@ -18,8 +18,7 @@ - Puzzle @attempt.puzzleId - (@attempt.puzzleRating) + @trans.puzzleId(attempt.puzzleId) (@attempt.puzzleRating) diff --git a/app/views/puzzle/playMode.scala.html b/app/views/puzzle/playMode.scala.html index 7d31885dc5..12261b7e84 100644 --- a/app/views/puzzle/playMode.scala.html +++ b/app/views/puzzle/playMode.scala.html @@ -10,12 +10,12 @@
@trainingBox(puzzle, userInfos, true) -

Good move

But you can do better.
-

Best move!

Keep going…
+

@trans.goodMove()

@trans.butYouCanDoBetter()
+

@trans.bestMove()

@trans.keepGoing()
@if(asPlay) { -

Puzzle failed

+

@trans.puzzleFailed()

} else { -

Puzzle failed

But you can keep trying.
+

@trans.puzzleFailed()

@trans.butYouCanKeepTrying()
}
@@ -44,7 +44,7 @@
diff --git a/app/views/puzzle/show.scala.html b/app/views/puzzle/show.scala.html index c8293bd108..b307d1bd96 100644 --- a/app/views/puzzle/show.scala.html +++ b/app/views/puzzle/show.scala.html @@ -1,6 +1,6 @@ @(puzzle: lila.puzzle.Puzzle, userInfos: Option[lila.puzzle.UserInfos], asPlay: Boolean)(implicit ctx: Context) -@layout("Puzzle") { +@layout(trans.training.str()) {
@playMode(puzzle, userInfos, asPlay) diff --git a/app/views/puzzle/trainingBox.scala.html b/app/views/puzzle/trainingBox.scala.html index b9fc557b17..32ef209c85 100644 --- a/app/views/puzzle/trainingBox.scala.html +++ b/app/views/puzzle/trainingBox.scala.html @@ -1,9 +1,9 @@ @(puzzle: lila.puzzle.Puzzle, userInfos: Option[lila.puzzle.UserInfos], isPlay: Boolean)(implicit ctx: Context)
-

Training

+

@trans.training()

@userInfos.map { i => - Your puzzle rating: @i.user.perfs.puzzle.intRating + @trans.yourPuzzleRatingX(s"${i.user.perfs.puzzle.intRating}") @if(i.history.nonEmpty) {
} else { @@ -11,15 +11,13 @@ } }.getOrElse { @if(isPlay) { -

Find the best move for @{puzzle.color.name}.

+

@trans.findTheBestMoveForColor(puzzle.color.name)

} else { -

To track your progress:

+

@trans.toTrackYourProgress()

-

- Lichess will provide puzzles that match your ability, making for better training sessions. + @trans.signUp()

+

@trans.trainingSignupExplanation()

} }
diff --git a/app/views/puzzle/viewMode.scala.html b/app/views/puzzle/viewMode.scala.html index e1ddd2c55d..9ffca7930a 100644 --- a/app/views/puzzle/viewMode.scala.html +++ b/app/views/puzzle/viewMode.scala.html @@ -12,20 +12,20 @@ @trainingBox(puzzle, userInfos, false) @win.map { w => @if(w) { -

Victory!

+

@trans.victory()

} else { -

Puzzle failed

+

@trans.puzzleFailed()

} }.getOrElse { @attempt.map { a => @if(a.win) {
-

Victory! @showNumber(a.userRatingDiff)

- Puzzle solved in @a.seconds seconds. +

@trans.victory() @showNumber(a.userRatingDiff)

+ @trans.puzzleSolvedInXSeconds(a.seconds)
} else {
-

Puzzle failed @showNumber(a.userRatingDiff)

+

@trans.puzzleFailed() @showNumber(a.userRatingDiff)

} } @@ -51,13 +51,12 @@ @if(voted == Some(false)) {

- Was this puzzle any good?
- Help lichess improve by voting
- using the up or down arrow: + @trans.wasThisPuzzleAnyGood()
+ @trans.pleaseVotePuzzle()


- Thank you! + @trans.thankYou()

@@ -67,35 +66,26 @@
@vote(puzzle, attempt)
}

- Rating: @puzzle.perf.intRating + @trans.ratingX(s"${puzzle.perf.intRating}") ±@puzzle.perf.glicko.intDeviationDoubled

-

- Played - @puzzle.attempts match { - case 1 => { once } - case 2 => { twice } - case x => { @x times } - } -

-

- Win rate: @puzzle.winPercent% -

+

@trans.playedXTimes(s"${puzzle.attempts}")

+

@trans.winRateX(s"${puzzle.winPercent}%")

@puzzle.gameId.map { id => -

From game #@id

+

@trans.fromGameLink(s"""#$id""")

}
@if(win.isDefined) { - Start training + @trans.startTraining() } else { - + } @if(win.fold(attempt.exists(_.loss))(!_)) { - Retry this puzzle + @trans.retryThisPuzzle() }
diff --git a/app/views/puzzle/vote.scala.html b/app/views/puzzle/vote.scala.html index 1de274ccfa..7f3c00e0af 100644 --- a/app/views/puzzle/vote.scala.html +++ b/app/views/puzzle/vote.scala.html @@ -1,17 +1,17 @@ -@(puzzle: lila.puzzle.Puzzle, attempt: Option[lila.puzzle.Attempt]) +@(puzzle: lila.puzzle.Puzzle, attempt: Option[lila.puzzle.Attempt])(implicit ctx: Context) @if(puzzle.enabled) {
- @puzzle.vote.sum -
diff --git a/conf/messages b/conf/messages index b86d0d9202..75a4f4db94 100644 --- a/conf/messages +++ b/conf/messages @@ -264,3 +264,31 @@ bestBulletPlayers=Best bullet players bestBlitzPlayers=Best blitz players bestSlowPlayers=Best slow players bewareTheGameIsRatedButHasNoClock=Beware, the game is rated but has no clock! +training=Training +yourPuzzleRatingX=Your puzzle rating: %s +findTheBestMoveForColor=Find the best move for %s. +toTrackYourProgress=To track your progress: +trainingSignupExplanation=Lichess will provide puzzles that match your ability, making for better training sessions. +recentlyPlayedPuzzles=Recently played puzzles +puzzleId=Puzzle %s +goodMove=Good move +butYouCanDoBetter=But you can do better. +bestMove=Best move! +keepGoing=Keep going… +puzzleFailed=Puzzle failed +butYouCanKeepTrying=But you can keep trying. +victory=Victory! +giveUp=Give up +puzzleSolvedInXSeconds=Puzzle solved in %s seconds. +wasThisPuzzleAnyGood=Was this puzzle any good? +pleaseVotePuzzle=Help lichess improve by voting, using the up or down arrow: +thankYou=Thank you! +ratingX=Rating: %s +playedXTimes=Played %s times +winRateX=Win rate: %s +fromGameLink=From game %s +startTraining=Start training +continueTraining=Continue training +retryThisPuzzle=Retry this puzzle +thisPuzzleIsCorrect=This puzzle is correct and interesting +thisPuzzleIsWrong=This puzzle is wrong or boring diff --git a/modules/i18n/src/main/I18nKeys.scala b/modules/i18n/src/main/I18nKeys.scala index 6fcadd50f0..5e3393935a 100644 --- a/modules/i18n/src/main/I18nKeys.scala +++ b/modules/i18n/src/main/I18nKeys.scala @@ -288,6 +288,34 @@ final class I18nKeys(translator: Translator) { val `bestBlitzPlayers` = new Key("bestBlitzPlayers") val `bestSlowPlayers` = new Key("bestSlowPlayers") val `bewareTheGameIsRatedButHasNoClock` = new Key("bewareTheGameIsRatedButHasNoClock") + val `training` = new Key("training") + val `yourPuzzleRatingX` = new Key("yourPuzzleRatingX") + val `findTheBestMoveForColor` = new Key("findTheBestMoveForColor") + val `toTrackYourProgress` = new Key("toTrackYourProgress") + val `trainingSignupExplanation` = new Key("trainingSignupExplanation") + val `recentlyPlayedPuzzles` = new Key("recentlyPlayedPuzzles") + val `puzzleId` = new Key("puzzleId") + val `goodMove` = new Key("goodMove") + val `butYouCanDoBetter` = new Key("butYouCanDoBetter") + val `bestMove` = new Key("bestMove") + val `keepGoing` = new Key("keepGoing") + val `puzzleFailed` = new Key("puzzleFailed") + val `butYouCanKeepTrying` = new Key("butYouCanKeepTrying") + val `victory` = new Key("victory") + val `giveUp` = new Key("giveUp") + val `puzzleSolvedInXSeconds` = new Key("puzzleSolvedInXSeconds") + val `wasThisPuzzleAnyGood` = new Key("wasThisPuzzleAnyGood") + val `pleaseVotePuzzle` = new Key("pleaseVotePuzzle") + val `thankYou` = new Key("thankYou") + val `ratingX` = new Key("ratingX") + val `playedXTimes` = new Key("playedXTimes") + val `winRateX` = new Key("winRateX") + val `fromGameLink` = new Key("fromGameLink") + val `startTraining` = new Key("startTraining") + val `continueTraining` = new Key("continueTraining") + val `retryThisPuzzle` = new Key("retryThisPuzzle") + val `thisPuzzleIsCorrect` = new Key("thisPuzzleIsCorrect") + val `thisPuzzleIsWrong` = new Key("thisPuzzleIsWrong") - def keys = List(`playWithAFriend`, `inviteAFriendToPlayWithYou`, `playWithTheMachine`, `challengeTheArtificialIntelligence`, `toInviteSomeoneToPlayGiveThisUrl`, `gameOver`, `waitingForOpponent`, `waiting`, `yourTurn`, `aiNameLevelAiLevel`, `level`, `toggleTheChat`, `toggleSound`, `chat`, `resign`, `checkmate`, `stalemate`, `white`, `black`, `randomColor`, `createAGame`, `whiteIsVictorious`, `blackIsVictorious`, `playWithTheSameOpponentAgain`, `newOpponent`, `playWithAnotherOpponent`, `yourOpponentWantsToPlayANewGameWithYou`, `joinTheGame`, `whitePlays`, `blackPlays`, `theOtherPlayerHasLeftTheGameYouCanForceResignationOrWaitForHim`, `makeYourOpponentResign`, `forceResignation`, `forceDraw`, `talkInChat`, `theFirstPersonToComeOnThisUrlWillPlayWithYou`, `whiteCreatesTheGame`, `blackCreatesTheGame`, `whiteJoinsTheGame`, `blackJoinsTheGame`, `whiteResigned`, `blackResigned`, `whiteLeftTheGame`, `blackLeftTheGame`, `shareThisUrlToLetSpectatorsSeeTheGame`, `youAreViewingThisGameAsASpectator`, `replayAndAnalyse`, `computerAnalysisInProgress`, `theComputerAnalysisHasFailed`, `viewTheComputerAnalysis`, `requestAComputerAnalysis`, `computerAnalysis`, `blunders`, `mistakes`, `inaccuracies`, `moveTimes`, `flipBoard`, `threefoldRepetition`, `claimADraw`, `offerDraw`, `draw`, `nbConnectedPlayers`, `gamesBeingPlayedRightNow`, `viewAllNbGames`, `viewNbCheckmates`, `nbBookmarks`, `nbPopularGames`, `nbAnalysedGames`, `bookmarkedByNbPlayers`, `viewInFullSize`, `logOut`, `signIn`, `newToLichess`, `youNeedAnAccountToDoThat`, `signUp`, `games`, `forum`, `xPostedInForumY`, `latestForumPosts`, `players`, `minutesPerSide`, `variant`, `timeControl`, `time`, `username`, `password`, `haveAnAccount`, `allYouNeedIsAUsernameAndAPassword`, `changePassword`, `learnMoreAboutLichess`, `rank`, `gamesPlayed`, `nbGamesWithYou`, `declineInvitation`, `cancel`, `timeOut`, `drawOfferSent`, `drawOfferDeclined`, `drawOfferAccepted`, `drawOfferCanceled`, `yourOpponentOffersADraw`, `accept`, `decline`, `playingRightNow`, `finished`, `abortGame`, `gameAborted`, `standard`, `unlimited`, `mode`, `casual`, `rated`, `thisGameIsRated`, `rematch`, `rematchOfferSent`, `rematchOfferAccepted`, `rematchOfferCanceled`, `rematchOfferDeclined`, `cancelRematchOffer`, `viewRematch`, `play`, `inbox`, `chatRoom`, `spectatorRoom`, `composeMessage`, `noNewMessages`, `subject`, `recipient`, `send`, `incrementInSeconds`, `freeOnlineChess`, `spectators`, `nbWins`, `nbLosses`, `nbDraws`, `exportGames`, `color`, `ratingRange`, `giveNbSeconds`, `premoveEnabledClickAnywhereToCancel`, `thisPlayerUsesChessComputerAssistance`, `opening`, `takeback`, `proposeATakeback`, `takebackPropositionSent`, `takebackPropositionDeclined`, `takebackPropositionAccepted`, `takebackPropositionCanceled`, `yourOpponentProposesATakeback`, `bookmarkThisGame`, `toggleBackground`, `search`, `advancedSearch`, `tournament`, `tournaments`, `tournamentPoints`, `viewTournament`, `freeOnlineChessGamePlayChessNowInACleanInterfaceNoRegistrationNoAdsNoPluginRequiredPlayChessWithComputerFriendsOrRandomOpponents`, `teams`, `nbMembers`, `allTeams`, `newTeam`, `myTeams`, `noTeamFound`, `joinTeam`, `quitTeam`, `anyoneCanJoin`, `aConfirmationIsRequiredToJoin`, `joiningPolicy`, `teamLeader`, `teamBestPlayers`, `teamRecentMembers`, `xJoinedTeamY`, `xCreatedTeamY`, `averageElo`, `location`, `settings`, `filterGames`, `reset`, `apply`, `leaderboard`, `pasteTheFenStringHere`, `pasteThePgnStringHere`, `fromPosition`, `continueFromHere`, `importGame`, `nbImportedGames`, `thisIsAChessCaptcha`, `clickOnTheBoardToMakeYourMove`, `notACheckmate`, `colorPlaysCheckmateInOne`, `retry`, `reconnecting`, `onlineFriends`, `noFriendsOnline`, `findFriends`, `favoriteOpponents`, `follow`, `following`, `unfollow`, `block`, `blocked`, `unblock`, `followsYou`, `xStartedFollowingY`, `nbFollowers`, `nbFollowing`, `more`, `memberSince`, `lastLogin`, `challengeToPlay`, `player`, `list`, `graph`, `lessThanNbMinutes`, `xToYMinutes`, `textIsTooShort`, `textIsTooLong`, `required`, `addToChrome`, `openTournaments`, `duration`, `winner`, `standing`, `createANewTournament`, `join`, `withdraw`, `points`, `wins`, `losses`, `winStreak`, `createdBy`, `waitingForNbPlayers`, `tournamentIsStarting`, `nbMinutesPerSidePlusNbSecondsPerMove`, `membersOnly`, `boardEditor`, `startPosition`, `clearBoard`, `savePosition`, `loadPosition`, `isPrivate`, `reportXToModerators`, `profile`, `editProfile`, `firstName`, `lastName`, `biography`, `country`, `preferences`, `watchLichessTV`, `previouslyOnLichessTV`, `todaysLeaders`, `onlinePlayers`, `progressToday`, `progressThisWeek`, `progressThisMonth`, `leaderboardThisWeek`, `leaderboardThisMonth`, `activeToday`, `activeThisWeek`, `activePlayers`, `bestBulletPlayers`, `bestBlitzPlayers`, `bestSlowPlayers`, `bewareTheGameIsRatedButHasNoClock`) + def keys = List(`playWithAFriend`, `inviteAFriendToPlayWithYou`, `playWithTheMachine`, `challengeTheArtificialIntelligence`, `toInviteSomeoneToPlayGiveThisUrl`, `gameOver`, `waitingForOpponent`, `waiting`, `yourTurn`, `aiNameLevelAiLevel`, `level`, `toggleTheChat`, `toggleSound`, `chat`, `resign`, `checkmate`, `stalemate`, `white`, `black`, `randomColor`, `createAGame`, `whiteIsVictorious`, `blackIsVictorious`, `playWithTheSameOpponentAgain`, `newOpponent`, `playWithAnotherOpponent`, `yourOpponentWantsToPlayANewGameWithYou`, `joinTheGame`, `whitePlays`, `blackPlays`, `theOtherPlayerHasLeftTheGameYouCanForceResignationOrWaitForHim`, `makeYourOpponentResign`, `forceResignation`, `forceDraw`, `talkInChat`, `theFirstPersonToComeOnThisUrlWillPlayWithYou`, `whiteCreatesTheGame`, `blackCreatesTheGame`, `whiteJoinsTheGame`, `blackJoinsTheGame`, `whiteResigned`, `blackResigned`, `whiteLeftTheGame`, `blackLeftTheGame`, `shareThisUrlToLetSpectatorsSeeTheGame`, `youAreViewingThisGameAsASpectator`, `replayAndAnalyse`, `computerAnalysisInProgress`, `theComputerAnalysisHasFailed`, `viewTheComputerAnalysis`, `requestAComputerAnalysis`, `computerAnalysis`, `blunders`, `mistakes`, `inaccuracies`, `moveTimes`, `flipBoard`, `threefoldRepetition`, `claimADraw`, `offerDraw`, `draw`, `nbConnectedPlayers`, `gamesBeingPlayedRightNow`, `viewAllNbGames`, `viewNbCheckmates`, `nbBookmarks`, `nbPopularGames`, `nbAnalysedGames`, `bookmarkedByNbPlayers`, `viewInFullSize`, `logOut`, `signIn`, `newToLichess`, `youNeedAnAccountToDoThat`, `signUp`, `games`, `forum`, `xPostedInForumY`, `latestForumPosts`, `players`, `minutesPerSide`, `variant`, `timeControl`, `time`, `username`, `password`, `haveAnAccount`, `allYouNeedIsAUsernameAndAPassword`, `changePassword`, `learnMoreAboutLichess`, `rank`, `gamesPlayed`, `nbGamesWithYou`, `declineInvitation`, `cancel`, `timeOut`, `drawOfferSent`, `drawOfferDeclined`, `drawOfferAccepted`, `drawOfferCanceled`, `yourOpponentOffersADraw`, `accept`, `decline`, `playingRightNow`, `finished`, `abortGame`, `gameAborted`, `standard`, `unlimited`, `mode`, `casual`, `rated`, `thisGameIsRated`, `rematch`, `rematchOfferSent`, `rematchOfferAccepted`, `rematchOfferCanceled`, `rematchOfferDeclined`, `cancelRematchOffer`, `viewRematch`, `play`, `inbox`, `chatRoom`, `spectatorRoom`, `composeMessage`, `noNewMessages`, `subject`, `recipient`, `send`, `incrementInSeconds`, `freeOnlineChess`, `spectators`, `nbWins`, `nbLosses`, `nbDraws`, `exportGames`, `color`, `ratingRange`, `giveNbSeconds`, `premoveEnabledClickAnywhereToCancel`, `thisPlayerUsesChessComputerAssistance`, `opening`, `takeback`, `proposeATakeback`, `takebackPropositionSent`, `takebackPropositionDeclined`, `takebackPropositionAccepted`, `takebackPropositionCanceled`, `yourOpponentProposesATakeback`, `bookmarkThisGame`, `toggleBackground`, `search`, `advancedSearch`, `tournament`, `tournaments`, `tournamentPoints`, `viewTournament`, `freeOnlineChessGamePlayChessNowInACleanInterfaceNoRegistrationNoAdsNoPluginRequiredPlayChessWithComputerFriendsOrRandomOpponents`, `teams`, `nbMembers`, `allTeams`, `newTeam`, `myTeams`, `noTeamFound`, `joinTeam`, `quitTeam`, `anyoneCanJoin`, `aConfirmationIsRequiredToJoin`, `joiningPolicy`, `teamLeader`, `teamBestPlayers`, `teamRecentMembers`, `xJoinedTeamY`, `xCreatedTeamY`, `averageElo`, `location`, `settings`, `filterGames`, `reset`, `apply`, `leaderboard`, `pasteTheFenStringHere`, `pasteThePgnStringHere`, `fromPosition`, `continueFromHere`, `importGame`, `nbImportedGames`, `thisIsAChessCaptcha`, `clickOnTheBoardToMakeYourMove`, `notACheckmate`, `colorPlaysCheckmateInOne`, `retry`, `reconnecting`, `onlineFriends`, `noFriendsOnline`, `findFriends`, `favoriteOpponents`, `follow`, `following`, `unfollow`, `block`, `blocked`, `unblock`, `followsYou`, `xStartedFollowingY`, `nbFollowers`, `nbFollowing`, `more`, `memberSince`, `lastLogin`, `challengeToPlay`, `player`, `list`, `graph`, `lessThanNbMinutes`, `xToYMinutes`, `textIsTooShort`, `textIsTooLong`, `required`, `addToChrome`, `openTournaments`, `duration`, `winner`, `standing`, `createANewTournament`, `join`, `withdraw`, `points`, `wins`, `losses`, `winStreak`, `createdBy`, `waitingForNbPlayers`, `tournamentIsStarting`, `nbMinutesPerSidePlusNbSecondsPerMove`, `membersOnly`, `boardEditor`, `startPosition`, `clearBoard`, `savePosition`, `loadPosition`, `isPrivate`, `reportXToModerators`, `profile`, `editProfile`, `firstName`, `lastName`, `biography`, `country`, `preferences`, `watchLichessTV`, `previouslyOnLichessTV`, `todaysLeaders`, `onlinePlayers`, `progressToday`, `progressThisWeek`, `progressThisMonth`, `leaderboardThisWeek`, `leaderboardThisMonth`, `activeToday`, `activeThisWeek`, `activePlayers`, `bestBulletPlayers`, `bestBlitzPlayers`, `bestSlowPlayers`, `bewareTheGameIsRatedButHasNoClock`, `training`, `yourPuzzleRatingX`, `findTheBestMoveForColor`, `toTrackYourProgress`, `trainingSignupExplanation`, `recentlyPlayedPuzzles`, `puzzleId`, `goodMove`, `butYouCanDoBetter`, `bestMove`, `keepGoing`, `puzzleFailed`, `butYouCanKeepTrying`, `victory`, `giveUp`, `puzzleSolvedInXSeconds`, `wasThisPuzzleAnyGood`, `pleaseVotePuzzle`, `thankYou`, `ratingX`, `playedXTimes`, `winRateX`, `fromGameLink`, `startTraining`, `continueTraining`, `retryThisPuzzle`, `thisPuzzleIsCorrect`, `thisPuzzleIsWrong`) }