Merge branch 'master' of github.com:ornicar/lila into prettier

* 'master' of github.com:ornicar/lila: (100 commits)
  faster storm score animation
  reverse storm run history before summary display
  remove time logging
  New Crowdin updates (#7987)
  tweak storm selector logging
  tweak storm difficulty
  dim ding
  storm UI tweaks
  try out manual storm rating buckets
  a message to the hax0rs
  tweak user activity style
  tweak storm fonts
  tweak storm UI
  add about storm link
  use Segment7 font for puzzle storm
  puzzle storm in puzzle activity
  storm UI tweak
  update /features
  tweak doc style
  prevent opening same run in multiple tabs
  ...
pull/7944/head
Panayiotis Lipiridis 2021-01-27 11:18:10 +02:00
commit 2403250261
325 changed files with 9659 additions and 281 deletions

View File

@ -39,6 +39,7 @@ public/font/lichess.{sfd,woff,woff2} | [Dave Gandy](http://fontawesome.io/), [Gi
public/font/lichess.chess.{sfd,woff,woff2} | the [pgn4web](http://pgn4web.casaschi.net/home.html) authors | [GPLv2+](https://www.gnu.org/licenses/gpl-2.0.txt)
Noto Sans in public/font | [Google](https://fonts.google.com/specimen/Noto+Sans) | [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)
Roboto in public/font | [Christian Robertson](https://fonts.google.com/specimen/Roboto) | [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)
Segment7 in public/font | [Cedders](https://www.fontspace.com/cedders) | [SIL Open Font License](https://www.fontspace.com/help#license-17)
public/images/staunton | [James Clarke](https://github.com/clarkerubber/Staunton-Pieces) | [MIT](https://github.com/clarkerubber/Staunton-Pieces/blob/master/LICENSE)
public/images/staunton/piece/CubesAndPi | CubesAndPi | AGPLv3+
public/images/trophy | [James Clarke](https://github.com/clarkerubber/Staunton-Pieces/tree/master/Trophies) | [MIT](https://github.com/clarkerubber/Staunton-Pieces/blob/master/LICENSE)

View File

@ -153,6 +153,7 @@ final class LilaComponents(ctx: ApplicationLoader.Context) extends BuiltInCompon
lazy val video: Video = wire[Video]
lazy val swiss: Swiss = wire[Swiss]
lazy val dgt: DgtCtrl = wire[DgtCtrl]
lazy val storm: Storm = wire[Storm]
// eagerly wire up all controllers
val router: Router = {

View File

@ -79,6 +79,7 @@ final class Env(
val evalCache: lila.evalCache.Env,
val rating: lila.rating.Env,
val swiss: lila.swiss.Env,
val storm: lila.storm.Env,
val lilaCookie: lila.common.LilaCookie,
val net: NetConfig,
val controllerComponents: ControllerComponents
@ -261,6 +262,7 @@ final class EnvBoot(
lazy val evalCache: lila.evalCache.Env = wire[lila.evalCache.Env]
lazy val rating: lila.rating.Env = wire[lila.rating.Env]
lazy val swiss: lila.swiss.Env = wire[lila.swiss.Env]
lazy val storm: lila.storm.Env = wire[lila.storm.Env]
lazy val api: lila.api.Env = wire[lila.api.Env]
lazy val lilaCookie = wire[lila.common.LilaCookie]

View File

@ -0,0 +1,59 @@
package controllers
import play.api.mvc._
import views._
import lila.api.Context
import lila.app._
final class Storm(env: Env)(implicit mat: akka.stream.Materializer) extends LilaController(env) {
def home =
Open { implicit ctx =>
NoBot {
env.storm.selector.apply flatMap { puzzles =>
ctx.userId.?? { u => env.storm.highApi.get(u) dmap some } map { high =>
NoCache {
Ok(
views.html.storm.home(
env.storm.json(puzzles),
env.storm.json.pref(ctx.pref.copy(coords = lila.pref.Pref.Coords.NONE)),
high
)
)
}
}
}
}
}
def record =
OpenBody { implicit ctx =>
NoBot {
implicit val req = ctx.body
env.storm.forms.run
.bindFromRequest()
.fold(
_ => fuccess(none),
data => env.storm.dayApi.addRun(data, ctx.me)
) map env.storm.json.newHigh map { json =>
Ok(json) as JSON
}
}
}
def dashboard(page: Int) =
Auth { implicit ctx => me =>
get("u")
.ifTrue(isGranted(_.Hunter))
.??(env.user.repo.named)
.map(_ | me)
.flatMap { user =>
env.storm.dayApi.history(user.id, page) flatMap { history =>
env.storm.highApi.get(user.id) map { high =>
Ok(views.html.storm.dashboard(user, history, high))
}
}
}
}
}

View File

@ -1,5 +1,7 @@
package views.html
import controllers.routes
import lila.activity.activities._
import lila.activity.model._
import lila.api.Context
@ -7,8 +9,6 @@ import lila.app.templating.Environment._
import lila.app.ui.ScalatagsTemplate._
import lila.user.User
import controllers.routes
object activity {
def apply(u: User, as: Iterable[lila.activity.ActivityView])(implicit ctx: Context) =
@ -20,6 +20,7 @@ object activity {
a.patron map renderPatron,
a.practice map renderPractice,
a.puzzles map renderPuzzles,
a.storm map renderStorm,
a.games map renderGames,
a.posts map renderPosts,
a.corresMoves map { case (nb, povs) =>
@ -84,6 +85,16 @@ object activity {
)
)
private def renderStorm(s: Storm)(implicit ctx: Context) =
entryTag(
iconTag("~"),
scoreTag(winTag(trans.storm.highscoreX(strong(s.score)))),
div(
trans.storm.playedNbRunsOfPuzzleStorm
.plural(s.runs, s.runs.localize, a(href := routes.Storm.home())("Puzzle Storm"))
)
)
private def renderGames(games: Games)(implicit ctx: Context) =
games.value.toSeq.sortBy(-_._2.size).map { case (pt, score) =>
entryTag(
@ -270,6 +281,8 @@ object activity {
private val entryTag = div(cls := "entry")
private val subTag = div(cls := "sub")
private val scoreTag = tag("score")
private val winTag = tag("win")
private def scoreFrag(s: Score)(implicit ctx: Context) =
raw {

View File

@ -1,11 +1,11 @@
package views.html.base
import controllers.routes
import lila.api.Context
import lila.app.templating.Environment._
import lila.app.ui.ScalatagsTemplate._
import controllers.routes
object topnav {
private def linkTitle(url: String, name: Frag)(implicit ctx: Context) =
@ -35,12 +35,19 @@ object topnav {
)
)
),
ctx.noBot option st.section(
linkTitle(routes.Puzzle.home().path, trans.puzzles()),
div(role := "group")(
a(href := routes.Puzzle.home())(trans.puzzles()),
a(href := routes.Puzzle.dashboard(30, "home"))(trans.puzzle.puzzleDashboard()),
a(href := routes.Storm.home())("Puzzle storm")
)
),
st.section(
linkTitle(routes.Puzzle.home().path, trans.learnMenu()),
linkTitle(routes.Practice.index().path, trans.learnMenu()),
div(role := "group")(
ctx.noBot option frag(
a(href := routes.Learn.index())(trans.chessBasics()),
a(href := routes.Puzzle.home())(trans.puzzles()),
a(href := routes.Practice.index())(trans.practice()),
a(href := routes.Coordinate.home())(trans.coordinates.coordinates())
),

View File

@ -74,6 +74,9 @@ object features {
tr(unlimited)(
a(href := routes.Puzzle.home())("Tactical puzzles from user games")
),
tr(unlimited)(
a(href := routes.Storm.home())("Puzzle Storm")
),
tr(unlimited)(
a(href := s"${routes.UserAnalysis.index()}#explorer")("Opening explorer"),
" (62 million games!)"
@ -88,7 +91,7 @@ object features {
),
tr(unlimited)(
a(href := routes.Search.index(1))("Advanced search"),
" through Lichess 1.5 billion games"
" through Lichess 3 billion games"
),
tr(unlimited)(
a(href := routes.Video.index())("Chess video library")

View File

@ -0,0 +1,134 @@
package views.html
import controllers.routes
import play.api.i18n.Lang
import play.api.libs.json._
import lila.api.Context
import lila.app.templating.Environment._
import lila.app.ui.ScalatagsTemplate._
import lila.common.paginator.Paginator
import lila.common.String.html.safeJsonValue
import lila.storm.{ StormDay, StormHigh }
import lila.user.User
object storm {
def home(data: JsObject, pref: JsObject, high: Option[StormHigh])(implicit ctx: Context) =
views.html.base.layout(
moreCss = frag(cssTag("storm")),
moreJs = frag(
jsModule("storm"),
embedJsUnsafeLoadThen(
s"""LichessStorm.start(${safeJsonValue(
Json.obj(
"data" -> data,
"pref" -> pref,
"i18n" -> i18nJsObject(i18nKeys)
)
)})"""
)
),
title = "Puzzle Storm",
zoomable = true
) {
main(
div(cls := "storm storm-app"),
high map { h =>
frag(
div(cls := "storm-play-scores")(
span("Puzzle storm highscores"),
a(href := routes.Storm.dashboard())("View best runs »")
),
div(cls := "storm-dashboard__high__periods")(
renderHigh(h)
)
)
},
div(cls := "storm__about__link")(
a(href := routes.Page.loneBookmark("storm"))("About Puzzle Storm")
)
)
}
private def renderHigh(high: StormHigh)(implicit lang: Lang) =
frag(
List(
(high.allTime, "All-time"),
(high.month, "This month"),
(high.week, "This week"),
(high.day, "Today")
).map { case (value, name) =>
div(cls := "storm-dashboard__high__period")(
strong(value),
span(name)
)
}
)
private val numberTag = tag("number")
def dashboard(user: User, history: Paginator[StormDay], high: StormHigh)(implicit ctx: Context) =
views.html.base.layout(
moreCss = frag(cssTag("storm.dashboard")),
title = s"${user.username} Puzzle Storm"
)(
main(cls := "storm-dashboard page-small")(
div(cls := "storm-dashboard__high box box-pad")(
h1(
userLink(user),
" • Puzzle Storm highscores"
),
div(cls := "storm-dashboard__high__periods highlight-alltime")(
renderHigh(high)
)
),
a(cls := "storm-play-again button", href := routes.Storm.home())(trans.storm.playAgain()),
div(cls := "storm-dashboard__history box")(
table(cls := "slist slist-pad")(
thead(
tr(
th("Best run of day"),
th("Score"),
th("Moves"),
th("Accuracy"),
th("Combo"),
th("Time"),
th("Highest solved"),
th("Runs")
)
),
tbody(
history.currentPageResults.map { day =>
tr(
td(showDate(day._id.day.toDate)),
td(numberTag(cls := "score")(day.score)),
td(numberTag(day.moves)),
td(numberTag(f"${day.accuracyPercent}%1.1f"), "%"),
td(numberTag(day.combo)),
td(numberTag(day.time), "s"),
td(numberTag(day.highest)),
td(numberTag(day.runs))
)
},
pagerNextTable(history, np => addQueryParameter(routes.Storm.dashboard().url, "page", np))
)
)
)
)
)
private val i18nKeys = {
import lila.i18n.I18nKeys.{ storm => t }
List(
t.moveToStart,
t.puzzlesSolved,
t.newDailyHighscore,
t.newWeeklyHighscore,
t.newMonthlyHighscore,
t.newAllTimeHighscore,
t.previousHighscoreWasX,
t.playAgain
).map(_.key)
}
}

View File

@ -1,12 +1,13 @@
package views.html.user.show
import controllers.routes
import lila.api.Context
import lila.app.templating.Environment._
import lila.app.ui.ScalatagsTemplate._
import lila.rating.PerfType
import lila.user.User
import controllers.routes
import play.api.i18n.Lang
object side {
@ -55,7 +56,7 @@ object side {
)
}
),
!isPuzzle option iconTag("G")
iconTag("G")
)
}
@ -77,8 +78,29 @@ object side {
showNonEmptyPerf(u.perfs.horde, PerfType.Horde),
showNonEmptyPerf(u.perfs.racingKings, PerfType.RacingKings),
br,
u.noBot option showPerf(u.perfs.puzzle, PerfType.Puzzle)
u.noBot option showPerf(u.perfs.puzzle, PerfType.Puzzle),
u.noBot option showStorm(u.perfs.storm)
)
)
}
private def showStorm(storm: lila.rating.Perf.Storm)(implicit lang: Lang) =
a(
dataIcon := '~',
cls := List(
"empty" -> !storm.nonEmpty
),
href := routes.Storm.dashboard(),
span(
h3("Puzzle Storm"),
st.rating(
strong(storm.score),
storm.nonEmpty option frag(
" ",
span(trans.storm.xRuns.plural(storm.runs, storm.runs.localize))
)
)
),
iconTag("G")
)
}

View File

@ -2,7 +2,7 @@ const fs = require('fs').promises;
const parseString = require('xml2js').parseString;
const baseDir = 'translation/source';
const dbs = 'site arena emails learn activity coordinates study clas contact patron coach broadcast streamer tfa settings preferences team perfStat search tourname faq lag swiss puzzle puzzleTheme challenge'.split(' ');
const dbs = 'site arena emails learn activity coordinates study clas contact patron coach broadcast streamer tfa settings preferences team perfStat search tourname faq lag swiss puzzle puzzleTheme challenge storm'.split(' ');
function ucfirst(s) {
return s.charAt(0).toUpperCase() + s.slice(1);

View File

@ -38,7 +38,7 @@ lazy val modules = Seq(
playban, insight, perfStat, slack, quote, challenge,
study, studySearch, fishnet, explorer, learn, plan,
event, coach, practice, evalCache, irwin,
activity, relay, streamer, bot, clas, swiss
activity, relay, streamer, bot, clas, swiss, storm
)
lazy val moduleRefs = modules map projectToRef
@ -60,7 +60,7 @@ lazy val i18n = smallModule("i18n",
MessageCompiler(
sourceDir = new File("translation/source"),
destDir = new File("translation/dest"),
dbs = "site arena emails learn activity coordinates study class contact patron coach broadcast streamer tfa settings preferences team perfStat search tourname faq lag swiss puzzle puzzleTheme challenge".split(' ').toList,
dbs = "site arena emails learn activity coordinates study class contact patron coach broadcast streamer tfa settings preferences team perfStat search tourname faq lag swiss puzzle puzzleTheme challenge storm".split(' ').toList,
compileTo = (sourceManaged in Compile).value
)
}.taskValue
@ -71,6 +71,11 @@ lazy val puzzle = module("puzzle",
reactivemongo.bundle
)
lazy val storm = module("storm",
Seq(common, memo, hub, puzzle, db, user, rating, pref, tree),
reactivemongo.bundle
)
lazy val quote = smallModule("quote",
Seq(),
Seq(play.json)

View File

@ -99,6 +99,11 @@ POST /training/$id<\w{5}>/vote/:theme controllers.Puzzle.voteTheme(id: String,
POST /training/complete/:theme/$id<\w{5}> controllers.Puzzle.complete(theme: String, id: String)
POST /training/difficulty/:theme controllers.Puzzle.setDifficulty(theme: String)
# Puzzle Storm
GET /storm controllers.Storm.home
POST /storm controllers.Storm.record
GET /storm/dashboard controllers.Storm.dashboard(page: Int ?= 1)
# User Analysis
GET /analysis/help controllers.UserAnalysis.help
GET /analysis/*something controllers.UserAnalysis.parseArg(something: String)

View File

@ -11,6 +11,7 @@ case class Activity(
games: Option[Games] = None,
posts: Option[Posts] = None,
puzzles: Option[Puzzles] = None,
storm: Option[Storm] = None,
learn: Option[Learn] = None,
practice: Option[Practice] = None,
simuls: Option[Simuls] = None,
@ -27,7 +28,20 @@ case class Activity(
def interval = new Interval(date, date plusDays 1)
def isEmpty =
!stream && List(games, posts, puzzles, learn, practice, simuls, corres, patron, follows, studies, teams)
!stream && List(
games,
posts,
puzzles,
storm,
learn,
practice,
simuls,
corres,
patron,
follows,
studies,
teams
)
.forall(_.isEmpty)
}

View File

@ -110,6 +110,7 @@ final class ActivityReadApi(
interval = a.interval,
games = a.games,
puzzles = a.puzzles,
storm = a.storm,
practice = practice,
posts = postView,
simuls = simuls,

View File

@ -15,6 +15,7 @@ case class ActivityView(
interval: Interval,
games: Option[Games] = None,
puzzles: Option[Puzzles] = None,
storm: Option[Storm] = None,
practice: Option[Map[PracticeStudy, Int]] = None,
simuls: Option[List[Simul]] = None,
patron: Option[Patron] = None,

View File

@ -70,6 +70,17 @@ final class ActivityWriteApi(
.void
}
def storm(userId: User.ID, score: Int): Funit =
getOrCreate(userId) flatMap { a =>
coll.update
.one(
$id(a.id),
$set(ActivityFields.storm -> { ~a.storm + score }),
upsert = true
)
.void
}
def learn(userId: User.ID, stage: String) =
update(userId) { a =>
a.copy(learn = Some(~a.learn + Learn.Stage(stage))).some

View File

@ -77,6 +77,11 @@ private object BSONHandlers {
implicit lazy val puzzlesHandler = isoHandler[Puzzles, Score]((p: Puzzles) => p.score, Puzzles.apply _)
implicit lazy val stormHandler = new lila.db.BSON[Storm] {
def reads(r: lila.db.BSON.Reader) = Storm(r.intD("r"), r.intD("s"))
def writes(w: lila.db.BSON.Writer, s: Storm) = BSONDocument("r" -> s.runs, "s" -> s.score)
}
implicit private lazy val learnHandler =
typedMapHandler[Learn.Stage, Int](Iso.string(Learn.Stage.apply, _.value))
.as[Learn](Learn.apply, _.value)
@ -117,6 +122,7 @@ private object BSONHandlers {
val games = "g"
val posts = "p"
val puzzles = "z"
val storm = "m"
val learn = "l"
val practice = "r"
val simuls = "s"
@ -138,6 +144,7 @@ private object BSONHandlers {
games = r.getO[Games](games),
posts = r.getO[Posts](posts),
puzzles = r.getO[Puzzles](puzzles),
storm = r.getO[Storm](storm),
learn = r.getO[Learn](learn),
practice = r.getO[Practice](practice),
simuls = r.getO[Simuls](simuls),

View File

@ -41,7 +41,8 @@ final class Env(
"plan",
"relation",
"startStudy",
"streamStart"
"streamStart",
"stormRun"
) {
case lila.game.actorApi.FinishGame(game, _, _) if !game.aborted => write.game(game).unit
case lila.forum.actorApi.CreatePost(post) => write.forumPost(post).unit
@ -57,6 +58,7 @@ final class Env(
case lila.hub.actorApi.team.CreateTeam(id, _, userId) => write.team(id, userId).unit
case lila.hub.actorApi.team.JoinTeam(id, userId) => write.team(id, userId).unit
case lila.hub.actorApi.streamer.StreamStart(userId) => write.streamStart(userId).unit
case lila.hub.actorApi.storm.StormRun(userId, score) => write.storm(userId, score).unit
case lila.user.User.GDPRErase(user) => write.erase(user).unit
}
}

View File

@ -31,6 +31,11 @@ object activities {
}
implicit val PuzzlesZero = Zero.instance(Puzzles(ScoreZero.zero))
case class Storm(runs: Int, score: Int) {
def +(s: Int) = Storm(runs = runs + 1, score = score atLeast s)
}
implicit val StormZero = Zero.instance(Storm(0, 0))
case class Learn(value: Map[Learn.Stage, Int]) {
def +(stage: Learn.Stage) =
copy(

View File

@ -14,6 +14,10 @@ object Day {
def today = Day(Days.daysBetween(genesis, DateTime.now.withTimeAtStartOfDay).getDays)
def daysAgo(days: Int) = Day(
Days.daysBetween(genesis, DateTime.now.minusDays(days).withTimeAtStartOfDay).getDays
)
def recent(nb: Int): List[Day] =
(0 until nb).toList.map { delta =>
Day(Days.daysBetween(genesis, DateTime.now.minusDays(delta).withTimeAtStartOfDay).getDays)

View File

@ -484,6 +484,17 @@ object mon {
)
val crazyGlicko = counter("puzzle.crazyGlicko").withoutTags()
}
object storm {
object selector {
val time = timer("storm.selector.time").withoutTags()
val count = histogram("storm.selector.count").withoutTags()
val rating = histogram("storm.selector.rating").withoutTags()
def ratingSlice(index: Int) = histogram("storm.selector.ratingSlice").withTag("index", index)
}
object run {
def score(auth: Boolean) = histogram("storm.run.score").withTag("auth", auth)
}
}
object game {
def finish(variant: String, speed: String, source: String, mode: String, status: String) =
counter("game.finish").withTags(

View File

@ -62,6 +62,10 @@ package msg {
case class SystemMsg(userId: String, text: String)
}
package storm {
case class StormRun(userId: String, score: Int)
}
package shutup {
case class RecordPublicForumMessage(userId: String, text: String)
case class RecordTeamForumMessage(userId: String, text: String)

View File

@ -1972,4 +1972,18 @@ val `declineNoBot` = new I18nKey("challenge:declineNoBot")
val `declineOnlyBot` = new I18nKey("challenge:declineOnlyBot")
}
object storm {
val `moveToStart` = new I18nKey("storm:moveToStart")
val `puzzlesSolved` = new I18nKey("storm:puzzlesSolved")
val `newDailyHighscore` = new I18nKey("storm:newDailyHighscore")
val `newWeeklyHighscore` = new I18nKey("storm:newWeeklyHighscore")
val `newMonthlyHighscore` = new I18nKey("storm:newMonthlyHighscore")
val `newAllTimeHighscore` = new I18nKey("storm:newAllTimeHighscore")
val `previousHighscoreWasX` = new I18nKey("storm:previousHighscoreWasX")
val `playAgain` = new I18nKey("storm:playAgain")
val `highscoreX` = new I18nKey("storm:highscoreX")
val `xRuns` = new I18nKey("storm:xRuns")
val `playedNbRunsOfPuzzleStorm` = new I18nKey("storm:playedNbRunsOfPuzzleStorm")
}
}

View File

@ -2,21 +2,20 @@ package lila.puzzle
import chess.format.{ FEN, Uci }
import reactivemongo.api.bson._
import scala.util.Success
import scala.util.Try
import scala.util.{ Success, Try }
import lila.db.BSON
import lila.db.dsl._
import lila.game.Game
import lila.rating.Glicko
private[puzzle] object BsonHandlers {
object BsonHandlers {
implicit val PuzzleIdBSONHandler = stringIsoHandler(Puzzle.idIso)
import Puzzle.BSONFields._
implicit val PuzzleBSONReader = new BSONDocumentReader[Puzzle] {
implicit private[puzzle] val PuzzleBSONReader = new BSONDocumentReader[Puzzle] {
def readDocument(r: BSONDocument) = for {
id <- r.getAsTry[Puzzle.Id](id)
gameId <- r.getAsTry[Game.ID](gameId)
@ -39,7 +38,7 @@ private[puzzle] object BsonHandlers {
)
}
implicit val RoundIdHandler = tryHandler[PuzzleRound.Id](
implicit private[puzzle] val RoundIdHandler = tryHandler[PuzzleRound.Id](
{ case BSONString(v) =>
v split PuzzleRound.idSep match {
case Array(userId, puzzleId) => Success(PuzzleRound.Id(userId, Puzzle.Id(puzzleId)))
@ -49,7 +48,7 @@ private[puzzle] object BsonHandlers {
id => BSONString(id.toString)
)
implicit val RoundThemeHandler = tryHandler[PuzzleRound.Theme](
implicit private[puzzle] val RoundThemeHandler = tryHandler[PuzzleRound.Theme](
{ case BSONString(v) =>
PuzzleTheme
.find(v.tail)
@ -60,7 +59,7 @@ private[puzzle] object BsonHandlers {
rt => BSONString(s"${if (rt.vote) "+" else "-"}${rt.theme}")
)
implicit val RoundHandler = new BSON[PuzzleRound] {
implicit private[puzzle] val RoundHandler = new BSON[PuzzleRound] {
import PuzzleRound.BSONFields._
def reads(r: BSON.Reader) = PuzzleRound(
id = r.get[PuzzleRound.Id](id),
@ -81,7 +80,11 @@ private[puzzle] object BsonHandlers {
)
}
implicit val PathIdBSONHandler: BSONHandler[PuzzlePath.Id] = stringIsoHandler(PuzzlePath.pathIdIso)
implicit private[puzzle] val PathIdBSONHandler: BSONHandler[PuzzlePath.Id] = stringIsoHandler(
PuzzlePath.pathIdIso
)
implicit val ThemeKeyBSONHandler: BSONHandler[PuzzleTheme.Key] = stringIsoHandler(PuzzleTheme.keyIso)
implicit private[puzzle] val ThemeKeyBSONHandler: BSONHandler[PuzzleTheme.Key] = stringIsoHandler(
PuzzleTheme.keyIso
)
}

View File

@ -67,6 +67,6 @@ final private class PuzzlePathApi(
def select(theme: PuzzleTheme.Key, tier: PuzzleTier, rating: Range) = $doc(
"min" $lte f"${theme}_${tier}_${rating.max}%04d",
"max" $gt f"${theme}_${tier}_${rating.min}%04d"
"max" $gte f"${theme}_${tier}_${rating.min}%04d"
)
}

View File

@ -1,13 +1,13 @@
package lila.puzzle
sealed abstract private class PuzzleTier(val key: String) {
sealed abstract class PuzzleTier(val key: String) {
def stepDown = PuzzleTier stepDown this
override def toString = key
}
private object PuzzleTier {
object PuzzleTier {
case object Top extends PuzzleTier("top")
case object Good extends PuzzleTier("good")

View File

@ -2,7 +2,7 @@ package lila.rating
import org.goochjs.glicko2.Rating
import org.joda.time.DateTime
import reactivemongo.api.bson.BSONDocument
import reactivemongo.api.bson.{ BSONDocument, Macros }
import lila.db.BSON
@ -98,6 +98,14 @@ case object Perf {
val recentMaxSize = 12
case class Storm(score: Int, runs: Int) {
def nonEmpty = runs > 0
}
object Storm {
val default = Storm(0, 0)
}
implicit val perfBSONHandler = new BSON[Perf] {
import Glicko.glickoBSONHandler
@ -120,4 +128,6 @@ case object Perf {
"la" -> o.latest.map(w.date)
)
}
implicit val stormBSONHandler = Macros.handler[Storm]
}

View File

@ -0,0 +1,31 @@
package lila.storm
import com.softwaremill.macwire._
import play.api.Configuration
import lila.common.config._
import lila.user.UserRepo
@Module
final class Env(
appConfig: Configuration,
db: lila.db.Db,
colls: lila.puzzle.PuzzleColls,
cacheApi: lila.memo.CacheApi,
userRepo: UserRepo
)(implicit
ec: scala.concurrent.ExecutionContext
) {
private lazy val dayColl = db(CollName("storm_day"))
lazy val selector = wire[StormSelector]
lazy val json = wire[StormJson]
lazy val highApi = wire[StormHighApi]
lazy val dayApi = wire[StormDayApi]
val forms = StormForm
}

View File

@ -0,0 +1,40 @@
package lila.storm
import chess.format.{ FEN, Uci }
import reactivemongo.api.bson._
import lila.db.dsl._
import lila.puzzle.Puzzle
import scala.util.Success
import lila.common.Day
private object StormBsonHandlers {
import lila.puzzle.BsonHandlers.{ PuzzleIdBSONHandler }
implicit val StormPuzzleBSONReader = new BSONDocumentReader[StormPuzzle] {
def readDocument(r: BSONDocument) = for {
id <- r.getAsTry[Puzzle.Id]("_id")
fen <- r.getAsTry[FEN]("fen")
lineStr <- r.getAsTry[String]("line")
line <- lineStr.split(' ').toList.flatMap(Uci.Move.apply).toNel.toTry("Empty move list?!")
rating <- r.getAsTry[Int]("rating")
} yield StormPuzzle(id, fen, line, rating)
}
implicit lazy val stormDayIdHandler = {
import StormDay.Id
val sep = ':'
tryHandler[Id](
{ case BSONString(v) =>
v split sep match {
case Array(userId, dayStr) => Success(Id(userId, Day(Integer.parseInt(dayStr))))
case _ => handlerBadValue(s"Invalid storm day id $v")
}
},
id => BSONString(s"${id.userId}$sep${id.day.value}")
)
}
implicit val stormDayBSONHandler = Macros.handler[StormDay]
}

View File

@ -0,0 +1,99 @@
package lila.storm
import org.joda.time.DateTime
import org.joda.time.Days
import scala.concurrent.ExecutionContext
import lila.common.Bus
import lila.common.config.MaxPerPage
import lila.common.Day
import lila.common.paginator.Paginator
import lila.db.dsl._
import lila.db.paginator.Adapter
import lila.user.User
import lila.user.UserRepo
// stores data of the best run of the day
// plus the number of runs
case class StormDay(
_id: StormDay.Id,
score: Int,
moves: Int,
errors: Int,
combo: Int,
time: Int,
highest: Int,
runs: Int
) {
def add(run: StormForm.RunData) = {
if (run.score > score)
copy(
score = run.score,
moves = run.moves,
errors = run.errors,
combo = run.combo,
time = run.time,
highest = run.highest
)
else this
}.copy(runs = runs + 1)
def accuracyPercent: Float = 100 * (moves - errors) / moves.toFloat
}
object StormDay {
case class Id(userId: User.ID, day: Day)
object Id {
def today(userId: User.ID) = Id(userId, Day.today)
def lastWeek(userId: User.ID) = Id(userId, Day daysAgo 7)
def lastMonth(userId: User.ID) = Id(userId, Day daysAgo 30)
def allTime(userId: User.ID) = Id(userId, Day(0))
}
def empty(id: Id) = StormDay(id, 0, 0, 0, 0, 0, 0, 0)
}
final class StormDayApi(coll: Coll, highApi: StormHighApi, userRepo: UserRepo)(implicit
ctx: ExecutionContext
) {
import StormDay._
import StormBsonHandlers._
def addRun(data: StormForm.RunData, user: Option[User]): Fu[Option[StormHigh.NewHigh]] = {
lila.mon.storm.run.score(user.isDefined).record(data.score).unit
user ?? { u =>
Bus.publish(lila.hub.actorApi.storm.StormRun(u.id, data.score), "stormRun")
highApi get u.id flatMap { prevHigh =>
val todayId = Id today u.id
coll
.one[StormDay]($id(todayId))
.map {
_.getOrElse(StormDay empty todayId) add data
}
.flatMap { day =>
coll.update.one($id(day._id), day, upsert = true)
}
.flatMap { _ =>
val (high, newHigh) = highApi.update(u.id, prevHigh, data.score)
userRepo.addStormRun(u.id, high.allTime.some.filter(prevHigh.allTime <)) inject newHigh
}
}
}
}
def history(userId: User.ID, page: Int): Fu[Paginator[StormDay]] =
Paginator(
adapter = new Adapter[StormDay](
collection = coll,
selector = $doc("_id" $startsWith s"${userId}:"),
projection = none,
sort = $sort desc "_id"
),
page,
MaxPerPage(30)
)
}

View File

@ -0,0 +1,36 @@
package lila.storm
import play.api.data._
import play.api.data.Forms._
import lila.common.Form.{ numberIn, stringIn }
object StormForm {
case class RunData(
puzzles: Int,
score: Int,
moves: Int,
errors: Int,
combo: Int,
time: Int,
highest: Int,
notAnExploit: String
)
val run = Form(
mapping(
"puzzles" -> number(min = 1, max = 200),
"score" -> number(min = 1, max = 200),
"moves" -> number(min = 1, max = 900),
"errors" -> number(min = 1, max = 50),
"combo" -> number(min = 1, max = 900),
"time" -> number(min = 1, max = 900),
"highest" -> number(min = lila.rating.Glicko.minRating, max = 4000),
"notAnExploit" -> nonEmptyText.verifying(_ == notAnExploit)
)(RunData.apply)(RunData.unapply)
)
val notAnExploit =
"Yes, we know that you can send whatever score you like. That's why there's no leaderboards and no competition."
}

View File

@ -0,0 +1,91 @@
package lila.storm
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext
import lila.db.dsl._
import lila.memo.CacheApi
import lila.user.User
case class StormHigh(day: Int, week: Int, month: Int, allTime: Int) {
def update(score: Int) = copy(
day = day atLeast score,
week = week atLeast score,
month = month atLeast score,
allTime = allTime atLeast score
)
}
object StormHigh {
val default = StormHigh(0, 0, 0, 0)
sealed abstract class NewHigh(val key: String) {
val previous: Int
}
object NewHigh {
case class Day(previous: Int) extends NewHigh("day")
case class Week(previous: Int) extends NewHigh("week")
case class Month(previous: Int) extends NewHigh("month")
case class AllTime(previous: Int) extends NewHigh("allTime")
}
}
final class StormHighApi(coll: Coll, cacheApi: CacheApi)(implicit ctx: ExecutionContext) {
import StormBsonHandlers._
import StormHigh.NewHigh
def get(userId: User.ID): Fu[StormHigh] = cache get userId
def update(userId: User.ID, prev: StormHigh, score: Int): (StormHigh, Option[NewHigh]) = {
val newHigh = prev update score
newHigh -> {
(newHigh != prev) ?? {
cache.put(userId, fuccess(newHigh))
import NewHigh._
if (newHigh.allTime > prev.allTime) AllTime(prev.allTime).some
else if (newHigh.month > prev.month) Month(prev.month).some
else if (newHigh.week > prev.week) Week(prev.week).some
else Day(prev.day).some
}
}
}
private val cache = cacheApi[User.ID, StormHigh](8192, "storm.high") {
_.expireAfterAccess(1 hour).buildAsyncFuture(compute)
}
private def compute(userId: User.ID): Fu[StormHigh] =
coll
.aggregateOne() { framework =>
import framework._
val todayId = StormDay.Id today userId
val project = Project($doc("_id" -> false, "score" -> true))
def bestSince(sinceId: StormDay.Id) = List(
Match($doc("_id" $lte todayId $gt sinceId)),
Sort(Descending("score")),
Limit(1),
project
)
Facet(
List(
"day" -> List(Match($id(todayId)), project),
"week" -> bestSince(StormDay.Id.lastWeek(userId)),
"month" -> bestSince(StormDay.Id.lastMonth(userId)),
"allTime" -> bestSince(StormDay.Id.allTime(userId))
)
) -> Nil
}
.map2 { doc =>
def readScore(doc: Bdoc, field: String) =
~doc.getAsOpt[List[Bdoc]](field).flatMap(_.headOption).flatMap(_.getAsOpt[Int]("score"))
StormHigh(
day = readScore(doc, "day"),
week = readScore(doc, "week"),
month = readScore(doc, "month"),
allTime = readScore(doc, "allTime")
)
}
.map(_ | StormHigh.default)
}

View File

@ -0,0 +1,49 @@
package lila.storm
import play.api.libs.json._
import lila.common.Json._
final class StormJson {
import StormJson.puzzleWrites
def apply(puzzles: List[StormPuzzle]): JsObject = Json.obj(
"puzzles" -> puzzles,
"notAnExploit" -> StormForm.notAnExploit
)
def pref(p: lila.pref.Pref) =
Json.obj(
"coords" -> p.coords,
"rookCastle" -> p.rookCastle,
"destination" -> p.destination,
"moveEvent" -> p.moveEvent,
"highlight" -> p.highlight,
"is3d" -> p.is3d
)
def newHigh(n: Option[StormHigh.NewHigh]) =
Json
.obj()
.add("newHigh" -> n.map { nh =>
Json.obj(
"key" -> nh.key,
"prev" -> nh.previous
)
})
}
object StormJson {
import lila.puzzle.JsonView.puzzleIdWrites
implicit val puzzleWrites: OWrites[StormPuzzle] = OWrites { p =>
Json.obj(
"id" -> p.id,
"fen" -> p.fen.value,
"line" -> p.line.toList.map(_.uci).mkString(" "),
"rating" -> p.rating
)
}
}

View File

@ -0,0 +1,28 @@
package lila.storm
import cats.data.NonEmptyList
import chess.format.{ FEN, Forsyth, Uci }
import lila.puzzle.Puzzle
case class StormPuzzle(
id: Puzzle.Id,
fen: FEN,
line: NonEmptyList[Uci.Move],
rating: Int
) {
// ply after "initial move" when we start solving
def initialPly: Int =
fen.fullMove ?? { fm =>
fm * 2 - color.fold(1, 2)
}
lazy val fenAfterInitialMove: FEN = {
for {
sit1 <- Forsyth << fen
sit2 <- sit1.move(line.head).toOption.map(_.situationAfter)
} yield Forsyth >> sit2
} err s"Can't apply puzzle $id first move"
def color = fen.color.fold[chess.Color](chess.White)(!_)
}

View File

@ -0,0 +1,141 @@
package lila.storm
import reactivemongo.api.bson.BSONNull
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext
import lila.db.AsyncColl
import lila.db.dsl._
import lila.memo.CacheApi
import lila.puzzle.PuzzleColls
/* The difficulty of storm should remain constant!
* Be very careful when adjusting the selector.
* Use the grafana average rating per slice chart.
*/
final class StormSelector(colls: PuzzleColls, cacheApi: CacheApi)(implicit ec: ExecutionContext) {
import StormBsonHandlers._
def apply: Fu[List[StormPuzzle]] = current.get {}
private val theme = lila.puzzle.PuzzleTheme.mix.key.value
private val tier = lila.puzzle.PuzzleTier.Good.key
private val maxDeviation = 90
private val ratingBuckets =
List(
1000 -> 7,
1150 -> 7,
1300 -> 8,
1450 -> 9,
1600 -> 10,
1750 -> 11,
1900 -> 13,
2050 -> 15,
2200 -> 17,
2350 -> 19,
2500 -> 21,
2650 -> 23
)
private val poolSize = ratingBuckets.foldLeft(0) { case (acc, (_, nb)) =>
acc + nb
}
private val current = cacheApi.unit[List[StormPuzzle]] {
_.refreshAfterWrite(6 seconds)
.buildAsyncFuture { _ =>
colls
.path {
_.aggregateList(poolSize) { framework =>
import framework._
val fenColorRegex = $doc(
"$regexMatch" -> $doc(
"input" -> "$fen",
"regex" -> { if (scala.util.Random.nextBoolean()) " w " else " b " }
)
)
Facet(
ratingBuckets.map { case (rating, nbPuzzles) =>
rating.toString -> List(
Match(
$doc(
"min" $lte f"${theme}_${tier}_${rating}%04d",
"max" $gte f"${theme}_${tier}_${rating}%04d"
)
),
Sample(1),
Project($doc("_id" -> false, "ids" -> true)),
UnwindField("ids"),
// ensure we have enough after filtering deviation & color
Sample(nbPuzzles * 7),
PipelineOperator(
$doc(
"$lookup" -> $doc(
"from" -> colls.puzzle.name.value,
"as" -> "puzzle",
"let" -> $doc("id" -> "$ids"),
"pipeline" -> $arr(
$doc(
"$match" -> $doc(
"$expr" -> $doc(
"$and" -> $arr(
$doc("$eq" -> $arr("$_id", "$$id")),
$doc("$lte" -> $arr("$glicko.d", maxDeviation)),
fenColorRegex
)
)
)
),
$doc(
"$project" -> $doc(
"fen" -> true,
"line" -> true,
"rating" -> $doc("$toInt" -> "$glicko.r")
)
)
)
)
)
),
UnwindField("puzzle"),
Sample(nbPuzzles),
ReplaceRootField("puzzle")
)
}
) -> List(
Project($doc("all" -> $doc("$setUnion" -> ratingBuckets.map(r => s"$$${r._1}")))),
UnwindField("all"),
ReplaceRootField("all"),
Sort(Ascending("rating"))
)
}.map {
_.flatMap(StormPuzzleBSONReader.readOpt)
}
}
.mon(_.storm.selector.time)
.addEffect { puzzles =>
monitor(puzzles.toVector, poolSize)
}
}
}
private def monitor(puzzles: Vector[StormPuzzle], poolSize: Int): Unit = {
val nb = puzzles.size
lila.mon.storm.selector.count.record(nb)
if (nb < poolSize * 0.9)
logger.warn(s"Selector wanted $poolSize puzzles, only got $nb")
if (nb > 1) {
val rest = puzzles.toVector drop 1
lila.common.Maths.mean(rest.map(_.rating)) foreach { r =>
lila.mon.storm.selector.rating.record(r.toInt).unit
}
(0 to poolSize by 10) foreach { i =>
val slice = rest drop i take 10
lila.common.Maths.mean(slice.map(_.rating)) foreach { r =>
lila.mon.storm.selector.ratingSlice(i).record(r.toInt)
}
}
}
}
}

View File

@ -0,0 +1,8 @@
package lila
import lila.user.User
package object storm extends PackageObject {
private[storm] val logger = lila.log("swiss")
}

View File

@ -23,7 +23,8 @@ case class Perfs(
rapid: Perf,
classical: Perf,
correspondence: Perf,
puzzle: Perf
puzzle: Perf,
storm: Perf.Storm
) {
def perfs =
@ -187,7 +188,7 @@ case object Perfs {
val default = {
val p = Perf.default
Perfs(p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p)
Perfs(p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, Perf.Storm.default)
}
val defaultManaged = {
@ -250,7 +251,8 @@ case object Perfs {
rapid = perf("rapid"),
classical = perf("classical"),
correspondence = perf("correspondence"),
puzzle = perf("puzzle")
puzzle = perf("puzzle"),
storm = r.getO[Perf.Storm]("storm") getOrElse Perf.Storm.default
)
}
@ -273,7 +275,8 @@ case object Perfs {
"rapid" -> notNew(o.rapid),
"classical" -> notNew(o.classical),
"correspondence" -> notNew(o.correspondence),
"puzzle" -> notNew(o.puzzle)
"puzzle" -> notNew(o.puzzle),
"storm" -> (o.storm.nonEmpty option o.storm)
)
}

View File

@ -205,6 +205,17 @@ final class UserRepo(val coll: Coll)(implicit ec: scala.concurrent.ExecutionCont
)
.void
private val incStormRuns = $inc("perfs.storm.runs" -> 1)
def addStormRun(userId: User.ID, newHighScore: Option[Int]): Funit =
coll.update
.one(
$id(userId),
newHighScore.fold(incStormRuns) { score =>
incStormRuns ++ $set("perfs.storm.score" -> score)
}
)
.void
def setProfile(id: ID, profile: Profile): Funit =
coll.update
.one(

View File

@ -61,6 +61,7 @@
"ui/tree",
"ui/msg",
"ui/dgt",
"ui/storm",
"ui/@build/rollupProject",
"ui/@types/lichess",
"ui/@types/cash"

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><path d="M0 0h512v512H0z" fill-opacity="0"></path><g class="" transform="translate(0,0)" style=""><path d="M265.143 16.73c-65.944 0-118.326 5.893-155.188 18.143-18.43 6.125-33.1 13.83-43.54 23.926-10.438 10.095-16.352 23.132-15.88 37.165l.006.172.013.17c2.75 39.093 15.275 72.883 33.394 103.4-30.092 26.304-22.554 56.57 55.328 71.47 6.504 6.985 13.16 13.85 19.877 20.653-44.976 17.343-44.457 38.22 40.79 40.582 10.873 10.84 21.557 21.703 31.767 32.744-34.54 3.67-70.755 11.923-106.7 26.227 33.16-5.943 79.682-8.487 124.244-6.436 27.66 32.73 49.995 67.74 60.193 108.84h19.207c-9.205-40.806-29.034-75.516-53.713-107.105 46.038 4.14 86.467 13.755 102.77 30.302-6.223 24.423-16.816 49.782-33.946 76.803h21.873c4.307-7.368 8.162-14.648 11.615-21.848 48.44-8.298 70.147-23.06 72.033-39.1 7.677-22.363-10.594-56.65-45.38-82.97-.028-8.232-.335-16.386-.842-24.474 62.557-8.128 63.666-38.01-5.163-51.105-3.74-30.33-7.695-60.182-7.425-90.93 91.998-21.19 74.89-59.455 13.513-83.942 1.79-5.373 3.767-10.793 5.998-16.28l.268-.66.164-.69c2.94-12.31-.722-24.506-8.666-33.145-7.944-8.64-19.33-14.517-32.955-19.07-27.25-9.103-64.2-12.71-103.623-12.843h-.031zm-.034 18.69c38.27.13 74.034 3.952 97.765 11.88 11.866 3.965 20.536 9.007 25.12 13.993 4.512 4.905 5.846 9.015 4.29 15.844-2.168 5.394-4.123 10.735-5.892 16.03-54.098-17.105-131.934-23.978-202.008-5.622 65.494.283 172.564 13.5 190.418 54.82-3.317 23.44-3.54 46-2.283 67.955-45.155-33.14-134.644-21.05-199.475 1.23 41.805-1.966 94.256 1.828 136.084 12.9-25.3 2.72-53.93 10.074-81.84 21.894 64.456-6.42 133.745 2.883 151.286 23.982l.123.996c-20.61-2.533-45.806-3.76-75.735-3.047-49.278 1.178-92.846 8.102-124.002 17.002-18.856-18.886-36.954-37.853-52.848-57.763 8.89-54.23 137.75-65.292 210.666-63.426-88.136-26.143-187.425-6.064-237.17 24.312-2.61-44.05 89.057-68.318 170.267-60.23-72.526-23.095-149-33.873-182.982-16.15 31.36-37.388 106.277-55.177 179.17-54.934-32.778-8.548-61.407-13.926-92-16.656 26.092-3.278 56.598-5.01 91.044-5.01zm51.73 249.873c25.132-.12 48.713 2.566 64.607 8.908 1.65 14.464 3.032 28.817 3.63 43.218-13.863-7.993-29.508-14.637-46.557-19.094 13.17 10.786 25.794 22.58 37.226 34.598-41.07-17.11-89.233-22.64-116.377-18.67 30.09 4.298 66.47 18.864 92.41 36.248-28.314-5.917-61.158-8.87-96.344-7.174-16.924-19.096-35.188-37.224-53.383-55.166 19.422-13.37 69.6-22.65 114.787-22.867z" fill="#ffffff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><path d="M0 0h512v512H0z" fill-opacity="0"></path><g class="" transform="translate(0,0)" style=""><path d="M265.143 16.73c-65.944 0-118.326 5.893-155.188 18.143-18.43 6.125-33.1 13.83-43.54 23.926-10.438 10.095-16.352 23.132-15.88 37.165l.006.172.013.17c2.75 39.093 15.275 72.883 33.394 103.4-30.092 26.304-22.554 56.57 55.328 71.47 6.504 6.985 13.16 13.85 19.877 20.653-44.976 17.343-44.457 38.22 40.79 40.582 10.873 10.84 21.557 21.703 31.767 32.744-34.54 3.67-70.755 11.923-106.7 26.227 33.16-5.943 79.682-8.487 124.244-6.436 27.66 32.73 49.995 67.74 60.193 108.84h19.207c-9.205-40.806-29.034-75.516-53.713-107.105 46.038 4.14 86.467 13.755 102.77 30.302-6.223 24.423-16.816 49.782-33.946 76.803h21.873c4.307-7.368 8.162-14.648 11.615-21.848 48.44-8.298 70.147-23.06 72.033-39.1 7.677-22.363-10.594-56.65-45.38-82.97-.028-8.232-.335-16.386-.842-24.474 62.557-8.128 63.666-38.01-5.163-51.105-3.74-30.33-7.695-60.182-7.425-90.93 91.998-21.19 74.89-59.455 13.513-83.942 1.79-5.373 3.767-10.793 5.998-16.28l.268-.66.164-.69c2.94-12.31-.722-24.506-8.666-33.145-7.944-8.64-19.33-14.517-32.955-19.07-27.25-9.103-64.2-12.71-103.623-12.843h-.031zm-.034 18.69c38.27.13 74.034 3.952 97.765 11.88 11.866 3.965 20.536 9.007 25.12 13.993 4.512 4.905 5.846 9.015 4.29 15.844-2.168 5.394-4.123 10.735-5.892 16.03-54.098-17.105-131.934-23.978-202.008-5.622 65.494.283 172.564 13.5 190.418 54.82-3.317 23.44-3.54 46-2.283 67.955-45.155-33.14-134.644-21.05-199.475 1.23 41.805-1.966 94.256 1.828 136.084 12.9-25.3 2.72-53.93 10.074-81.84 21.894 64.456-6.42 133.745 2.883 151.286 23.982l.123.996c-20.61-2.533-45.806-3.76-75.735-3.047-49.278 1.178-92.846 8.102-124.002 17.002-18.856-18.886-36.954-37.853-52.848-57.763 8.89-54.23 137.75-65.292 210.666-63.426-88.136-26.143-187.425-6.064-237.17 24.312-2.61-44.05 89.057-68.318 170.267-60.23-72.526-23.095-149-33.873-182.982-16.15 31.36-37.388 106.277-55.177 179.17-54.934-32.778-8.548-61.407-13.926-92-16.656 26.092-3.278 56.598-5.01 91.044-5.01zm51.73 249.873c25.132-.12 48.713 2.566 64.607 8.908 1.65 14.464 3.032 28.817 3.63 43.218-13.863-7.993-29.508-14.637-46.557-19.094 13.17 10.786 25.794 22.58 37.226 34.598-41.07-17.11-89.233-22.64-116.377-18.67 30.09 4.298 66.47 18.864 92.41 36.248-28.314-5.917-61.158-8.87-96.344-7.174-16.924-19.096-35.188-37.224-53.383-55.166 19.422-13.37 69.6-22.65 114.787-22.867z" fill="#d59120" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,2 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="broadcasts">Излъчване</string>
<string name="liveBroadcasts">Излъчвания на турнир на живо</string>
<string name="newBroadcast">Нови предавания на живо</string>
<string name="ongoing">Текущи</string>
<string name="upcoming">Предстоящи</string>
<string name="completed">Завършени</string>
<string name="eventName">Име на събитието</string>
<string name="eventDescription">Кратко описание на събитието</string>
<string name="fullDescription">Пълно описание на събитието</string>
<string name="fullDescriptionHelp" comment="fullDescriptionHelp&#10;&#10;%1$s stands for a link to Markdown.&#10;%2$s is the character limit (e.g. 160)">Незадължително дълго описание на излъчването. %1$s е налично. Дължината трябва да по-малка от %2$s знака.</string>
<string name="sourceUrl">Уебадрес на източника</string>
<string name="sourceUrlHelp">Уебадресът, който Lichess ще проверява, за да получи осъвременявания на PGN. Той трябва да е публично достъпен от интернет.</string>
<string name="roundNumber">Номер на рунда</string>
<string name="startDate">Дата на започване във вашата часова зона</string>
<string name="startDateHelp">По избор, ако знаете, кога започва събитието</string>
<string name="credits">Признателност на източника</string>
<string name="cloneBroadcast">Клониране на излъчването</string>
<string name="resetBroadcast">Нулиране на излъчването</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Çağırış göndərmək üçün lütfən qeydiyyatdan keçin.</string>
<string name="youCannotChallengeX">%s istifadəçisinə çağırış edə bilməzsiz.</string>
<string name="xDoesNotAcceptChallenges">%s çağırışları qəbul etmir.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Sizin %1$s reytinqiniz %2$s-in reytinqindən çox uzaqdır.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Müvəqqəti %s reytinqi səbəbilə çağırış edə bilməzsiz.</string>
<string name="yourXRatingIsTooFarFromY">Sizin %1$s reytinqiniz %2$s-in reytinqindən çox uzaqdır.</string>
<string name="cannotChallengeDueToProvisionalXRating">Müvəqqəti %s reytinqi səbəbilə çağırış edə bilməzsiz.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s yalnız dostlarından çağırış qəbul edir.</string>
<string name="declineGeneric">Hal-hazırda çağırışları qəbul etmirəm.</string>
<string name="declineLater">Bu mənim üçün uyğun vaxt deyil, lütfən sonra yenidən soruşun.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Zəhmət olmasa mənə reytinqsiz bir çağırış göndərin.</string>
<string name="declineStandard">Hal-hazırda qeyri-ənənəvi şahmat variantları çağırışlarını qəbul etmirəm.</string>
<string name="declineVariant">Hazırda bu variantı oynamaq istəmirəm.</string>
<string name="declineNoBot">Botlardan gələn çağırışları qəbul etmirəm.</string>
<string name="declineOnlyBot">Yalnız botlardan gələn çağırışları qəbul edirəm.</string>
</resources>

View File

@ -1,2 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="challenges">Предизвикателства</string>
<string name="challengeToPlay">Предизвикайте на партия</string>
<string name="challengeDeclined">Предизвикателството отказано</string>
<string name="challengeAccepted">Предизвикателството прието!</string>
<string name="challengeCanceled">Предизвикателството отменено.</string>
<string name="registerToSendChallenges">Регистрирайте се, за да отправяте предизвикателства.</string>
<string name="youCannotChallengeX">Не може да предизвикате %s.</string>
<string name="xDoesNotAcceptChallenges">%s не приема предизвикателства.</string>
<string name="yourXRatingIsTooFarFromY">Вашият рейтинг %1$s е предалеч от %2$s.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s приема предизвикателства само от приятели.</string>
<string name="declineGeneric">Не приемам предизвикателства в момента.</string>
<string name="declineLater">Това не е точният момент за мен, моля, опитайте пак по-късно.</string>
<string name="declineTooFast">Този път управлението е пребързо за мен, моля, предизвикайте ме пак с по-бавна игра.</string>
<string name="declineTooSlow">Този път управлението е твърде бавно за мен, моля, предизвикайте ме пак с по-бърза игра.</string>
<string name="declineTimeControl">Не приемам предизвикателства с такъв времеви формат.</string>
<string name="declineRated">Вместо това изпращайте ми рейтингови предизвикателства, моля.</string>
<string name="declineCasual">Вместо това изпращайте ми лежерни предизвикателства, моля.</string>
<string name="declineStandard">Не приемам вариант за партия шах в момента.</string>
<string name="declineVariant">Не желая да играя този вариант в момента.</string>
</resources>

View File

@ -8,9 +8,11 @@
<string name="registerToSendChallenges">Molimo, registrirajte se da biste mogli slati izazove.</string>
<string name="youCannotChallengeX">Ne možete izazvati %s.</string>
<string name="xDoesNotAcceptChallenges">%s ne prihvata izazove.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Vaš %1$s rejting predaleko je od %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Nemoguće izazvati zbog privremenog %s rejtinga.</string>
<string name="yourXRatingIsTooFarFromY">Vaš %1$s rejting predaleko je od %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Nemoguće izazvati zbog privremenog %s rejtinga.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s prihvata samo izazove od prijatelja.</string>
<string name="declineGeneric">Trenutno ne prihvatam izazove.</string>
<string name="declineLater">Ne odgovara mi ovaj trenutak; molim, izazovite me ponovo kasnije.</string>
<string name="declineNoBot">Ne prihvatam izazove od botova.</string>
<string name="declineOnlyBot">Prihvatam izazove samo od botova.</string>
</resources>

View File

@ -1,6 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="challenges">Desafiaments</string>
<string name="challengeToPlay">Desafia a una partida</string>
<string name="challengeDeclined">Desafiament rebutjat</string>
<string name="challengeAccepted">Desafiament acceptat!</string>
<string name="challengeCanceled">Desafiament cancel·lat.</string>
<string name="registerToSendChallenges">Si us plau, registra\'t per enviar desafiaments.</string>
<string name="youCannotChallengeX">No pots desafiar a %s.</string>
<string name="xDoesNotAcceptChallenges">%s no accepta desafiaments.</string>
<string name="yourXRatingIsTooFarFromY">La teva qualificació de %1$s és massa distant de la de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">No es pot desafiar a causa de la qualificació provisional de %s.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s només accepta desafiaments dels amics.</string>
<string name="declineGeneric">No accepto desafiaments en aquest moment.</string>
<string name="declineLater">Ara mateix no puc, si us plau prova-ho més tard.</string>
<string name="declineTooFast">Aquest control de temps és massa ràpid per a mi. Si us plau, desafia\'m un altra vegada amb un ritme més lent.</string>
<string name="declineTooSlow">Aquest control de temps és massa lent per a mi. Si us plau, desafia\'m una altra vegada amb un ritme més ràpid.</string>
<string name="declineTimeControl">No accepto desafiaments amb aquest control de temps.</string>
<string name="declineRated">Si us plau, envia\'m un desafiament puntuat.</string>
<string name="declineCasual">Si us plau, envia\'m un desafiament casual.</string>
<string name="declineStandard">No accepto desafiaments per variants en aquest moment.</string>
<string name="declineVariant">No vull jugar aquesta variant en aquest moment.</string>
<string name="declineNoBot">No accepto desafiaments de bots.</string>
<string name="declineOnlyBot">Només accepto desafiaments de bots.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Opret en konto for at sende udfordringer.</string>
<string name="youCannotChallengeX">Du kan ikke udfordre %s.</string>
<string name="xDoesNotAcceptChallenges">%s accepterer ikke udfordringer.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Din %1$s rating er for langt fra %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Kan ikke udfordre på grund af provisorisk %s rating.</string>
<string name="yourXRatingIsTooFarFromY">Din %1$s rating er for langt fra %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Kan ikke udfordre på grund af provisorisk %s rating.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s accepterer kun udfordringer fra venner.</string>
<string name="declineGeneric">Jeg accepterer ikke udfordringer i øjeblikket.</string>
<string name="declineLater">Det er ikke et godt tidspunkt for mig, spørg venligst igen senere.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Send mig gerne en ikke-ratet udfordring i stedet.</string>
<string name="declineStandard">Jeg accepterer ikke variantudfordringer lige nu.</string>
<string name="declineVariant">Jeg er ikke villig til at spille denne variant lige nu.</string>
<string name="declineNoBot">Jeg accepterer ikke udfordringer fra bots.</string>
<string name="declineOnlyBot">Jeg accepterer kun udfordringer fra bots.</string>
</resources>

View File

@ -8,16 +8,18 @@
<string name="registerToSendChallenges">Bitte registriere dich, um Herausforderungen zu senden.</string>
<string name="youCannotChallengeX">Du kannst %s nicht herausfordern.</string>
<string name="xDoesNotAcceptChallenges">%s nimmt keine Herausforderungen an.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Deine %1$s Wertung ist zu weit von %2$s entfernt.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Herausforderung wegen provisorischer %s Wertung nicht möglich.</string>
<string name="yourXRatingIsTooFarFromY">Deine %1$s Wertung ist zu weit von %2$s entfernt.</string>
<string name="cannotChallengeDueToProvisionalXRating">Herausforderung wegen provisorischer %s Wertung nicht möglich.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s nimmt Herausforderungen nur von Freunden an.</string>
<string name="declineGeneric">Ich nehme derzeit keine Herausforderungen an.</string>
<string name="declineLater">Ich nehme momentan keine Herausforderungen an, bitte frage später noch einmal.</string>
<string name="declineTooFast">Diese Bedenkzeit ist zu gering für mich, ich bitte daher um erneutes Herausfordern mit mehr Bedenkzeit.</string>
<string name="declineTooSlow">Diese Bedenkzeit ist zu viel für mich, ich bitte daher um erneutes Herausfordern mit weniger Bedenkzeit.</string>
<string name="declineTimeControl">Ich nehme keine Herausforderungen mit Bedenkzeit an.</string>
<string name="declineTooFast">Diese Bedenkzeit ist zu gering für mich, bitte fordere mich erneut mit einer höheren Bedenkzeit heraus.</string>
<string name="declineTooSlow">Diese Bedenkzeit ist zu lang für mich, bitte fordere mich mit weniger Bedenkzeit heraus.</string>
<string name="declineTimeControl">Ich nehme keine Herausforderungen mit dieser Bedenkzeit an.</string>
<string name="declineRated">Bitte fordere mich stattdessen zu einer gewerteten Partie heraus.</string>
<string name="declineCasual">Bitte fordere mich stattdessen zu einer ungewerteten Partie heraus.</string>
<string name="declineStandard">Ich nehme derzeit keine Herausforderungen für andere Spielvarianten an.</string>
<string name="declineVariant">Ich bin nicht bereit, diese Variante zu spielen.</string>
<string name="declineVariant">Ich bin derzeit nicht bereit, diese Variante zu spielen.</string>
<string name="declineNoBot">Ich nehme keine Herausforderungen von Bots an.</string>
<string name="declineOnlyBot">Ich nehme nur Herausforderungen von Bots an.</string>
</resources>

View File

@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="declineNoBot">Δεν δέχομαι προκλήσεις από bots.</string>
<string name="declineOnlyBot">Δέχομαι μόνο προκλήσεις από bots.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Please register to send challenges.</string>
<string name="youCannotChallengeX">You cannot challenge %s.</string>
<string name="xDoesNotAcceptChallenges">%s does not accept challenges.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Your %1$s rating is too far from %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Cannot challenge due to provisional %s rating.</string>
<string name="yourXRatingIsTooFarFromY">Your %1$s rating is too far from %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Cannot challenge due to provisional %s rating.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s only accepts challenges from friends.</string>
<string name="declineGeneric">I\'m not accepting challenges at the moment.</string>
<string name="declineLater">This is not the right time for me, please ask again later.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Please send me a casual challenge instead.</string>
<string name="declineStandard">I\'m not accepting variant challenges right now.</string>
<string name="declineVariant">I\'m not willing to play this variant right now.</string>
<string name="declineNoBot">I\'m not accepting challenges from bots.</string>
<string name="declineOnlyBot">I\'m only accepting challenges from bots.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Por favor regístrate para desafiar a otros jugadores.</string>
<string name="youCannotChallengeX">No puedes desafiar a %s.</string>
<string name="xDoesNotAcceptChallenges">%s no acepta desafíos.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Tu puntuación de %1$s está demasiado lejos de la de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">No puedes desafiar a otros jugadores debido a que tu puntuación de %s es provisional.</string>
<string name="yourXRatingIsTooFarFromY">Tu puntuación de %1$s está demasiado lejos de la de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">No puedes desafiar a otros jugadores debido a que tu puntuación de %s es provisional.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s sólo acepta desafíos de sus amigos.</string>
<string name="declineGeneric">No estoy aceptando desafíos por el momento.</string>
<string name="declineLater">No estoy aceptando desafíos ahora mismo, por favor pregunta de nuevo más tarde.</string>
@ -17,7 +17,9 @@
<string name="declineTooSlow">Este control de tiempo es demasiado lento para mí, por favor desafíame de nuevo con una partida más rápida.</string>
<string name="declineTimeControl">No estoy aceptando desafíos con este control de tiempo.</string>
<string name="declineRated">En su lugar, desafíame a una partida por puntos.</string>
<string name="declineCasual">En su lugar, desafíame a una partida casual.</string>
<string name="declineCasual">En su lugar, desafíame a una partida amistosa.</string>
<string name="declineStandard">No estoy aceptando desafíos de variantes en este momento.</string>
<string name="declineVariant">No estoy dispuesto a jugar esta variante en este momento.</string>
<string name="declineNoBot">No estoy aceptando desafíos de bots.</string>
<string name="declineOnlyBot">Solo estoy aceptando desafíos de bots.</string>
</resources>

View File

@ -1,2 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="challenges">Erronkak</string>
<string name="challengeToPlay">Partida baterako erronka egin</string>
<string name="challengeDeclined">Erronka baztertuta</string>
<string name="challengeAccepted">Erronka onartuta!</string>
<string name="challengeCanceled">Erronka bertan behera utzita.</string>
<string name="registerToSendChallenges">Eman izena erronkak bidaltzeko.</string>
<string name="youCannotChallengeX">Ezin diozu %s erabiltzaileri erronka egin.</string>
<string name="xDoesNotAcceptChallenges">%s erabiltzaileak ez du erronkarik onartzen.</string>
<string name="yourXRatingIsTooFarFromY">Zure %1$s puntuazioa urrunegi dago %2$s-tik.</string>
<string name="cannotChallengeDueToProvisionalXRating">Ezin duzu erronkarik egin behin-behineko %s puntuazioa duzulako.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s erabiltzaileak bere lagunen erronkak onartzen ditu bakarrik.</string>
<string name="declineGeneric">Orain ez dut erronkarik onartzen.</string>
<string name="declineLater">Hori ez da momenturik onena, eskatu beranduago.</string>
<string name="declineTooFast">Erritmo hori azkarregia da, proposatu partida geldoago bat.</string>
<string name="declineTooSlow">Erritmo hori geldoegia da, proposatu partida azkarrago bat.</string>
<string name="declineTimeControl">Ez dut erritmo horretako erronkarik onartzen.</string>
<string name="declineRated">Mesedez bidali puntuaziorako balio duen erronka bat.</string>
<string name="declineCasual">Mesedez bidali lagunarteko erronka bat, puntuaziorako balio ez duena.</string>
<string name="declineStandard">Ez dut aldaeren erronkarik onartzen.</string>
<string name="declineVariant">Ez dut aldaera horretan jokatu nahi.</string>
<string name="declineNoBot">Ez dut erroboten erronkarik onartzen.</string>
<string name="declineOnlyBot">Erroboten erronkak bakarrik onartzen ditut.</string>
</resources>

View File

@ -8,9 +8,11 @@
<string name="registerToSendChallenges">Rekisteröidy niin voit lähettää haasteita.</string>
<string name="youCannotChallengeX">Et voi haastaa pelaajaa %s.</string>
<string name="xDoesNotAcceptChallenges">%s ei ota haasteita vastaan.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">%1$s-vahvuuslukusi on liian kaukana pelaajan %2$s vahvuusluvusta.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Et voi haastaa, koska %s-vahvuuslukusi on tilapäinen.</string>
<string name="yourXRatingIsTooFarFromY">%1$s-vahvuuslukusi on liian kaukana pelaajan %2$s vahvuusluvusta.</string>
<string name="cannotChallengeDueToProvisionalXRating">Et voi haastaa, koska %s-vahvuuslukusi on tilapäinen.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s ottaa vastaan haasteita vain kavereiltaan.</string>
<string name="declineGeneric">En ota tällä hetkellä haasteita vastaan.</string>
<string name="declineLater">Ajankohta ei sovi minulle juuri nyt, pyydä myöhemmin uudelleen.</string>
<string name="declineNoBot">En ota vastaan haasteita boteilta.</string>
<string name="declineOnlyBot">Otan vastaan haasteita vain boteilta.</string>
</resources>

View File

@ -13,4 +13,6 @@
<string name="xOnlyAcceptsChallengesFromFriends">%s tekur bert við avbjóðingum frá vinum.</string>
<string name="declineGeneric">Eg taki ikki móti avbjóðingum í løtuni.</string>
<string name="declineLater">Eg taki ikki ímóti avbjóðingum í løtuni. Spyr vinaliga aftur seinni.</string>
<string name="declineNoBot">Eg taki ikki móti avbjóðingum frá teldum.</string>
<string name="declineOnlyBot">Eg taki bert móti avbjóðingum frá teldum.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Veuillez vous inscrire pour envoyer des défis.</string>
<string name="youCannotChallengeX">Vous ne pouvez pas défier %s.</string>
<string name="xDoesNotAcceptChallenges">%s naccepte pas les défis.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Votre classement de %1$s est trop différent de celui de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Défi refusé à cause de la cote %s provisoire</string>
<string name="yourXRatingIsTooFarFromY">Votre classement de %1$s est trop différent de celui de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Défi refusé à cause de la cote %s provisoire</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s naccepte que les défis de ses ami(e)s.</string>
<string name="declineGeneric">Je n\'accepte pas de défis pour le moment.</string>
<string name="declineLater">Ce n\'est pas un bon moment pour moi, réessayez plus tard s\'il vous plaît.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Envoyez-moi plutôt un défi amical.</string>
<string name="declineStandard">Je n\'accepte pas de défis en variantes pour le moment.</string>
<string name="declineVariant">Je ne veux pas jouer cette variante pour le moment.</string>
<string name="declineNoBot">Je n\'accepte pas les défis des robots.</string>
<string name="declineOnlyBot">J\'accepte uniquement les défis des robots.</string>
</resources>

View File

@ -5,19 +5,21 @@
<string name="challengeDeclined">Izazov odbijen</string>
<string name="challengeAccepted">Izazov prihvaćen!</string>
<string name="challengeCanceled">Izazov otkazan.</string>
<string name="registerToSendChallenges">Za slanje izazova morate se registrirati.</string>
<string name="youCannotChallengeX">Ne možete izazvati %s.</string>
<string name="registerToSendChallenges">Registriraj se za slanje izazova.</string>
<string name="youCannotChallengeX">Ne možeš izazvati %s.</string>
<string name="xDoesNotAcceptChallenges">%s ne prihvaća izazove.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Prevelika je razlika između tvog i %2$s %1$s rejtinga.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Nemoguće izazvati zbog prevelike razlike u %s rejtingu.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s prihvaća samo izazove od prijatelja.</string>
<string name="yourXRatingIsTooFarFromY">Prevelika je razlika između tvog i %2$s %1$s rejtinga.</string>
<string name="cannotChallengeDueToProvisionalXRating">Nemoguće izazvati zbog prevelike razlike u %s rejtingu.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s prihvaća izazove isključivo od prijatelja.</string>
<string name="declineGeneric">Trenutačno ne prihvaćam izazove.</string>
<string name="declineLater">Trenutačno nije najbolje vrijeme, molimo Vas pokušajte kasnije.</string>
<string name="declineTooFast">Ovaj vremenski format je prebrz za mene, molim Vas da me izazovete na sporiji format.</string>
<string name="declineTooSlow">Ovaj vremenski format je prespor za mene, molim Vas da me izazovete na brži format.</string>
<string name="declineLater">Trenutačno ne mogu prihvatiti izazov, molim te da pokušaš kasnije.</string>
<string name="declineTooFast">Ovaj vremenski format je prebrz za mene, izazovi me na sporiji format.</string>
<string name="declineTooSlow">Ovaj vremenski format je prespor za mene, izazovi me na brži format.</string>
<string name="declineTimeControl">Ne prihvaćam izazove u ovom vremenskom formatu.</string>
<string name="declineRated">Molim Vas da me radije izazovete na rangiranu partiju.</string>
<string name="declineCasual">Molim Vas da me radije izazovete na ležernu partiju.</string>
<string name="declineRated">Radije me izazovi na bodovanu partiju.</string>
<string name="declineCasual">Radije me izazovi na ležernu partiju.</string>
<string name="declineStandard">Ne prihvaćam izazove u ovoj varijanti.</string>
<string name="declineVariant">Trenutačno ne želim igrati ovu varijantu.</string>
<string name="declineNoBot">Ne prihvaćam izazove od botova.</string>
<string name="declineOnlyBot">Prihvaćam izazove isključivo od botova.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">挑戦を送るには登録が必要です。</string>
<string name="youCannotChallengeX">%s には挑戦できません。</string>
<string name="xDoesNotAcceptChallenges">%s は挑戦を受け付けていません。</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">あなたの %1$s レーティングは %2$s と離れすぎています。</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">%s レーティングが暫定のため挑戦できません。</string>
<string name="yourXRatingIsTooFarFromY">あなたの %1$s レーティングは %2$s と離れすぎています。</string>
<string name="cannotChallengeDueToProvisionalXRating">%s レーティングが暫定のため挑戦できません。</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s は友達からの挑戦しか受け付けません。</string>
<string name="declineGeneric">現在、挑戦を受け付けていません。</string>
<string name="declineLater">今は都合が悪いので、後でもう一度尋ねてください。</string>
@ -20,4 +20,6 @@
<string name="declineCasual">代わりに非レート戦での挑戦を送ってください。</string>
<string name="declineStandard">現在、バリアントでの挑戦は受け付けていません。</string>
<string name="declineVariant">今はこのバリアントで対戦するつもりはありません。</string>
<string name="declineNoBot">ボットからの挑戦は受け付けていません。</string>
<string name="declineOnlyBot">私はボットからの挑戦しか受け付けません。</string>
</resources>

View File

@ -20,4 +20,6 @@
<string name="declineCasual">Vietoje šio iššūkio atsiųskite nevertinamą iššūkį.</string>
<string name="declineStandard">Šiuo metu nepriimu variantų iššūkių.</string>
<string name="declineVariant">Šiuo metu nenoriu žaisti šio varianto.</string>
<string name="declineNoBot">Nepriimu iššūkių iš programų.</string>
<string name="declineOnlyBot">Priimu iššūkius tik iš programų.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Lūdzu reģistrējieties, lai sūtītu izaicinājumus.</string>
<string name="youCannotChallengeX">Nevarat izaicināt %s.</string>
<string name="xDoesNotAcceptChallenges">%s nepieņem izaicinājumus.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username">Jūsu %1$s reitings ir par tālu no %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Nevar izaicināt pagaidu %s reitinga dēļ.</string>
<string name="yourXRatingIsTooFarFromY">Jūsu %1$s reitings ir par tālu no %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Nevar izaicināt pagaidu %s reitinga dēļ.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s pieņem izaicinājumus tikai no draugiem.</string>
<string name="declineGeneric">Pašlaik nepieņemu izaicinājumus.</string>
<string name="declineLater">Šis laiks man neder, lūdzu piedāvājiet vēlāk.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Labāk lūdzu atsūtiet nevērtētu izaicinājumu.</string>
<string name="declineStandard">Šobrīd nepieņemu variantu izaicinājumus.</string>
<string name="declineVariant">Šobrīd nevēlos spēlēt šo variantu.</string>
<string name="declineNoBot">Pašlaik nepieņemu izaicinājumus no botiem.</string>
<string name="declineOnlyBot">Pieņemu izaicinājumus tikai no botiem.</string>
</resources>

View File

@ -20,4 +20,6 @@
<string name="declineCasual">Send meg en utfordring til et uformelt parti i stedet.</string>
<string name="declineStandard">Jeg godtar ikke utfordringer til varianter for øyeblikket.</string>
<string name="declineVariant">Jeg ønsker ikke å spille denne varianten for øyeblikket.</string>
<string name="declineNoBot">Jeg godtar ikke utfordringer fra boter.</string>
<string name="declineOnlyBot">Jeg godtar bare utfordringer fra boter.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Gelieve te registreren om uitdagingen te versturen.</string>
<string name="youCannotChallengeX">Je kunt %s niet uitdagen.</string>
<string name="xDoesNotAcceptChallenges">%s neemt geen uitdagingen aan.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Je rating van %1$s wijkt te veel af van %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Uitdagen niet mogelijk vanwege voorlopige %s-rating.</string>
<string name="yourXRatingIsTooFarFromY">Je rating van %1$s wijkt te veel af van %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Uitdagen niet mogelijk vanwege voorlopige %s-rating.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s neemt alleen uitdagingen aan van vrienden.</string>
<string name="declineGeneric">Momenteel neem ik geen uitdagingen aan.</string>
<string name="declineLater">Op dit moment neem ik geen uitdagingen aan, probeer het later nog eens.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Stuur me a.u.b. een uitdaging zonder rating.</string>
<string name="declineStandard">Momenteel neem ik geen uitdagingen aan voor varianten.</string>
<string name="declineVariant">Momenteel voel ik er niet voor om deze variant te spelen.</string>
<string name="declineNoBot">Ik neem geen uitdagingen van bots aan.</string>
<string name="declineOnlyBot">Ik neem alleen uitdagingen van bots aan.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Du må registrera deg om du vil oppretta utfordringar.</string>
<string name="youCannotChallengeX">Du kan ikkje utfordra %s.</string>
<string name="xDoesNotAcceptChallenges">%s tek ikkje i mot utfordringar.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Ratinga di i %1$s er for langt unna %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Kan ikkje utfordre grunna mellombels %s rating.</string>
<string name="yourXRatingIsTooFarFromY">Ratinga di i %1$s er for langt unna %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Kan ikkje utfordre grunna mellombels %s rating.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s tek berre mot utfordringar frå vener.</string>
<string name="declineGeneric">Eg tek for tida ikkje mot utfordringar.</string>
<string name="declineLater">Det passar ikkje nett no, men spør meg gjerne seinare.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Send meg heller ei utfordring til eit uformelt parti.</string>
<string name="declineStandard">Eg tek ikkje utfordringar til variantar nett no.</string>
<string name="declineVariant">Eg ønskjer ikkje å spela denne varianten nett no.</string>
<string name="declineNoBot">Eg tek ikkje utfordringar frå bottar.</string>
<string name="declineOnlyBot">Eg tek berre utfordringar frå bottar.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Zarejestruj się, aby zapraszać do gry.</string>
<string name="youCannotChallengeX">Nie możesz wyzwać %s.</string>
<string name="xDoesNotAcceptChallenges">%s nie przyjmuje wyzwań.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username">Twój ranking (%1$s) jest zbyt odległy od %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Nie możesz zapraszać ze względu na swój tymczasowy ranking (%s).</string>
<string name="yourXRatingIsTooFarFromY">Twój ranking (%1$s) jest zbyt odległy od %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Nie możesz zapraszać ze względu na swój tymczasowy ranking (%s).</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s akceptuje tylko wyzwania od znajomych.</string>
<string name="declineGeneric">Obecnie nie akceptuję wyzwań.</string>
<string name="declineLater">Nie mam teraz czasu, spróbuj proszę później.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Zaproś mnie proszę do partii nierankingowej.</string>
<string name="declineStandard">Nie akceptuję teraz zaproszeń do gry w warianty.</string>
<string name="declineVariant">Nie chcę grać teraz tego wariantu.</string>
<string name="declineNoBot">Nie przyjmuję wyzwań od botów.</string>
<string name="declineOnlyBot">Przyjmuję tylko wyzwania od botów.</string>
</resources>

View File

@ -20,4 +20,6 @@
<string name="declineCasual">Por favor, envie-me um desafio amigável.</string>
<string name="declineStandard">Eu não estou aceitando desafios de variantes no momento.</string>
<string name="declineVariant">Não estou disposto a jogar esta variante no momento.</string>
<string name="declineNoBot">Não estou aceitando desafios de robôs.</string>
<string name="declineOnlyBot">Estou aceitando apenas desafios de robôs.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Por favor regista-te para enviar desafios.</string>
<string name="youCannotChallengeX">Não podes desafiar %s.</string>
<string name="xDoesNotAcceptChallenges">%s não aceita desafios.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">A tua classificação %1$s é muito diferente de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Não podes desafiar por causa do tua pontuação provisória de %s.</string>
<string name="yourXRatingIsTooFarFromY">A tua classificação %1$s é muito diferente de %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Não podes desafiar por causa do tua pontuação provisória de %s.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s só aceita desafios de amigos.</string>
<string name="declineGeneric">Não estou a aceitar desafios com este controlo de tempo.</string>
<string name="declineLater">Este não é o momento certo para mim, por favor pergunte novamente mais tarde.</string>

View File

@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="declineNoBot">Nu accept provocările roboților.</string>
<string name="declineOnlyBot">Accept doar provocările roboților.</string>
</resources>

View File

@ -20,4 +20,6 @@
<string name="declineCasual">Вызовите меня на товарищескую игру, пожалуйста.</string>
<string name="declineStandard">Я не принимаю вызовы на неклассические шахматы прямо сейчас.</string>
<string name="declineVariant">Я не хочу играть в этот вариант шахмат прямо сейчас.</string>
<string name="declineNoBot">Я не принимаю вызовы от ботов.</string>
<string name="declineOnlyBot">Я принимаю вызовы только от ботов.</string>
</resources>

View File

@ -1,5 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="challenges">Izzivi</string>
<string name="challengeToPlay">Izzovi na partijo</string>
<string name="challengeDeclined">Izziv zavrnjen</string>
<string name="challengeAccepted">Izziv je sprejet!</string>
<string name="challengeCanceled">Izziv je preklican.</string>
<string name="registerToSendChallenges">Če želite poslati izziv, se prosim registrirajte.</string>
<string name="youCannotChallengeX">Ne morete izzvati %s.</string>
<string name="xDoesNotAcceptChallenges">%s ne sprejema izzivov.</string>
<string name="yourXRatingIsTooFarFromY">Vaš %1$s rating je predaleč od ratinga igralca %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Izzivanje ni mogoče, zaradi začasnega %s ratinga.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s sprejema izzive samo od prijateljev.</string>
<string name="declineGeneric">Sedaj ne sprejemam izzivov.</string>
<string name="declineLater">Zdaj ni pravi čas, posimo vprašajte kasneje.</string>
<string name="declineTooFast">Tokratna kontrola je zame prehitra, prosim, ponovno izzivajte s počasnejšo igro.</string>
<string name="declineTooSlow">Tokratna kontrola je zame prepočasna, prosim, znova izzivajte s hitrejšo igro.</string>
<string name="declineTimeControl">S tem časovnim nadzorom ne sprejemam izzivov.</string>
@ -7,4 +20,6 @@
<string name="declineCasual">Prosim, pošljite mi nerangirani izziv.</string>
<string name="declineStandard">Trenutno ne sprejemam variantnih izzivov.</string>
<string name="declineVariant">Trenutno nisem pripravljen igrati te različice.</string>
<string name="declineNoBot">Izzivov od robotov ne sprejemam.</string>
<string name="declineOnlyBot">Sprejemam le izzive od robotov.</string>
</resources>

View File

@ -8,16 +8,18 @@
<string name="registerToSendChallenges">Vänligen registrera ett konto för att skicka utmaningar.</string>
<string name="youCannotChallengeX">Du kan inte utmana %s.</string>
<string name="xDoesNotAcceptChallenges">%s accepterar inte utmaningar.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">Din %1$srating är för långt ifrån %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">Kan inte utmana på grund av provisorisk %srating.</string>
<string name="yourXRatingIsTooFarFromY">Din %1$srating är för långt ifrån %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Kan inte utmana på grund av provisorisk %srating.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s accepterar endast utmaningar från vänner.</string>
<string name="declineGeneric">Jag accepterar inte utmaningar för tillfället.</string>
<string name="declineLater">Detta är inte rätt tid för mig, vänligen fråga igen senare.</string>
<string name="declineTooFast">Denna tidskontroll är för snabb för mig, vänligen utmana igen med ett långsammare parti.</string>
<string name="declineTooSlow">Denna tidskontroll är för långsam för mig, vänligen utmana igen med ett snabbare parti.</string>
<string name="declineTimeControl">Jag accepterar inte utmaningar med denna tidskontroll.</string>
<string name="declineTimeControl">Jag antar inte utmaningar med denna tidskontroll.</string>
<string name="declineRated">Vänligen skicka en rankad utmaning istället.</string>
<string name="declineCasual">Vänligen skicka en orankad utmaning istället.</string>
<string name="declineStandard">Jag accepterar inte utmaningar med varianter för tillfället.</string>
<string name="declineStandard">Jag antar inte utmaningar med varianter för tillfället.</string>
<string name="declineVariant">Jag vill inte spela denna variant för tillfället.</string>
<string name="declineNoBot">Jag antar inte utmaningar från bottar.</string>
<string name="declineOnlyBot">Jag antar endast utmaningar från bottar.</string>
</resources>

View File

@ -8,8 +8,8 @@
<string name="registerToSendChallenges">Oyun daveti göndermek için üye olun.</string>
<string name="youCannotChallengeX">%s adlı oyuncuya oyun daveti gönderemezsiniz.</string>
<string name="xDoesNotAcceptChallenges">%s oyun davetlerini kabul etmiyor.</string>
<string name="yourXRatingIsTooFarFromY" comment="yourXRatingIsTooFarFromY&#10;&#10;%1$s is the rating type (blitz, bullet, crazyhouse)&#10;%2$s is another username&#10;&#10;This message is shown if you are trying too challenge someone who is too strong/weak compared to your rating.">%1$s puanınız %2$s ile kıyaslandığında büyük fark var.</string>
<string name="cannotChallengeDueToProvisionalXRating" comment="cannotChallengeDueToProvisionalXRating&#10;&#10;Users can set the preference to deny challenges from other players if their rating is not within a range of 300 points. If you attempt to challenge someone who has turned on this restriction, but one of you has a provisional rating in this area, you will see this message.&#10;&#10;A rating is considered provisional if the player hasn't played enough games for the system to be certain of their exact rating.&#10;&#10;The variable is the type of rating (Blitz, Bullet, Crazyhouse, etc.)">%s puanınız geçici olduğu için başka oyunculara meydan okuyamazsınız.</string>
<string name="yourXRatingIsTooFarFromY">%1$s puanınız %2$s ile kıyaslandığında büyük fark var.</string>
<string name="cannotChallengeDueToProvisionalXRating">%s puanınız geçici olduğu için başka oyunculara meydan okuyamazsınız.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s sadece arkadaşlarından gelen oyun davetlerini kabul ediyor.</string>
<string name="declineGeneric">Şimdilik oyun tekliflerini kabul etmiyorum.</string>
<string name="declineLater">Şu anda müsait değilim, lütfen daha sonra yeniden teklif ediniz.</string>
@ -20,4 +20,6 @@
<string name="declineCasual">Bunun yerine puansız oyun teklifi yapınız lütfen.</string>
<string name="declineStandard">Şimdilik standart dışı varyantlarda oyun tekliflerini kabul etmiyorum.</string>
<string name="declineVariant">Şimdilik bu varyantı oynamak istemiyorum.</string>
<string name="declineNoBot">Botlardan gelen oyun tekliflerini kabul etmiyorum.</string>
<string name="declineOnlyBot">Yalnızca botlardan gelen oyun tekliflerini kabul ediyorum.</string>
</resources>

View File

@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="declineNoBot">Я не приймаю виклики від ботів.</string>
<string name="declineOnlyBot">Я приймаю виклики лише від ботів.</string>
</resources>

View File

@ -4,4 +4,22 @@
<string name="challengeToPlay">O\'yinga chorlov</string>
<string name="challengeDeclined">Chorlovni rad etildi</string>
<string name="challengeAccepted">Chorlov qabul qilindi!</string>
<string name="challengeCanceled">Chorlov bekor qilindi.</string>
<string name="registerToSendChallenges">Iltimos o\'yinga chorlash uchun ro\'yhatdan o\'ting.</string>
<string name="youCannotChallengeX">Siz %s ni chorlay olmaysiz.</string>
<string name="xDoesNotAcceptChallenges">%s chorlovni qabul qilmadi.</string>
<string name="yourXRatingIsTooFarFromY">Sizning %1$s reytingingiz %2$s dan ancha uzoq.</string>
<string name="cannotChallengeDueToProvisionalXRating">%s taxminiy belgilangan reyting bilan bellashib bo\'lmaydi.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s faqat doʻstlardan chorlovni qabul qiladi.</string>
<string name="declineGeneric">Ayni damda chorlovni qabul qila olmayman.</string>
<string name="declineLater">Ayni dam men uchun qulay emas, iltimos keyinroq soʻrang.</string>
<string name="declineTooFast">Usbu vaqt boshqaruvi men uchun tezlik qiladi, iltimos sekinroq oʻynash uchun uzoqroq vaqt bilan chorlang.</string>
<string name="declineTooSlow">Ushbu vaqt boshqaruvi men uchun sekin hisoblanadi, iltimos tezroq oʻyin uchun qisqaroq vaqt bilan chorlang.</string>
<string name="declineTimeControl">Men ushbu vaqt boshqaruvidagi chorlovni qabul qila olmayman.</string>
<string name="declineRated">Iltimos menga reytingli chorlovni yuboring.</string>
<string name="declineCasual">Iltimos menga reytingsiz bellashuv chorlovini joʻnating.</string>
<string name="declineStandard">Xozir men bellashuvlar variantlarini qabul qila olmayman.</string>
<string name="declineVariant">Ayni damda ushbu variantda oʻynashga men tayyor emasman.</string>
<string name="declineNoBot">Ayni damda men botlardan chorlovlarni qabul qila olmayman.</string>
<string name="declineOnlyBot">Men faqat botlardan chorlovlarni qabul qila olaman.</string>
</resources>

View File

@ -1,2 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="challenges">Thách đấu</string>
<string name="challengeToPlay">Yêu cầu chơi</string>
<string name="challengeDeclined">Thử thách đấu bị từ chối</string>
<string name="challengeAccepted">Lời thách đấu được chấp nhận!</string>
<string name="challengeCanceled">Lời thách đấu bị hủy bỏ.</string>
<string name="registerToSendChallenges">Xin vui lòng đăng ký để gửi những lời thách đấu.</string>
<string name="youCannotChallengeX">Bạn không thể thách đấu %s.</string>
<string name="xDoesNotAcceptChallenges">%s không chấp nhận những lời thách đấu.</string>
<string name="yourXRatingIsTooFarFromY">Chỉ số %1$s của bạn quá xa so với %2$s.</string>
<string name="cannotChallengeDueToProvisionalXRating">Không thể thách đấu do xếp hạng %s tạm thời.</string>
<string name="xOnlyAcceptsChallengesFromFriends">%s chỉ chấp nhận những thách thức từ bạn bè.</string>
</resources>

View File

@ -5,7 +5,7 @@
<string name="features">Características</string>
<string name="quicklyGenerateSafeUsernames">Generar rápidamente nombres de usuario y contraseñas seguras para estudiantes</string>
<string name="trackStudentProgress">Seguir el progreso del estudiante en partidas y ejercicios de táctica</string>
<string name="messageAllStudents">Notificar a todos los estudiantes sobre el nuevo material de clase</string>
<string name="messageAllStudents">Enviar un mensaje a todos los estudiantes sobre el nuevo material de clase</string>
<string name="freeForAllForever">100% libre y gratuito para todos, para siempre, sin publicidad ni rastreadores</string>
<string name="applyToBeLichessTeacher">Solicitar ser profesor de Lichess</string>
<string name="noClassesYet">No hay clases todavía.</string>
@ -90,7 +90,7 @@ Aquí está el enlace para acceder a la clase.</string>
<string name="editNews">Editar las novedades</string>
<string name="notifyAllStudents">Notificar a todos los estudiantes</string>
<string name="nothingHere">Aún no hay nada aquí.</string>
<string name="newsEdit1">Todas las noticias de clase en un solo lugar.</string>
<string name="newsEdit1">Todas las noticias de la clase en un solo campo.</string>
<string name="newsEdit2">Añade las novedades más recientes en la parte superior. No elimines las novedades anteriores.</string>
<string name="newsEdit3">Separa las novedades con ---
Mostrará una línea separadora horizontal.</string>

View File

@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="lichessCoaches">Lichess treenerid</string>
<string name="lichessCoach">Lichess treener</string>
</resources>

View File

@ -1,2 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="lichessCoaches">Lichess murabbiylari</string>
<string name="lichessCoach">Lichess murabbiyi</string>
<string name="areYouCoach">Siz %s da ajoyib shaxmat murabbiyimisiz?</string>
<string name="nmOrFideTitle" comment="nmOrFideTitle&#10;&#10;Part of sentence &quot;Are you a great chess coach with a NM or FIDE title?&quot;&#10;&#10;The text links to our title verification page: https://lichess.org/help/master">NM yoki FIDE </string>
<string name="confirmTitle">Oʻz reytingingizni kiriting va biz sizni ariznagizni koʻrib chiqamiz.</string>
<string name="languages">Tillar</string>
<string name="rating">Reyting</string>
<string name="hourlyRate">Soatli reyting</string>
<string name="availability">Mavjudligi</string>
</resources>

View File

@ -10,4 +10,11 @@
<string name="forgotUsername">Забравих потребителското си име</string>
<string name="youCanLoginWithEmail">Можете да влезе с email адреса, с който сте регистрирани</string>
<string name="lost2FA">Нямам достъп до 2-стъпковите кодове за аутентикация</string>
<string name="wantChangeUsername">Искам да променя потребителското ми име</string>
<string name="wantClearHistory">Искам да изчистя моята история или рейтинг</string>
<string name="cantClearHistory">Не е възможно да почистите в играта своите история, шахматни задачи или рейтинги.</string>
<string name="wantReport">Искам да докладвам играч</string>
<string name="errorPage">Страница за грешката</string>
<string name="welcomeToUse">Добре сте дошли да използвате Lichess за своята дейност, дори и търговска такава.</string>
<string name="noneOfTheAbove">Никое от горните</string>
</resources>

View File

@ -34,8 +34,8 @@
<string name="doNotMessageModerators">No envíes mensajes directos a los moderadores.</string>
<string name="onlyReports">La única forma eficaz de denunciar jugadores es mediante el formulario de denuncia.</string>
<string name="wantReportBug">Quiero informar de un error</string>
<string name="reportBugInForum">En el Foro de Comentarios de Lichess</string>
<string name="reportWebsiteIssue">Como un problema del sitio web de Lichess en GitHub</string>
<string name="reportBugInForum">En el foro de comentarios de Lichess</string>
<string name="reportWebsiteIssue">Como un problema de la página de Lichess en GitHub</string>
<string name="reportMobileIssue">Como un problema de la aplicación móvil de Lichess en GitHub</string>
<string name="reportBugInDiscord">En el servidor de Discord de Lichess</string>
<string name="howToReportBug">Por favor, describe cómo se ve el error, qué esperabas que sucediera, y los pasos para reproducir el error.</string>

View File

@ -27,6 +27,7 @@
<string name="wantClearHistory">Želim izbrisati svoju povijest ili ocjenu</string>
<string name="cantClearHistory">Nije moguće izbrisati svoju povijest igara, povijest zagonetka ili ocjenu.</string>
<string name="wantReport">Želim prijaviti igrača</string>
<string name="toReportAPlayerUseForm">Kako biste prijavili igrača, koristite obrazac za prijavu</string>
<string name="youCanAlsoReachReportPage">Do te stranice možete doći i klikom na %s gumb za izvještaj na stranici profila.</string>
<string name="doNotReportInForum">Nemojte prijavljivati igrače na forumu.</string>
<string name="doNotSendReportEmails">Ne šaljite nam e-poštu s izvješćima.</string>

View File

@ -48,6 +48,7 @@
<string name="fideMate">По FIDE Laws of Chess §6.9, ако је мат могућ са било којим редоследом легалних потеза, партија није реми</string>
<string name="knightMate">Могуће је матирати уз помоћ само коња или ловца, ако противник има фигура сем краља.</string>
<string name="noRatingPoints">Рејтинг поени нису додељени</string>
<string name="errorPage">Страница са грешком</string>
<string name="sendAppealTo">Можеш послати жалбу %s.</string>
<string name="falsePositives">Грешке се могу дешавати понекад, и нама је жао због тога.</string>
<string name="ifLegit">Ако је твоја жалба легитимна, уклонићемо забрану што пре.</string>

View File

@ -15,6 +15,7 @@
මෙන්න ඔබේ පැතිකඩ පිටුව: %1$s. ඔබට එය %2$s මත පුද්ගලීකරණය කළ හැකිය.
විනෝද වන්න, ඔබේ කොටස් සෑම විටම ඔබේ ප්‍රතිවාදියාගේ රජු වෙතට යා හැකි වේවා!</string>
<string name="logInToLichess">Lichess.org වෙත සාදරයෙන් පිළිගනිමු, %s</string>
<string name="common_orPaste">(ක්ලික් කිරීම ක්‍රියා නොකරයි ද? එය ඔබගේ බ්‍රව්සරයට ඇතුල් කර උත්සාහ කරන්න!)</string>
<string name="common_note">මෙය ඔබගේ %s භාවිතය හා සම්බන්ධ සේවා විද්‍යුත් තැපෑලකි.</string>
<string name="common_contact">අප හා සම්බන්ධ වීමට, කරුණාකර %s භාවිතා කරන්න.</string>

View File

@ -19,7 +19,7 @@
<string name="fairPlay">Fair Play</string>
<string name="whyFlaggedRatingManipulationOrCheater">Warum wurde ich für künstliche Wertungsmanipulation (Tiefstapelei und Hochtreiben) oder Computerunterstützung markiert?</string>
<string name="cheatDetectionMethods">Lichess arbeitet mit starken Erkennungsmethoden und sehr gründlichen Verfahren, um alle Hinweise zu überprüfen und eine Entscheidung zu treffen. Der Prozess umfasst oft viele Moderatoren und kann eine lange Zeit dauern. Außer der Markierung selbst werden wir für einzelne Fälle nicht auf Einzelheiten über Hinweise oder das Entscheidungsverfahren eingehen. Dies würde es in Zukunft einfacher machen, eine Erkennung zu vermeiden und wäre eine Einladung zu unproduktiven Debatten. Diese Zeit und Mühe wenden wir lieber für andere wichtige Fälle auf. Benutzer können Widerspruch einlegen, indem sie eine E-Mail an %1$s schicken, jedoch werden Entscheidungen selten rückgängig gemacht.</string>
<string name="whenAmIEligibleRatinRefund">Wann bin ich berechtigt, die automatische Wertungs-Rückerstattung von Betrügern zu erhalten?</string>
<string name="whenAmIEligibleRatinRefund">Wann qualifiziere ich mich für die automatische Wertungs-Rückerstattung von Betrügern?</string>
<string name="ratingRefundExplanation">Eine Minute, nachdem ein Spieler markiert wurde, werden seine 40 neuesten Partien in den letzten 3 Tagen betrachtet. Wenn du in diesen Partien unter den Gegnern warst, sich damit deine Wertung (wegen einer Niederlage oder eines Remis\') verschlechtert hat und deine Wertung nicht vorläufig war, erhältst du eine Wertungsrückerstattung. Die Rückerstattung wird begrenzt durch deine Spitzenwertung und deine Wertungsfortschritte nach der Partie.
(Wenn deine Wertung nach diesen Partien stark gestiegen ist, erhältst du möglicherweise keine Rückerstattung oder nur eine Teilrückerstattung.) Eine Rückerstattung beträgt nie mehr als 150 Punkte.</string>
<string name="preventLeavingGameWithoutResigning">Was geschieht mit Spielern, die Partien verlassen ohne aufzugeben?</string>
@ -28,7 +28,7 @@
<string name="youCannotApply">Es ist nicht möglich, sich als Moderator zu bewerben. Wenn wir jemanden sehen, von dem wir glauben, dass er als Moderator gut wäre, werden wir ihn direkt kontaktieren.</string>
<string name="isCorrespondenceDifferent">Unterscheidet sich Fernschach von normalem Schach?</string>
<string name="youCanUseOpeningBookNoEngine">Bei Lichess besteht der Hauptunterschied bei den Regeln für Fernschach darin, dass hier zwar ein Eröffnungsbuch erlaubt ist. Die Verwendung von Schachcomputern ist jedoch immer noch verboten und führt zu einer Markierung des Kontos wegen unerlaubter Unterstützung durch Schachcomputer. Obwohl die ICCF die Verwendung von Schachcomputern in Fernschachpartien erlaubt, ist dies auf Lichess nicht gestattet.</string>
<string name="gameplay">Das Spiel selbst betreffend</string>
<string name="gameplay">Spielerlebnis</string>
<string name="howBulletBlitzEtcDecided">Wie wird entschieden, was Bullet, Blitz und andere Zeitkontrollen sind?</string>
<string name="basedOnGameDuration">Lichess Zeitkontrollen basieren auf der erwarteten Spieldauer = %1$s
Zum Beispiel berechnet sich die erwartete Spieldauer einer 5+3 Partie zu 5 × 60 + 40 × 3 = 420 Sekunden.</string>

View File

@ -99,7 +99,7 @@ No solicites el título de LM.</string>
<string name="ownerUniqueTrophies">Ese trofeo es único en la historia de Lichess, nadie más que %1$s lo tendrá jamás.</string>
<string name="wayOfBerserkExplanation">Para obtenerlo, hiimgosu se desafió a sí mismo a berserk y ganó 100%% partidas de %s.</string>
<string name="aHourlyBulletTournament">un torneo Bullet por hora</string>
<string name="goldenZeeExplanation">ZugAddict estaba transmitiendo y durante las dos últimas horas había estado tratando de derrotar a la I.A. nivel 8 en una partida 1+0, sin éxito. Thibault le dijo que si lo hacía con éxito durante la transmisión, obtendría un trofeo único. Una hora después, venció a Stockfish y se cumplió la promesa.</string>
<string name="goldenZeeExplanation">ZugAddict estaba transmitiendo y durante las dos últimas horas había estado tratando de derrotar a la I.A. nivel 8 en una partida 1+0, sin éxito. Thibault le dijo que si lo lograba durante la transmisión, obtendría un trofeo único. Una hora después, venció a Stockfish y se cumplió la promesa.</string>
<string name="lichessRatings">Puntuaciones de Lichess</string>
<string name="whichRatingSystemUsedByLichess">¿Qué sistema de puntuación utiliza Lichess?</string>
<string name="ratingSystemUsedByLichess">Las puntuaciones se calculan utilizando el método de clasificación Glicko-2 desarrollado por Mark Glickman. Es un método de puntuación muy popular y que utilizan muchas organizaciones de ajedrez (la FIDE es un contraejemplo notable, ya que todavía utilizan el sistema de puntuación Elo).

View File

@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="faqAbbreviation">KKK</string>
<string name="frequentlyAskedQuestions">Korduma kippuvad küsimused</string>
</resources>

View File

@ -4,7 +4,7 @@
<string name="frequentlyAskedQuestions">Često postavljena pitanja</string>
<string name="whyIsLichessCalledLichess">Zašto se Lichess tako zove?</string>
<string name="lichessCombinationLiveLightLibrePronounced">Lichess je šah opisan sa izrazima uživo/lako/beslatno. Izgovara se kao %1$s.</string>
<string name="leechess">lee-chess</string>
<string name="leechess">li čes</string>
<string name="hearItPronouncedBySpecialist" comment="hearItPronouncedBySpecialist&#10;&#10;Links to https://www.youtube.com/watch?v=KRpPqcrdE-o">Čujte to izgovara stručnjak.</string>
<string name="whyLiveLightLibre">Uživo, jer se igre igraju i gledaju u stvarnom vremenu 24/7; lagan i besplatan zbog činjenice da je Lichess otvorenog koda i da nije opterećen vlasničkim smećem koji muči druge web stranice.</string>
<string name="whyIsLilaCalledLila">Slično tome, izvorni kod Lichess-a, %1$s, stoji za li[chess in sca]la, s obzirom da je najveći dio Lichess-a napisan u %2$s, intuitivnom programskom jeziku.</string>
@ -38,12 +38,21 @@ Na primjer, procijenjeno trajanje 5+3 računa se kao 5 × 60 + 40 × 3 i iznosi
<string name="whatVariantsCanIplay">Koje varijente šaha mogu da igram na Lichess-u?</string>
<string name="lichessSupportChessAnd">Lichess podržava standardni šah i %1$s.</string>
<string name="eightVariants">Osmerostruka varijanta šaha</string>
<string name="whatIsACPL">Što je prosječan gubitak centi-pješaka (ACPL)?</string>
<string name="acplExplanation">Centipawn je mjerna jedinica koja se koristi u šahu kao prikaz prednosti. Centipawn je jednak 1/100 pijuna. Prema tome 100 centipawn-a = 1 pijun. Te vrijednosti ne igraju formalnu ulogu u igri, ali su korisne igračima i ključne su u računalnom šahu za procjenu pozicija.
Gornji potez računala izgubit će nula centipawn-a, ali manji potezi rezultirat će pogoršanjem položaja, mjereno u centipawn-ima.
Ova se vrijednost može koristiti kao pokazatelj kvalitete igre. Što manje centipauna jedan izgubi po potezu, to je jača igra.
Računalnu analizu na Lichessu pokreće Stockfish.</string>
<string name="insufficientMaterial">Gubljenje igre zbog isteka vremena, remi i nedostatni šahovski materijal</string>
<string name="lichessFollowFIDErules">U slučaju da jednom igraču ponestane vremena, taj igrač će obično izgubiti igru. Međutim, igra je remi ako je položaj figura takav da protivnik ne može matirati protivničkog kralja nijednim mogućim nizom legalnih poteza (%1$s).
U rijetkim slučajevima to se može teško odlučiti automatski (prisilne linije, tvrđave). Prema zadanim postavkama uvijek smo uz igrača kojem nije ponestalo vremena.
Imajte na umu da je moguće izvesti mat sa jednim skakačem ili lovcem ako protivnik ima figuru koja bi mogla blokirati njegovog kralja.</string>
<string name="fideHandbookX">FIDE priručnik %s</string>
<string name="discoveringEnPassant">Zašto može pijun uzeti protivničkog pijuna kojeg je već prošao? (en passant)</string>
<string name="explainingEnPassant">Ovaj potez važi u šahu i poznat je kao \"en passant\". Članak na Wikipediji daje %1$s poteza \"en passant\".
@ -84,6 +93,8 @@ Nemojte tražiti LM titulu.</string>
<string name="whatUsernameCanIchoose">Koje korisničko ime mogu koristiti?</string>
<string name="usernamesNotOffensive">Općenito, korisničko ime ne bi trebala biti: uvredljivo, lažno predstavljanje nekog drugog ili oglašavanje. Više o %1$s korisničkog imena.</string>
<string name="guidelines">smjernicama</string>
<string name="canIChangeMyUsername">Mogu li promijeniti svoje korisničko ime?</string>
<string name="usernamesCannotBeChanged">Ne, korisnička imena se ne mogu mijenjati iz tehničkih i praktičnih razloga. Korisnička imena materijalizirana su na previše mjesta: u bazama podataka, izvozima, zapisnicima i umovima ljudi. Kapitalizaciju možete prilagoditi jednom.</string>
<string name="uniqueTrophies">Jedinstveni trofeji</string>
<string name="ownerUniqueTrophies">Taj trofej jedinstven je u povijesti Lichess-a. Nitko drugi osim %1$s ga nikad neće imati.</string>
<string name="wayOfBerserkExplanation">Da bi ga dobio, hiimgosu je izazvao sebe na berserk i pobijedio u 100%% igara %s.</string>
@ -91,4 +102,42 @@ Nemojte tražiti LM titulu.</string>
<string name="goldenZeeExplanation">ZugAddict je emitirao i posljednjih 2 sata je pokušavao poraziti A.I. razine 8 u igri 1+0, ali bez uspjeha. Thibault mu je rekao da će dobiti jedinstveni trofej ako to uspješno učini u emitiranju. Sat vremena kasnije razbio je Stockfish, a obećanje je bilo ispunjeno.</string>
<string name="lichessRatings">Lichess rajgovi</string>
<string name="whichRatingSystemUsedByLichess">Kakav sistem rangiranja koristi Lichess?</string>
<string name="ratingSystemUsedByLichess">Ocjene se izračunavaju pomoću metode ocjenjivanja Glicko-2, koju je razvio Mark Glickman. Ovo je vrlo popularna metoda ocjenjivanja, a koristi je značajan broj šahovskih organizacija (FIDE je značajan kontra-primjer, jer još uvijek koriste datirani sustav ocjenjivanja Elo).
U osnovi, ocjene Glicko koriste \"intervale pouzdanosti\" prilikom izračunavanja i predstavljanja vaše ocjene. Kada prvi put započnete koristiti web mjesto, vaša ocjena započinje s 1500 ± 700. 1500 predstavlja vašu ocjenu, a 700 predstavlja interval pouzdanosti.
U osnovi, sustav je 90% siguran da je vaša ocjena negdje između 800 i 2200. Nevjerojatno je neizvjestan. Zbog toga će se, kad igrač tek započinje, njegova ocjena vrlo dramatično promijeniti, potencijalno nekoliko stotina bodova odjednom. Ali nakon nekih igara protiv etabliranih igrača interval povjerenja će se suziti, a količina osvojenih / izgubljenih bodova nakon svake igre smanjit će se.
Još jedna stvar koju treba napomenuti jest da će se s vremenom interval pouzdanosti povećavati. To vam omogućuje brže osvajanje / gubljenje bodova kako biste se podudarali s bilo kakvim promjenama u razini vještina tijekom tog vremena.</string>
<string name="whatIsProvisionalRating">Zašto se znak upitnik (?) nalazi pokraj mog rejtinga?</string>
<string name="provisionalRatingExplanation">Upitnik znači da je vaš rejting privremen. Razlozi uključuju:</string>
<string name="notPlayedEnoughRatedGamesAgainstX">Igrač još nije završio dovoljno ocijenjene igre protiv %1$s u ocijenjenim partijama.</string>
<string name="similarOpponents">podjednaki protivnici</string>
<string name="notPlayedRecently">Igrač nije dugo igrao. Ovisno o broju igara koje ste igrali, možda će trebati oko godinu dana neaktivnosti da bi vaša ocjena ponovno postala privremena.</string>
<string name="ratingDeviationMorethanOneHundredTen">Konkretno, to znači da je odstupanje Glicko-2 veće od 110. Odstupanje je razina povjerenja koji sustav ima u ocjenu. Što je niže odstupanje, to je ocjena stabilnija.</string>
<string name="howDoLeaderoardsWork">Kako funkcioniraju titule i ljestvice poretka?</string>
<string name="inOrderToAppearsYouMust">Da biste došli na %1$s, moraš:</string>
<string name="ratingLeaderboards">ljestvica poretka</string>
<string name="havePlayedMoreThanThirtyGamesInThatRating">odigrati najmanje 30 ocijenjenih partija u određenom rejtingu</string>
<string name="havePlayedARatedGameAtLeastOneWeekAgo">odigrati ocijenjenu igru ne stariju od tjedan dana,</string>
<string name="ratingDeviationLowerThanXinChessYinVariants">imaju ocjenu odstupanja nižu od %1$s, u standardnom šahu, i nižu od %2$s u varijantama,</string>
<string name="beInTopTen">biti u top 10 u određenom rejtingu.</string>
<string name="secondRequirementToStopOldPlayersTrustingLeaderboards">Drugi je uvjet da igrači koji više ne koriste svoje račune prestanu popunjavati ploče s rezultatima.</string>
<string name="whyAreRatingHigher">Zašto su rejtinzi veći u usporedbi s drugim web mjestima i organizacijama poput FIDE, USCF i ICC?</string>
<string name="whyAreRatingHigherExplanation">Najbolje je ne smatrati ocjene apsolutnim brojevima ili ih uspoređivati s drugim organizacijama. Različite organizacije imaju različite razine igrača, različite sustave ocjenjivanja (Elo, Glicko, Glicko-2 ili izmijenjena verzija prethodno spomenutog). Ovi čimbenici mogu drastično utjecati na apsolutne brojke (ocjene).
Najbolje je da o ocjenama razmišljate kao o \"relativnim\" brojkama (za razliku od \"apsolutnih\"): U grupi igrača, njihove relativne razlike u ocjenama pomoći će vam da procijenite tko će i koliko često pobjeđivati / izvlačiti / gubiti. Reći \"imam ocjenu X\" ne znači ništa, osim ako postoje drugi igrači s kojima se ta ocjena može usporediti.</string>
<string name="howToHideRatingWhilePlaying">Kako sakriti rejtinge dok traju partije?</string>
<string name="enableZenMode">Omogućite Zen-način u %1$s ili pritiskom na %2$s tijekom igre.</string>
<string name="displayPreferences">prikaži postavke</string>
<string name="connexionLostCanIGetMyRatingBack">Izgubio sam igru zbog prekida ili slabe veze. Mogu li dobiti svoje bodove nazad?</string>
<string name="weCannotDoThatEvenIfItIsServerSideButThatsRare">Nažalost, ne možemo vratiti bodove za partije izgubljene zbog kašnjenja ili prekida veze, bez obzira je li problem bio na vašem ili na našem kraju. Ovo drugo je vrlo rijetko. Također imajte na umu da kada se Lichess ponovno pokrene i izgubite na vrijeme zbog toga, prekidamo igru kako bismo spriječili nepravedan gubitak.</string>
<string name="howToThreeDots">Kako...</string>
<string name="enableDisableNotificationPopUps">Uključiti ili isključiti notifikacije?</string>
<string name="viewSiteInformationPopUp">Pogledajte skočni prozor s informacijama o web mjestu</string>
<string name="lichessCanOptionnalySendPopUps">Lichess može po želji slati skočne obavijesti, na primjer kada ste na redu vi ili ste primili privatnu poruku.
Kliknite ikonu lokota pored adrese lichess.org na URL traci vašeg preglednika.
Zatim odaberite želite li dopustiti ili blokirati obavijesti od strane Lichess-a.</string>
</resources>

View File

@ -113,13 +113,13 @@ Sjå meir om dette trekket i %3$s for å få litt øving med det.</string>
<string name="provisionalRatingExplanation">Spørjeteiknet tyder at ratinga er mellombels. Grunnar til dette kan vere:</string>
<string name="notPlayedEnoughRatedGamesAgainstX">Spelaren har så langt ikkje fullførd tilstrekkeleg mange rata parti mot %1$s i ratingkategorien.</string>
<string name="similarOpponents">motspelarar av tilsvarande spelestyrke</string>
<string name="notPlayedRecently">Spelaren har ikkje spela tilstrekkeleg mange nylege parti. Avhengig av talet på parti du har spelt kan du etter omlag eit års inaktivitet få mellombels rating igjen.</string>
<string name="notPlayedRecently">Spelaren har ikkje spelt tilstrekkeleg mange nylege parti. Avhengig av talet på parti du har spela kan du etter omlag eit års inaktivitet få mellombels rating igjen.</string>
<string name="ratingDeviationMorethanOneHundredTen">Det inneber at Glicko-2-avviket er større enn 110. Avviket er eit mål på den tiltrua systemet har til ratingtalet. Desto lågare avvik, desto meir stabil er ei rating.</string>
<string name="howDoLeaderoardsWork">Korleis fungerer rangeringar og leiartavler?</string>
<string name="inOrderToAppearsYouMust">For å bli ført opp på %1$s må du:</string>
<string name="ratingLeaderboards">leiartavler for rating:</string>
<string name="havePlayedMoreThanThirtyGamesInThatRating">har spelt minst 30 rata parti under ei gjeven rating,</string>
<string name="havePlayedARatedGameAtLeastOneWeekAgo">har spelt eit rata parti sist veke for denne ratinga,</string>
<string name="havePlayedMoreThanThirtyGamesInThatRating">har spelt minst 30 rata parti i ein gjeven ratingkategori,</string>
<string name="havePlayedARatedGameAtLeastOneWeekAgo">har spelt eit rata parti i denne ratingkategorien sist veke,</string>
<string name="ratingDeviationLowerThanXinChessYinVariants">ha eit ratingsavvik lågare enn %1$s, i standardsjakk og lågare enn %2$s i variantar,</string>
<string name="beInTopTen">vere på topp ti i denne ratingskategorien.</string>
<string name="secondRequirementToStopOldPlayersTrustingLeaderboards">Det andre kravet er utforma slik at spelarar som ikkje lengre brukar kontoen fell ut av leiartavlene.</string>

View File

@ -15,11 +15,11 @@
<string name="weAreNonProfit">Somos una organización sin ánimo de lucro porque creemos que todos deberíamos tener acceso a una plataforma de ajedrez de primera clase y gratuita.</string>
<string name="weRelyOnSupport">Lo hacemos posible gracias al apoyo de gente como tú. Si te gusta Lichess, por favor ¡considera apoyarnos donando y convirtiéndote en patrón!</string>
<string name="lifetime">De por vida</string>
<string name="payLifetimeOnce">Paga %s una vez. ¡Sé un Patrón de la Lichess para siempre!</string>
<string name="payLifetimeOnce">Paga %s una vez. ¡Sé un patrón de Lichess para siempre!</string>
<string name="lifetimePatron">Patrón de Lichess de por vida</string>
<string name="makeExtraDonation">¿Hacer una donación adicional?</string>
<string name="monthly">Mensual</string>
<string name="recurringBilling">Facturación recurrente, renovando sus alas de Patrón cada mes.</string>
<string name="recurringBilling">Facturación recurrente, renovando tus alas de patrón cada mes.</string>
<string name="onetime">Una vez</string>
<string name="singleDonation">Una sola donación que te otorga las alas de patrón durante un mes.</string>
<string name="otherAmount">Otro</string>
@ -49,7 +49,7 @@ Sin embargo, los patrones obtienen derecho a presumir de su nuevo icono de perfi
<item quantity="one">Patrón de Lichess por un mes</item>
<item quantity="other">Patrón de Lichess por %s meses</item>
</plurals>
<string name="youSupportWith">Soportas lichess.org con %s al mes.</string>
<string name="youSupportWith">Apoyas a lichess.org con %s al mes.</string>
<string name="tyvm">¡Muchas gracias por tu apoyo! ¡Eres genial!</string>
<string name="currentStatus">Estado actual</string>
<string name="nextPayment">Próximo pago</string>
@ -57,17 +57,17 @@ Sin embargo, los patrones obtienen derecho a presumir de su nuevo icono de perfi
<string name="makeAdditionalDonation">Haz una donación adicional ahora</string>
<string name="update">Actualizar</string>
<string name="changeMonthlyAmount">Cambiar la cantidad mensual (%s)</string>
<string name="cancelSupport">cancela tu soporte</string>
<string name="cancelSupport">cancela tu apoyo</string>
<string name="xOrY">%1$s o %2$s</string>
<string name="decideHowMuch">Decide cuanto vale Lichess para ti:</string>
<string name="stopPayments">Retira tu tarjeta de crédito y detén los pagos:</string>
<string name="noLongerSupport">Ya no soporta Lichess</string>
<string name="noLongerSupport">Ya no apoyas a Lichess</string>
<string name="paymentHistory">Historial de pagos</string>
<string name="paid">Pagado</string>
<string name="viewOthers">Ver otros Patrones de Lichess</string>
<string name="date">Fecha</string>
<string name="amount">Cantidad</string>
<string name="transactionCompleted">La transacción ha sido completada, y un recibo de tu donación ha sido enviado por correo electrónico.</string>
<string name="transactionCompleted">La transacción ha sido completada y el recibo de la donación se te ha enviado por correo electrónico.</string>
<string name="permanentPatron">Ahora tienes una cuenta de Patrón permanente.</string>
<string name="checkOutProfile">¡Échale un vistazo a tu página de perfil!</string>
<string name="nowLifetime">¡Ahora eres un Patrón de Lichess de por vida!</string>

View File

@ -9,9 +9,9 @@
<string name="freeChess">Gratis schaken voor iedereen, voor altijd!</string>
<string name="noAdsNoSubs">Geen advertenties, geen abonnementen; maar open-source en passie.</string>
<string name="thankYou">Hartelijk dank voor je donatie!</string>
<string name="youHaveLifetime">Je hebt een levenslang Patroon-account. Dat is super geweldig!</string>
<string name="youHaveLifetime">Je hebt een levenslang Patroon-account. Dat is geweldig!</string>
<string name="patronUntil">Je hebt een Patroon-account tot %s.</string>
<string name="ifNotRenewed">Indien niet vernieuwd, wordt je naar het standaard account teruggezet.</string>
<string name="ifNotRenewed">Indien niet vernieuwd, word je naar het standaard account teruggezet.</string>
<string name="weAreNonProfit">Wij zijn een organisatie zonder winstoogmerk omdat wij van mening zijn dat iedereen toegang moet hebben tot een gratis schaakplatform van wereldklasse.</string>
<string name="weRelyOnSupport">We rekenen op de steun van mensen zoals u om dit mogelijk te maken. Als het gebruik van Lichess u bevalt, overweeg dan alstublieft om ons te steunen door te doneren en een Patroon te worden!</string>
<string name="lifetime">Levenslang</string>
@ -19,9 +19,9 @@
<string name="lifetimePatron">Levenslange Lichess Patroon</string>
<string name="makeExtraDonation">Een extra donatie maken?</string>
<string name="monthly">Maandelijks</string>
<string name="recurringBilling">Terugkerende betaling, verlengt je beschermvleugels elke maand.</string>
<string name="recurringBilling">Terugkerende betaling, verlengt je Patroonvleugels elke maand.</string>
<string name="onetime">Eenmalig</string>
<string name="singleDonation">Een enkele donatie die u de Beschermvleugels geeft voor één maand.</string>
<string name="singleDonation">Een enkele donatie die u de Patroonvleugels geeft voor één maand.</string>
<string name="otherAmount">Overige</string>
<string name="pleaseEnterAmount">Vul een USD bedrag in</string>
<string name="withCreditCard">Creditcard</string>
@ -32,16 +32,16 @@
<string name="serversAndDeveloper">Allereerst, krachtige servers.
Daarnaast betalen we een voltijds ontwikkelaar: %s, de oprichter van Lichess.</string>
<string name="costBreakdown">Zie de gedetailleerde kostenverdeling</string>
<string name="officialNonProfit">Is Lichess echt een organisatie zonder winstoogmerk?</string>
<string name="actOfCreation">Ja, hier is de akte van oprichting (in Franse taal)</string>
<string name="officialNonProfit">Is Lichess aantoonbaar een organisatie zonder winstoogmerk?</string>
<string name="actOfCreation">Ja, hier is de akte van oprichting (in het Frans)</string>
<string name="changeMonthlySupport">Kan ik mijn maandelijkse ondersteuning wijzigen of annuleren?</string>
<string name="changeOrContact">Ja, op elk gewenst moment vanaf deze pagina.
Of u kunt %s.</string>
<string name="contactSupport">lichess ondersteuning contacten</string>
<string name="contactSupport">contact opnemen met de Lichess helpdesk</string>
<string name="otherMethods">Andere vormen van donatie?</string>
<string name="bankTransfers">We accepteren ook bankoverschrijvingen</string>
<string name="bitcoin">En hier is ons bitcoin adres: %s</string>
<string name="patronFeatures">Zijn sommige functies gereserveerd voor Patronen?</string>
<string name="bitcoin">En hier is ons bitcoinadres: %s</string>
<string name="patronFeatures">Zijn sommige functies enkel beschikbaar voor Patronen?</string>
<string name="noPatronFeatures">Nee, omdat Lichess altijd gratis is, en voor iedereen. Dat is een belofte.
Het enige verschil? Patronen krijgen een cool nieuw profielpictogram als waardering.</string>
<string name="featuresComparison">Zie de gedetailleerde functievergelijking</string>
@ -62,7 +62,7 @@ Het enige verschil? Patronen krijgen een cool nieuw profielpictogram als waarder
<string name="decideHowMuch">Beslis wat Lichess voor jou waard is:</string>
<string name="stopPayments">Trek je creditcard terug en stop de betalingen:</string>
<string name="noLongerSupport">Lichess wordt niet langer gesteund</string>
<string name="paymentHistory">Betaalhistorie</string>
<string name="paymentHistory">Betaalgeschiedenis</string>
<string name="paid">Betaald</string>
<string name="viewOthers">Andere Lichess Patronen bekijken</string>
<string name="date">Datum</string>

View File

@ -53,6 +53,7 @@
<string name="nextPayment">Следећа уплата</string>
<string name="makeAdditionalDonation">Направи додатну донацију сада</string>
<string name="changeMonthlyAmount">Промени месечну вредност (%s)</string>
<string name="cancelSupport">откажи твоју пордшку</string>
<string name="xOrY">%1$s или %2$s</string>
<string name="decideHowMuch">Одлучи колико Личес теби вреди:</string>
<string name="stopPayments">Повуци своју кредитну картицу и обустави наплате:</string>

View File

@ -16,7 +16,7 @@
<string name="victories">Sigrar</string>
<string name="defeats">Tap</string>
<string name="disconnections">Fråkoplingar</string>
<string name="notEnoughGames">For få spelte parti</string>
<string name="notEnoughGames">For få spela parti</string>
<string name="highestRating">Høgaste rating: %s</string>
<string name="lowestRating">Lågaste rating: %s</string>
<string name="fromXToY">frå %1$s til %2$s</string>
@ -26,7 +26,7 @@
<string name="currentStreak">Noverande rekke: %s</string>
<string name="bestRated">Beste sigrar</string>
<string name="worstRated">Verste tap</string>
<string name="gamesInARow">Parti spelt på rad</string>
<string name="gamesInARow">Parti spela på rad</string>
<string name="lessThanOneHour">Mindre enn ein time mellom partia</string>
<string name="maxTimePlaying">Lengste speletid</string>
<string name="now">no</string>

View File

@ -6,7 +6,7 @@
<string name="materialDifference">Material fərqi</string>
<string name="boardHighlights">Lövhə xəbərdarlıqları (son gediş və şah vermə)</string>
<string name="pieceDestinations">Fiqurun gedə biləcəyi xanalar (qanuni gediş və öngedişlər)</string>
<string name="boardCoordinates">Taxta kordinatları</string>
<string name="boardCoordinates">Lövhə koordinantları (A-H, 1-8)</string>
<string name="moveListWhilePlaying">Oyun zamanı notasiyanı göstər</string>
<string name="pgnPieceNotation">Şahmat notasiyası</string>
<string name="chessPieceSymbol">Şahmat fiqur simvolu</string>
@ -15,10 +15,10 @@
<string name="displayBoardResizeHandle">Lövhə ölçüləndirmə tutacağını göstər</string>
<string name="onlyOnInitialPosition">Yalnız başlanğıc pozisiyada</string>
<string name="blindfoldChess">Gözübağlı şahmat (görünməz fiqurlar)</string>
<string name="chessClock">Şahmat saat</string>
<string name="tenthsOfSeconds">Son 10 saniyə</string>
<string name="whenTimeRemainingLessThanTenSeconds" comment="whenTimeRemainingLessThanTenSeconds&#10;&#10;The &amp;lt; symbol is not required (you can write it as a word), just do NOT use &lt; in its place.&#10;&#10;Technical information: &lt; is a reserved character in HTML, which is why it cannot be used.">Qalan zaman &lt; 10 saniyə</string>
<string name="horizontalGreenProgressBars">Yaşıl üfüqi tərəqqi bar</string>
<string name="chessClock">Şahmat saatı</string>
<string name="tenthsOfSeconds">Saniyənin onda biri</string>
<string name="whenTimeRemainingLessThanTenSeconds" comment="whenTimeRemainingLessThanTenSeconds&#10;&#10;The &amp;lt; symbol is not required (you can write it as a word), just do NOT use &lt; in its place.&#10;&#10;Technical information: &lt; is a reserved character in HTML, which is why it cannot be used.">10 saniyədən az vaxt qalanda</string>
<string name="horizontalGreenProgressBars">Üfüqi yaşıl inkişaf sətri</string>
<string name="soundWhenTimeGetsCritical">Zaman azaldığında səslə xəbərdarlıq</string>
<string name="giveMoreTime">Vaxt ver</string>
<string name="gameBehavior" comment="gameBehavior&#10;&#10;In the user settings page, &quot;Game behavior&quot; is the title of the tab for configuring how the player can interact with the game.">Oyun seçimləri</string>
@ -27,12 +27,12 @@
<string name="dragPiece">Fiquru sürüşdürərək</string>
<string name="bothClicksAndDrag">Hər ikisi</string>
<string name="premovesPlayingDuringOpponentTurn">Öngedişlər (oyun növbəsi rəqibdə olarkən oyna)</string>
<string name="takebacksWithOpponentApproval">Geri Alma (rəqib razılığı ilə)</string>
<string name="takebacksWithOpponentApproval">Geri qaytarma (rəqib razılığı ilə)</string>
<string name="inCasualGamesOnly">Yalnız reytinqsiz oyunlarda</string>
<string name="promoteToQueenAutomatically">Avtomatik Vəzirə çıx</string>
<string name="whenPremoving">Ön hücum edərkən</string>
<string name="whenPremoving">Ön gediş edərkən</string>
<string name="claimDrawOnThreefoldRepetitionAutomatically">Üç dəfə təkrarlanan oyunda avtomatik heç-heçə təklif et</string>
<string name="whenTimeRemainingLessThanThirtySeconds">Qalan zaman &lt; 30 saniyə</string>
<string name="whenTimeRemainingLessThanThirtySeconds">Qalan vaxt 30 saniyədən az olanda</string>
<string name="moveConfirmation">Gediş təsdiqi</string>
<string name="inCorrespondenceGames">Yazışmalı oyunlar</string>
<string name="correspondenceAndUnlimited">Yazışmalı və vaxtsız</string>
@ -43,5 +43,5 @@
<string name="inputMovesWithTheKeyboard">Gedişləri klaviatura ilə daxil et</string>
<string name="snapArrowsToValidMoves" comment="snapArrowsToValidMoves&#10;&#10;The 'arrows' are for quick annotations you can do on the board, by holding right mouse button. With this setting enabled, it means the arrows will align themselves to places were pieces can move.">Etibarlı gedişlər üçün oxları göstər</string>
<string name="sayGgWpAfterLosingOrDrawing" comment="sayGgWpAfterLosingOrDrawing&#10;&#10;When enabled, this setting will automatically send 'Good game, well played' to your opponent if you are lose or draw the game. It's meant as a courtesy message.&#10;&#10;The message will be sent in ENGLISH.&#10;&#10;It is up to you how to deal with this. For example, you may want to put '(message will be sent in English)' in your translated text as one example. Or you can leave the actual English text and put a brief translation in your own language.">Məğlub olduqda və ya heç-heçə etdikdə \"Yaxşı oyun idi, yaxşı oynadın\" deyin</string>
<string name="yourPreferencesHaveBeenSaved">Seçimləriniz qeyd edildi.</string>
<string name="yourPreferencesHaveBeenSaved">Tərcihləriniz saxlanıldı.</string>
</resources>

View File

@ -11,13 +11,13 @@
<string name="pgnPieceNotation">Notación de los movimientos</string>
<string name="chessPieceSymbol">Símbolo de la pieza</string>
<string name="pgnLetter">Inicial (en inglés) de la pieza (K, Q, R, B, N)</string>
<string name="zenMode">Modo Zen</string>
<string name="zenMode" comment="zenMode&#10;&#10;This is not the religious meaning. Turning this option on takes away make elements of the user interface.&#10;&#10;Can also translate as 'Focus mode' as one example.">Modo Zen</string>
<string name="displayBoardResizeHandle">Mostrar el control de tamaño del tablero</string>
<string name="onlyOnInitialPosition">Sólo en posición inicial</string>
<string name="blindfoldChess">Ajedrez a ciegas (piezas invisibles)</string>
<string name="chessClock">Reloj de ajedrez</string>
<string name="tenthsOfSeconds">Décimas de segundo</string>
<string name="whenTimeRemainingLessThanTenSeconds">Cuando queden menos de 10 segundos</string>
<string name="whenTimeRemainingLessThanTenSeconds" comment="whenTimeRemainingLessThanTenSeconds&#10;&#10;The &amp;lt; symbol is not required (you can write it as a word), just do NOT use &lt; in its place.&#10;&#10;Technical information: &lt; is a reserved character in HTML, which is why it cannot be used.">Cuando queden menos de 10 segundos</string>
<string name="horizontalGreenProgressBars">Barras de progreso horizontales verdes</string>
<string name="soundWhenTimeGetsCritical">Alerta cuando reste poco tiempo</string>
<string name="giveMoreTime">Dar más tiempo</string>

View File

@ -11,17 +11,17 @@
<string name="pgnPieceNotation">Oznaka poteza</string>
<string name="chessPieceSymbol">Simbol šahovske figure</string>
<string name="pgnLetter">Slovo (K, Q, R, B, N)</string>
<string name="zenMode">Zen način</string>
<string name="zenMode" comment="zenMode&#10;&#10;This is not the religious meaning. Turning this option on takes away make elements of the user interface.&#10;&#10;Can also translate as 'Focus mode' as one example.">Zen način</string>
<string name="displayBoardResizeHandle">Prikaži ručicu za promjenu veličine ploče</string>
<string name="onlyOnInitialPosition">Samo na početku partije</string>
<string name="blindfoldChess">Šah na slijepo (nevidljive figure)</string>
<string name="chessClock">Sat</string>
<string name="tenthsOfSeconds">Desetinke sekundi</string>
<string name="whenTimeRemainingLessThanTenSeconds">Kad je ostalo manje od 10 sekundi</string>
<string name="whenTimeRemainingLessThanTenSeconds" comment="whenTimeRemainingLessThanTenSeconds&#10;&#10;The &amp;lt; symbol is not required (you can write it as a word), just do NOT use &lt; in its place.&#10;&#10;Technical information: &lt; is a reserved character in HTML, which is why it cannot be used.">Kad je ostalo manje od 10 sekundi</string>
<string name="horizontalGreenProgressBars">Vodoravna zelena linija napretka</string>
<string name="soundWhenTimeGetsCritical">Zvuk kada je vrijeme kritično</string>
<string name="giveMoreTime">Daj više vremena</string>
<string name="gameBehavior">Način igre</string>
<string name="gameBehavior" comment="gameBehavior&#10;&#10;In the user settings page, &quot;Game behavior&quot; is the title of the tab for configuring how the player can interact with the game.">Način igre</string>
<string name="howDoYouMovePieces">Kako želiš pomicati figure?</string>
<string name="clickTwoSquares">Klikom na dva polja</string>
<string name="dragPiece">Povlačenjem figure</string>
@ -41,5 +41,7 @@
<string name="castleByMovingTwoSquares">Pomakni kralja dvije kocke</string>
<string name="castleByMovingOntoTheRook">Pomakni kralja na kulu</string>
<string name="inputMovesWithTheKeyboard">Omogući unošenje poteza tipkovnicom</string>
<string name="snapArrowsToValidMoves" comment="snapArrowsToValidMoves&#10;&#10;The 'arrows' are for quick annotations you can do on the board, by holding right mouse button. With this setting enabled, it means the arrows will align themselves to places were pieces can move.">Crtaj strelice za planiranje budućih poteza</string>
<string name="sayGgWpAfterLosingOrDrawing" comment="sayGgWpAfterLosingOrDrawing&#10;&#10;When enabled, this setting will automatically send 'Good game, well played' to your opponent if you are lose or draw the game. It's meant as a courtesy message.&#10;&#10;The message will be sent in ENGLISH.&#10;&#10;It is up to you how to deal with this. For example, you may want to put '(message will be sent in English)' in your translated text as one example. Or you can leave the actual English text and put a brief translation in your own language.">Reci \"Dobra partija, odlićno odigrano\" kad izgubiš ili odigraš remi</string>
<string name="yourPreferencesHaveBeenSaved">Tvoje promjene su spremljene.</string>
</resources>

View File

@ -11,17 +11,17 @@
<string name="pgnPieceNotation">Catatan langkah</string>
<string name="chessPieceSymbol">Simbol bidak catur</string>
<string name="pgnLetter">Huruf (K, Q, R, B, N)</string>
<string name="zenMode">Moda Zen</string>
<string name="zenMode" comment="zenMode&#10;&#10;This is not the religious meaning. Turning this option on takes away make elements of the user interface.&#10;&#10;Can also translate as 'Focus mode' as one example.">Moda Zen</string>
<string name="displayBoardResizeHandle">Tampilkan pengubah ukuran papan catur</string>
<string name="onlyOnInitialPosition">Hanya di posisi awal</string>
<string name="blindfoldChess">Catur buta (buah catur disembunyikan)</string>
<string name="chessClock">Jam catur</string>
<string name="tenthsOfSeconds">Sepersepuluh detik</string>
<string name="whenTimeRemainingLessThanTenSeconds">Ketika waktu tersisa &lt; 10 detik</string>
<string name="whenTimeRemainingLessThanTenSeconds" comment="whenTimeRemainingLessThanTenSeconds&#10;&#10;The &amp;lt; symbol is not required (you can write it as a word), just do NOT use &lt; in its place.&#10;&#10;Technical information: &lt; is a reserved character in HTML, which is why it cannot be used.">Ketika waktu tersisa &lt; 10 detik</string>
<string name="horizontalGreenProgressBars">Indikator horisontal perkembangan warna hijau</string>
<string name="soundWhenTimeGetsCritical">Bersuara ketika waktu hampir habis</string>
<string name="giveMoreTime">Berikan waktu lebih</string>
<string name="gameBehavior">Lingkungan permainan</string>
<string name="gameBehavior" comment="gameBehavior&#10;&#10;In the user settings page, &quot;Game behavior&quot; is the title of the tab for configuring how the player can interact with the game.">Lingkungan permainan</string>
<string name="howDoYouMovePieces">Bagaimana Anda melangkahkan bidak?</string>
<string name="clickTwoSquares">Klik dua kotak</string>
<string name="dragPiece">Seret sebuah bidak</string>
@ -41,5 +41,6 @@
<string name="castleByMovingTwoSquares">Memindahkan raja dua kotak</string>
<string name="castleByMovingOntoTheRook">Memindahkan raja ke benteng</string>
<string name="inputMovesWithTheKeyboard">Melangkah dengan menggunakan keyboard</string>
<string name="sayGgWpAfterLosingOrDrawing" comment="sayGgWpAfterLosingOrDrawing&#10;&#10;When enabled, this setting will automatically send 'Good game, well played' to your opponent if you are lose or draw the game. It's meant as a courtesy message.&#10;&#10;The message will be sent in ENGLISH.&#10;&#10;It is up to you how to deal with this. For example, you may want to put '(message will be sent in English)' in your translated text as one example. Or you can leave the actual English text and put a brief translation in your own language.">Ucapkan \"Good game, well played\" apabila kalah atau seri</string>
<string name="yourPreferencesHaveBeenSaved">Preferensi telah disimpan.</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More