From 4efa404780701feb5d2935992ceb099ab22da373 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 10:13:15 +0100 Subject: [PATCH 001/103] New Crowdin updates (#10655) * New translations: site.xml (Breton) * New translations: patron.xml (Albanian) * New translations: faq.xml (Romanian) * New translations: faq.xml (Slovak) * New translations: faq.xml (French) * New translations: faq.xml (Afrikaans) * New translations: patron.xml (Lithuanian) * New translations: class.xml (Lithuanian) * New translations: faq.xml (Lithuanian) * New translations: faq.xml (Latvian) * New translations: faq.xml (Finnish) * New translations: faq.xml (Basque) * New translations: faq.xml (Polish) * New translations: faq.xml (Norwegian Bokmal) * New translations: site.xml (Uzbek) * New translations: faq.xml (Dutch) * New translations: coordinates.xml (Armenian) * New translations: site.xml (Armenian) * New translations: learn.xml (Armenian) * New translations: coordinates.xml (Armenian) * New translations: faq.xml (Armenian) * New translations: puzzle.xml (Armenian) * New translations: storm.xml (Armenian) * New translations: class.xml (German) * New translations: faq.xml (Greek) --- translation/dest/class/de-DE.xml | 2 +- translation/dest/class/lt-LT.xml | 19 +++++++++++++++++++ translation/dest/coordinates/hy-AM.xml | 8 ++++---- translation/dest/faq/af-ZA.xml | 2 ++ translation/dest/faq/el-GR.xml | 2 ++ translation/dest/faq/eu-ES.xml | 2 ++ translation/dest/faq/fi-FI.xml | 2 ++ translation/dest/faq/fr-FR.xml | 4 ++-- translation/dest/faq/hy-AM.xml | 1 + translation/dest/faq/lt-LT.xml | 2 ++ translation/dest/faq/lv-LV.xml | 2 ++ translation/dest/faq/nb-NO.xml | 2 ++ translation/dest/faq/nl-NL.xml | 3 ++- translation/dest/faq/pl-PL.xml | 4 ++-- translation/dest/faq/ro-RO.xml | 4 ++-- translation/dest/faq/sk-SK.xml | 2 ++ translation/dest/learn/hy-AM.xml | 1 + translation/dest/patron/lt-LT.xml | 1 + translation/dest/patron/sq-AL.xml | 3 ++- translation/dest/puzzle/hy-AM.xml | 4 +++- translation/dest/site/br-FR.xml | 4 ++++ translation/dest/site/hy-AM.xml | 2 +- translation/dest/site/uz-UZ.xml | 7 +++++++ translation/dest/storm/hy-AM.xml | 2 +- 24 files changed, 69 insertions(+), 16 deletions(-) diff --git a/translation/dest/class/de-DE.xml b/translation/dest/class/de-DE.xml index 854770a58bb50..c53a2746f6b7a 100644 --- a/translation/dest/class/de-DE.xml +++ b/translation/dest/class/de-DE.xml @@ -48,7 +48,7 @@ Passwort: %3$s Verwende stattdessen das Einladungsformular, falls sie bereits eines besitzen. Erstelle nur Konten für echte Schüler. Verwende dies nicht, um mehrere Konten für dich selbst zu erstellen. Du würdest gebannt werden. Lichess Benutzername - Erstelle einen neuen Benutzernamen + Generiere einen neuen Benutzernamen Willkommen in deiner Klasse: %s. Hier ist der Link zum Zugriff auf die Klasse. Du bist eingeladen, der Klasse \"%s\" als Schüler beizutreten. diff --git a/translation/dest/class/lt-LT.xml b/translation/dest/class/lt-LT.xml index 1985d19bff385..1a2bb54f447e5 100644 --- a/translation/dest/class/lt-LT.xml +++ b/translation/dest/class/lt-LT.xml @@ -12,6 +12,7 @@ Mokytojai: %s Nauja klasė Uždaryti klasę + Pašalinta %s Atidaryti vėl Pašalinti mokinį Pašalinti @@ -94,6 +95,9 @@ Slaptažodis: %3$s %1$s per paskutines %2$s Laimėjimo dažnumas Neprieinama + Apžvalga + Naujienos + Klasės naujienos Keisti naujienas Pranešti visiems mokiniams Kol kas nieko. @@ -101,4 +105,19 @@ Slaptažodis: %3$s Paskutines naujienas pridėkite viršuje. Netrinkite esamų naujienų. Atskirkite naujienas su --- Taip bus parodyta horizontali linija. + Pakviesti + Jūs buvote pakviestas(-a) %s. + Jūs priėmėte šį pakvietimą. + Jūs atsisakėte šio pakvietimo. + arba + Sukurti kelias Lichess paskyras iš karto + Norėdami sukurti kelias Lichess paskyras iš mokinių vardų galite %s. + naudoti šią formą + Norime pažymėti, kad klasės gali turėti iki %1$s mokinių. Norėdami valdyti daugiau mokinių, %2$s. + sukurkite daugiau klasių + Mokinių tikri vardai, vienas per eilutę + %s yra klasės mokinys + Pakvietimas buvo išsiųstas %s + %s jau turi laukiantį pakvietimą + %1$s yra vaiko paskyra ir negali priimti jūsų žinutės. Turite jiems duoti pakvietimo adresą kitu būdu: %2$s diff --git a/translation/dest/coordinates/hy-AM.xml b/translation/dest/coordinates/hy-AM.xml index 2dfc0255ec7df..0fe24d490bf65 100644 --- a/translation/dest/coordinates/hy-AM.xml +++ b/translation/dest/coordinates/hy-AM.xml @@ -5,9 +5,9 @@ Միջին հաշիվը սպիտակներով՝ %s Միջին հաշիվը սևերով՝ %s Շախմատի կոորդինատները իմանալը շատ կարևոր հմտություն է: - Շախմատի դասընթացների ժամանակ այն լայնորեն կիրառվում է: - Հեշտանում է ընկերների հետ խոսելը, երբ երկուսն էլ հասկանում են <<շախմատի լեզուն>>: - Դուք կարող եք ավելի արդյունավետ վերլուծել պարտիաները, եթե դրա համար պետք չի ման գալ նոր անուններ: - Տախտակի վրա կհայտնվի քառակուսի, որի վրա գրված կլինի դաշտի անունը և Դուք պետք է ճիշտ սեղմեք տվյալ դաշտի վրա: Դրա համար Դուք ունեք 30 վայրկյան, որպեսզի գտնեք շատ դաշտեր: + Շախմատային դասընթացներում և խնդիրներում լայնորեն կիրառվում է նոտագրությունը: + Հեշտանում է ընկերների հետ խոսելը, երբ երկուսն էլ հասկանում են «շախմատի լեզուն»: + Պարտիաներ վերլուծելն ավելի արդյունավետ է, եթե կոորդինատներով դաշտերը փնտելու վրա ժամանակ չի ծախսվում: + Երբ հայտնվի դաշտի անունը, պետք է սեղմեք խաղատախտակի անհրաժեշտ դաշտը։ Առավել շատ դաշտեր գտնելու համար ունեք 30 վայրկյան։ Սկսել ուսուցումը diff --git a/translation/dest/faq/af-ZA.xml b/translation/dest/faq/af-ZA.xml index 59e1395debb80..e9d44d0d12f72 100644 --- a/translation/dest/faq/af-ZA.xml +++ b/translation/dest/faq/af-ZA.xml @@ -25,6 +25,8 @@ Hoe kan ek moderator word? Dit is nie moontlik om aansoek te doen om moderator te word nie. As ons iemand sien wat volgens ons goed sal wees as moderator, sal ons hulle direk kontak. Is korrespondensie anders as normale skaak? + Lees asb. ons %s vir meer inligting + bladsy oor regverdige spel Op Lichess is die belangrikste verskil in reëls vir korrespondensie-skaak dat \'n openingsboek toegelaat word. Die gebruik van enjins is steeds verbode en sal daartoe gelei word dat dit vir enjinbystand gemerk word. Alhoewel ICCF die gebruik van enjins in korrespondensie toelaat, doen Lichess dit nie. Spel Hoe word daar besluit oor Bullet, Blitz en ander tydsbeheer? diff --git a/translation/dest/faq/el-GR.xml b/translation/dest/faq/el-GR.xml index 5e227e258b1d8..cc74d5b33c11e 100644 --- a/translation/dest/faq/el-GR.xml +++ b/translation/dest/faq/el-GR.xml @@ -25,6 +25,8 @@ Πώς μπορώ να γίνω διαχειριστής; Δεν μπορείτε να κάνετε αίτηση για να γίνετε διαχειριστής. Αν δούμε κάποιον που πιστεύουμε ότι θα ήταν καλός διαχειριστής θα επικοινωνήσουμε απευθείας μαζί τους. Είναι το σκάκι αλληλογραφίας διαφορετικό από το κανονικό σκάκι; + Για περισσότερες πληροφορίες, διαβάστε τη %s + σελίδα fair play Στο Lichess, η κύρια διαφορά στους κανόνες για το σκάκι αλληλογραφίας είναι ότι επιτρέπεται ένα opening book. Η χρήση μηχανών εξακολουθεί να απαγορεύεται και μπορεί να έχει ως αποτέλεσμα το κλείσιμο του λογαριασμού σας. Αν και το ICCF επιτρέπει τη χρήση μηχανών, το Lichess δεν το κάνει. Παιχνίδι Πώς αποφασίζεται ποιοι χρόνοι είναι τι (π.χ. Bullet, Blitz); diff --git a/translation/dest/faq/eu-ES.xml b/translation/dest/faq/eu-ES.xml index 5de59954daa00..b543452ff398b 100644 --- a/translation/dest/faq/eu-ES.xml +++ b/translation/dest/faq/eu-ES.xml @@ -25,6 +25,8 @@ Nola bihur naiteke moderatzaile? Ezin da moderatzaile izateko eskaerarik egin. Norbait moderatzaile izan daitekeela uste badugu zuzenean jarriko gara berarekin kontaktuan. Zein dira posta bidezko partidak eta xake arruntaren arteko desberdintasunak? + Informazio gehiagorako, irakurri gure %s + joko garbiari buruzko orria Lichessen posta bidezko xakearen arauen desberdintasun handiena, hasiera liburua erabili daitekeela da. Analisi-motoreak erabiltzea debekatuta dago eta laguntza erabiltzeagatik markatuko ditugu hori egiten duten jokalariak. Nahiz eta ICCFk analisi-motoreak erabiltzea uztean duen, Lichessek ez. Jokoa Nola erabakizen da zer diren Bullet, Blitz edo beste erritmo batzuk? diff --git a/translation/dest/faq/fi-FI.xml b/translation/dest/faq/fi-FI.xml index 76ad3f5ead4e9..247864a4746b3 100644 --- a/translation/dest/faq/fi-FI.xml +++ b/translation/dest/faq/fi-FI.xml @@ -25,6 +25,8 @@ Kuinka voin päästä moderaattoriksi? Moderaattoriksi ei voi hakea. Jos me huomaamme jonkun, joka meidän mielestämme olisi hyvä moderaattori, me otamme häneen suoraan yhteyttä. Onko kirjeshakki erilaista kuin tavallinen shakki? + Lisätietoja saat lukemalla %s + reilun pelin sivumme Lichessissä kirjeshakin sääntöjen suurin ero on se, että avauskirjojen käyttö on sallittu. Tietokoneanalyysi on kuitenkin kielletty, ja sen käyttö johtaa merkintään tietokoneavusta. Vaikka ICCF hyväksyy tietokoneanalyysin kirjeshakissa, Lichess ei hyväksy sitä. Pelaaminen Kuinka Bullet, Blitz ja muut aikakontrollit on määritelty? diff --git a/translation/dest/faq/fr-FR.xml b/translation/dest/faq/fr-FR.xml index cede2501b44fe..d7d3331de968b 100644 --- a/translation/dest/faq/fr-FR.xml +++ b/translation/dest/faq/fr-FR.xml @@ -25,8 +25,8 @@ Comment puis-je devenir modérateur ? Il n\'est pas possible de postuler pour devenir modérateur. Si nous rencontrons quelqu\'un qui nous semble être efficace comme modérateur, nous le contacterons directement. Les parties par correspondance sont-elle différentes de celles des échecs normaux ? - Pour plus d’information, lisez notre %s - page sur l\'esprit sportif + Pour plus d’informations, lisez notre %s + page sur l\'esprit sportif Sur Lichess, la principale différence entre les règles des échecs par correspondance est qu\'un livre d\'ouverture est autorisé. L\'utilisation de moteurs est toujours interdite et entraînera le signalement d\'une assistance moteur. Bien que l\'ICCF autorise l\'utilisation des moteurs dans la correspondance, ce n\'est pas le cas du Lichess. Règles du jeu et jouabilité Comment sont décidés les bullet, blitz et autres cadences ? diff --git a/translation/dest/faq/hy-AM.xml b/translation/dest/faq/hy-AM.xml index b72f9a1ed34a9..6d8a09aceb08e 100644 --- a/translation/dest/faq/hy-AM.xml +++ b/translation/dest/faq/hy-AM.xml @@ -21,6 +21,7 @@ Եթե ձեր մրցակիցը հաճախ է կասեցնում կամ լքում խաղը, նա ժամանակավորապես արգելափակվում է, ընդ որում՝ արգելափակման մասին իմանում է միայն նա։ Եթե արգելափակումից հետո նա շարունակում է իրեն պահել նույնկերպ, նա կրկին արգելափակվում է, բայց արդեն ավելի երկար ժամանակով։ Հետագայում նրա մասնակցային հաշիվը կարող է ամբողջովին արգելափակվել։ Ես կարո՞ղ եմ դառնալ մոդերատոր։ Մենք չենք ընդունում մոդերատոր դառնալու հայտեր։ Եթե մենք տեսնում ենք, որ ինչ-որ մեկը, մեր կարծիքով, կարող է դառնալ լավ մոդերատոր, նրա հետ կապվում ենք ինքներս։ + լավ բացատրություն Եռակի կրկնություն եռակի կրկնություն կարգավորել diff --git a/translation/dest/faq/lt-LT.xml b/translation/dest/faq/lt-LT.xml index 6c117344f8ef3..2de84d00fe0f1 100644 --- a/translation/dest/faq/lt-LT.xml +++ b/translation/dest/faq/lt-LT.xml @@ -24,6 +24,8 @@ Kaip galiu tapti moderatoriumi? Nėra įmanoma aplikuoti, norint tapti moderatoriumi. Jei pastebėsime ką nors, kas atrodys vertas būti geru moderatoriumi, mes su jais susisieksime tiesiogiai. Ar korespondencija skiriasi nuo įprastų šachmatų? + Norėdami sužinoti daugiau galite paskaityti mūsų %s + sąžiningo žaidimo puslapį Lichess pagrindinis skirtumas korespondencinių šachmatų taisyklėse yra, kad leidžiamos debiutų knygos. Variklių naudojimas vis dar draudžiamas ir galite būti pažymėti kaip sukčiaujantys kompiuteriu. Nors ICCF leidžia variklių naudojimą korespondenciniuose šachmatuose - Lichess ne. Žaidimas Kaip nusprendžiama laiko kontrolė kulkos, žaibo ir kituose žaidimuose? diff --git a/translation/dest/faq/lv-LV.xml b/translation/dest/faq/lv-LV.xml index 87c1d829c3e65..72d35f3bfc926 100644 --- a/translation/dest/faq/lv-LV.xml +++ b/translation/dest/faq/lv-LV.xml @@ -25,6 +25,8 @@ Kā varu kļūt par moderatoru? Nav iespējams pieteikties, lai kļūtu par moderatoru. Ja ieraudzīsim kādu, kas mūsuprāt būtu labs moderators, sazināsimies personīgi. Vai korespondencšahs atšķiras no parastā šaha? + Papildus informācijai, lūdzu lasiet mūsu %s + godīgas spēlēšanas lapu Vietnē Lichess galvenā atšķirība korespondencšaha noteikumos ir atļauja lietot atklātņu grāmatu. Datora palīdzība ir vēl joprojām aizliegta un novedīs pie atzīmes par datora palīdzības lietošanu. Kaut arī ICCF atļauj lietot datora palīdzību korespondencšahā, Lichess to aizliedz. Spēles apraksts Kā nosaka bullet, blica un citas laika kontroles? diff --git a/translation/dest/faq/nb-NO.xml b/translation/dest/faq/nb-NO.xml index 73f4ff282de75..72aa5149fda1e 100644 --- a/translation/dest/faq/nb-NO.xml +++ b/translation/dest/faq/nb-NO.xml @@ -25,6 +25,8 @@ Hvordan kan jeg bli moderator? Det er ikke mulig å søke om å bli moderator. Hvis vi ser noen som vi tror kan gjøre en god jobb som moderator, så kontakter vi vedkommende direkte. Er fjernsjakk forskjellig fra vanlig sjakk? + Les %s for mer informasjon + siden vår om sportslig opptreden Hos Lichess er den viktigste regelforskjellen for fjernsjakk at det er lov å bruke åpningsbøker. Maskinanalyse er fremdeles forbudt og vil føre til at man får anmerkning for maskinbistand. Selv om ICCF tillater bruk av maskinanalyse i fjernsjakk, så er ikke det tilfellet hos Lichess. Spillforløp Hvor går skillene mellom Bullet, Blitz og andre tidskontroller? diff --git a/translation/dest/faq/nl-NL.xml b/translation/dest/faq/nl-NL.xml index a6cebe7c15b51..79468caeb1016 100644 --- a/translation/dest/faq/nl-NL.xml +++ b/translation/dest/faq/nl-NL.xml @@ -25,7 +25,8 @@ Hoe kan ik moderator worden? Solliciteren om moderator te worden is niet mogelijk. Als we iemand zien van wie we denken dat hij geschikt zou zijn als moderator, zullen we direct contact met hem opnemen. Is correspondentieschaak anders dan standaard schaak? - Voor meer informatie, zie onze %s + Voor meer informatie, zie onze %s + fair-play-pagina Op Lichess is het belangrijkste verschil in de regels voor correspondentieschaak dat een openingsboek is toegestaan. Het gebruik van engines is nog steeds verboden en leidt tot een overeenkomstige markering. Hoewel ICCF gebruik van engines in correspondentieschaak toestaat, doet Lichess dat niet. Spelregels Hoe worden bullet, blitz en andere speeltempo\'s bepaald? diff --git a/translation/dest/faq/pl-PL.xml b/translation/dest/faq/pl-PL.xml index 23ff158d19eda..55a4c40e0656b 100644 --- a/translation/dest/faq/pl-PL.xml +++ b/translation/dest/faq/pl-PL.xml @@ -28,8 +28,8 @@ Jak mogę zostać moderatorem? Nie można zgłosić się do pełnienia funkcji moderatora. Jeśli zauważymy kogoś, kto naszym zdaniem byłby dobrym moderatorem, skontaktujemy się z nim bezpośrednio. Czym różnią się szachy korespondencyjne od zwykłych szachów? - By dowiedzieć się więcej, przeczytaj %s - stronę o fair play + By dowiedzieć się więcej, przeczytaj %s + stronę o fair play Na Lichess, główną różnicą w zasadach szachów korespondencyjnych polega na tym że jest dozwolony \"opening book\". Używanie silników nadal jest niedozwolone i będzie skutkowało flagging\'iem twojego konta. Chociaż ICCF pozwala używanie silników w szachach korespondencyjnych, Lichess nie. Rozgrywka W jaki sposób system decyduje czy partia jest typu Bullet, Blitz itd.? diff --git a/translation/dest/faq/ro-RO.xml b/translation/dest/faq/ro-RO.xml index d1fb640e433dc..1d3878e6ccabd 100644 --- a/translation/dest/faq/ro-RO.xml +++ b/translation/dest/faq/ro-RO.xml @@ -24,8 +24,8 @@ Cum pot deveni un moderator? Nu este posibil să aplici pentru a deveni moderator. Dacă vedem pe cineva care credem noi ca este bun de moderator, îl vom contacta direct. Este șahul prin corespondență diferit față de șahul normal? - Pentru mai multe informații, citiți %s noastre - pagina de joc corect + Pentru mai multe informații, citiți %s + pagina de joc corect Pe Lichess, diferența principală de regulament pentru șahul prin corespondență este că o carte de deschideri in șah este permisă. Utilizarea de motoare pentru a automatiza șahul sunt încă nepermise ți vor rezulta în marcharea contului tău pentru motor de asistență. Deși ICCF permite motor de asistență la șahul prin corespondență, Lichess nu permite acest lucru. Joc Cum sunt decise controalele de timp Bullet, Blitz și alte? diff --git a/translation/dest/faq/sk-SK.xml b/translation/dest/faq/sk-SK.xml index c2fb5cdb15b75..aab369eac173f 100644 --- a/translation/dest/faq/sk-SK.xml +++ b/translation/dest/faq/sk-SK.xml @@ -25,6 +25,8 @@ Ako sa môžem stať moderátorom? Není možné podať prihlášku pre pozíciu moderátora. Ak si všimneme niekoho o kom si myslíme, že by bol dobrým moderátorom, sami ho kontaktujeme. Je korešpondenčný šach odlišný od normálneho šachu? + Viac informácií nájdete na našej %s + stránke fair play Pokiaľ ide o Lichess, hlavný rozdiel v pravidlách pre korešpondenčný šach spočíva v tom, že je povolená opening book. Používanie enginov je stále zakázané a bude mať za následok označenie pomoc s enginom. Aj keď ICCF umožňuje použitie enginu v korešpondencii, Lichess nie. Hrateľnosť Ako sa rozhoduje o Bullete, Blitzi a iných časových kontrolách? diff --git a/translation/dest/learn/hy-AM.xml b/translation/dest/learn/hy-AM.xml index bb374a5d7a45f..50b74189dc0ec 100644 --- a/translation/dest/learn/hy-AM.xml +++ b/translation/dest/learn/hy-AM.xml @@ -93,6 +93,7 @@ Գրոհե՛ք մրցակցի արքային այնպես, որ նրան հնարավոր չլինի պաշտպանել։ Խաղաքարերի դասավորությունը Շախմատային պարտիայի սկիզբը + Կողանցիկ հարված Պատ Խաղն ավարտվում է ոչ-ոքի։ Խնդիրներ diff --git a/translation/dest/patron/lt-LT.xml b/translation/dest/patron/lt-LT.xml index 33a7b1b0ee7cd..cce24a9cef9e0 100644 --- a/translation/dest/patron/lt-LT.xml +++ b/translation/dest/patron/lt-LT.xml @@ -18,6 +18,7 @@ Dėkojame už jūsų paramą! Jūs turite Rėmėjo Gyvenimui paskyrą. Kietai! Jūs turite Rėmėjo paskyrą iki %s. + Jei nebus atnaujinta, jūsų paskyra atsivers į įprastą paskyrą. Mes esame nepelno asocijacija, nes tikime, kad visi turėtų turėti prieigą prie nemokamos, pasaulinės klasės šachmatų platformos. Norėdami tai pasiekti, mes remiamės tokių žmonių kaip jūs parama. Jei jums patinka Lichess, pamąstykite apie paramą mums ir tapkite Rėmėju! Gyvenimui diff --git a/translation/dest/patron/sq-AL.xml b/translation/dest/patron/sq-AL.xml index 793606f97c497..9d14e35323aed 100644 --- a/translation/dest/patron/sq-AL.xml +++ b/translation/dest/patron/sq-AL.xml @@ -16,7 +16,7 @@ Faleminderit për dhurimin tuaj! Keni një llogari të përjetshme Bamirësi. Kjo është me të vërtetë fantastike! Keni një llogari Bamirësi deri më %s. - Po nuk u rinovua, llogaria juaj do të rikthehet atëherë si llogari e rregullt. + Po nuk u rinovua, llogaria juaj do të rikthehet atëherë si llogari e rregullt. Jemi një ent jofitimprurës, ngaqë besojmë se gjithkush duhet të ketë mundësi të përdorë një platformë shahu të lirë, të kalibrit botëror. Për ta bërë të mundur këtë, mbështetemi në përkrahjen e njerëzve si ju. Nëse ju pëlqen të përdorni Lichess-in, ju lutemi, shihni mundësinë të na përkrahni duke dhuruar ose duke u bërë një Bamirës! Pergjithmone @@ -58,6 +58,7 @@ Sidoqoftë, Bamirësit mund të mburren me një ikonë të re të lezetshme prof Pagesa pasuese Do t’ju faturohen %1$s më datë %2$s. Bëni një dhurim shtesë + Dhurojini një lojtari krahë Patron-i Përditësoje Ndryshoni shumën mujore (%s) anuloni përkrahjen tuaj diff --git a/translation/dest/puzzle/hy-AM.xml b/translation/dest/puzzle/hy-AM.xml index c10d289b58ea3..33c2ea53f3e79 100644 --- a/translation/dest/puzzle/hy-AM.xml +++ b/translation/dest/puzzle/hy-AM.xml @@ -43,7 +43,7 @@ %s միավոր ցածր՝ խնդիրների լուծման Ձեր վարկանիշից Բարդ - Բարդագույն + Շատ բարդ Մեկ միավոր բարձր խնդիրների լուծման Ձեր վարկանիշից %s միավոր բարձր խնդիրների լուծման Ձեր վարկանիշից @@ -68,4 +68,6 @@ Փնտրել խնդիրներ Տվյալների բազայում Ձեր պարտիաներից խնդիրներ չկան, բայց Lichess-ը Ձեզ հետ հույսեր է կապում։ Խաղացե՛ք ավելի շատ արագ կամ դասական ժամակարգով պարտիաներ, և խնդիրներ ունեցող խաղացողների ցանկում հայտնվելու Ձեր հնարավորությունները կմեծանան։ Գտնվել է %1$s խնդիր %2$s պարտիաներում + Մարզվե՛ք, վերլուծե՛ք, բարելավե՛ք + Ոչինչ չկա, սկսելու համար լուծե՛ք մի քանի խնդիր։ diff --git a/translation/dest/site/br-FR.xml b/translation/dest/site/br-FR.xml index 6367e54126c51..6e6f1039be820 100644 --- a/translation/dest/site/br-FR.xml +++ b/translation/dest/site/br-FR.xml @@ -624,6 +624,8 @@ Ostilhoù Inkrement Ret eo skrivañ un dra bennak + Chomlec\'h postel fazius pe implijet dija + Ho chomlec\'h postel an hini eo dija Ma \'z eo ar renkadur ± %s Mignoned hepken Lañser @@ -885,7 +887,9 @@ Ne c\'hallit ket skrivañ ur gemennadenn war ar foromoù evit poent. C\'hoarit un tamm a-raok! Heuliañ Paouez da heuliañ + [Klikit da ziskouez ar chomlec’h postel] Degemer mat! + Nullañ an tournamant Addigeriñ ho kont M\'ho peus serret ho kont, met cheñchet ho soñj ganeoc\'h, ho peus un tu da gaout ho kont en dro. Ur wech e yelo en dro an dra se nemetken. diff --git a/translation/dest/site/hy-AM.xml b/translation/dest/site/hy-AM.xml index 675c2935a55c0..dd05e382b4aac 100644 --- a/translation/dest/site/hy-AM.xml +++ b/translation/dest/site/hy-AM.xml @@ -471,7 +471,7 @@ Հակառակորդի քայլից հետո ավտոմատ կերպով անցնել հաջորդ քայլին միանգամից անցնել հաջորդ խաղին - խնդիրներ + Խնդիրներ Մրցաշարերի հաղթողները Անուն Նկարագրություն diff --git a/translation/dest/site/uz-UZ.xml b/translation/dest/site/uz-UZ.xml index 68bfb8ff5992a..912c4ede17778 100644 --- a/translation/dest/site/uz-UZ.xml +++ b/translation/dest/site/uz-UZ.xml @@ -17,6 +17,8 @@ Pat, durrang Oq Qora + oqlar sifatida + qoralar sifatida Tasodifiy tarafda O\'yin yaratish Oqlar yutdi @@ -24,6 +26,7 @@ Siz oqlarda o\'ynaysiz Siz qoralarda o\'ynaysiz Sizning yurishingiz! + Girromlik topildi Qirol markazga kelguncha Uch marta shox berishgacha Musobaqa yakunlandi @@ -86,12 +89,16 @@ %s yarim yurishda Mot %s yarim-yurishlarda Mot + DTZ50\'\' with rounding, based on number of half-moves until next capture or pawn move O\'yin topilmadi Balkim sozlamalar menusidan o\'yinlarni yuklash kerakdir? Sharhlovchini ochish + Uyinni boshlamoq/tugatmoq %s sharhlovchini ochish 50 yurish qoidasiga asosan g\'alabaga to\'sqinlik qilindi Mag\'lubiyatdan 50 yurish qoidasaga asosan saqlanildi + Hato uchun yutmoq yoki 50-ta qadam yurish + Hato uchun yutqazmoq yoki 50-ta qadam yurish Xammasi yaxshi! PGN ni import qilish O\'chirish diff --git a/translation/dest/storm/hy-AM.xml b/translation/dest/storm/hy-AM.xml index 9f4816044dd0c..e5b3cac60fea1 100644 --- a/translation/dest/storm/hy-AM.xml +++ b/translation/dest/storm/hy-AM.xml @@ -25,7 +25,7 @@ Քոմբո Ժամանակ Ժամանակ քայլին - Բարդագույն խնդիր + Շատ բարդ խնդիր Խաղացված խնդիրներ Նոր փորձ («Բացատ» ստեղն) Ավարտել փորձը («Մուտք» ստեղն) From 160f77ce50dc56953fd5ce4d6e1d0831a01c162b Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 10:47:31 +0100 Subject: [PATCH 002/103] show active autoplay speed in analysis action menu --- ui/analyse/css/_action-menu.scss | 6 ++++-- ui/analyse/src/actionMenu.ts | 7 ++++++- ui/analyse/src/autoplay.ts | 6 +++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ui/analyse/css/_action-menu.scss b/ui/analyse/css/_action-menu.scss index c1945231b3a78..bd37743b0f571 100644 --- a/ui/analyse/css/_action-menu.scss +++ b/ui/analyse/css/_action-menu.scss @@ -69,8 +69,10 @@ .autoplay { @extend %flex-wrap; - a { - color: $c-font-dim; + .button { + &-empty { + color: $c-font-dim; + } font-size: 0.9em; flex: 1 1 auto; padding: 7px 0; diff --git a/ui/analyse/src/actionMenu.ts b/ui/analyse/src/actionMenu.ts index 316b427083ed7..014a5df75d997 100644 --- a/ui/analyse/src/actionMenu.ts +++ b/ui/analyse/src/actionMenu.ts @@ -72,9 +72,14 @@ function autoplayButtons(ctrl: AnalyseCtrl): VNode { return h( 'div.autoplay', speeds.map(speed => { + const active = ctrl.autoplay.getDelay() == speed.delay; return h( - 'a.button.button-empty', + 'a.button', { + class: { + active, + 'button-empty': !active, + }, hook: bind('click', () => ctrl.togglePlay(speed.delay), ctrl.redraw), }, ctrl.trans.noarg(speed.name) diff --git a/ui/analyse/src/autoplay.ts b/ui/analyse/src/autoplay.ts index b81f2e60939b1..c842891e5f87a 100644 --- a/ui/analyse/src/autoplay.ts +++ b/ui/analyse/src/autoplay.ts @@ -72,7 +72,7 @@ export class Autoplay { } } - active(delay?: AutoplayDelay): boolean { - return (!delay || delay === this.delay) && !!this.timeout; - } + active = (delay?: AutoplayDelay) => (!delay || delay === this.delay) && !!this.timeout; + + getDelay = () => this.delay; } From 76cdededcc2d1755c582b4ef425835a4bfcd8f85 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 11:20:06 +0100 Subject: [PATCH 003/103] realtime clock in analysis board during realtime replay - closes #10641 --- ui/analyse/src/autoplay.ts | 29 +++++++++++++++++++++-------- ui/analyse/src/clocks.ts | 9 +++++++-- ui/analyse/src/control.ts | 4 ---- ui/analyse/src/ctrl.ts | 4 +--- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/ui/analyse/src/autoplay.ts b/ui/analyse/src/autoplay.ts index c842891e5f87a..4ced57035efcd 100644 --- a/ui/analyse/src/autoplay.ts +++ b/ui/analyse/src/autoplay.ts @@ -1,20 +1,26 @@ import AnalyseCtrl from './ctrl'; -import * as control from './control'; - export type AutoplayDelay = number | 'realtime' | 'cpl'; export class Autoplay { - private timeout: number | undefined; + private timeout: Timeout | undefined; private delay: AutoplayDelay | undefined; + private redrawInterval: Timeout | undefined; + + lastMoveAt: number | undefined; constructor(private ctrl: AnalyseCtrl) {} private move(): boolean { - if (control.canGoForward(this.ctrl)) { - control.next(this.ctrl); - this.ctrl.redraw(); - return true; + const child = this.ctrl.node.children[0]; + if (child) { + const path = this.ctrl.path + child.id; + if (this.ctrl.canJumpTo(path)) { + this.ctrl.jump(path); + this.lastMoveAt = performance.now(); + this.ctrl.redraw(); + return true; + } } this.stop(); this.ctrl.redraw(); @@ -52,16 +58,23 @@ export class Autoplay { } start(delay: AutoplayDelay): void { - this.delay = delay; this.stop(); + this.delay = delay; this.schedule(); + if (delay == 'realtime') this.redrawInterval = setInterval(this.ctrl.redraw, 100); } stop(): void { + this.delay = undefined; if (this.timeout) { clearTimeout(this.timeout); this.timeout = undefined; } + if (this.redrawInterval) { + clearInterval(this.redrawInterval); + this.redrawInterval = undefined; + } + this.lastMoveAt = undefined; } toggle(delay: AutoplayDelay): void { diff --git a/ui/analyse/src/clocks.ts b/ui/analyse/src/clocks.ts index ee5180d47c411..83264b551144e 100644 --- a/ui/analyse/src/clocks.ts +++ b/ui/analyse/src/clocks.ts @@ -18,8 +18,13 @@ export default function renderClocks(ctrl: AnalyseCtrl): [VNode, VNode] | undefi const study = ctrl.study, relay = study && study.data.chapter.relay; - if (relay && relay.lastMoveAt && relay.path === ctrl.path && ctrl.path !== '' && !isFinished(study!.data.chapter)) { - const spent = (Date.now() - relay.lastMoveAt) / 10; + + const lastMoveAt = + (relay?.path === ctrl.path && ctrl.path !== '' && !isFinished(study!.data.chapter) && relay.lastMoveAt) || + ctrl.autoplay.lastMoveAt; + + if (lastMoveAt) { + const spent = (performance.now() - lastMoveAt) / 10; const i = isWhiteTurn ? 0 : 1; if (centis[i]) centis[i] = Math.max(0, centis[i]! - spent); } diff --git a/ui/analyse/src/control.ts b/ui/analyse/src/control.ts index 6556847adc603..ab52a01f9e572 100644 --- a/ui/analyse/src/control.ts +++ b/ui/analyse/src/control.ts @@ -2,10 +2,6 @@ import AnalyseCtrl from './ctrl'; import { path as treePath } from 'tree'; -export function canGoForward(ctrl: AnalyseCtrl): boolean { - return ctrl.node.children.length > 0; -} - export function next(ctrl: AnalyseCtrl): void { const child = ctrl.node.children[0]; if (child) ctrl.userJumpIfCan(ctrl.path + child.id); diff --git a/ui/analyse/src/ctrl.ts b/ui/analyse/src/ctrl.ts index 89e0d76c72498..06d16f0840ec7 100644 --- a/ui/analyse/src/ctrl.ts +++ b/ui/analyse/src/ctrl.ts @@ -398,9 +398,7 @@ export default class AnalyseCtrl { } else this.jump(path); }; - private canJumpTo(path: Tree.Path): boolean { - return !this.study || this.study.canJumpTo(path); - } + canJumpTo = (path: Tree.Path): boolean => !this.study || this.study.canJumpTo(path); userJumpIfCan(path: Tree.Path): void { if (this.canJumpTo(path)) this.userJump(path); From 0b3b60daf09ce8a43b217ad1e582f56187f40ec0 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 11:53:17 +0100 Subject: [PATCH 004/103] make function async --- ui/dasher/src/main.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/dasher/src/main.ts b/ui/dasher/src/main.ts index 203804a5c5401..0cba22b210909 100644 --- a/ui/dasher/src/main.ts +++ b/ui/dasher/src/main.ts @@ -6,7 +6,7 @@ import { init, VNode, classModule, attributesModule } from 'snabbdom'; const patch = init([classModule, attributesModule]); -export default function LichessDasher(element: Element, opts: DasherOpts) { +export default async function LichessDasher(element: Element, opts: DasherOpts) { let vnode: VNode, ctrl: DasherCtrl; const redraw: Redraw = () => { @@ -15,9 +15,8 @@ export default function LichessDasher(element: Element, opts: DasherOpts) { redraw(); - return xhr.json('/dasher').then(data => { - ctrl = makeCtrl(opts, data, redraw); - redraw(); - return ctrl; - }); + const data = await xhr.json('/dasher'); + ctrl = makeCtrl(opts, data, redraw); + redraw(); + return ctrl; } From e549eb1d45d25ff50858cce5ade31fd1a4948ecf Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 11:54:17 +0100 Subject: [PATCH 005/103] remove #user_tag.href asap - closes #10640 --- ui/site/src/site.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/site/src/site.ts b/ui/site/src/site.ts index 641a8afc797e3..bd3afa902c6a4 100644 --- a/ui/site/src/site.ts +++ b/ui/site/src/site.ts @@ -26,6 +26,7 @@ lichess.info = info; loadClockWidget(); lichess.load.then(() => { + $('#user_tag').removeAttr('href'); moduleLaunchers(); requestAnimationFrame(() => { From 10c87d2d6e9fb8cc8434ab3eef60ef6473222e6d Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 12:02:25 +0100 Subject: [PATCH 006/103] remove lila-http tour ids setting --- app/controllers/Dev.scala | 3 +-- modules/tournament/src/main/Env.scala | 7 ------- modules/tournament/src/main/TournamentLilaHttp.scala | 8 +++----- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/app/controllers/Dev.scala b/app/controllers/Dev.scala index 4d9da3b175874..5964877c33509 100644 --- a/app/controllers/Dev.scala +++ b/app/controllers/Dev.scala @@ -31,8 +31,7 @@ final class Dev(env: Env) extends LilaController(env) { env.prizeTournamentMakers, env.pieceImageExternal, env.evalCache.enable, - env.tournament.reloadEndpointSetting, - env.tournament.lilaHttpTourIdSetting + env.tournament.reloadEndpointSetting ) def settings = diff --git a/modules/tournament/src/main/Env.scala b/modules/tournament/src/main/Env.scala index 4872a9da6d747..57b06ebd57717 100644 --- a/modules/tournament/src/main/Env.scala +++ b/modules/tournament/src/main/Env.scala @@ -102,13 +102,6 @@ final class Env( text = "lila-http endpoint. Set to /tournament/{id} to only use lila.".some ).taggedWith[TournamentReloadEndpoint] - lazy val lilaHttpTourIdSetting = settingStore[Tournament.ID]( - "lilaHttpTourId", - default = "none", - text = - "Which single tournament ID to send to lila-http. Empty = all tournaments. Random = no tournament.".some - ).taggedWith[LilaHttpTourId] - lazy val jsonView: JsonView = wire[JsonView] lazy val apiJsonView = wire[ApiJsonView] diff --git a/modules/tournament/src/main/TournamentLilaHttp.scala b/modules/tournament/src/main/TournamentLilaHttp.scala index 39e01942d5de3..bab99442cfafb 100644 --- a/modules/tournament/src/main/TournamentLilaHttp.scala +++ b/modules/tournament/src/main/TournamentLilaHttp.scala @@ -23,13 +23,11 @@ final class TournamentLilaHttp( jsonView: JsonView, pause: Pause, lightUserApi: lila.user.LightUserApi, - redisClient: RedisClient, - lilaHttpTourId: SettingStore[Tournament.ID] @@ LilaHttpTourId + redisClient: RedisClient )(implicit mat: akka.stream.Materializer, system: ActorSystem, ec: ExecutionContext) { - def onlyId = lilaHttpTourId.get().some.filter(_.nonEmpty) - def handles(tour: Tournament) = onlyId.fold(isOnLilaHttp get tour.id)(tour.id ==) - def handledIds = onlyId.fold(isOnLilaHttp.keys)(_ :: Nil) + def handles(tour: Tournament) = isOnLilaHttp get tour.id + def handledIds = isOnLilaHttp.keys def hit(tour: Tournament) = if (tour.nbPlayers > 10 && !tour.isFinished && hitCounter(tour.id)) isOnLilaHttp.put(tour.id) From 3234bc0b5457e71007cbfd0c2642326dd4749062 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 12:42:54 +0100 Subject: [PATCH 007/103] code golf --- modules/chat/src/main/ChatTimeout.scala | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/chat/src/main/ChatTimeout.scala b/modules/chat/src/main/ChatTimeout.scala index 0581bf30c4ff3..fc856c738c11a 100644 --- a/modules/chat/src/main/ChatTimeout.scala +++ b/modules/chat/src/main/ChatTimeout.scala @@ -26,7 +26,7 @@ final class ChatTimeout( coll.insert .one( $doc( - "_id" -> makeId, + "_id" -> (lila.common.ThreadLocalRandom nextString 8), "chat" -> chat.id, "mod" -> mod.id, "user" -> user.id, @@ -59,10 +59,6 @@ final class ChatTimeout( case objs => coll.unsetField($inIds(objs.map(_._id)), "expiresAt", multi = true) inject objs } - - private val idSize = 8 - - private def makeId = lila.common.ThreadLocalRandom nextString idSize } object ChatTimeout { From 0567b221e082ef1ab82b4cd88b7e35ac0144b948 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 12:43:45 +0100 Subject: [PATCH 008/103] remember broadcast REC state - closes #10480 --- ui/analyse/src/study/studyCtrl.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ui/analyse/src/study/studyCtrl.ts b/ui/analyse/src/study/studyCtrl.ts index ec03ca9ae6e77..feef97d3e0699 100644 --- a/ui/analyse/src/study/studyCtrl.ts +++ b/ui/analyse/src/study/studyCtrl.ts @@ -43,6 +43,7 @@ import { RelayData } from './relay/interfaces'; import { MultiBoardCtrl } from './multiBoard'; import { StudySocketSendParams } from '../socket'; import { Opening } from '../explorer/interfaces'; +import { storedProp } from 'common/storage'; interface Handlers { path(d: WithWhoAndPos): void; @@ -83,6 +84,8 @@ export default function ( const send = ctrl.socket.send; const redraw = ctrl.redraw; + const relayRecProp = storedProp('relay.rec', true); + const vm: StudyVm = (() => { const isManualChapter = data.chapter.id !== data.position.chapterId; const sticked = data.features.sticky && !ctrl.initialPath && !isManualChapter && !practiceData; @@ -94,7 +97,7 @@ export default function ( // path is at ctrl.path mode: { sticky: sticked, - write: true, + write: !relayData || relayRecProp(), }, // how many events missed because sync=off behind: 0, @@ -117,7 +120,7 @@ export default function ( startTour, notif, onBecomingContributor() { - vm.mode.write = true; + vm.mode.write = !relayData || relayRecProp(); }, admin: data.admin, redraw, @@ -504,7 +507,7 @@ export default function ( if (d.s && !vm.mode.sticky) vm.behind++; if (d.s) data.position = d.p; else if (d.w && d.w.s === lichess.sri) { - vm.mode.write = true; + vm.mode.write = !relayData || relayRecProp(); vm.chapterId = d.p.chapterId; } xhrReload(); @@ -680,6 +683,7 @@ export default function ( }, toggleWrite() { vm.mode.write = !vm.mode.write && members.canContribute(); + if (relayData) relayRecProp(vm.mode.write); xhrReload(); }, isWriting, From d88085ab31cc9136ac656ea02830b8cef7570278 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Wed, 16 Mar 2022 13:19:58 +0100 Subject: [PATCH 009/103] expand twitter tweets in ublogs - closes #10473 --- app/views/ublog/post.scala | 3 +- ui/site/css/ublog/_markup.scss | 4 +++ ui/site/src/expandText.ts | 63 ++++++++++++++++++++++++---------- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/app/views/ublog/post.scala b/app/views/ublog/post.scala index 05474f2c3effa..e9654161e04c5 100644 --- a/app/views/ublog/post.scala +++ b/app/views/ublog/post.scala @@ -43,7 +43,8 @@ object post { href := routes.Ublog.userAtom(user.username), st.title := trans.ublog.xBlog.txt(user.username) ).some, - robots = netConfig.crawlable && blog.listed && (post.indexable || blog.tier >= UblogBlog.Tier.HIGH) + robots = netConfig.crawlable && blog.listed && (post.indexable || blog.tier >= UblogBlog.Tier.HIGH), + csp = defaultCsp.withTwitter.some ) { main(cls := "page-menu page-small")( views.html.blog.bits.menu(none, (if (ctx is user) "mine" else "community").some), diff --git a/ui/site/css/ublog/_markup.scss b/ui/site/css/ublog/_markup.scss index 182d0e1b9e8f6..498cd904ca100 100644 --- a/ui/site/css/ublog/_markup.scss +++ b/ui/site/css/ublog/_markup.scss @@ -27,4 +27,8 @@ margin: $block-gap auto; } + + .twitter-tweet { + margin: auto; + } } diff --git a/ui/site/src/expandText.ts b/ui/site/src/expandText.ts index afdaf0d05db6b..238b61e21cedf 100644 --- a/ui/site/src/expandText.ts +++ b/ui/site/src/expandText.ts @@ -1,8 +1,26 @@ import spinner from './component/spinner'; +import * as xhr from 'common/xhr'; + +type LinkType = 'youtube' | 'study' | 'game' | 'twitter'; + +interface Parsed { + type: LinkType; + src: string; +} +interface Candidate { + element: HTMLAnchorElement; + parent: HTMLElement; + type: LinkType; + src: string; +} + +interface Group { + parent: HTMLElement | null; + index: number; +} function toYouTubeEmbedUrl(url: string) { - if (!url) return; - const m = url.match( + const m = url?.match( /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch)?(?:\?v=)?([^"&?/ ]{11})(?:\?|&|)(\S*)/i ); if (!m) return; @@ -21,22 +39,9 @@ function toYouTubeEmbedUrl(url: string) { return 'https://www.youtube.com/embed/' + m[1] + '?' + params; } -type LinkType = 'youtube' | 'study' | 'game'; - -interface Parsed { - type: LinkType; - src: string; -} -interface Candidate { - element: HTMLAnchorElement; - parent: HTMLElement; - type: LinkType; - src: string; -} - -interface Group { - parent: HTMLElement | null; - index: number; +function toTwitterEmbedUrl(url: string) { + const m = url?.match(/(?:https?:\/\/)?(?:www\.)?(?:twitter\.com)\/([^/]+\/status\/\d+)/i); + return m && `https://twitter.com/${m[1]}`; } lichess.load.then(() => { @@ -47,6 +52,12 @@ lichess.load.then(() => { notGames = ['training', 'analysis', 'insights', 'practice', 'features', 'password', 'streamer', 'timeline']; function parseLink(a: HTMLAnchorElement): Parsed | undefined { + const tw = toTwitterEmbedUrl(a.href); + if (tw) + return { + type: 'twitter', + src: tw, + }; const yt = toYouTubeEmbedUrl(a.href); if (yt) return { @@ -96,6 +107,20 @@ lichess.load.then(() => { }); } + let twitterLoaded = false; + function expandTwitter(a: Candidate) { + const theme = $('body').data('theme') == 'light' ? 'light' : 'dark'; + $(a.element).replaceWith( + $( + `` + ) + ); + if (!twitterLoaded) { + twitterLoaded = true; + xhr.script('https://platform.twitter.com/widgets.js'); + } + } + function expand(a: Candidate) { const $iframe: any = $('