feat: script to translate specific keys and inclusion of acftl in level names

This commit is contained in:
wcjord 2025-11-04 13:38:38 -05:00
parent b20f2d3ef0
commit c7c6efadaf
57 changed files with 990 additions and 430 deletions

View file

@ -1,6 +1,6 @@
{
"@@locale": "ar",
"@@last_modified": "2025-10-16 13:08:16.063345",
"@@last_modified": "2025-11-04 13:34:44.139492",
"about": "حول",
"@about": {
"type": "String",
@ -3316,13 +3316,13 @@
"iWantALanguagePartnerWhoIsLearning": "يتعلم:",
"joinWithClassCode": "انضم إلى الدورة",
"joinWithClassCodeHint": "أدخل رمز الدعوة",
"languageLevelPreA1": "مبتدئ حقيقي (ما قبل A1)",
"languageLevelA1": "مبتدئ (A1)",
"languageLevelA2": "مبتدئ أساسي (A2)",
"languageLevelB1": "متوسط (B1)",
"languageLevelB2": "متوسط مرتفع (B2)",
"languageLevelC1": "متقدم (C1)",
"languageLevelC2": "إتقان (C2)",
"languageLevelPreA1": "مبتدئ منخفض (ما قبل A1)",
"languageLevelA1": "مبتدئ متوسط (A1)",
"languageLevelA2": "مبتدئ عالي (A2)",
"languageLevelB1": "متوسط متوسط (B1)",
"languageLevelB2": "متقدم منخفض (B2)",
"languageLevelC1": "متقدم متوسط (C1)",
"languageLevelC2": "متفوق (C2)",
"changeTheNameOfTheClass": "غير الاسم",
"changeTheNameOfTheChat": "غير اسم الدردشة",
"askPangeaBot": "اطلب من بوت بانجيا تعريفًا سياقيًا.",

View file

@ -833,13 +833,13 @@
"iWantALanguagePartnerWhoIsLearning": "Вучыцца:",
"joinWithClassCode": "Далучыцца да курса",
"joinWithClassCodeHint": "Увядзіце код запрашэння",
"languageLevelPreA1": "Пачатковец (Pre A1)",
"languageLevelA1": "Пачатковец (A1)",
"languageLevelA2": "Элементарны (A2)",
"languageLevelB1": "Сярэдні (B1)",
"languageLevelB2": "Павышаны сярэдні (B2)",
"languageLevelC1": "Прасунуты (C1)",
"languageLevelC2": "Майстэрства (C2)",
"languageLevelPreA1": "Навічок Нізкі (Папярэдні A1)",
"languageLevelA1": "Навічок Сярэдні (A1)",
"languageLevelA2": "Пачатковы высокі (A2)",
"languageLevelB1": "Сярэдні сярэдні (B1)",
"languageLevelB2": "Высокі нізкі (B2)",
"languageLevelC1": "Высокі сярэдні (C1)",
"languageLevelC2": "Супер (C2)",
"changeTheNameOfTheClass": "Змяніць імя",
"changeTheNameOfTheChat": "Змяніць імя чата",
"askPangeaBot": "Пытайце ў Pangea Bot для кантэкстуальнага вызначэння.",
@ -2392,7 +2392,7 @@
"playWithAI": "Пакуль гуляйце з ШІ",
"courseStartDesc": "Pangea Bot гатовы да працы ў любы час!\n\n...але навучанне лепш з сябрамі!",
"@@locale": "be",
"@@last_modified": "2025-10-16 13:08:21.169808",
"@@last_modified": "2025-11-04 13:34:29.024561",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:08:26.192955",
"@@last_modified": "2025-11-04 13:35:07.054864",
"about": "সম্পর্কে",
"@about": {
"type": "String",
@ -3425,13 +3425,13 @@
"iWantALanguagePartnerWhoIsLearning": "শিখছে:",
"joinWithClassCode": "কোর্সে যোগ দিন",
"joinWithClassCodeHint": "আমন্ত্রণ কোড লিখুন",
"languageLevelPreA1": "সত্যিই শুরু (প্রি A1)",
"languageLevelA1": "শুরু (A1)",
"languageLevelA2": "প্রাথমিক (A2)",
"languageLevelB1": "মধ্যবর্তী (B1)",
"languageLevelB2": "উচ্চ মধ্যবর্তী (B2)",
"languageLevelC1": "উন্নত (C1)",
"languageLevelC2": "মাস্টারি (C2)",
"languageLevelPreA1": "নবীন নিম্ন (প্রি A1)",
"languageLevelA1": "নবীন মধ্য (এ1)",
"languageLevelA2": "নবীন উচ্চ (A2)",
"languageLevelB1": "মধ্যবর্তী মধ্য (B1)",
"languageLevelB2": "উন্নত নিম্ন (B2)",
"languageLevelC1": "উন্নত মধ্য (C1)",
"languageLevelC2": "শ্রেষ্ঠ (C2)",
"changeTheNameOfTheClass": "নাম পরিবর্তন করুন",
"changeTheNameOfTheChat": "চ্যাটের নাম পরিবর্তন করুন",
"askPangeaBot": "প্রশ্ন করুন পাঞ্জিয়া বটকে একটি প্রাসঙ্গিক সংজ্ঞার জন্য।",

View file

@ -3300,13 +3300,13 @@
"iWantALanguagePartnerWhoIsLearning": "སྱོན་ཚན་ལས་སྐད་ལེན་པ།",
"joinWithClassCode": "ཚོང་ཚད་ལ་སྡེབ་སྤྱོད་ན།",
"joinWithClassCodeHint": "འཕྲིན་ལེན་ལས་སྤྱོད་ན་ལོག་ལེན་འབད།",
"languageLevelPreA1": "བརྗེད་ཡོད་པ་སྤྱོད་མི་ཚོད་ (Pre A1)",
"languageLevelA1": "བརྗེད་ཡོད་པ (A1)",
"languageLevelA2": "གཞི་སྒོར (A2)",
"languageLevelB1": "ལས་སྤྱོད་ལོག་ལེན་ (B1)",
"languageLevelB2": "མཐར་ཕྱིན་ལས་སྤྱོད་ལོག་ལེན་ (B2)",
"languageLevelC1": "ལོངས་སྤྱོད་ལོག་ལེན་ (C1)",
"languageLevelC2": "མཐོ་སྐོར (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice High (A2)",
"languageLevelB1": "Intermediate Mid (B1)",
"languageLevelB2": "Advanced Low (B2)",
"languageLevelC1": "Advanced Mid (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "མིང་ལེན་བསྐྱར་བཟོ།",
"changeTheNameOfTheChat": "ཆ་ཚང་མིང་བསྐྱར་བཟོ།",
"askPangeaBot": "Pangea Bot ལ་འདི་ལས་སྒྲིག་བཀོད་ལ་བཀོད་ནས་བརྗེ་བརྗོད་འདི་ལ་བཀོད།",
@ -4707,7 +4707,7 @@
"joinPublicTrip": "མི་ཚེས་ལ་ལོག་འབད།",
"startOwnTrip": "ངེད་རང་གི་ལོག་ལ་སྦྱོར་བཅོས།",
"@@locale": "bo",
"@@last_modified": "2025-10-16 16:03:25.501925",
"@@last_modified": "2025-11-04 13:35:01.640152",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:30:33.942130",
"@@last_modified": "2025-11-04 13:34:30.531761",
"about": "Quant a",
"@about": {
"type": "String",
@ -3403,13 +3403,13 @@
"iWantALanguagePartnerWhoIsLearning": "Està aprenent:",
"joinWithClassCode": "Uneix-te al curs",
"joinWithClassCodeHint": "Introdueix el codi d'invitació",
"languageLevelPreA1": "Totalment principiants (Pre A1)",
"languageLevelA1": "Principiant (A1)",
"languageLevelA2": "Elemental (A2)",
"languageLevelB1": "Intermedi (B1)",
"languageLevelB2": "Intermedi superior (B2)",
"languageLevelC1": "Avançat (C1)",
"languageLevelC2": "Dominació (C2)",
"languageLevelPreA1": "Novell Baix (Pre A1)",
"languageLevelA1": "Novell Mitjà (A1)",
"languageLevelA2": "Novell Alt (A2)",
"languageLevelB1": "Intermedi Mitjà (B1)",
"languageLevelB2": "Avançat Baix (B2)",
"languageLevelC1": "Avançat Mitjà (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Canvia el nom",
"changeTheNameOfTheChat": "Canvia el nom del xat",
"askPangeaBot": "Pregunta a Pangea Bot per una definició contextual.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "cs",
"@@last_modified": "2025-10-16 13:30:36.618840",
"@@last_modified": "2025-11-04 13:34:23.845105",
"about": "O aplikaci",
"@about": {
"type": "String",
@ -2960,13 +2960,13 @@
"iWantALanguagePartnerWhoIsLearning": "Se učí:",
"joinWithClassCode": "Připojit se ke kurzu",
"joinWithClassCodeHint": "Zadejte pozvánkový kód",
"languageLevelPreA1": "Skutečný začátečník (Pre A1)",
"languageLevelA1": "Začátečník (A1)",
"languageLevelA2": "Základní (A2)",
"languageLevelB1": "Středně pokročilý (B1)",
"languageLevelB2": "Vyšší středně pokročilý (B2)",
"languageLevelC1": "Pokročilý (C1)",
"languageLevelC2": "Mistrovství (C2)",
"languageLevelPreA1": "Nováček Nízká (Pre A1)",
"languageLevelA1": "Nováček Mid (A1)",
"languageLevelA2": "Začátečník Vysoký (A2)",
"languageLevelB1": "Středně pokročilý Střední (B1)",
"languageLevelB2": "Pokročilý Nízký (B2)",
"languageLevelC1": "Pokročilý Střední (C1)",
"languageLevelC2": "Vysoce pokročilý (C2)",
"changeTheNameOfTheClass": "Změnit název",
"changeTheNameOfTheChat": "Změnit název chatu",
"askPangeaBot": "Požádejte Pangea Bota o kontextovou definici.",

View file

@ -852,13 +852,13 @@
"iWantALanguagePartnerWhoIsLearning": "Lærer:",
"joinWithClassCode": "Deltag i kursus",
"joinWithClassCodeHint": "Indtast invitationskoden",
"languageLevelPreA1": "Sandbegynder (Pre A1)",
"languageLevelA1": "Begynder (A1)",
"languageLevelA2": "Elementær (A2)",
"languageLevelB1": "Mellem (B1)",
"languageLevelB2": "Øvre Mellem (B2)",
"languageLevelC1": "Avanceret (C1)",
"languageLevelC2": "Mestring (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice High (A2)",
"languageLevelB1": "Intermediate Mid (B1)",
"languageLevelB2": "Advanced Low (B2)",
"languageLevelC1": "Advanced Mid (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Skift navn",
"changeTheNameOfTheChat": "Skift chatnavn",
"askPangeaBot": "Spørg Pangea Bot om en kontekstuel definition.",
@ -2411,7 +2411,7 @@
"playWithAI": "Leg med AI for nu",
"courseStartDesc": "Pangea Bot er klar til at starte når som helst!\n\n...men læring er bedre med venner!",
"@@locale": "da",
"@@last_modified": "2025-10-16 13:30:39.003047",
"@@last_modified": "2025-11-04 13:33:43.063775",
"@aboutHomeserver": {
"type": "String",
"placeholders": {

View file

@ -1,6 +1,6 @@
{
"@@locale": "de",
"@@last_modified": "2025-10-16 13:30:41.915934",
"@@last_modified": "2025-11-04 13:34:11.760779",
"alwaysUse24HourFormat": "true",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
@ -3438,13 +3438,13 @@
"iWantALanguagePartnerWhoIsLearning": "Lernt:",
"joinWithClassCode": "Kurs beitreten",
"joinWithClassCodeHint": "Einladungscode eingeben",
"languageLevelPreA1": "Wahrer Anfänger (Pre A1)",
"languageLevelA1": "Anfänger (A1)",
"languageLevelA2": "Grundstufe (A2)",
"languageLevelPreA1": "Anfänger Niedrig (Pre A1)",
"languageLevelA1": "Novize Mitte (A1)",
"languageLevelA2": "Anfänger Hoch (A2)",
"languageLevelB1": "Mittelstufe (B1)",
"languageLevelB2": "Obere Mittelstufe (B2)",
"languageLevelC1": "Fortgeschritten (C1)",
"languageLevelC2": "Meisterschaft (C2)",
"languageLevelB2": "Fortgeschritten Niedrig (B2)",
"languageLevelC1": "Fortgeschritten Mittel (C1)",
"languageLevelC2": "Überlegen (C2)",
"changeTheNameOfTheClass": "Namen ändern",
"changeTheNameOfTheChat": "Den Namen des Chats ändern",
"askPangeaBot": "Fragen Sie Pangea Bot nach einer kontextbezogenen Definition.",

View file

@ -3378,13 +3378,13 @@
"iWantALanguagePartnerWhoIsLearning": "Μαθαίνει:",
"joinWithClassCode": "Εγγραφή στο μάθημα",
"joinWithClassCodeHint": "Εισάγετε τον κωδικό πρόσκλησης",
"languageLevelPreA1": "Πραγματικά αρχάριος (Προ A1)",
"languageLevelA1": "Αρχάριος (A1)",
"languageLevelA2": "Βασικό (A2)",
"languageLevelB1": "Μεσαίο (B1)",
"languageLevelB2": "Ανώτερο μεσαίο (B2)",
"languageLevelC1": "Προχωρημένο (C1)",
"languageLevelC2": "Διδασκαλία (C2)",
"languageLevelPreA1": "Νέος Χαμηλός (Προ Α1)",
"languageLevelA1": "Νέος Μέσος (A1)",
"languageLevelA2": "Αρχάριος Υψηλού Επιπέδου (A2)",
"languageLevelB1": "Μεσαίος Μέτριος (B1)",
"languageLevelB2": "Προχωρημένος Χαμηλού Επιπέδου (B2)",
"languageLevelC1": "Προχωρημένος Μέτριος (C1)",
"languageLevelC2": "Ανώτερος (C2)",
"changeTheNameOfTheClass": "Αλλαγή ονόματος",
"changeTheNameOfTheChat": "Αλλαγή ονόματος της συνομιλίας",
"askPangeaBot": "Ζητήστε από το Pangea Bot μια συμφραζόμενη ορισμό.",
@ -4937,7 +4937,7 @@
"playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν",
"courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!",
"@@locale": "el",
"@@last_modified": "2025-10-16 13:30:44.558485",
"@@last_modified": "2025-11-04 13:35:19.855843",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -3305,13 +3305,13 @@
"iWantALanguagePartnerWhoIsLearning": "Is learning:",
"joinWithClassCode": "Join course",
"joinWithClassCodeHint": "Enter invite code",
"languageLevelPreA1": "True Beginner (Pre A1)",
"languageLevelA1": "Beginner (A1)",
"languageLevelA2": "Elementary (A2)",
"languageLevelB1": "Intermediate (B1)",
"languageLevelB2": "Upper Intermediate (B2)",
"languageLevelC1": "Advanced (C1)",
"languageLevelC2": "Mastery (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice High (A2)",
"languageLevelB1": "Intermediate Mid (B1)",
"languageLevelB2": "Advanced Low (B2)",
"languageLevelC1": "Advanced Mid (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Change the name",
"changeTheNameOfTheChat": "Change the name of the chat",
"askPangeaBot": "Ask Pangea Bot for a contextual definition.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:30:47.008238",
"@@last_modified": "2025-11-04 13:35:26.105229",
"about": "Prio",
"@about": {
"type": "String",
@ -2557,13 +2557,13 @@
"iWantALanguagePartnerWhoIsLearning": "Ŝatas:",
"joinWithClassCode": "Aliĝi al kurso",
"joinWithClassCodeHint": "Enmetu invitan kodon",
"languageLevelPreA1": "Verŝa Komencanto (Pre A1)",
"languageLevelA1": "Komencanto (A1)",
"languageLevelA2": "Elementa (A2)",
"languageLevelB1": "Meznivelulo (B1)",
"languageLevelB2": "Supermeznivelulo (B2)",
"languageLevelC1": "Progresinta (C1)",
"languageLevelC2": "Mastro (C2)",
"languageLevelPreA1": "Novice Malalta (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novica Alta (A2)",
"languageLevelB1": "Mezgrada Meza (B1)",
"languageLevelB2": "Avancita Malalta (B2)",
"languageLevelC1": "Avancita Meza (C1)",
"languageLevelC2": "Supera (C2)",
"changeTheNameOfTheClass": "Ŝanĝi la nomon",
"changeTheNameOfTheChat": "Ŝanĝi la nomon de la babilejo",
"askPangeaBot": "Demandi al Pangea Bot por kunteksta difino.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "es",
"@@last_modified": "2025-10-16 13:30:49.638463",
"@@last_modified": "2025-11-04 13:33:35.588794",
"about": "Acerca de",
"@about": {
"type": "String",
@ -3619,13 +3619,13 @@
"addDescription": "Añadir descripción",
"pleaseEnterSecurityKeyDescription": "Para desbloquear el respaldo de tu chat, por favor ingresa tu clave de seguridad que ha sido generada en una sesión previa. Tu clave de seguridad NO es tu contraseña.",
"updateLanguage": "Cambiar mis idiomas",
"languageLevelPreA1": "Principiante absoluto (Pre A1)",
"languageLevelA1": "Principiante elemental (A1)",
"languageLevelA2": "Principiante básico (A2)",
"languageLevelB1": "Intermedio (B1)",
"languageLevelB2": "Intermedio alto (B2)",
"languageLevelC1": "Avanzado (C1)",
"languageLevelC2": "Maestría (C2)",
"languageLevelPreA1": "Novato Bajo (Pre A1)",
"languageLevelA1": "Novato Medio (A1)",
"languageLevelA2": "Principiante Alto (A2)",
"languageLevelB1": "Intermedio Medio (B1)",
"languageLevelB2": "Avanzado Bajo (B2)",
"languageLevelC1": "Avanzado Medio (C1)",
"languageLevelC2": "Superior (C2)",
"reportAnIssue": "Ayuda",
"whatLanguageYouWantToLearn": "¿Qué idioma quiere aprender?",
"whatIsYourBaseLanguage": "¿Cuál es su idioma base? \n\n Actualmente, la traducción interactiva solo está disponible cuando su idioma base es inglés y español. La asistencia gramatical está disponible para todos los idiomas base.",
@ -7427,5 +7427,33 @@
"@highlightVocabTooltip": {
"type": "String",
"placeholders": {}
},
"@languageLevelPreA1": {
"type": "String",
"placeholders": {}
},
"@languageLevelA1": {
"type": "String",
"placeholders": {}
},
"@languageLevelA2": {
"type": "String",
"placeholders": {}
},
"@languageLevelB1": {
"type": "String",
"placeholders": {}
},
"@languageLevelB2": {
"type": "String",
"placeholders": {}
},
"@languageLevelC1": {
"type": "String",
"placeholders": {}
},
"@languageLevelC2": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "et",
"@@last_modified": "2025-10-16 13:30:52.593520",
"@@last_modified": "2025-11-04 13:34:09.788327",
"about": "Rakenduse teave",
"@about": {
"type": "String",
@ -3434,13 +3434,13 @@
"iWantALanguagePartnerWhoIsLearning": "Õpib:",
"joinWithClassCode": "Liitu ruumiga",
"joinWithClassCodeHint": "Sisesta kutsekood",
"languageLevelPreA1": "Tõeline algaja (Pre A1)",
"languageLevelA1": "Algaja (A1)",
"languageLevelA2": "Algeline (A2)",
"languageLevelB1": "Keskmine (B1)",
"languageLevelB2": "Ülemine Keskastme (B2)",
"languageLevelC1": "Edasijõudnud (C1)",
"languageLevelC2": "Meisterlikkus (C2)",
"languageLevelPreA1": "Algaja Madal (Eel A1)",
"languageLevelA1": "Algaja Kesktase (A1)",
"languageLevelA2": "Algaja Kõrge (A2)",
"languageLevelB1": "Vahepealne Keskmine (B1)",
"languageLevelB2": "Edasijõudnud Madal (B2)",
"languageLevelC1": "Edasijõudnud Keskmine (C1)",
"languageLevelC2": "Üksikasjalik (C2)",
"changeTheNameOfTheClass": "Muuda nime",
"changeTheNameOfTheChat": "Muuda vestluse nime",
"askPangeaBot": "Küsi Pangea Botilt kontekstuaalset definitsiooni.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "eu",
"@@last_modified": "2025-10-16 13:30:55.222415",
"@@last_modified": "2025-11-04 13:34:05.712800",
"about": "Honi buruz",
"@about": {
"type": "String",
@ -3431,13 +3431,13 @@
"iWantALanguagePartnerWhoIsLearning": "Ikasten:",
"joinWithClassCode": "Batu ikastaroan",
"joinWithClassCodeHint": "Sartu gonbidapen kodea",
"languageLevelPreA1": "Hasiberri Benetakoa (Pre A1)",
"languageLevelA1": "Hasiberri (A1)",
"languageLevelA2": "Oinarrizkoa (A2)",
"languageLevelB1": "Erdakorra (B1)",
"languageLevelB2": "Goren Erdakorra (B2)",
"languageLevelC1": "Aurreratua (C1)",
"languageLevelC2": "Maisu (C2)",
"languageLevelPreA1": "Hasiberri Baxua (Pre A1)",
"languageLevelA1": "Hasiberri Erdi (A1)",
"languageLevelA2": "Hasiberri Altua (A2)",
"languageLevelB1": "Ertain Ertaina (B1)",
"languageLevelB2": "Aurreratu Baxua (B2)",
"languageLevelC1": "Aurreratu Ertaina (C1)",
"languageLevelC2": "Goren (C2)",
"changeTheNameOfTheClass": "Aldatu izena",
"changeTheNameOfTheChat": "Aldatu txateatzen denaren izena",
"askPangeaBot": "Galdetu Pangea Bot-i testuinguruko definizio bat.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:30:57.998791",
"@@last_modified": "2025-11-04 13:35:09.159097",
"repeatPassword": "تکرار رمزعبور",
"@repeatPassword": {},
"about": "درباره",
@ -2851,13 +2851,13 @@
"iWantALanguagePartnerWhoIsLearning": "در حال یادگیری:",
"joinWithClassCode": "پیوستن به دوره",
"joinWithClassCodeHint": "کد دعوت را وارد کنید",
"languageLevelPreA1": "مبتدی مطلق (پیش A1)",
"languageLevelA1": "مبتدی (A1)",
"languageLevelA2": "مقدماتی (A2)",
"languageLevelB1": "متوسط (B1)",
"languageLevelB2": "متوسط رو به بالا (B2)",
"languageLevelC1": "پیشرفته (C1)",
"languageLevelC2": "استادی (C2)",
"languageLevelPreA1": "نوآموز پایین (پیش A1)",
"languageLevelA1": "نوآموز میانه (A1)",
"languageLevelA2": "مبتدی بالا (A2)",
"languageLevelB1": "متوسطه میانه (B1)",
"languageLevelB2": "پیشرفته پایین (B2)",
"languageLevelC1": "پیشرفته میانه (C1)",
"languageLevelC2": "عالی (C2)",
"changeTheNameOfTheClass": "تغییر نام",
"changeTheNameOfTheChat": "تغییر نام چت",
"askPangeaBot": "از ربات پانگئا برای تعریف متنی درخواست کنید.",

View file

@ -2931,13 +2931,13 @@
"iWantALanguagePartnerWhoIsLearning": "Oppii:",
"joinWithClassCode": "Liity kurssille",
"joinWithClassCodeHint": "Syötä kutsukoodi",
"languageLevelPreA1": "Tosi aloitteleva (Pre A1)",
"languageLevelA1": "Alkeistaso (A1)",
"languageLevelA2": "Perustaso (A2)",
"languageLevelB1": "Keskitaso (B1)",
"languageLevelB2": "Yläkeskitaso (B2)",
"languageLevelC1": "Edistynyt (C1)",
"languageLevelC2": "Mestaritaito (C2)",
"languageLevelPreA1": "Aloittelija Matala (Pre A1)",
"languageLevelA1": "Aloittelija Keskitaso (A1)",
"languageLevelA2": "Aloittelija Korkea (A2)",
"languageLevelB1": "Keskitaso Keskiväli (B1)",
"languageLevelB2": "Korkea Alhainen (B2)",
"languageLevelC1": "Korkea Keskiväli (C1)",
"languageLevelC2": "Erinomainen (C2)",
"changeTheNameOfTheClass": "Vaihda nimi",
"changeTheNameOfTheChat": "Vaihda keskustelun nimi",
"askPangeaBot": "Kysy Pangea Botilta kontekstuaalista määritelmää.",
@ -4512,7 +4512,7 @@
"playWithAI": "Leiki tekoälyn kanssa nyt",
"courseStartDesc": "Pangea Bot on valmis milloin tahansa!\n\n...mutta oppiminen on parempaa ystävien kanssa!",
"@@locale": "fi",
"@@last_modified": "2025-10-16 13:31:00.370211",
"@@last_modified": "2025-11-04 13:33:40.930239",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1697,13 +1697,13 @@
"iWantALanguagePartnerWhoIsLearning": "Nagtututo:",
"joinWithClassCode": "Sumali sa kurso",
"joinWithClassCodeHint": "Ilagay ang invite code",
"languageLevelPreA1": "Tunay na Nagsisimula (Pre A1)",
"languageLevelA1": "Nagsisimula (A1)",
"languageLevelA2": "Pang-Elementary (A2)",
"languageLevelB1": "Intermediate (B1)",
"languageLevelB2": "Upper Intermediate (B2)",
"languageLevelC1": "Advanced (C1)",
"languageLevelC2": "Mastery (C2)",
"languageLevelPreA1": "Baguhan Mababa (Pre A1)",
"languageLevelA1": "Baguhang Mid (A1)",
"languageLevelA2": "Baguhan Mataas (A2)",
"languageLevelB1": "Katamtamang Gitna (B1)",
"languageLevelB2": "Advanced Mababa (B2)",
"languageLevelC1": "Advanced Gitna (C1)",
"languageLevelC2": "Superyor (C2)",
"changeTheNameOfTheClass": "Palitan ang pangalan",
"changeTheNameOfTheChat": "Palitan ang pangalan ng chat",
"askPangeaBot": "Magtanong kay Pangea Bot para sa isang kontekstuwal na depinisyon.",
@ -3272,7 +3272,7 @@
"selectAll": "Piliin lahat",
"deselectAll": "Huwag piliin lahat",
"@@locale": "fil",
"@@last_modified": "2025-10-16 13:31:03.387348",
"@@last_modified": "2025-11-04 13:34:38.274191",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}

View file

@ -1,6 +1,6 @@
{
"@@locale": "fr",
"@@last_modified": "2025-10-16 13:31:05.366693",
"@@last_modified": "2025-11-04 13:35:41.866867",
"about": "À propos",
"@about": {
"type": "String",
@ -3261,13 +3261,13 @@
"iWantALanguagePartnerWhoIsLearning": "Apprend :",
"joinWithClassCode": "Rejoindre le cours",
"joinWithClassCodeHint": "Entrez le code d'invitation",
"languageLevelPreA1": "Vrai Débutant (Pre A1)",
"languageLevelA1": "Débutant (A1)",
"languageLevelA2": "Élémentaire (A2)",
"languageLevelB1": "Intermédiaire (B1)",
"languageLevelB2": "Intermédiaire supérieur (B2)",
"languageLevelC1": "Avancé (C1)",
"languageLevelC2": "Maîtrise (C2)",
"languageLevelPreA1": "Novice Bas (Pré A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice élevé (A2)",
"languageLevelB1": "Intermédiaire moyen (B1)",
"languageLevelB2": "Avancé faible (B2)",
"languageLevelC1": "Avancé moyen (C1)",
"languageLevelC2": "Supérieur (C2)",
"changeTheNameOfTheClass": "Changer le nom",
"changeTheNameOfTheChat": "Changer le nom du chat",
"askPangeaBot": "Demandez à Pangea Bot une définition contextuelle.",

View file

@ -3439,13 +3439,13 @@
"iWantALanguagePartnerWhoIsLearning": "Ag foghlaim:",
"joinWithClassCode": "Cláraigh leis an gcód rang",
"joinWithClassCodeHint": "Cuir isteach an cód cuireadh",
"languageLevelPreA1": "Tús Mór (Pre A1)",
"languageLevelA1": "Tús Mór (A1)",
"languageLevelA2": "Bunúsach (A2)",
"languageLevelB1": "Meánleibhéal (B1)",
"languageLevelB2": "Meánleibhéal Uachtarach (B2)",
"languageLevelC1": "Ceadúnas Ardleibhéil (C1)",
"languageLevelC2": "Foirfeacht (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Tosaitheoir Ard (A2)",
"languageLevelB1": "Idirmheánach Lár (B1)",
"languageLevelB2": "Ard Íseal (B2)",
"languageLevelC1": "Ard Lár (C1)",
"languageLevelC2": "Sár (C2)",
"changeTheNameOfTheClass": "Athraigh an t-ainm",
"changeTheNameOfTheChat": "Athraigh ainm an chomhrá",
"askPangeaBot": "Iarr ar Pangea Bot le sainmhíniú comhthéacsúil.",
@ -4998,7 +4998,7 @@
"playWithAI": "Imir le AI faoi láthair",
"courseStartDesc": "Tá Bot Pangea réidh chun dul am ar bith!\n\n...ach is fearr foghlaim le cairde!",
"@@locale": "ga",
"@@last_modified": "2025-10-16 13:31:08.161200",
"@@last_modified": "2025-11-04 13:35:39.442358",
"@customReaction": {
"type": "String",
"placeholders": {}

View file

@ -1,6 +1,6 @@
{
"@@locale": "gl",
"@@last_modified": "2025-10-16 13:31:10.613939",
"@@last_modified": "2025-11-04 13:33:37.429308",
"about": "Acerca de",
"@about": {
"type": "String",
@ -3432,13 +3432,13 @@
"iWantALanguagePartnerWhoIsLearning": "Está a aprender:",
"joinWithClassCode": "Unirse ao curso",
"joinWithClassCodeHint": "Introduce o código de invitación",
"languageLevelPreA1": "Principiante verdadeiro (Pre A1)",
"languageLevelA1": "Principiante (A1)",
"languageLevelA2": "Elemental (A2)",
"languageLevelB1": "Intermedio (B1)",
"languageLevelB2": "Nivel avanzado (B2)",
"languageLevelC1": "Avanzado (C1)",
"languageLevelC2": "Maestría (C2)",
"languageLevelPreA1": "Novato Baixo (Pre A1)",
"languageLevelA1": "Novato Medio (A1)",
"languageLevelA2": "Novato Alto (A2)",
"languageLevelB1": "Intermedio Medio (B1)",
"languageLevelB2": "Avanzado Baixo (B2)",
"languageLevelC1": "Avanzado Medio (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Cambiar o nome",
"changeTheNameOfTheChat": "Cambiar o nome do chat",
"askPangeaBot": "Pregunte ao Pangea Bot por unha definición contextual.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:12.984526",
"@@last_modified": "2025-11-04 13:33:59.135039",
"about": "אודות",
"@about": {
"type": "String",
@ -2017,13 +2017,13 @@
"iWantALanguagePartnerWhoIsLearning": "לומד:",
"joinWithClassCode": "הצטרף לקורס",
"joinWithClassCodeHint": "הזן קוד הזמנה",
"languageLevelPreA1": "מתחיל אמיתי (Pre A1)",
"languageLevelA1": "מתחיל (A1)",
"languageLevelA2": "יסודי (A2)",
"languageLevelB1": "בינוני (B1)",
"languageLevelB2": "בינוני עליון (B2)",
"languageLevelC1": "מתקדם (C1)",
"languageLevelC2": "שליטה (C2)",
"languageLevelPreA1": "מתחיל נמוך (פרה A1)",
"languageLevelA1": "מתחיל בינוני (A1)",
"languageLevelA2": "מתחיל גבוה (A2)",
"languageLevelB1": "בינוני בינוני (B1)",
"languageLevelB2": "מתקדם נמוך (B2)",
"languageLevelC1": "מתקדם בינוני (C1)",
"languageLevelC2": "מעל (C2)",
"changeTheNameOfTheClass": "שנה את השם",
"changeTheNameOfTheChat": "שנה את שם הצ'אט",
"askPangeaBot": "שאל את בוט פנגיאה להגדרה הקשרית.",

View file

@ -3405,13 +3405,13 @@
"iWantALanguagePartnerWhoIsLearning": "सीख रहा है:",
"joinWithClassCode": "कोर्स में शामिल हों",
"joinWithClassCodeHint": "आमंत्रण कोड दर्ज करें",
"languageLevelPreA1": "सच्चा शुरुआतकर्ता (Pre A1)",
"languageLevelA1": "शुरुआती (A1)",
"languageLevelA2": "मूलभूत (A2)",
"languageLevelB1": "मध्यम (B1)",
"languageLevelB2": "उच्च मध्यम (B2)",
"languageLevelC1": "उन्नत (C1)",
"languageLevelC2": "माहिर (C2)",
"languageLevelPreA1": "नवीनतम निम्न (पूर्व A1)",
"languageLevelA1": "नवोदित मध्य (A1)",
"languageLevelA2": "नवीन उच्च (A2)",
"languageLevelB1": "मध्यम मध्य (B1)",
"languageLevelB2": "उन्नत निम्न (B2)",
"languageLevelC1": "उन्नत मध्य (C1)",
"languageLevelC2": "श्रेष्ठ (C2)",
"changeTheNameOfTheClass": "नाम बदलें",
"changeTheNameOfTheChat": "चैट का नाम बदलें",
"askPangeaBot": "पांगेआ बॉट से संदर्भात्मक परिभाषा पूछें।",
@ -4964,7 +4964,7 @@
"playWithAI": "अभी के लिए एआई के साथ खेलें",
"courseStartDesc": "पैंजिया बॉट कभी भी जाने के लिए तैयार है!\n\n...लेकिन दोस्तों के साथ सीखना बेहतर है!",
"@@locale": "hi",
"@@last_modified": "2025-10-16 13:31:15.251036",
"@@last_modified": "2025-11-04 13:35:23.970994",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hr",
"@@last_modified": "2025-10-16 13:31:18.226992",
"@@last_modified": "2025-11-04 13:33:57.394567",
"about": "Informacije",
"@about": {
"type": "String",
@ -3187,13 +3187,13 @@
"iWantALanguagePartnerWhoIsLearning": "Uči:",
"joinWithClassCode": "Pridruži se tečaju",
"joinWithClassCodeHint": "Unesite pozivni kod",
"languageLevelPreA1": "Potpuni početnik (Pre A1)",
"languageLevelA1": "Početnik (A1)",
"languageLevelA2": "Osnovno (A2)",
"languageLevelB1": "Srednja razina (B1)",
"languageLevelB2": "Viša srednja razina (B2)",
"languageLevelC1": "Napredno (C1)",
"languageLevelC2": "Majstorski (C2)",
"languageLevelPreA1": "Novak Nizak (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Početni Visoki (A2)",
"languageLevelB1": "Srednji Srednji (B1)",
"languageLevelB2": "Napredni Niski (B2)",
"languageLevelC1": "Napredni Srednji (C1)",
"languageLevelC2": "Superiorni (C2)",
"changeTheNameOfTheClass": "Promijeni ime",
"changeTheNameOfTheChat": "Promijeni ime chata",
"askPangeaBot": "Pitaj Pangea Bota za kontekstualnu definiciju.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "hu",
"@@last_modified": "2025-10-16 13:31:20.947240",
"@@last_modified": "2025-11-04 13:33:45.709926",
"about": "Névjegy",
"@about": {
"type": "String",
@ -3431,13 +3431,13 @@
"iWantALanguagePartnerWhoIsLearning": "Tanul:",
"joinWithClassCode": "Csatlakozás kurzushoz",
"joinWithClassCodeHint": "Írja be a meghívókódot",
"languageLevelPreA1": "Igazi kezdő (Pre A1)",
"languageLevelA1": "Kezdő (A1)",
"languageLevelA2": "Alapfok (A2)",
"languageLevelB1": "Középhaladó (B1)",
"languageLevelB2": "Felsőközéphaladó (B2)",
"languageLevelC1": "Haladó (C1)",
"languageLevelC2": "Mesterfokú (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Kezdő Magas (A2)",
"languageLevelB1": "Középfok Közepes (B1)",
"languageLevelB2": "Felsőfok Alacsony (B2)",
"languageLevelC1": "Felsőfok Közepes (C1)",
"languageLevelC2": "Kiváló (C2)",
"changeTheNameOfTheClass": "Név módosítása",
"changeTheNameOfTheChat": "A chat nevének módosítása",
"askPangeaBot": "Kérdezze meg a Pangea Botot egy kontextuális meghatározásért.",

View file

@ -880,13 +880,13 @@
"iWantALanguagePartnerWhoIsLearning": "Est in le processo de apprender:",
"joinWithClassCode": "Joinar le curso",
"joinWithClassCodeHint": "Entera le codice de invito",
"languageLevelPreA1": "Principiante vermente (Pre A1)",
"languageLevelA1": "Principiante (A1)",
"languageLevelA2": "Elementari (A2)",
"languageLevelB1": "Intermedie (B1)",
"languageLevelB2": "Superiore intermedie (B2)",
"languageLevelC1": "Avanzate (C1)",
"languageLevelC2": "Maestria (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice High (A2)",
"languageLevelB1": "Intermediate Mid (B1)",
"languageLevelB2": "Advanced Low (B2)",
"languageLevelC1": "Advanced Mid (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Changear le nomine",
"changeTheNameOfTheChat": "Changear le nomine del chat",
"askPangeaBot": "Questiona Pangea Bot pro un definition contextual.",
@ -2439,7 +2439,7 @@
"playWithAI": "Joca con le IA pro ora",
"courseStartDesc": "Pangea Bot es preste a comenzar a qualunque momento!\n\n...ma apprender es melior con amicos!",
"@@locale": "ia",
"@@last_modified": "2025-10-16 13:31:23.726766",
"@@last_modified": "2025-11-04 13:34:01.175577",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:25.902157",
"@@last_modified": "2025-11-04 13:33:48.096891",
"setAsCanonicalAlias": "Atur sebagai alias utama",
"@setAsCanonicalAlias": {
"type": "String",
@ -3433,13 +3433,13 @@
"iWantALanguagePartnerWhoIsLearning": "Sedang belajar:",
"joinWithClassCode": "Gabung kursus",
"joinWithClassCodeHint": "Masukkan kode undangan",
"languageLevelPreA1": "Pemula Sejati (Pre A1)",
"languageLevelA1": "Pemula (A1)",
"languageLevelA2": "Dasar (A2)",
"languageLevelB1": "Menengah (B1)",
"languageLevelB2": "Menengah Atas (B2)",
"languageLevelC1": "Lanjutan (C1)",
"languageLevelC2": "Penguasaan (C2)",
"languageLevelPreA1": "Pemula Rendah (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Pemula Tinggi (A2)",
"languageLevelB1": "Menengah Sedang (B1)",
"languageLevelB2": "Lanjutan Rendah (B2)",
"languageLevelC1": "Lanjutan Sedang (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Ubah nama",
"changeTheNameOfTheChat": "Ubah nama obrolan",
"askPangeaBot": "Tanyakan Pangea Bot untuk definisi kontekstual.",

View file

@ -3294,13 +3294,13 @@
"iWantALanguagePartnerWhoIsLearning": "Es in apprendage:",
"joinWithClassCode": "Joinar al curso",
"joinWithClassCodeHint": "Entera le codice de invitation",
"languageLevelPreA1": "Vermente Novice (Pre A1)",
"languageLevelA1": "Novice (A1)",
"languageLevelA2": "Elementari (A2)",
"languageLevelB1": "Intermedie (B1)",
"languageLevelB2": "Superiore Intermedie (B2)",
"languageLevelC1": "Avanzate (C1)",
"languageLevelC2": "Maestria (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice High (A2)",
"languageLevelB1": "Intermediate Mid (B1)",
"languageLevelB2": "Advanced Low (B2)",
"languageLevelC1": "Advanced Mid (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Cambiar le nomine",
"changeTheNameOfTheChat": "Cambiar le nomine del chat",
"askPangeaBot": "Dumanda Pangea Bot por un definition contextual.",
@ -4853,7 +4853,7 @@
"playWithAI": "Joca con AI pro ora",
"courseStartDesc": "Pangea Bot es preste a partir a qualunque momento!\n\n...ma apprender es melior con amicos!",
"@@locale": "ie",
"@@last_modified": "2025-10-16 13:31:28.322202",
"@@last_modified": "2025-11-04 13:33:55.367913",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:31.204302",
"@@last_modified": "2025-11-04 13:34:19.072263",
"about": "Informazioni",
"@about": {
"type": "String",
@ -3410,13 +3410,13 @@
"iWantALanguagePartnerWhoIsLearning": "Sta imparando:",
"joinWithClassCode": "Unisciti al corso",
"joinWithClassCodeHint": "Inserisci il codice di invito",
"languageLevelPreA1": "Principiante assoluto (Pre A1)",
"languageLevelA1": "Principiante (A1)",
"languageLevelA2": "Elementare (A2)",
"languageLevelB1": "Intermedio (B1)",
"languageLevelB2": "Intermedio superiore (B2)",
"languageLevelC1": "Avanzato (C1)",
"languageLevelC2": "Padronanza (C2)",
"languageLevelPreA1": "Principiante Basso (Pre A1)",
"languageLevelA1": "Novizio Mid (A1)",
"languageLevelA2": "Principiante Alto (A2)",
"languageLevelB1": "Intermedio Medio (B1)",
"languageLevelB2": "Avanzato Basso (B2)",
"languageLevelC1": "Avanzato Medio (C1)",
"languageLevelC2": "Superiore (C2)",
"changeTheNameOfTheClass": "Cambia il nome",
"changeTheNameOfTheChat": "Cambia il nome della chat",
"askPangeaBot": "Chiedi a Pangea Bot una definizione contestuale.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "ja",
"@@last_modified": "2025-10-16 13:31:33.790667",
"@@last_modified": "2025-11-04 13:35:21.867810",
"about": "このアプリについて",
"@about": {
"type": "String",
@ -2774,13 +2774,13 @@
"iWantALanguagePartnerWhoIsLearning": "学習中の言語:",
"joinWithClassCode": "コースに参加",
"joinWithClassCodeHint": "招待コードを入力してください",
"languageLevelPreA1": "初心者Pre A1",
"languageLevelA1": "初A1",
"languageLevelA2": "初中級A2",
"languageLevelB1": "中級B1",
"languageLevelB2": "上級中級B2",
"languageLevelC1": "上級C1",
"languageLevelC2": "熟練C2",
"languageLevelPreA1": "初心者低 (プレA1)",
"languageLevelA1": "初心者ミッド (A1)",
"languageLevelA2": "初級高 (A2)",
"languageLevelB1": "中級中 (B1)",
"languageLevelB2": "上級低 (B2)",
"languageLevelC1": "上級中 (C1)",
"languageLevelC2": "最上級 (C2)",
"changeTheNameOfTheClass": "名前を変更",
"changeTheNameOfTheChat": "チャットの名前を変更",
"askPangeaBot": "Pangea Botにコンテキスト定義を尋ねる。",

View file

@ -1516,13 +1516,13 @@
"iWantALanguagePartnerWhoIsLearning": "სწავლობს:",
"joinWithClassCode": "შეერთება კურსში",
"joinWithClassCodeHint": "შეიყვანეთ მოწვევის კოდი",
"languageLevelPreA1": "სინამდვილე დამწყები (Pre A1)",
"languageLevelA1": "დამწყები (A1)",
"languageLevelA2": "საშუალო (A2)",
"languageLevelB1": "შუალედური (B1)",
"languageLevelB2": "ზედა შუალედური (B2)",
"languageLevelC1": "მაღალი დონის (C1)",
"languageLevelC2": "მასტერული (C2)",
"languageLevelPreA1": "ახალი დაბალი (წინა A1)",
"languageLevelA1": "ახალი შუა (A1)",
"languageLevelA2": "დაწყებითი მაღალი (A2)",
"languageLevelB1": "შუალედური საშუალო (B1)",
"languageLevelB2": "წინასწარი დაბალი (B2)",
"languageLevelC1": "წინასწარი საშუალო (C1)",
"languageLevelC2": "მაღლესი (C2)",
"changeTheNameOfTheClass": "შეცვალეთ კლასი",
"changeTheNameOfTheChat": "შეცვალეთ ჩატის სახელი",
"askPangeaBot": "მოითხოვეთ Pangea Bot-გან კონტექსტუალური განმარტება.",
@ -3075,7 +3075,7 @@
"playWithAI": "ამ დროისთვის ითამაშეთ AI-თან",
"courseStartDesc": "Pangea Bot მზადაა ნებისმიერ დროს გასასვლელად!\n\n...მაგრამ სწავლა უკეთესია მეგობრებთან ერთად!",
"@@locale": "ka",
"@@last_modified": "2025-10-16 13:31:36.334482",
"@@last_modified": "2025-11-04 13:35:34.501028",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:39.341446",
"@@last_modified": "2025-11-04 13:33:33.344908",
"about": "소개",
"@about": {
"type": "String",
@ -3367,13 +3367,13 @@
"iWantALanguagePartnerWhoIsLearning": "학습 중인 언어:",
"joinWithClassCode": "수업 참여",
"joinWithClassCodeHint": "초대 코드를 입력하세요",
"languageLevelPreA1": "초보자 (Pre A1)",
"languageLevelA1": "초급 (A1)",
"languageLevelA2": "초급 (A2)",
"languageLevelB1": "중급 (B1)",
"languageLevelB2": "상급 중급 (B2)",
"languageLevelC1": "고급 (C1)",
"languageLevelC2": "숙달 (C2)",
"languageLevelPreA1": "초급 낮음 (Pre A1)",
"languageLevelA1": "초급 중급 (A1)",
"languageLevelA2": "초급 고급 (A2)",
"languageLevelB1": "중급 (B1)",
"languageLevelB2": "고급 저 (B2)",
"languageLevelC1": "고급 (C1)",
"languageLevelC2": "우수 (C2)",
"changeTheNameOfTheClass": "이름 변경",
"changeTheNameOfTheChat": "채팅 이름 변경",
"askPangeaBot": "Pangea Bot에게 맥락에 맞는 정의를 요청하세요.",

View file

@ -2783,13 +2783,13 @@
"iWantALanguagePartnerWhoIsLearning": "Mokosi:",
"joinWithClassCode": "Prisijungti prie kurso",
"joinWithClassCodeHint": "Įveskite kvietimo kodą",
"languageLevelPreA1": "Tikras pradedantysis (Pre A1)",
"languageLevelA1": "Pradedantysis (A1)",
"languageLevelA2": "Pradedantysis (A2)",
"languageLevelB1": "Tarpinis (B1)",
"languageLevelB2": "Aukštesnysis tarpinis (B2)",
"languageLevelC1": "Pažengęs (C1)",
"languageLevelC2": "Meistrystė (C2)",
"languageLevelPreA1": "Pradedantysis Žemas (Pre A1)",
"languageLevelA1": "Pradedančiojo vidurinis (A1)",
"languageLevelA2": "Pradedančiųjų aukštas (A2)",
"languageLevelB1": "Vidutinio lygio vidurys (B1)",
"languageLevelB2": "Išplėstinis žemas (B2)",
"languageLevelC1": "Išplėstinis vidurys (C1)",
"languageLevelC2": "Pats aukščiausias (C2)",
"changeTheNameOfTheClass": "Pakeisti pavadinimą",
"changeTheNameOfTheChat": "Pakeisti pokalbio pavadinimą",
"askPangeaBot": "Paklausk Pangea bot'o apie kontekstinę apibrėžimą.",
@ -4342,7 +4342,7 @@
"playWithAI": "Žaiskite su dirbtiniu intelektu dabar",
"courseStartDesc": "Pangea botas pasiruošęs bet kada pradėti!\n\n...bet mokymasis yra geresnis su draugais!",
"@@locale": "lt",
"@@last_modified": "2025-10-16 13:31:41.724130",
"@@last_modified": "2025-11-04 13:34:52.927239",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -3419,13 +3419,13 @@
"iWantALanguagePartnerWhoIsLearning": "Mācās:",
"joinWithClassCode": "Pievienoties kursam",
"joinWithClassCodeHint": "Ievadiet ielūguma kodu",
"languageLevelPreA1": "Ļoti iesācējs (Pre A1)",
"languageLevelA1": "Iesācējs (A1)",
"languageLevelA2": "Pamatskolas līmenis (A2)",
"languageLevelB1": "Vidējais līmenis (B1)",
"languageLevelB2": "Augstā vidējā līmenī (B2)",
"languageLevelC1": "Uzlabots (C1)",
"languageLevelC2": "Meistarība (C2)",
"languageLevelPreA1": "Sākuma līmenis Zems (Pre A1)",
"languageLevelA1": "Jaunais Vidējais (A1)",
"languageLevelA2": "Sākuma augstums (A2)",
"languageLevelB1": "Vidējais vidus (B1)",
"languageLevelB2": "Augstais zems (B2)",
"languageLevelC1": "Augstais vidus (C1)",
"languageLevelC2": "Augstākais (C2)",
"changeTheNameOfTheClass": "Mainīt nosaukumu",
"changeTheNameOfTheChat": "Mainīt čata nosaukumu",
"askPangeaBot": "Uzdod Pangea botam jautājumu par kontekstualizētu definīciju.",
@ -4958,7 +4958,7 @@
"playWithAI": "Tagad spēlējiet ar AI",
"courseStartDesc": "Pangea bots ir gatavs jebkurā laikā!\n\n...bet mācīties ir labāk ar draugiem!",
"@@locale": "lv",
"@@last_modified": "2025-10-16 13:31:44.701808",
"@@last_modified": "2025-11-04 13:34:40.949441",
"analyticsInactiveTitle": "Pieprasījumi neaktīviem lietotājiem nevar tikt nosūtīti",
"analyticsInactiveDesc": "Neaktīvi lietotāji, kuri nav pieteikušies kopš šīs funkcijas ieviešanas, neredzēs jūsu pieprasījumu.\n\nPieprasījuma poga parādīsies, kad viņi atgriezīsies. Jūs varat atkārtoti nosūtīt pieprasījumu vēlāk, noklikšķinot uz pieprasījuma pogas viņu vārdā, kad tā būs pieejama.",
"accessRequestedTitle": "Pieprasījums piekļūt analītikai",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:46.932073",
"@@last_modified": "2025-11-04 13:34:26.297705",
"about": "Om",
"@about": {
"type": "String",
@ -2346,13 +2346,13 @@
"iWantALanguagePartnerWhoIsLearning": "Lærer:",
"joinWithClassCode": "Bli med i kurs",
"joinWithClassCodeHint": "Skriv inn invitasjonskode",
"languageLevelPreA1": "Reell nybegynner (Pre A1)",
"languageLevelA1": "Nybegynner (A1)",
"languageLevelA2": "Elementært (A2)",
"languageLevelB1": "Middels (B1)",
"languageLevelB2": "Øvre middels (B2)",
"languageLevelC1": "Avansert (C1)",
"languageLevelC2": "Mestring (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Nybegynner Høy (A2)",
"languageLevelB1": "Moderat Mid (B1)",
"languageLevelB2": "Avansert Lav (B2)",
"languageLevelC1": "Avansert Mid (C1)",
"languageLevelC2": "Overlegen (C2)",
"changeTheNameOfTheClass": "Endre navnet",
"changeTheNameOfTheChat": "Endre navnet på chatten",
"askPangeaBot": "Spør Pangea Bot om en kontekstuell definisjon.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:49.093821",
"@@last_modified": "2025-11-04 13:34:59.239403",
"about": "Over ons",
"@about": {
"type": "String",
@ -3430,13 +3430,13 @@
"iWantALanguagePartnerWhoIsLearning": "Leren:",
"joinWithClassCode": "Deelname via cursuscode",
"joinWithClassCodeHint": "Voer uitnodigingscode in",
"languageLevelPreA1": "Echte Beginner (Pre A1)",
"languageLevelA1": "Beginner (A1)",
"languageLevelA2": "Elementair (A2)",
"languageLevelB1": "Intermediate (B1)",
"languageLevelB2": "Upper Intermediate (B2)",
"languageLevelC1": "Gevorderd (C1)",
"languageLevelC2": "Meesterschap (C2)",
"languageLevelPreA1": "Novice Laag (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Beginners Hoog (A2)",
"languageLevelB1": "Gemiddeld Midden (B1)",
"languageLevelB2": "Geavanceerd Laag (B2)",
"languageLevelC1": "Geavanceerd Midden (C1)",
"languageLevelC2": "Superieur (C2)",
"changeTheNameOfTheClass": "Verander de naam",
"changeTheNameOfTheChat": "Verander de naam van de chat",
"askPangeaBot": "Vraag Pangea Bot om een contextuele definitie.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "pl",
"@@last_modified": "2025-10-16 13:31:52.022877",
"@@last_modified": "2025-11-04 13:35:11.553191",
"about": "O aplikacji",
"@about": {
"type": "String",
@ -3431,13 +3431,13 @@
"iWantALanguagePartnerWhoIsLearning": "Uczy się:",
"joinWithClassCode": "Dołącz do kursu",
"joinWithClassCodeHint": "Wprowadź kod zaproszenia",
"languageLevelPreA1": "Prawdziwy początkujący (Pre A1)",
"languageLevelA1": "Początkujący (A1)",
"languageLevelA2": "Podstawowy (A2)",
"languageLevelB1": "Średniozaawansowany (B1)",
"languageLevelB2": "Wyższy średniozaawansowany (B2)",
"languageLevelC1": "Zaawansowany (C1)",
"languageLevelC2": "Mistrzostwo (C2)",
"languageLevelPreA1": "Nowicjusz Niski (Pre A1)",
"languageLevelA1": "Nowicjusz Środkowy (A1)",
"languageLevelA2": "Nowicjusz Wysoki (A2)",
"languageLevelB1": "Średniozaawansowany Średni (B1)",
"languageLevelB2": "Zaawansowany Niski (B2)",
"languageLevelC1": "Zaawansowany Średni (C1)",
"languageLevelC2": "Wyższy (C2)",
"changeTheNameOfTheClass": "Zmień nazwę",
"changeTheNameOfTheChat": "Zmień nazwę czatu",
"askPangeaBot": "Zapytaj Pangea Bot o kontekstową definicję.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:54.004418",
"@@last_modified": "2025-11-04 13:34:07.487948",
"copiedToClipboard": "Copiada para a área de transferência",
"@copiedToClipboard": {
"type": "String",
@ -3421,13 +3421,13 @@
"iWantALanguagePartnerWhoIsLearning": "Está aprendendo:",
"joinWithClassCode": "Participar do curso",
"joinWithClassCodeHint": "Digite o código de convite",
"languageLevelPreA1": "Total Iniciante (Pré A1)",
"languageLevelA1": "Iniciante (A1)",
"languageLevelA2": "Elementar (A2)",
"languageLevelB1": "Intermediário (B1)",
"languageLevelB2": "Intermediário Superior (B2)",
"languageLevelC1": "Avançado (C1)",
"languageLevelC2": "Mestria (C2)",
"languageLevelPreA1": "Iniciante Baixo (Pré A1)",
"languageLevelA1": "Novato Mid (A1)",
"languageLevelA2": "Iniciante Alto (A2)",
"languageLevelB1": "Intermediário Médio (B1)",
"languageLevelB2": "Avançado Baixo (B2)",
"languageLevelC1": "Avançado Médio (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Alterar o nome",
"changeTheNameOfTheChat": "Alterar o nome do chat",
"askPangeaBot": "Peça ao Pangea Bot uma definição contextual.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:31:56.112352",
"@@last_modified": "2025-11-04 13:34:03.353415",
"about": "Sobre",
"@about": {
"type": "String",
@ -3178,13 +3178,13 @@
"iWantALanguagePartnerWhoIsLearning": "Está aprendendo:",
"joinWithClassCode": "Participar do curso",
"joinWithClassCodeHint": "Digite o código de convite",
"languageLevelPreA1": "Total Iniciante (Pré A1)",
"languageLevelA1": "Iniciante (A1)",
"languageLevelA2": "Elementar (A2)",
"languageLevelB1": "Intermediário (B1)",
"languageLevelB2": "Intermediário Avançado (B2)",
"languageLevelC1": "Avançado (C1)",
"languageLevelC2": "Mestria (C2)",
"languageLevelPreA1": "Novato Baixo (Pré A1)",
"languageLevelA1": "Novato Médio (A1)",
"languageLevelA2": "Iniciante Alto (A2)",
"languageLevelB1": "Intermediário Médio (B1)",
"languageLevelB2": "Avançado Baixo (B2)",
"languageLevelC1": "Avançado Médio (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Alterar o nome",
"changeTheNameOfTheChat": "Alterar o nome do chat",
"askPangeaBot": "Pergunte ao Pangea Bot por uma definição contextual.",

View file

@ -2241,13 +2241,13 @@
"iWantALanguagePartnerWhoIsLearning": "Está a aprender:",
"joinWithClassCode": "Juntar-se ao curso",
"joinWithClassCodeHint": "Inserir código de convite",
"languageLevelPreA1": "Iniciante Verdadeiro (Pré A1)",
"languageLevelA1": "Principiante (A1)",
"languageLevelA2": "Elementar (A2)",
"languageLevelB1": "Intermediário (B1)",
"languageLevelB2": "Intermediário Superior (B2)",
"languageLevelC1": "Avançado (C1)",
"languageLevelC2": "Domínio (C2)",
"languageLevelPreA1": "Iniciante Baixo (Pré A1)",
"languageLevelA1": "Novato Mid (A1)",
"languageLevelA2": "Iniciante Alto (A2)",
"languageLevelB1": "Intermediário Médio (B1)",
"languageLevelB2": "Avançado Baixo (B2)",
"languageLevelC1": "Avançado Médio (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Alterar o nome",
"changeTheNameOfTheChat": "Alterar o nome do chat",
"askPangeaBot": "Peça ao Pangea Bot uma definição contextual.",
@ -3816,7 +3816,7 @@
"selectAll": "Selecionar tudo",
"deselectAll": "Desmarcar tudo",
"@@locale": "pt_PT",
"@@last_modified": "2025-10-16 13:31:58.159625",
"@@last_modified": "2025-11-04 13:34:34.127034",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:32:00.774739",
"@@last_modified": "2025-11-04 13:33:50.681488",
"about": "Despre",
"@about": {
"type": "String",
@ -2850,13 +2850,13 @@
"iWantALanguagePartnerWhoIsLearning": "Învățând:",
"joinWithClassCode": "Participă la curs",
"joinWithClassCodeHint": "Introduceți codul de invitație",
"languageLevelPreA1": "Începător adevărat (Pre A1)",
"languageLevelA1": "Începător (A1)",
"languageLevelA2": "Elementar (A2)",
"languageLevelB1": "Intermediar (B1)",
"languageLevelB2": "Upper Intermediate (B2)",
"languageLevelC1": "Avansat (C1)",
"languageLevelC2": "Maestru (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Novice Înalt (A2)",
"languageLevelB1": "Intermediar Mediu (B1)",
"languageLevelB2": "Avansat Scăzut (B2)",
"languageLevelC1": "Avansat Mediu (C1)",
"languageLevelC2": "Superior (C2)",
"changeTheNameOfTheClass": "Schimbă numele",
"changeTheNameOfTheChat": "Schimbă numele chat-ului",
"askPangeaBot": "Întreabă Pangea Bot pentru o definiție contextuală.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "ru",
"@@last_modified": "2025-10-16 13:32:02.970247",
"@@last_modified": "2025-11-04 13:35:28.162026",
"about": "О проекте",
"@about": {
"type": "String",
@ -3369,13 +3369,13 @@
"iWantALanguagePartnerWhoIsLearning": "Учится:",
"joinWithClassCode": "Присоединиться к курсу",
"joinWithClassCodeHint": "Введите код приглашения",
"languageLevelPreA1": "Настоящий новичок (Pre A1)",
"languageLevelA1": "Начинающий (A1)",
"languageLevelA2": "Элементарный (A2)",
"languageLevelB1": "Средний (B1)",
"languageLevelB2": "Выше среднего (B2)",
"languageLevelC1": "Продвинутый (C1)",
"languageLevelC2": "Мастерство (C2)",
"languageLevelPreA1": "Новичок Низкий (Pre A1)",
"languageLevelA1": "Новичок Мид (A1)",
"languageLevelA2": "Начальный высокий (A2)",
"languageLevelB1": "Средний средний (B1)",
"languageLevelB2": "Продвинутый низкий (B2)",
"languageLevelC1": "Продвинутый средний (C1)",
"languageLevelC2": "Высший (C2)",
"changeTheNameOfTheClass": "Изменить название",
"changeTheNameOfTheChat": "Изменить название чата",
"askPangeaBot": "Попросите Pangea Bot дать контекстное определение.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "sk",
"@@last_modified": "2025-10-16 13:32:06.139506",
"@@last_modified": "2025-11-04 13:33:53.548300",
"about": "O aplikácii",
"@about": {
"type": "String",
@ -2054,13 +2054,13 @@
"iWantALanguagePartnerWhoIsLearning": "Učí sa:",
"joinWithClassCode": "Pripojiť sa ku kurzu",
"joinWithClassCodeHint": "Zadajte kód pozvania",
"languageLevelPreA1": "Úplný začiatočník (Pre A1)",
"languageLevelA1": "Začiatočník (A1)",
"languageLevelA2": "Elementárny (A2)",
"languageLevelB1": "Stredne pokročilý (B1)",
"languageLevelB2": "Vyšší stredne pokročilý (B2)",
"languageLevelC1": "Pokročilý (C1)",
"languageLevelC2": "Majstrovstvo (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Nováčik Stred (A1)",
"languageLevelA2": "Začiatočník Vysoký (A2)",
"languageLevelB1": "Stredne Pokročilý Stredný (B1)",
"languageLevelB2": "Pokročilý Nízky (B2)",
"languageLevelC1": "Pokročilý Stredný (C1)",
"languageLevelC2": "Nadpriemerný (C2)",
"changeTheNameOfTheClass": "Zmeniť názov",
"changeTheNameOfTheChat": "Zmeniť názov chatu",
"askPangeaBot": "Požiadať Pangea Bota o kontextovú definíciu.",

View file

@ -1386,13 +1386,13 @@
"iWantALanguagePartnerWhoIsLearning": "Se uči:",
"joinWithClassCode": "Pridruži se tečaju",
"joinWithClassCodeHint": "Vnesi kodo povabila",
"languageLevelPreA1": "Popoln začetnik (Pre A1)",
"languageLevelA1": "Začetnik (A1)",
"languageLevelA2": "Elementarni (A2)",
"languageLevelB1": "Srednjega nivoja (B1)",
"languageLevelB2": "Višji srednji nivo (B2)",
"languageLevelC1": "Napredno (C1)",
"languageLevelC2": "Obvladovanje (C2)",
"languageLevelPreA1": "Novice Low (Pre A1)",
"languageLevelA1": "Novice Mid (A1)",
"languageLevelA2": "Visoka začetna (A2)",
"languageLevelB1": "Srednja (B1)",
"languageLevelB2": "Nizka napredna (B2)",
"languageLevelC1": "Srednja napredna (C1)",
"languageLevelC2": "Visoka (C2)",
"changeTheNameOfTheClass": "Spremeni ime",
"changeTheNameOfTheChat": "Spremeni ime klepeta",
"askPangeaBot": "Vprašajte Pangea Bota za kontekstualno definicijo.",
@ -2945,7 +2945,7 @@
"playWithAI": "Za zdaj igrajte z AI-jem",
"courseStartDesc": "Pangea Bot je pripravljen kadarkoli!\n\n...ampak je bolje učiti se s prijatelji!",
"@@locale": "sl",
"@@last_modified": "2025-10-16 13:32:09.029952",
"@@last_modified": "2025-11-04 13:34:14.532285",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:32:11.725645",
"@@last_modified": "2025-11-04 13:35:36.950474",
"about": "О програму",
"@about": {
"type": "String",
@ -2467,13 +2467,13 @@
"iWantALanguagePartnerWhoIsLearning": "Учится:",
"joinWithClassCode": "Присоединиться к курсу",
"joinWithClassCodeHint": "Введите код приглашения",
"languageLevelPreA1": "Почетни почетни (Pre A1)",
"languageLevelA1": "Начинајући (A1)",
"languageLevelA2": "Основни (A2)",
"languageLevelB1": "Средњи (B1)",
"languageLevelB2": "Вишњи средњи (B2)",
"languageLevelC1": "Напредни (C1)",
"languageLevelC2": "Мастерство (C2)",
"languageLevelPreA1": "Почетник Низак (Пре A1)",
"languageLevelA1": "Почетник Средњи (A1)",
"languageLevelA2": "Početni Visoki (A2)",
"languageLevelB1": "Srednji Srednji (B1)",
"languageLevelB2": "Napredni Niski (B2)",
"languageLevelC1": "Napredni Srednji (C1)",
"languageLevelC2": "Superiorni (C2)",
"changeTheNameOfTheClass": "Промени име",
"changeTheNameOfTheChat": "Промени име ћаскања",
"askPangeaBot": "Питајте Пангее Бот за контекстуалну дефиницију.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 16:03:28.457217",
"@@last_modified": "2025-11-04 13:35:16.747047",
"about": "Om",
"@about": {
"type": "String",
@ -3092,13 +3092,13 @@
"iWantALanguagePartnerWhoIsLearning": "Lär sig:",
"joinWithClassCode": "Gå med i kurs",
"joinWithClassCodeHint": "Ange inbjudningskod",
"languageLevelPreA1": "Äkta nybörjare (Pre A1)",
"languageLevelA1": "Nybörjare (A1)",
"languageLevelA2": "Elementär (A2)",
"languageLevelB1": "Mellanliggande (B1)",
"languageLevelB2": "Övre mellanliggande (B2)",
"languageLevelC1": "Avancerad (C1)",
"languageLevelC2": "Mästerskap (C2)",
"languageLevelPreA1": "Novis Låg (Pre A1)",
"languageLevelA1": "Novis Mid (A1)",
"languageLevelA2": "Nybörjare Hög (A2)",
"languageLevelB1": "Medelnivå Mitten (B1)",
"languageLevelB2": "Avancerad Låg (B2)",
"languageLevelC1": "Avancerad Mitten (C1)",
"languageLevelC2": "Överlägsen (C2)",
"changeTheNameOfTheClass": "Ändra namnet",
"changeTheNameOfTheChat": "Ändra chatnamnet",
"askPangeaBot": "Fråga Pangea Bot om en kontextuell definition.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:32:14.869459",
"@@last_modified": "2025-11-04 13:34:57.181084",
"acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது",
"@acceptedTheInvitation": {
"type": "String",
@ -3307,13 +3307,13 @@
"iWantALanguagePartnerWhoIsLearning": "கற்றுக் கொண்டுவரும்:",
"joinWithClassCode": "பாடத்துடன் சேரவும்",
"joinWithClassCodeHint": "அழைப்பு குறியீட்டை உள்ளிடவும்",
"languageLevelPreA1": "உண்மையான ஆரம்பம் (Pre A1)",
"languageLevelA1": "தொடக்கம் (A1)",
"languageLevelA2": "அடிப்படை (A2)",
"languageLevelB1": "இடையிலான (B1)",
"languageLevelB2": "மேலான இடையிலான (B2)",
"languageLevelC1": "மேம்பட்ட (C1)",
"languageLevelC2": "திறமை (C2)",
"languageLevelPreA1": "புதியவர் குறைந்த (முன் A1)",
"languageLevelA1": "புதிய நடுவண் (A1)",
"languageLevelA2": "புதிய உயர்வு (A2)",
"languageLevelB1": "மத்திய நடுத்தர (B1)",
"languageLevelB2": "மேம்பட்ட குறைந்த (B2)",
"languageLevelC1": "மேம்பட்ட நடுத்தர (C1)",
"languageLevelC2": "மேன்மை (C2)",
"changeTheNameOfTheClass": "பெயரை மாற்றவும்",
"changeTheNameOfTheChat": "செய்தி குழுவின் பெயரை மாற்றவும்",
"askPangeaBot": "பங்கேயா பாட்டிடம் ஒரு சூழ்நிலையியல் வரையறையை கேளுங்கள்.",

View file

@ -842,13 +842,13 @@
"iWantALanguagePartnerWhoIsLearning": "శిక్షణ పొందుతున్నవారు:",
"joinWithClassCode": "కోర్సులో చేరండి",
"joinWithClassCodeHint": "ఆహ్వాన కోడ్‌ను నమోదు చేయండి",
"languageLevelPreA1": "నిజమైన ప్రారంభికుడు (Pre A1)",
"languageLevelA1": "ప్రారంభికుడు (A1)",
"languageLevelA2": "ప్రాథమిక (A2)",
"languageLevelB1": "మధ్యస్థ (B1)",
"languageLevelB2": "అపురూప మధ్యస్థ (B2)",
"languageLevelC1": "అధిక స్థాయి (C1)",
"languageLevelC2": "నైపుణ్యము (C2)",
"languageLevelPreA1": "నవీన్ తక్కువ (ప్రి A1)",
"languageLevelA1": "నవీన్ మిడ్ (A1)",
"languageLevelA2": "ప్రారంభం ఉన్నత (A2)",
"languageLevelB1": "మధ్యస్థ మిడ్ (B1)",
"languageLevelB2": "అధిక నిమ్న (B2)",
"languageLevelC1": "అధిక మిడ్ (C1)",
"languageLevelC2": "ఉన్నత (C2)",
"changeTheNameOfTheClass": "పేరు మార్చండి",
"changeTheNameOfTheChat": "చాట్ పేరును మార్చండి",
"askPangeaBot": "పాంజియా బాట్‌ను ప్రశ్నించండి, సందర్భానుసార వివరణ కోసం.",
@ -2401,7 +2401,7 @@
"playWithAI": "ఇప్పుడే AI తో ఆడండి",
"courseStartDesc": "పాంజియా బాట్ ఎప్పుడైనా సిద్ధంగా ఉంటుంది!\n\n...కానీ స్నేహితులతో నేర్చుకోవడం మెరుగైనది!",
"@@locale": "te",
"@@last_modified": "2025-10-16 13:32:18.059294",
"@@last_modified": "2025-11-04 13:34:50.382080",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}

View file

@ -3378,13 +3378,13 @@
"iWantALanguagePartnerWhoIsLearning": "กำลังเรียนรู้:",
"joinWithClassCode": "เข้าร่วมคอร์ส",
"joinWithClassCodeHint": "ป้อนรหัสเชิญ",
"languageLevelPreA1": "ผู้เริ่มต้นจริง (Pre A1)",
"languageLevelA1": "ผู้เริ่มต้น (A1)",
"languageLevelA2": "ระดับพื้นฐาน (A2)",
"languageLevelB1": "ระดับกลาง (B1)",
"languageLevelB2": "ระดับกลางขั้นสูง (B2)",
"languageLevelC1": "ระดับสูง (C1)",
"languageLevelC2": "เชี่ยวชาญ (C2)",
"languageLevelPreA1": "ระดับเริ่มต้นต่ำ (Pre A1)",
"languageLevelA1": "มือใหม่ ระดับกลาง (A1)",
"languageLevelA2": "ระดับเริ่มต้นสูง (A2)",
"languageLevelB1": "ระดับกลางกลาง (B1)",
"languageLevelB2": "ระดับสูงต่ำ (B2)",
"languageLevelC1": "ระดับสูงกลาง (C1)",
"languageLevelC2": "ระดับสูงสุด (C2)",
"changeTheNameOfTheClass": "เปลี่ยนชื่อ",
"changeTheNameOfTheChat": "เปลี่ยนชื่อแชท",
"askPangeaBot": "ถาม Pangea Bot เพื่อคำจำกัดความตามบริบท",
@ -4937,7 +4937,7 @@
"playWithAI": "เล่นกับ AI ชั่วคราว",
"courseStartDesc": "Pangea Bot พร้อมที่จะเริ่มต้นได้ทุกเมื่อ!\n\n...แต่การเรียนรู้ดีกว่ากับเพื่อน!",
"@@locale": "th",
"@@last_modified": "2025-10-16 13:32:20.092719",
"@@last_modified": "2025-11-04 13:34:32.284237",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}

View file

@ -1,6 +1,6 @@
{
"@@locale": "tr",
"@@last_modified": "2025-10-16 13:32:23.571063",
"@@last_modified": "2025-11-04 13:34:47.775542",
"about": "Hakkında",
"@about": {
"type": "String",
@ -3314,13 +3314,13 @@
"iWantALanguagePartnerWhoIsLearning": "Öğrenen:",
"joinWithClassCode": "Derse katıl",
"joinWithClassCodeHint": "Davet kodunu girin",
"languageLevelPreA1": "Gerçek Başlangıç (Pre A1)",
"languageLevelA1": "Başlangıç (A1)",
"languageLevelA2": "Temel (A2)",
"languageLevelB1": "Orta Seviye (B1)",
"languageLevelB2": "Üst Orta (B2)",
"languageLevelC1": "İleri (C1)",
"languageLevelC2": "Ustalık (C2)",
"languageLevelPreA1": "Acemi Düşük (Pre A1)",
"languageLevelA1": "Acemi Orta (A1)",
"languageLevelA2": "Yeni Başlayan Yüksek (A2)",
"languageLevelB1": "Orta Seviye Orta (B1)",
"languageLevelB2": "İleri Seviye Düşük (B2)",
"languageLevelC1": "İleri Seviye Orta (C1)",
"languageLevelC2": "Üst Düzey (C2)",
"changeTheNameOfTheClass": "İsmi değiştir",
"changeTheNameOfTheChat": "Sohbetin adını değiştir",
"askPangeaBot": "Pangea Bot'tan bağlam tanımı isteyin.",

View file

@ -1,6 +1,6 @@
{
"@@locale": "uk",
"@@last_modified": "2025-10-16 13:32:26.039817",
"@@last_modified": "2025-11-04 13:34:20.995929",
"about": "Про застосунок",
"@about": {
"type": "String",
@ -3433,13 +3433,13 @@
"iWantALanguagePartnerWhoIsLearning": "Вивчає:",
"joinWithClassCode": "Приєднатися до курсу",
"joinWithClassCodeHint": "Введіть код запрошення",
"languageLevelPreA1": "Досвідчений початківець (Pre A1)",
"languageLevelA1": "Початковий (A1)",
"languageLevelA2": "Елементарний (A2)",
"languageLevelB1": "Середній (B1)",
"languageLevelB2": "Вищий середній (B2)",
"languageLevelC1": "Просунутий (C1)",
"languageLevelC2": "Майстерність (C2)",
"languageLevelPreA1": "Новачок Низький (Перед A1)",
"languageLevelA1": "Новачок Середній (A1)",
"languageLevelA2": "Початковий високий (A2)",
"languageLevelB1": "Середній середній (B1)",
"languageLevelB2": "Високий низький (B2)",
"languageLevelC1": "Високий середній (C1)",
"languageLevelC2": "Вищий (C2)",
"changeTheNameOfTheClass": "Змінити назву",
"changeTheNameOfTheChat": "Змінити назву чату",
"askPangeaBot": "Запитайте у Pangea Bot про контекстуальне визначення.",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:32:28.677939",
"@@last_modified": "2025-11-04 13:34:54.956294",
"about": "Giới thiệu",
"@about": {
"type": "String",
@ -1814,13 +1814,13 @@
"mustBe13": "Bạn phải ít nhất 13 tuổi",
"yourBirthdayPleaseShort": "Vui lòng chọn nhóm tuổi của bạn",
"joinWithClassCodeHint": "Nhập mã mời",
"languageLevelPreA1": "Hoàn toàn mới (Pre A1)",
"languageLevelA1": "Sơ cấp (A1)",
"languageLevelA2": "Căn bản (A2)",
"languageLevelB1": "Trung cấp (B1)",
"languageLevelB2": "Trung cấp cao (B2)",
"languageLevelC1": "Nâng cao (C1)",
"languageLevelC2": "Thành thạo (C2)",
"languageLevelPreA1": "Người mới bắt đầu Thấp (Pre A1)",
"languageLevelA1": "Người mới giữa (A1)",
"languageLevelA2": "Người mới cao (A2)",
"languageLevelB1": "Trung cấp trung bình (B1)",
"languageLevelB2": "Cao cấp thấp (B2)",
"languageLevelC1": "Cao cấp trung bình (C1)",
"languageLevelC2": "Cao cấp (C2)",
"changeTheNameOfTheClass": "Đổi tên",
"changeTheNameOfTheChat": "Đổi tên trò chuyện",
"welcomeToYourNewClass": "Chào mừng! 🙂",
@ -5757,5 +5757,33 @@
"@highlightVocabTooltip": {
"type": "String",
"placeholders": {}
},
"@languageLevelPreA1": {
"type": "String",
"placeholders": {}
},
"@languageLevelA1": {
"type": "String",
"placeholders": {}
},
"@languageLevelA2": {
"type": "String",
"placeholders": {}
},
"@languageLevelB1": {
"type": "String",
"placeholders": {}
},
"@languageLevelB2": {
"type": "String",
"placeholders": {}
},
"@languageLevelC1": {
"type": "String",
"placeholders": {}
},
"@languageLevelC2": {
"type": "String",
"placeholders": {}
}
}

View file

@ -765,13 +765,13 @@
"iWantALanguagePartnerWhoIsLearning": "正在學習:",
"joinWithClassCode": "加入課程",
"joinWithClassCodeHint": "輸入邀請碼",
"languageLevelPreA1": "真正的初學者Pre A1",
"languageLevelA1": "初學者A1",
"languageLevelA2": "初A2",
"languageLevelB1": "中級B1",
"languageLevelB2": "中高級B2",
"languageLevelC1": "高級C1",
"languageLevelC2": "精通C2",
"languageLevelPreA1": "新手低級 (Pre A1)",
"languageLevelA1": "新手中級 (A1)",
"languageLevelA2": "初學者高級 (A2)",
"languageLevelB1": "中級中 (B1)",
"languageLevelB2": "高級低 (B2)",
"languageLevelC1": "高級中 (C1)",
"languageLevelC2": "卓越 (C2)",
"changeTheNameOfTheClass": "更改名稱",
"changeTheNameOfTheChat": "更改聊天名稱",
"askPangeaBot": "向Pangea機器人詢問語境定義。",
@ -2341,7 +2341,7 @@
"selectAll": "全選",
"deselectAll": "取消全選",
"@@locale": "yue",
"@@last_modified": "2025-10-16 13:32:30.797608",
"@@last_modified": "2025-11-04 13:34:17.294087",
"@ignoreUser": {
"type": "String",
"placeholders": {}

View file

@ -1,6 +1,6 @@
{
"@@locale": "zh",
"@@last_modified": "2025-10-16 13:32:33.841766",
"@@last_modified": "2025-11-04 13:35:03.855586",
"about": "关于",
"@about": {
"type": "String",
@ -3434,13 +3434,13 @@
"iWantALanguagePartnerWhoIsLearning": "正在学习:",
"joinWithClassCode": "加入课程",
"joinWithClassCodeHint": "输入邀请码",
"languageLevelPreA1": "初学者Pre A1",
"languageLevelA1": "初级A1",
"languageLevelA2": "基础A2",
"languageLevelB1": "中级B1",
"languageLevelB2": "中高级B2",
"languageLevelC1": "高级C1",
"languageLevelC2": "精通C2",
"languageLevelPreA1": "初学者低级(预 A1",
"languageLevelA1": "新手中级 (A1)",
"languageLevelA2": "初学者高水平 (A2)",
"languageLevelB1": "中级中水平 (B1)",
"languageLevelB2": "高级低水平 (B2)",
"languageLevelC1": "高级中水平 (C1)",
"languageLevelC2": "优秀 (C2)",
"changeTheNameOfTheClass": "更改名称",
"changeTheNameOfTheChat": "更改聊天名称",
"askPangeaBot": "向Pangea机器人询问上下文定义。",

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-10-16 13:32:35.882830",
"@@last_modified": "2025-11-04 13:34:35.934573",
"about": "關於",
"@about": {
"type": "String",
@ -3410,13 +3410,13 @@
"iWantALanguagePartnerWhoIsLearning": "正在學習:",
"joinWithClassCode": "加入課程",
"joinWithClassCodeHint": "輸入邀請碼",
"languageLevelPreA1": "完全初學者Pre A1",
"languageLevelA1": "初級A1",
"languageLevelA2": "ElementaryA2",
"languageLevelB1": "中級B1",
"languageLevelB2": "中高級B2",
"languageLevelC1": "高級C1",
"languageLevelC2": "精通C2",
"languageLevelPreA1": "新手低級Pre A1",
"languageLevelA1": "新手中級 (A1)",
"languageLevelA2": "初學者高級 (A2)",
"languageLevelB1": "中級中 (B1)",
"languageLevelB2": "高級低 (B2)",
"languageLevelC1": "高級中 (C1)",
"languageLevelC2": "優秀 (C2)",
"changeTheNameOfTheClass": "更改名稱",
"changeTheNameOfTheChat": "更改聊天名稱",
"askPangeaBot": "向Pangea機器人詢問語境定義。",

View file

@ -0,0 +1,9 @@
# Example keys file for translate_keys.py
# Lines starting with # are comments and will be ignored
# One key per line
languageLevelA2
languageLevelB1
languageLevelB2
languageLevelC1
languageLevelC2

View file

@ -0,0 +1,495 @@
#!/usr/bin/env python3
"""
Translate a specific set of keys in the ARB files.
This script accepts a list of keys and:
1. Finds the value in the source ARB file (intl_en.arb)
2. Finds each instance of the value in the target ARB files (intl_*.arb)
3. Translates the value using OpenAI (reusing translate.py model)
4. Replaces the value in the target ARB files with the translated value
Usage:
python translate_keys.py --keys key1 key2 key3
python translate_keys.py --keys-file keys.txt
WARNING: Has not been tested extensively. Has not been tested with pluralization or
complex placeholders. Verify results before committing.
"""
import argparse
import sys
from pathlib import Path
from typing import Any, List
try:
from openai import OpenAI
except ImportError:
print("Error: openai package not found. Please install it with: pip install openai")
sys.exit(1)
# We'll implement all necessary functions locally to avoid path issues
# Get the client root directory (where this script is run from when called as module)
client_root = (
Path.cwd() if Path.cwd().name == "client" else Path(__file__).parent.parent.parent
)
l10n_dir = client_root / "lib" / "l10n"
def load_translations(lang_code: str) -> dict[str, str]:
"""Load translations for a language code using the correct path."""
import json
path_to_translations = l10n_dir / f"intl_{lang_code}.arb"
if not path_to_translations.exists():
translations = {}
else:
with open(path_to_translations, encoding="utf-8") as f:
translations = json.loads(f.read())
return translations
def load_supported_languages() -> List[tuple[str, str]]:
"""Load the supported languages from the languages.json file with correct path."""
import json
languages_path = client_root / "scripts" / "languages.json"
with open(languages_path, "r", encoding="utf-8") as f:
raw_languages = json.load(f)
languages: List[tuple[str, str]] = []
for lang in raw_languages:
assert isinstance(lang, dict), "Each language entry must be a dictionary."
language_code = lang.get("language_code", None)
language_name = lang.get("language_name", None)
assert (
language_code and language_name
), f"Each language must have a 'language_code' and 'language_name'. Found: {lang}"
languages.append((language_code, language_name))
return languages
def save_translations(lang_code: str, translations: dict[str, str]) -> None:
"""Save translations for a language code using the correct path."""
import json
from collections import OrderedDict
from datetime import datetime
path_to_translations = l10n_dir / f"intl_{lang_code}.arb"
translations["@@locale"] = lang_code
translations["@@last_modified"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
# Load existing data to preserve order if exists.
if path_to_translations.exists():
with open(path_to_translations, "r", encoding="utf-8") as f:
try:
existing_data = json.load(f, object_pairs_hook=OrderedDict)
except json.JSONDecodeError:
existing_data = OrderedDict()
else:
existing_data = OrderedDict()
# Update existing keys and append new keys (preserving existing order).
for key, value in translations.items():
if key in existing_data:
existing_data[key] = value # update value; order remains unchanged
else:
existing_data[key] = value # new key appended at the end
with open(path_to_translations, "w", encoding="utf-8") as f:
f.write(json.dumps(existing_data, indent=2, ensure_ascii=False))
def reconcile_metadata(
lang_code: str,
translation_keys: List[str],
english_translations_dict: dict[str, Any],
) -> None:
"""
For each translation key, update its metadata (the key prefixed with '@') by merging
any existing metadata with computed metadata. For basic translations, if no metadata exists,
add it; otherwise, leave it as is.
"""
translations = load_translations(lang_code)
for key in translation_keys:
# Skip keys that weren't successfully translated
if key not in translations:
continue
translation = translations[key]
meta_key = f"@{key}"
existing_meta = translations.get(meta_key, {})
assert isinstance(translation, str)
# Case 1: Basic translations, no placeholders.
if "{" not in translation:
if not existing_meta:
translations[meta_key] = {"type": "String", "placeholders": {}}
# if metadata exists, leave it as is.
# Case 2: Translations with placeholders (no pluralization).
elif (
"{" in translation
and "plural," not in translation
and "other{" not in translation
):
# Compute placeholders.
computed_placeholders = {}
for placeholder in translation.split("{")[1:]:
placeholder_name = placeholder.split("}")[0]
computed_placeholders[placeholder_name] = {}
# Obtain placeholder type from english translation or default to {}
placeholder_type = (
english_translations_dict.get(meta_key, {})
.get("placeholders", {})
.get(placeholder_name, {})
.get("type")
)
if placeholder_type:
computed_placeholders[placeholder_name]["type"] = placeholder_type
if existing_meta:
# Merge computed placeholders into existing metadata.
existing_meta.setdefault("type", "String")
existing_meta["placeholders"] = computed_placeholders
translations[meta_key] = existing_meta
else:
# Obtain type from english translation or default to "String".
translation_type = english_translations_dict.get(meta_key, {}).get(
"type", "String"
)
translations[meta_key] = {
"type": translation_type,
"placeholders": computed_placeholders,
}
# Case 3: Translations with pluralization.
elif (
"{" in translation and "plural," in translation and "other{" in translation
):
# Extract placeholders appearing before the plural part.
prefix = translation.split("plural,")[0].split("{")[1]
placeholders_list = [
p.strip() for p in prefix.split(",") if p.strip() != ""
]
computed_placeholders = {ph: {} for ph in placeholders_list}
for ph in placeholders_list:
# Obtain placeholder type from english translation or default to {}
placeholder_type = (
english_translations_dict.get(meta_key, {})
.get("placeholders", {})
.get(ph, {})
.get("type")
)
if placeholder_type:
computed_placeholders[ph]["type"] = placeholder_type
if existing_meta:
existing_meta.setdefault("type", "String")
existing_meta["placeholders"] = computed_placeholders
translations[meta_key] = existing_meta
else:
# Obtain type from english translation or default to "String".
translation_type = english_translations_dict.get(meta_key, {}).get(
"type", "String"
)
translations[meta_key] = {
"type": "String",
"placeholders": computed_placeholders,
}
save_translations(lang_code, translations)
def get_all_target_language_files() -> List[Path]:
"""Get all target ARB files (excluding intl_en.arb)."""
arb_files = list(l10n_dir.glob("intl_*.arb"))
# Filter out the English source file
return [f for f in arb_files if f.name != "intl_en.arb"]
def extract_language_code_from_filename(arb_path: Path) -> str:
"""Extract language code from ARB filename (e.g., intl_es.arb -> es)."""
filename = arb_path.stem # Get filename without extension
return filename.replace("intl_", "")
def translate_batch_with_openai(
translation_requests: dict[str, str],
target_language: str,
source_language: str = "English",
) -> dict[str, str]:
"""
Translate a batch of texts using OpenAI API.
Args:
translation_requests: Dictionary of {key: text} to translate
target_language: Target language name (e.g., "Spanish", "French")
source_language: Source language name (default: "English")
Returns:
Dictionary of {key: translated_text}
"""
import json
client = OpenAI()
# Create a batch translation prompt
prompt = f"""
Translate the following JSON object from {source_language} to {target_language}.
Preserve any placeholders (text within curly braces like {{username}}) exactly as they are.
Preserve any special formatting or ICU message format syntax.
Return only a JSON object with the same keys but translated values.
JSON to translate: {json.dumps(translation_requests, indent=2)}
"""
try:
chat_completion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are a professional translator. You translate text accurately while preserving any placeholders and special formatting. Always respond with valid JSON only.",
},
{
"role": "user",
"content": prompt,
},
],
model="gpt-4o-mini",
temperature=0.0,
)
response = chat_completion.choices[0].message.content.strip()
# Clean up common JSON formatting issues
if response.startswith("```json"):
response = response[7:]
if response.endswith("```"):
response = response[:-3]
response = response.strip()
# Parse the JSON response
translated_batch = json.loads(response)
return translated_batch
except json.JSONDecodeError as e:
print(f"JSON parsing error when translating batch to {target_language}: {e}")
print(f"Response was: {response[:200]}...")
# Fallback to original texts if parsing fails
return translation_requests
except (ConnectionError, TimeoutError) as e:
print(f"Network error translating batch to {target_language}: {e}")
return translation_requests # Return original texts if translation fails
except ValueError as e:
print(f"API error translating batch to {target_language}: {e}")
return translation_requests # Return original texts if translation fails
def get_language_display_name(lang_code: str) -> str:
"""Get the display name for a language code."""
supported_languages = load_supported_languages()
for code, display_name in supported_languages:
if code == lang_code:
return display_name
# Fallback mapping for common language codes
fallback_names = {
"es": "Spanish",
"fr": "French",
"de": "German",
"it": "Italian",
"pt": "Portuguese",
"pt_PT": "Portuguese",
"ja": "Japanese",
"ko": "Korean",
"zh": "Chinese",
"zh_Hant": "Traditional Chinese",
"ru": "Russian",
"ar": "Arabic",
"hi": "Hindi",
"nl": "Dutch",
"sv": "Swedish",
"da": "Danish",
"no": "Norwegian",
"nb": "Norwegian",
"fi": "Finnish",
"pl": "Polish",
"cs": "Czech",
"sk": "Slovak",
"hu": "Hungarian",
"ro": "Romanian",
"bg": "Bulgarian",
"hr": "Croatian",
"sl": "Slovenian",
"et": "Estonian",
"lv": "Latvian",
"lt": "Lithuanian",
"el": "Greek",
"tr": "Turkish",
"th": "Thai",
"vi": "Vietnamese",
"id": "Indonesian",
"ms": "Malay",
"fil": "Filipino",
"he": "Hebrew",
"uk": "Ukrainian",
"be": "Belarusian",
"ca": "Catalan",
"gl": "Galician",
"eu": "Basque",
}
return fallback_names.get(lang_code, lang_code.title())
def translate_keys(keys_to_translate: List[str]) -> None:
"""
Translate specific keys in all target ARB files using batch translation.
Args:
keys_to_translate: List of keys to translate
"""
# Load English translations (source)
english_translations = load_translations("en")
# Validate that all keys exist in English
missing_keys = [key for key in keys_to_translate if key not in english_translations]
if missing_keys:
print(
f"Error: The following keys were not found in intl_en.arb: {missing_keys}"
)
return
# Filter out metadata keys
keys_to_translate = [key for key in keys_to_translate if not key.startswith("@")]
# Get all target ARB files
target_files = get_all_target_language_files()
print(f"Found {len(target_files)} target language files")
print(f"Translating {len(keys_to_translate)} keys: {keys_to_translate}")
# Process keys in batches of 10
batch_size = 10
for arb_file in target_files:
lang_code = extract_language_code_from_filename(arb_file)
lang_display_name = get_language_display_name(lang_code)
print(f"\nProcessing {lang_display_name} ({lang_code})...")
# Load current translations for this language
current_translations = load_translations(lang_code)
# Track which keys were actually updated
updated_keys = []
# Process keys in batches
for i in range(0, len(keys_to_translate), batch_size):
batch = keys_to_translate[i : i + batch_size]
# Prepare translation requests for this batch
translation_requests = {}
for key in batch:
english_text = english_translations[key]
translation_requests[key] = english_text
print(
f" Translating batch {i//batch_size + 1} ({len(batch)} keys): {batch}"
)
# Translate the batch
translated_batch = translate_batch_with_openai(
translation_requests, lang_display_name
)
# Update translations and track updated keys
for key in batch:
if key in translated_batch:
translated_text = translated_batch[key]
current_translations[key] = translated_text
updated_keys.append(key)
print(
f" {key}: '{english_translations[key]}' -> '{translated_text}'"
)
else:
print(f" Warning: Key '{key}' not found in translation response")
# Save the updated translations
if updated_keys:
save_translations(lang_code, current_translations)
# Reconcile metadata for updated keys
reconcile_metadata(lang_code, updated_keys, english_translations)
print(f" ✓ Updated {len(updated_keys)} keys in {lang_code}")
else:
print(f" - No keys updated in {lang_code}")
def read_keys_from_file(file_path: Path) -> List[str]:
"""Read keys from a text file (one key per line)."""
if not file_path.exists():
raise FileNotFoundError(f"Keys file not found: {file_path}")
with open(file_path, "r", encoding="utf-8") as f:
keys = [
line.strip()
for line in f
if line.strip() and not line.strip().startswith("#")
]
return keys
def main():
parser = argparse.ArgumentParser(
description="Translate specific keys in ARB files",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
python translate_keys.py --keys about accept account
python -m scripts.translate.translate_keys.py --keys-file scripts.translate.keys_to_translate.txt
""",
)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--keys", nargs="+", help="List of keys to translate")
group.add_argument(
"--keys-file",
type=Path,
help="File containing keys to translate (one per line)",
)
args = parser.parse_args()
# Get the keys to translate
if args.keys:
keys_to_translate = args.keys
else:
keys_to_translate = read_keys_from_file(args.keys_file)
if not keys_to_translate:
print("Error: No keys to translate")
sys.exit(1)
# Change to the client directory so relative paths work
original_cwd = Path.cwd()
client_dir = Path(__file__).parent.parent.parent
try:
import os
os.chdir(client_dir)
translate_keys(keys_to_translate)
finally:
os.chdir(original_cwd)
print("\n✓ Translation complete!")
if __name__ == "__main__":
main()