Merge branch 'master' into ublog

* master:
  New Crowdin updates (#9690)
  rename Future.nevermind -> Future.recoverDefault
  log and ignore puzzle vote failure
  tweak hasher limit
  tweak puzzle sequencer
  remove unused argument
  fix response on invalid board API command
  check for the coach.listed flag
ublog
Thibault Duplessis 2021-08-30 08:41:33 +02:00
commit af4dd08768
31 changed files with 96 additions and 44 deletions

View File

@ -156,7 +156,7 @@ final class Env(
_ <- challenge.api.removeByUserId(u.id)
_ <- tournament.api.withdrawAll(u)
_ <- swiss.api.withdrawAll(u, teamIds)
_ <- plan.api.cancel(u).nevermind
_ <- plan.api.cancel(u).recoverDefault
_ <- lobby.seekApi.removeByUser(u)
_ <- security.store.closeAllSessionsOf(u.id)
_ <- push.webSubscriptionApi.unsubscribeByUser(u)

View File

@ -20,11 +20,11 @@ final class KeyPages(env: Env)(implicit ec: scala.concurrent.ExecutionContext) {
def homeHtml(implicit ctx: Context): Fu[Frag] =
env
.preloader(
posts = env.forum.recent(ctx.me, env.team.cached.teamIdsList).nevermind,
tours = env.tournament.cached.onHomepage.getUnit.nevermind,
posts = env.forum.recent(ctx.me, env.team.cached.teamIdsList).recoverDefault,
tours = env.tournament.cached.onHomepage.getUnit.recoverDefault,
swiss = env.swiss.feature.onHomepage.getUnit.getIfPresent,
events = env.event.api.promoteTo(ctx.req).nevermind,
simuls = env.simul.allCreatedFeaturable.get {}.nevermind,
events = env.event.api.promoteTo(ctx.req).recoverDefault,
simuls = env.simul.allCreatedFeaturable.get {}.recoverDefault,
streamerSpots = env.streamer.homepageMaxSetting.get()
)
.mon(_.lobby segment "preloader.total")

View File

@ -127,6 +127,7 @@ final class PlayApi(
env.chat.api.userChat.find(lila.chat.Chat.Id(pov.game.id)) map
lila.chat.JsonView.boardApi map JsonOk
}
case _ => notFoundJson("No such command")
}
}

View File

@ -60,7 +60,7 @@ final class Relation(
lila.msg.MsgPreset.maxFollow(me.username, env.relation.maxFollow.value)
) inject Ok
case _ =>
api.follow(me.id, UserModel normalize userId).nevermind >> renderActions(userId, getBool("mini"))
api.follow(me.id, UserModel normalize userId).recoverDefault >> renderActions(userId, getBool("mini"))
}
}(rateLimitedFu)
}
@ -74,7 +74,7 @@ final class Relation(
Api.ClientError(lila.msg.MsgPreset.maxFollow(me.username, env.relation.maxFollow.value).text)
)
case _ =>
api.follow(me.id, UserModel normalize userId).nevermind inject Api.Done
api.follow(me.id, UserModel normalize userId).recoverDefault inject Api.Done
}
}(fuccess(Api.Limited)) map apiC.toHttp
}
@ -82,7 +82,7 @@ final class Relation(
def unfollow(userId: String) =
Auth { implicit ctx => me =>
FollowLimitPerUser(me.id) {
api.unfollow(me.id, UserModel normalize userId).nevermind >> renderActions(userId, getBool("mini"))
api.unfollow(me.id, UserModel normalize userId).recoverDefault >> renderActions(userId, getBool("mini"))
}(rateLimitedFu)
}
@ -96,13 +96,13 @@ final class Relation(
def block(userId: String) =
Auth { implicit ctx => me =>
FollowLimitPerUser(me.id) {
api.block(me.id, UserModel normalize userId).nevermind >> renderActions(userId, getBool("mini"))
api.block(me.id, UserModel normalize userId).recoverDefault >> renderActions(userId, getBool("mini"))
}(rateLimitedFu)
}
def unblock(userId: String) =
Auth { implicit ctx => me =>
api.unblock(me.id, UserModel normalize userId).nevermind >> renderActions(userId, getBool("mini"))
api.unblock(me.id, UserModel normalize userId).recoverDefault >> renderActions(userId, getBool("mini"))
}
def following(username: String, page: Int) =

View File

@ -512,7 +512,7 @@ final class Tournament(
negotiate(
html = notFound,
api = _ =>
env.tournament.cached.onHomepage.getUnit.nevermind map {
env.tournament.cached.onHomepage.getUnit.recoverDefault map {
lila.tournament.Spotlight.select(_, ctx.me, 4)
} flatMap env.tournament.apiJsonView.featured map { Ok(_) }
)

View File

@ -132,7 +132,7 @@ object UserInfo {
relationApi.countFollowers(user.id).mon(_.user segment "nbFollowers") zip
!(user.is(User.lichessId) || user.isBot) ??
postApi.nbByUser(user.id).mon(_.user segment "nbPosts") zip
studyRepo.countByOwner(user.id).nevermind.mon(_.user segment "nbStudies") zip
studyRepo.countByOwner(user.id).recoverDefault.mon(_.user segment "nbStudies") zip
trophyApi.findByUser(user).mon(_.user segment "trophy") zip
shieldApi.active(user).mon(_.user segment "shields") zip
revolutionApi.active(user).mon(_.user segment "revolutions") zip

View File

@ -41,7 +41,9 @@ final class CoachApi(
}
def isListedCoach(user: User): Fu[Boolean] =
Granter(_.Coach)(user) ?? user.enabled ?? user.marks.clean ?? coachColl.exists($id(user.id))
Granter(_.Coach)(user) ?? user.enabled ?? user.marks.clean ?? coachColl.exists(
$id(user.id) ++ $doc("listed" -> true)
)
def setSeenAt(user: User): Funit =
Granter(_.Coach)(user) ?? coachColl.update.one($id(user.id), $set("user.seenAt" -> DateTime.now)).void

View File

@ -168,14 +168,14 @@ final class PimpedFuture[A](private val fua: Fu[A]) extends AnyVal {
def logTime(name: String) = chronometer pp name
def logTimeIfGt(name: String, duration: FiniteDuration) = chronometer.ppIfGt(name, duration)
def nevermind(implicit z: Zero[A], ec: EC): Fu[A] = nevermind(z.zero)
def recoverDefault(implicit z: Zero[A], ec: EC): Fu[A] = recoverDefault(z.zero)
def nevermind(default: => A)(implicit ec: EC): Fu[A] =
def recoverDefault(default: => A)(implicit ec: EC): Fu[A] =
fua recover {
case _: LilaException => default
case _: java.util.concurrent.TimeoutException => default
case e: Exception =>
lila.log("common").warn("Future.nevermind", e)
lila.log("common").warn("Future.recoverDefault", e)
default
}
}

View File

@ -68,7 +68,7 @@ final private class ZulipClient(ws: StandaloneWSClient, config: ZulipClient.Conf
}
.monSuccess(_.irc.zulip.say(msg.stream))
.logFailure(lila.log("zulip"))
.nevermind
.recoverDefault
}(fuccess(None))
}

View File

@ -53,7 +53,7 @@ final class MongoRateLimit[K](
}
}
final class MongoRateLimitApi(db: lila.db.Db, config: MemoConfig)(implicit ec: ExecutionContext) {
final class MongoRateLimitApi(db: lila.db.Db, config: MemoConfig) {
private val coll = db(config.cacheColl)

View File

@ -162,7 +162,7 @@ final class MsgApi(
destSource
.filter(orig.id !=)
.mapAsync(4) {
post(orig.id, _, text, multi = true).logFailure(logger).nevermind(PostResult.Invalid)
post(orig.id, _, text, multi = true).logFailure(logger).recoverDefault(PostResult.Invalid)
}
.toMat(LilaStream.sinkCount)(Keep.right)
.run()

View File

@ -15,7 +15,7 @@ final private class HookThieve()(implicit
Bus
.ask[PoolHooks]("lobbyTrouper")(GetCandidates(clock, _))
.logFailure(logger)
.nevermind(PoolHooks(Vector.empty))
.recoverDefault(PoolHooks(Vector.empty))
def stolen(poolHooks: Vector[PoolHook], monId: String) = {
lila.mon.lobby.pool.thieve.stolen(monId).record(poolHooks.size)

View File

@ -62,7 +62,7 @@ final class PuzzleApi(
private val sequencer =
new lila.hub.AsyncActorSequencers(
maxSize = 16,
expiration = 5 minutes,
expiration = 1 minute,
timeout = 3 seconds,
name = "puzzle.vote"
)
@ -85,7 +85,7 @@ final class PuzzleApi(
}
}
}
}
}.logFailure(logger, _ => s"puzzle.vote $id").recoverDefault
private def updatePuzzle(puzzleId: Puzzle.Id, newVote: Int, prevVote: Option[Int]): Funit =
colls.puzzle { coll =>

View File

@ -47,7 +47,7 @@ ${trans.common_orPaste.txt()}
tokener read token dmap (_.flatten) flatMap {
_ ?? { case TokenPayload(userId, email) =>
userRepo.email(userId) flatMap { previous =>
(userRepo.setEmail(userId, email).nevermind >> userRepo.byId(userId))
(userRepo.setEmail(userId, email).recoverDefault >> userRepo.byId(userId))
.map2(_ -> previous)
}
}

View File

@ -42,7 +42,7 @@ final class GarbageCollector(
retries = 5,
logger = none
)
.nevermind >> apply(applyData)
.recoverDefault >> apply(applyData)
()
}
.unit

View File

@ -180,7 +180,7 @@ final class RemoteSocket(
res => logger.info(s"lila-ws says: $res")
).withTimeout(1 second)
.addFailureEffect(e => logger.error("lila-ws stop", e))
.nevermind
.recoverDefault
}
Lilakka.shutdown(shutdown, _.PhaseServiceUnbind, "Stopping the socket redis pool") { () =>

View File

@ -90,7 +90,7 @@ object PasswordHasher {
)
private lazy val rateLimitGlobal = new RateLimit[String](
credits = 4 * 10 * 60, // max out 4 cores for 60 seconds
credits = 6 * 10 * 60, // max out 6 cores for 60 seconds
duration = 1 minute,
key = "password.hashes.global"
)

View File

@ -49,4 +49,8 @@ Hrajte rychle a vraťte se vždy co nejdříve do turnajové místnosti - stihne
<string name="newTeamBattle">Nová týmová bitva</string>
<string name="customStartDate">Vlastní datum zahájení</string>
<string name="allowBerserk">Povolit Berserk</string>
<string name="allowBerserkHelp">Umožní hráčům snížit čas na polovinu a získat bod navíc</string>
<string name="allowChatHelp">Nechat hráče diskutovat v chatu</string>
<string name="arenaStreaks">Série v aréně</string>
<string name="arenaStreaksHelp">Po dvou výhrách, další po sobě jdoucí výhry udělují 4 body místo 2.</string>
</resources>

View File

@ -52,6 +52,7 @@
<string name="knightMate">Je možné dát šach-mat jen s koněm nebo střelcem, pokud má soupeř na šachovnici více figur než jen krále.</string>
<string name="noRatingPoints">Nebyly přiděleny žádné ratingové body</string>
<string name="ratedGame">Ujistěte se, že jste hráli hodnocenou hru. Neformální hry neovlivňují hodnocení hráčů.</string>
<string name="botRatingAbuse">Za určitých okolností při hraní proti účtu bota hodnocená hra neudělí žádné body, pokud je zjištěno, že hráč zneužívá bota jen pro změnu hodnocení.</string>
<string name="errorPage">Chybová stránka</string>
<string name="reportErrorPage">Pokud jste narazili na chybovou stránku, můžete ji nahlásit:</string>
<string name="banAppeal">Žádost o zákaz nebo IP omezení</string>

View File

@ -34,7 +34,7 @@
<string name="theKnight">Jezdec</string>
<string name="itMovesInAnLShape">Pohybuje se ve tvaru písmene „L”</string>
<string name="knightIntro">A nyní výzva pro vás. Jezdec je... velmi obtížná figura.</string>
<string name="knightsHaveAFancyWay">Jezdci mají bláznivé cesty na skákání okolo!</string>
<string name="knightsHaveAFancyWay">Jezdci bláznivě skáčkou okolo!</string>
<string name="knightsCanJumpOverObstacles">Jezdci mohou skákat přes překážky! Utečte z pasti a dobyjte hvězdy!</string>
<string name="knightComplete">Gratulace! Zvládáte manipulovat s jezdcem.</string>
<string name="thePawn">Pěšec</string>

View File

@ -52,7 +52,7 @@
<string name="history">Historie řešení úloh</string>
<string name="solved">vyřešeno</string>
<string name="failed">nezdařilo se</string>
<string name="streakDescription">Vyřešte postupně těžší hádanky a vytvořte vítěznou sérii. Není tu žádný limit, takže si dejte na na čas. Jeden špatný tah a je to hra skončí! Můžete ale přeskočit jeden tah za běh.</string>
<string name="streakDescription">Vyřešte postupně těžší hádanky a vytvořte vítěznou sérii. Není tu žádný limit, takže si dejte na na čas. Jeden špatný tah a je to, hra skončí! Můžete ale přeskočit jeden tah za běh.</string>
<string name="yourStreakX">Vaše série: %s</string>
<string name="streakSkipExplanation">Přeskočit tento krok pro zachování své série! Funguje pouze jednou za běh.</string>
<string name="continueTheStreak">Pokračovat v sérii</string>
@ -61,4 +61,11 @@
<string name="fromMyGamesNone">V databázi nemáte žádné úlohy, ale Lichess vás stále velmi miluje.
Hrajte rapid a klasické hry ke zvýšení šance na přidání vlastní úlohy!</string>
<string name="fromXGamesFound">%1$s úloh nalezeno v %2$s partiích</string>
<plurals name="nbToReplay">
<item quantity="one">%s k opakování</item>
<item quantity="few">%s k opakování</item>
<item quantity="many">%s k opakování</item>
<item quantity="other">%s k opakování</item>
</plurals>
<string name="percentSolved">%s vyřešeno</string>
</resources>

View File

@ -57,7 +57,7 @@
<string name="strengths">Puntos fuertes</string>
<string name="history">Historial de ejercicios</string>
<string name="solved">resuelto</string>
<string name="failed">error</string>
<string name="failed">fallido</string>
<string name="streakDescription">Resuelve ejercicios cada vez más difíciles para conseguir la racha más larga posible. No hay tiempo, así que tómatelo con calma. Un movimiento erróneo y ¡se acabó!, aunque puedes omitir un movimiento en cada sesión.</string>
<string name="yourStreakX">Aciertos seguidos: %s</string>
<string name="streakSkipExplanation">Puedes omitir este movimiento para conservar tu racha, pero solo una vez por sesión.</string>
@ -72,15 +72,15 @@
<string name="fromXGamesFound">%1$s ejercicios encontrados en las partidas de %2$s</string>
<string name="puzzleDashboardDescription">Entrena, analiza, mejora</string>
<plurals name="nbPlayed">
<item quantity="one">%s completado</item>
<item quantity="other">%s completados</item>
<item quantity="one">%s ejercicio</item>
<item quantity="other">%s ejercicios</item>
</plurals>
<plurals name="nbToReplay">
<item quantity="one">%s a repetir</item>
<item quantity="other">%s a repetir</item>
</plurals>
<string name="percentSolved">%s solucionados</string>
<string name="noPuzzlesToShow">Nada que mostrar, ¡primero resuelve algunos ejercicios!</string>
<string name="improvementAreasDescription">¡Entrena estas áreas para mejorar tu progreso!</string>
<string name="strengthDescription">Tienes el mejor rendimiento en estos temas</string>
<string name="percentSolved">%s correctos</string>
<string name="noPuzzlesToShow">Aún no hay nada que mostrar aquí. ¡Ve y haz algunos ejercicios!</string>
<string name="improvementAreasDescription">¡Entrena estas áreas para progresar!</string>
<string name="strengthDescription">Estas son las áreas en las que eres más fuerte</string>
</resources>

View File

@ -76,4 +76,21 @@
<string name="fromMyGamesNone">V bazi podatkov nimate ugank, vendar vas ima Lichess še vedno zelo rad.
Igrajte hitre in klasične igre, da povečate možnosti za dodajanje svoje uganke!</string>
<string name="fromXGamesFound">Najdenih %1$s ugank v %2$s igrah</string>
<string name="puzzleDashboardDescription">Trenirajte, analizirajte, izboljšajte</string>
<plurals name="nbPlayed">
<item quantity="one">%s igrana</item>
<item quantity="two">%s igrani</item>
<item quantity="few">%s igrani</item>
<item quantity="other">%s igranih</item>
</plurals>
<plurals name="nbToReplay">
<item quantity="one">%s za predvajanje</item>
<item quantity="two">%s za predvajanje</item>
<item quantity="few">%s za predvajanje</item>
<item quantity="other">%s za predvajanje</item>
</plurals>
<string name="percentSolved">%s rešenih</string>
<string name="noPuzzlesToShow">Nič za pokazati, najprej pojdite igrati uganke!</string>
<string name="improvementAreasDescription">Trenirajte jih, da optimizirate svoj napredek!</string>
<string name="strengthDescription">V teh temah se najbolje odrežete</string>
</resources>

View File

@ -107,7 +107,7 @@
<string name="skewerDescription">Un motivo que implica el ataque de una pieza de alto valor, que se aparta del camino y permite capturar o atacar una pieza de menor valor detrás de ella, lo contrario de una clavada.</string>
<string name="smotheredMate">Mate de la coz</string>
<string name="smotheredMateDescription">Un jaque mate en el que el caballo ataca al rey contrario, el cual no puede moverse al encontrarse rodeado (o ahogado) por sus propias piezas.</string>
<string name="superGM">Partidas de super grandes maestros</string>
<string name="superGM">Partidas de súper grandes maestros</string>
<string name="superGMDescription">Ejercicios de partidas de los mejores jugadores del mundo.</string>
<string name="trappedPiece">Pieza atrapada</string>
<string name="trappedPieceDescription">Una pieza no puede escapar de la captura porque tiene movimientos limitados.</string>
@ -115,7 +115,7 @@
<string name="underPromotionDescription">Promoción a caballo, alfil o torre.</string>
<string name="veryLong">Ejercicio muy largo</string>
<string name="veryLongDescription">Cuatro movimientos o más para ganar.</string>
<string name="xRayAttack">Ataque de rayos X</string>
<string name="xRayAttack">Ataque por rayos X</string>
<string name="xRayAttackDescription">Una pieza ataca o defiende una casilla, a través de una pieza del oponente.</string>
<string name="zugzwang">Zugzwang</string>
<string name="zugzwangDescription">El oponente está limitado en los movimientos que puede realizar, y todos los movimientos empeoran su posición.</string>

View File

@ -89,4 +89,7 @@ Eden od vaših kmetov je globoko na nasprotnikovem področju in ima morda možno
<string name="veryLong">Zelo dolga uganka</string>
<string name="zugzwang">Nujnica</string>
<string name="healthyMixDescription">Vsega po malo. Ne veste, kaj pričakovati, zato bodite pripravljeni na vse! Kot pri resničnih partijah.</string>
<string name="playerGames">Igralske igre</string>
<string name="playerGamesDescription">Iskanje ugank, ustvarjenih iz vaših iger ali iz iger drugega igralca.</string>
<string name="puzzleDownloadInformation">Te uganke so v javni lasti in jih je mogoče prenesti s spletnega mesta %s.</string>
</resources>

View File

@ -916,10 +916,10 @@ Leer lassen, um Partien von der normalen Ausgangsstellung aus zu starten.</strin
<string name="closedAccountChangedMind">Wenn du dein Konto geschlossen, aber danach deine Meinung geändert hast, hast du eine Chance, dein Konto zurückzuerhalten.</string>
<string name="onlyWorksOnce">Das funktioniert nur ein einziges mal.</string>
<string name="cantDoThisTwice">Wenn du dein Konto ein zweites Mal schließt, wird es keine Möglichkeit geben, es wiederherzustellen.</string>
<string name="emailAssociatedToaccount">Deinem Konto zugeordnete E-Mail-Adresse</string>
<string name="emailAssociatedToaccount">E-Mail-Adresse deines Kontos</string>
<string name="sentEmailWithLink">Wir haben dir eine E-Mail mit einem Link geschickt.</string>
<string name="tournamentEntryCode">Turnierbeitrittscode</string>
<string name="hangOn">Moment mal!</string>
<string name="hangOn">Einen Moment!</string>
<string name="gameInProgress">Du hast noch eine laufende Partie mit %s.</string>
<string name="abortTheGame">Partie abbrechen</string>
<string name="resignTheGame">Partie aufgeben</string>

View File

@ -870,7 +870,7 @@
<string name="timeAlmostUp">¡Te queda poco tiempo!</string>
<string name="clickToRevealEmailAddress">[Haz clic para mostrar el correo electrónico]</string>
<string name="download">Descargar</string>
<string name="welcome">¡Bienvenidos!</string>
<string name="welcome">¡Bienvenido!</string>
<string name="lichessPatronInfo">Lichess es una organización benéfica y un software totalmente libre y de código abierto.
Todos los gastos de funcionamiento, desarrollo y contenidos se financian exclusivamente mediante las donaciones de sus usuarios.</string>
<string name="coachManager">Gestor de entrenador</string>
@ -912,9 +912,9 @@ Déjalo vacío para empezar las partidas desde la posición inicial habitual.</s
<string name="analysisOptions">Opciones de análisis</string>
<string name="focusChat">Foco en el chat</string>
<string name="showHelpDialog">Mostrar este cuadro de diálogo de ayuda</string>
<string name="reopenYourAccount">Recupera tu cuenta</string>
<string name="reopenYourAccount">Reactivar tu cuenta</string>
<string name="closedAccountChangedMind">Si cerraste tu cuenta y has cambiado de opinión, aún tienes una oportunidad de recuperarla.</string>
<string name="onlyWorksOnce">Esto solo funcionará una vez.</string>
<string name="onlyWorksOnce">Esto solo se puede hacer una vez.</string>
<string name="cantDoThisTwice">Si vuelves a cerrar tu cuenta, no podrás recuperarla.</string>
<string name="emailAssociatedToaccount">Dirección de correo electrónico asociada a la cuenta</string>
<string name="sentEmailWithLink">Te hemos enviado un correo electrónico con un enlace.</string>
@ -923,5 +923,5 @@ Déjalo vacío para empezar las partidas desde la posición inicial habitual.</s
<string name="gameInProgress">Estás jugando una partida con %s.</string>
<string name="abortTheGame">Cancelar la partida</string>
<string name="resignTheGame">Abandonar la partida</string>
<string name="youCantStartNewGame">No puedes empezar una nueva partida hasta que ésta haya terminado.</string>
<string name="youCantStartNewGame">No puedes empezar otra partida hasta que termines ésta.</string>
</resources>

View File

@ -3,7 +3,7 @@
<string name="moveToStart">Mueve para empezar</string>
<string name="youPlayTheWhitePiecesInAllPuzzles">Juegas con blancas en todos los ejercicios</string>
<string name="youPlayTheBlackPiecesInAllPuzzles">Juegas con negras en todos los ejercicios</string>
<string name="puzzlesSolved">ejercicios resueltos</string>
<string name="puzzlesSolved">ejercicios correctos</string>
<string name="newDailyHighscore">¡Récord del día!</string>
<string name="newWeeklyHighscore">¡Récord de la semana!</string>
<string name="newMonthlyHighscore">¡Récord del mes!</string>

View File

@ -41,6 +41,7 @@ Do turnaje se mohou připojit kdykoliv.</string>
Hráči, kteří se připojí dostanou 1 volna i když se nezúčastní více kol.</string>
<string name="willSwissReplaceArenasQ">Nahradí švýcarské turnaje arény?</string>
<string name="roundRobinQ">Co systém každý s každým?</string>
<string name="otherSystemsQ">A co ostatní systémy turnajů?</string>
<string name="joinOrCreateTeam">Připojit se k týmu nebo vytvořit tým</string>
<string name="nowPlaying">Právě se hraje</string>
<string name="startingSoon">Brzy začne</string>
@ -49,12 +50,19 @@ Hráči, kteří se připojí dostanou 1 volna i když se nezúčastní více ko
<string name="predefinedDuration">Předpokládaná doba trvání</string>
<string name="durationUnknown">Předem daný počet kol, ale neznámá doba trvání</string>
<string name="numberOfGames">Počet her</string>
<string name="numberOfGamesPreDefined">Stanoveno předem, stejné pro všechny hráče</string>
<string name="pairingSystem">Losovací systém</string>
<string name="pairingSystemArena">Jakýkoli soupeř s podobným hodnocením</string>
<string name="pairingSystemSwiss">Nejlepší párování založené na bodech a remízách</string>
<string name="pairingWaitTime">Čekání na spárování</string>
<string name="pairingWaitTimeFast">Rychle: nečeká se na všechny hráče</string>
<string name="pairingWaitTimeSlow">Pomalu: čeká se ns všechny hráče</string>
<string name="identicalForbidden">Zakázané</string>
<string name="lateJoin">Pozdní připojení</string>
<string name="lateJoinUntil">Ano, dokud nezačne více než polovina kol</string>
<string name="pause">Pauza</string>
<string name="pauseSwiss">Ano, ale může snížit počet kol</string>
<string name="streaksAndBerserk">Série a Berserk</string>
<string name="similarToOTB">Podobné OTB turnajům</string>
<string name="unlimitedAndFree">Neomezené a zdarma</string>
</resources>

View File

@ -9,6 +9,10 @@
<item quantity="one">%s kierrosta</item>
<item quantity="other">%s kierrosta</item>
</plurals>
<plurals name="oneRoundEveryXDays">
<item quantity="one">Yksi kierros päivässä</item>
<item quantity="other">Yksi kierros %s päivän välein</item>
</plurals>
<string name="roundsAreStartedManually">Kierrokset aloitetaan käsin</string>
<plurals name="xSecondsBetweenRounds">
<item quantity="one">%s sekuntia kierrosten välillä</item>
@ -20,6 +24,10 @@
</plurals>
<string name="startingIn" comment="Displayed above a timer">Turnauksen alkuun on</string>
<string name="nextRound">Seuraava kierros</string>
<plurals name="ongoingGames" comment="Displayed next to the ongoing games count">
<item quantity="one">Meneillään oleva peli</item>
<item quantity="other">Meneillään olevat pelit</item>
</plurals>
<string name="tournStartDate">Turnauksen alkamisaika</string>
<string name="numberOfRounds">Kierrosten määrä</string>
<string name="numberOfRoundsHelp">Parittomalla kierrosten määrällä värit jakautuvat tasapainoisimmin.</string>

View File

@ -39,6 +39,7 @@
<string name="teamBattleOverview">Souboj více týmů, každý hráč získává body pro svůj tým</string>
<string name="teamTournament">Týmový turnaj</string>
<string name="teamTournamentOverview">Arena turnaj, ke kterému se mohou přidat pouze členová vašeho týmu</string>
<string name="swissTournamentOverview">Švýcarský turnaj, ke kterému se mohou připojit pouze členové vašeho týmu</string>
<string name="messageAllMembers">Zpráva všem členům</string>
<string name="messageAllMembersOverview">Poslat soukromou zprávu každému členovi týmu</string>
<string name="messageAllMembersLongDescription">Poslat soukromou zprávu VŠEM členům týmu.