From 61dd94011f8444e5d82516942c3d427098f449b8 Mon Sep 17 00:00:00 2001 From: eolmapper <44468453+eolmapper@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:13:46 +0200 Subject: [PATCH] translate manager and toolbar --- app/html/addeventbody.html | 2 +- app/html/addmapbody.html | 4 +- app/html/editeventbody.html | 8 +- app/html/navbar.html | 24 +++--- lang/cz.txt | 128 ++++++++++++++++++++++++++++ lang/de.txt | 133 +++++++++++++++++++++++++++++ lang/fi.txt | 118 ++++++++++++++++++++++++++ lang/fr.txt | 165 +++++++++++++++++++++++++++++++++--- lang/it.txt | 125 +++++++++++++++++++++++++++ lang/ja.txt | 122 ++++++++++++++++++++++++++ lang/no.txt | 128 ++++++++++++++++++++++++++++ lang/pt.txt | 129 ++++++++++++++++++++++++++++ lang/ru.txt | 130 ++++++++++++++++++++++++++++ src/js/animation.js | 9 +- src/js/manager.js | 120 ++++++++++++++------------ src/js/managerutils.js | 33 ++++---- src/js/rg2ui.js | 20 ++++- src/js/translate.js | 148 ++++++++++++++++++++++++++++++++ 18 files changed, 1436 insertions(+), 110 deletions(-) diff --git a/app/html/addeventbody.html b/app/html/addeventbody.html index b1b2dbe..7cfb156 100644 --- a/app/html/addeventbody.html +++ b/app/html/addeventbody.html @@ -1,7 +1,7 @@
- Event details + Event details
diff --git a/app/html/addmapbody.html b/app/html/addmapbody.html index 56499cf..94a6d96 100644 --- a/app/html/addmapbody.html +++ b/app/html/addmapbody.html @@ -1,7 +1,7 @@
- Map details + Map details
@@ -10,7 +10,7 @@
- Georeferencing + Georeferencing
diff --git a/app/html/editeventbody.html b/app/html/editeventbody.html index de5756f..227beed 100644 --- a/app/html/editeventbody.html +++ b/app/html/editeventbody.html @@ -1,14 +1,14 @@
- Select event + Select event

- Edit event details + Edit event details
@@ -46,7 +46,7 @@

- Delete route + Delete route
@@ -54,7 +54,7 @@

- Delete event + Delete event
diff --git a/app/html/navbar.html b/app/html/navbar.html index 9dadaa2..daace49 100644 --- a/app/html/navbar.html +++ b/app/html/navbar.html @@ -24,27 +24,27 @@
diff --git a/lang/cz.txt b/lang/cz.txt index d6dbdae..de11aa6 100644 --- a/lang/cz.txt +++ b/lang/cz.txt @@ -114,3 +114,131 @@ "Best", "Nejlepší" "Worst", "Nejhorší" "Estimated loss", "Odhad ztráty" + +# translated automaticaly by Gemini AI +"Cancel", "Zrušit" +"Stats", "Statistiky" +"Login", "Přihlášení" +"Tails length", "Délka ocásků" +"Map intensity", "Intenzita mapy" +"Event level", "Úroveň akce" +"Select level", "Zvolit úroveň" +"International", "Mezinárodní" +"National", "Národní" +"Regional", "Regionální" +"Local", "Lokální" +"Training", "Trénink" +"Add event", "Přidat akci" +"Edit event", "Upravit akci" +"Add map", "Přidat mapu" +"Delete maps", "Smazat mapy" +"Event details", "Podrobnosti o akci" +"Event name", "Název akce" +"Map", "Mapa" +"Select map", "Zvolit mapu" +"No results file", "Žádný soubor s výsledky" +"Sort results file", "Seřadit soubor s výsledky" +"Only select if the results file is not already properly sorted.", "Zaškrtněte pouze v případě, že soubor s výsledky ještě není správně seřazen." +"Add classes to course names", "Přidat kategorie k názvům tratí" +"Individual courses (butterfly/score/relay)", "Individuální tratě (motýlek/scorelauf/štafeta)" +"Draw course", "Nakreslit trať" +"Move map and controls together", "Pohybovat mapou a kontrolami zároveň" +"Read-only mode", "Režim pouze pro čtení" +"Create event", "Vytvořit akci" +"Map details", "Podrobnosti o mapě" +"Map name", "Název mapy" +"Map file", "Soubor s mapou (jpg, gif)" +"Georeferencing", "Georeference" +"Georeferencing file", "Georeferenční soubor (jgw, gfw, wld)" +"Co-ordinate system", "Soustava souřadnic" +"Not georeferenced", "Negeoreferencováno" +"None found.", "Nenalezeno." +"Delete selected maps", "Smazat vybrané mapy" +"No route selected.", "Není vybrána žádná trasa." +"Route ", "Trasa " +" has been deleted.", " byla smazána." +" will be permanently deleted. Are you sure?", " bude trvale smazána. Jste si jisti?" +"Confirm route delete", "Potvrdit smazání trasy" +"Delete route", "Smazat trasu" +"No maps selected.", "Nejsou vybrány žádné mapy." +"Selected maps will be deleted. Are you sure?", "Vybrané mapy budou smazány. Jste si jisti?" +"Confirm map deletion", "Potvrdit smazání mapy" +"Event ", "Akce " +" will be deleted. Are you sure?", " bude smazána. Jste si jisti?" +"Event deleted", "Akce smazána" +"Confirm event delete", "Potvrdit smazání akce" +"Delete event", "Smazat akci" +"Confirm new map", "Potvrdit novou mapu" +"Are you sure you want to add this map?", "Jste si jisti, že chcete přidat tuto mapu?" +"Confirm event update", "Potvrdit aktualizaci akce" +"Update event", "Aktualizovat akci" +"Event set-up incomplete", "Nastavení akce není kompletní" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Prosím zadejte všechny potřebné informace a před vytvořením akce se ujistěte, že jsou kontroly správně zarovnány." +"Are you sure you want to create this event?", "Jste si jisti, že chcete vytvořit tuto akci?" +"Confirm event creation", "Potvrdit vytvoření akce" +"Login failed", "Přihlášení selhalo" +"User name or password incorrect. Please try again.", "Nesprávné uživatelské jméno nebo heslo. Zkuste to prosím znovu." +"Please enter user name and password of at least five characters", "Prosím zadejte uživatelské jméno a heslo o délce minimálně pěti znaků" +"Map added", "Mapa přidána" +" has been added with id ", " byl(a) přidán(a) s ID " +"Save failed", "Uložení selhalo" +". Failed to save map. Please try again.", ". Nepodařilo se uložit mapu. Zkuste to prosím znovu." +"Upload failed", "Nahrávání selhalo" +". Failed to upload map. Please try again.", ". Nepodařilo se nahrát mapu. Zkuste to prosím znovu." +"Update failed", "Aktualizace selhala" +". Event update failed. Please try again.", ". Aktualizace akce selhala. Zkuste to prosím znovu." +"Event updated", "Akce aktualizována" +" has been updated.", " byl(a) aktualizován(a)." +". Event ", ". Akce " +" delete failed. Please try again.", " smazání selhalo. Zkuste to prosím znovu." +" Failed to create event. Please try again.", " Nepodařilo se vytvořit akci. Zkuste to prosím znovu." +"Event created", "Akce vytvořena" +"undefined", "nedefinováno" +"Select route", "Zvolit trasu" +"No valid results found.", "Nenalezeny žádné platné výsledky." +"Course file error", "Chyba souboru s tratěmi" +"The selected course file could not be read.", "Vybraný soubor s tratěmi nelze přečíst." +"File read error", "Chyba čtení souboru" +"Failed to open selected world file.", "Nepodařilo se otevřit vybraný world soubor." +"World file error", "Chyba world souboru" +"The selected world file could not be read.", "Vybraný world soubor nelze přečíst." +" is not recognised. Only .jpg and .gif files are supported at present.", " nebyl rozpoznán. V současné době jsou podporovány pouze soubory .jpg a .gif." +"Results file error", "Chyba souboru s výsledky" +"The selected results file could not be read.", "Vybraný soubor s výsledky nelze přečíst." +"File type error", "Chyba typu souboru" +"Results file type is not recognised. Please select a valid file.", "Typ souboru s výsledky nebyl rozpoznán. Vyberte prosím platný soubor." +"No map loaded", "Není nahrána žádná mapa" +"Please load a map file before adding results.", "Před přidáním výsledků prosím nahrajte soubor s mapou." +"Please load a map file before adding courses.", "Před přidáním tratí prosím nahrajte soubor s mapou." +"No map selected", "Není vybrána žádná mapa" +"Please load a map before drawing courses", "Před kreslením tratí prosím nahrajte mapu" +"Event name is not valid.", "Název akce není platný." +"Club name is not valid.", "Název klubu není platný." +"Date is not valid.", "Datum není platné." +"Event level is not valid.", "Úroveň akce není platná." +"Event format is not valid.", "Formát akce není platný." +"No course information. Check your course XML file.", "Žádné informace o tratích. Zkontrolujte XML soubor s tratěmi." +"No results information. Check your results file.", "Žádné informace o výsledcích. Zkontrolujte soubor s výsledky." +"Controls have not been adjusted on the map.", "Kontroly nebyly na mapě upraveny." +"Are you sure you want to update", "Jste si jisti, že chcete aktualizovat" +"Maps deleted", "Mapy smazány" +"Selected maps have been deleted.", "Vybrané mapy byly smazány." +". Delete failed. Please try again.", ". Smazání selhalo. Zkuste to prosím znovu." +"Oversized map upload", "Nahrávání příliš velké mapy" +"Course file problem", "Problém se souborem s tratěmi" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Váš soubor s tratěmi neodpovídá souřadnicím mapy. Zkontrolujte prosím, zda jste vybrali správný soubor." +"Result details", "Podrobnosti o výsledku" +"Event", "Akce" +"Select event", "Zvolit akci" +"Edit event details", "Upravit podrobnosti o akci" +"Read-only", "Pouze pro čtení" +"Excluded controls", "Vyloučené kontroly" +"Update event details", "Aktualizovat podrobnosti o akci" +"No event selected", "Není vybrána žádná akce" +"days", "dny" +"hours", "hodiny" +"minutes", "minuty" +"seconds", "sekundy" +"Manager Login", "Přihlášení správce" +"Replay speed", "Rychlost přehrávání" +"By control", "Podle mezičasů" \ No newline at end of file diff --git a/lang/de.txt b/lang/de.txt index b455565..70b8ad4 100644 --- a/lang/de.txt +++ b/lang/de.txt @@ -87,3 +87,136 @@ "Right click to delete a handle", "Rechts-Klick zum Löschen eines Bearbeitungspunkts" "Drag a handle to adjust track around locked point(s)", "Ziehe einen Bearbeitungspunkt, um die Route anzupassen" "Search", "Suchen" + +# translated automaticaly by Gemini AI +"Cancel", "Abbrechen" +"Rotate right", "Nach rechts drehen" +"Rotate left", "Nach links drehen" +"Tails length", "Spurlänge" +"Loading courses", "Strecken werden geladen" +"Loading results", "Ergebnisse werden geladen" +"Loading map", "Karte wird geladen" +"Loading routes", "Routen werden geladen" +"Saving courses", "Strecken werden gespeichert" +"Saving results", "Ergebnisse werden gespeichert" +"Saving routes", "Routen werden gespeichert" +"Map loaded", "Karte geladen" +"Autofit", "Automatisch anpassen" +"Route already drawn", "Route bereits gezeichnet" +"If you draw a new route it will overwrite the old route for this runner.", "Wenn Sie eine neue Route zeichnen, wird die alte Route für diesen Läufer überschrieben." +"GPS routes are saved separately and will not be overwritten.", "GPS-Routen werden separat gespeichert und nicht überschrieben." +"Add event", "Wettkampf hinzufügen" +"Edit event", "Wettkampf bearbeiten" +"Add map", "Karte hinzufügen" +"Delete maps", "Karten löschen" +"Event details", "Wettkampfdetails" +"Event name", "Wettkampfname" +"Map", "Karte" +"Select map", "Karte auswählen" +"No results file", "Keine Ergebnisdatei" +"Sort results file", "Ergebnisdatei sortieren" +"Only select if the results file is not already properly sorted.", "Nur auswählen, wenn die Ergebnisdatei noch nicht richtig sortiert ist." +"Add classes to course names", "Klassen zu Streckennamen hinzufügen" +"Individual courses (butterfly/score/relay)", "Einzelstrecken (Schmetterling/Score/Staffel)" +"Draw course", "Bahn zeichnen" +"Move map and controls together", "Karte und Posten zusammen verschieben" +"Read-only mode", "Schreibgeschützter Modus" +"Create event", "Wettkampf erstellen" +"Map details", "Kartendetails" +"Map name", "Kartenname" +"Map file", "Kartendatei (jpg, gif)" +"Georeferencing", "Georeferenzierung" +"Georeferencing file", "Georeferenzierungsdatei (jgw, gfw, wld)" +"Co-ordinate system", "Koordinatensystem" +"Not georeferenced", "Nicht georeferenziert" +"None found.", "Keine gefunden." +"Delete selected maps", "Ausgewählte Karten löschen" +"No route selected.", "Keine Route ausgewählt." +"Route ", "Route " +" has been deleted.", " wurde gelöscht." +" will be permanently deleted. Are you sure?", " wird dauerhaft gelöscht. Sind Sie sicher?" +"Confirm route delete", "Löschen der Route bestätigen" +"Delete route", "Route löschen" +"No maps selected.", "Keine Karten ausgewählt." +"Selected maps will be deleted. Are you sure?", "Ausgewählte Karten werden gelöscht. Sind Sie sicher?" +"Confirm map deletion", "Löschen der Karte bestätigen" +"Event ", "Wettkampf " +" will be deleted. Are you sure?", " wird gelöscht. Sind Sie sicher?" +"Event deleted", "Wettkampf gelöscht" +"Confirm event delete", "Löschen des Wettkampfs bestätigen" +"Delete event", "Wettkampf löschen" +"Confirm new map", "Neue Karte bestätigen" +"Are you sure you want to add this map?", "Sind Sie sicher, dass Sie diese Karte hinzufügen möchten?" +"Confirm event update", "Wettkampfaktualisierung bestätigen" +"Update event", "Wettkampf aktualisieren" +"Event set-up incomplete", "Wettkampfeinrichtung unvollständig" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Bitte geben Sie alle erforderlichen Informationen ein und stellen Sie sicher, dass die Posten ausgerichtet sind, bevor Sie den Wettkampf erstellen." +"Are you sure you want to create this event?", "Sind Sie sicher, dass Sie diesen Wettkampf erstellen möchten?" +"Confirm event creation", "Wettkampferstellung bestätigen" +"Login failed", "Anmeldung fehlgeschlagen" +"User name or password incorrect. Please try again.", "Benutzername oder Passwort falsch. Bitte versuchen Sie es erneut." +"Please enter user name and password of at least five characters", "Bitte geben Sie einen Benutzernamen und ein Passwort mit mindestens fünf Zeichen ein" +"Map added", "Karte hinzugefügt" +" has been added with id ", " wurde mit der ID hinzugefügt " +"Save failed", "Speichern fehlgeschlagen" +". Failed to save map. Please try again.", ". Karte konnte nicht gespeichert werden. Bitte versuchen Sie es erneut." +"Upload failed", "Hochladen fehlgeschlagen" +". Failed to upload map. Please try again.", ". Karte konnte nicht hochgeladen werden. Bitte versuchen Sie es erneut." +"Update failed", "Aktualisierung fehlgeschlagen" +". Event update failed. Please try again.", ". Wettkampfaktualisierung fehlgeschlagen. Bitte versuchen Sie es erneut." +"Event updated", "Wettkampf aktualisiert" +" has been updated.", " wurde aktualisiert." +"Delete failed", "Löschen fehlgeschlagen" +". Event ", ". Wettkampf " +" delete failed. Please try again.", " Löschen fehlgeschlagen. Bitte versuchen Sie es erneut." +" Failed to create event. Please try again.", " Wettkampf konnte nicht erstellt werden. Bitte versuchen Sie es erneut." +"Event created", "Wettkampf erstellt" +"undefined", "undefiniert" +"Select route", "Route auswählen" +"No valid results found.", "Keine gültigen Ergebnisse gefunden." +"Course file error", "Fehler in der Streckendatei" +"The selected course file could not be read.", "Die ausgewählte Streckendatei konnte nicht gelesen werden." +"File read error", "Dateilesefehler" +"Failed to open selected world file.", "Ausgewählte World-Datei konnte nicht geöffnet werden." +"World file error", "Fehler in der World-Datei" +"The selected world file could not be read.", "Die ausgewählte World-Datei konnte nicht gelesen werden." +" is not recognised. Only .jpg and .gif files are supported at present.", " wird nicht erkannt. Derzeit werden nur .jpg- und .gif-Dateien unterstützt." +"Results file error", "Fehler in der Ergebnisdatei" +"The selected results file could not be read.", "Die ausgewählte Ergebnisdatei konnte nicht gelesen werden." +"File type error", "Fehlender Dateityp" +"Results file type is not recognised. Please select a valid file.", "Typ der Ergebnisdatei wird nicht erkannt. Bitte wählen Sie eine gültige Datei aus." +"No map loaded", "Keine Karte geladen" +"Please load a map file before adding results.", "Bitte laden Sie eine Kartendatei, bevor Sie Ergebnisse hinzufügen." +"Please load a map file before adding courses.", "Bitte laden Sie eine Kartendatei, bevor Sie Strecken hinzufügen." +"No map selected", "Keine Karte ausgewählt" +"Please load a map before drawing courses", "Bitte laden Sie eine Karte, bevor Sie Bahnen zeichnen" +"Event name is not valid.", "Wettkampfname ist ungültig." +"Club name is not valid.", "Vereinsname ist ungültig." +"Date is not valid.", "Datum ist ungültig." +"Event level is not valid.", "Wettkampfniveau ist ungültig." +"Event format is not valid.", "Wettkampf-Format ist ungültig." +"No course information. Check your course XML file.", "Keine Streckeninformationen. Überprüfen Sie Ihre XML-Streckendatei." +"No results information. Check your results file.", "Keine Ergebnisinformationen. Überprüfen Sie Ihre Ergebnisdatei." +"Controls have not been adjusted on the map.", "Posten wurden auf der Karte nicht angepasst." +"Are you sure you want to update", "Sind Sie sicher, dass Sie aktualisieren möchten" +"Maps deleted", "Karten gelöscht" +"Selected maps have been deleted.", "Ausgewählte Karten wurden gelöscht." +". Delete failed. Please try again.", ". Löschen fehlgeschlagen. Bitte versuchen Sie es erneut." +"Oversized map upload", "Hochladen einer zu großen Karte" +"Course file problem", "Problem mit der Streckendatei" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Ihre Streckendatei stimmt nicht mit den Kartenkoordinaten überein. Bitte überprüfen Sie, ob Sie die richtige Datei ausgewählt haben." +"Result details", "Ergebnisdetails" +"Event", "Wettkampf" +"Select event", "Wettkampf auswählen" +"Edit event details", "Wettkampfdetails bearbeiten" +"Read-only", "Schreibgeschützt" +"Excluded controls", "Ausgeschlossene Posten" +"Update event details", "Wettkampfdetails aktualisieren" +"No event selected", "Kein Wettkampf ausgewählt" +"days", "Tage" +"hours", "Stunden" +"minutes", "Minuten" +"seconds", "Sekunden" +"Manager Login", "Administrator-Anmeldung" +"Replay speed", "Animationsgeschwindigkeit" +"By control", "Nach Posten" \ No newline at end of file diff --git a/lang/fi.txt b/lang/fi.txt index f8e5da9..2d426b5 100644 --- a/lang/fi.txt +++ b/lang/fi.txt @@ -106,3 +106,121 @@ "Search","Hae" "Share route","Jaa reitti" "Copy and paste this link to share your route","Kopio tämä linkki jakaaksesi reittisi" + +# translated automaticaly by Gemini AI +"Cancel", "Peruuta" +"Tails length", "Hännän pituus" +"Add event", "Lisää tapahtuma" +"Edit event", "Muokkaa tapahtumaa" +"Add map", "Lisää kartta" +"Delete maps", "Poista karttoja" +"Event details", "Tapahtuman tiedot" +"Event name", "Tapahtuman nimi" +"Map", "Kartta" +"Select map", "Valitse kartta" +"No results file", "Ei tulostiedostoa" +"Sort results file", "Lajittele tulostiedosto" +"Only select if the results file is not already properly sorted.", "Valitse vain, jos tulostiedosto ei ole valmiiksi oikeassa järjestyksessä." +"Add classes to course names", "Lisää sarjat ratojen nimiin" +"Individual courses (butterfly/score/relay)", "Yksilölliset radat (perhonen/score/viesti)" +"Draw course", "Piirrä rata" +"Move map and controls together", "Siirrä karttaa ja rasteja yhdessä" +"Read-only mode", "Vain luku -tila" +"Create event", "Luo tapahtuma" +"Map details", "Kartan tiedot" +"Map name", "Kartan nimi" +"Map file", "Karttatiedosto (jpg, gif)" +"Georeferencing", "Georeferointi" +"Georeferencing file", "Georeferointitiedosto (jgw, gfw, wld)" +"Co-ordinate system", "Koordinaattijärjestelmä" +"Not georeferenced", "Ei georeferoitu" +"None found.", "Ei löytynyt." +"Delete selected maps", "Poista valitut kartat" +"No route selected.", "Reittiä ei ole valittu." +"Route ", "Reitti " +" has been deleted.", " on poistettu." +" will be permanently deleted. Are you sure?", " poistetaan pysyvästi. Oletko varma?" +"Confirm route delete", "Vahvista reitin poisto" +"Delete route", "Poista reitti" +"No maps selected.", "Karttoja ei ole valittu." +"Selected maps will be deleted. Are you sure?", "Valitut kartat poistetaan. Oletko varma?" +"Confirm map deletion", "Vahvista kartan poisto" +"Event ", "Tapahtuma " +" will be deleted. Are you sure?", " poistetaan. Oletko varma?" +"Event deleted", "Tapahtuma poistettu" +"Confirm event delete", "Vahvista tapahtuman poisto" +"Delete event", "Poista tapahtuma" +"Confirm new map", "Vahvista uusi kartta" +"Are you sure you want to add this map?", "Oletko varma, että haluat lisätä tämän kartan?" +"Confirm event update", "Vahvista tapahtuman päivitys" +"Update event", "Päivitä tapahtuma" +"Event set-up incomplete", "Tapahtuman määrittely on puutteellinen" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Syötä kaikki tarvittavat tiedot ja varmista, että rastit ovat kohdallaan ennen tapahtuman luomista." +"Are you sure you want to create this event?", "Oletko varma, että haluat luoda tämän tapahtuman?" +"Confirm event creation", "Vahvista tapahtuman luonti" +"Login failed", "Kirjautuminen epäonnistui" +"User name or password incorrect. Please try again.", "Käyttäjätunnus tai salasana on virheellinen. Yritä uudelleen." +"Please enter user name and password of at least five characters", "Syötä vähintään viiden merkin pituinen käyttäjätunnus ja salasana" +"Map added", "Kartta lisätty" +" has been added with id ", " on lisätty tunnuksella " +"Save failed", "Tallennus epäonnistui" +". Failed to save map. Please try again.", ". Kartan tallennus epäonnistui. Yritä uudelleen." +"Upload failed", "Lataus epäonnistui" +". Failed to upload map. Please try again.", ". Kartan lataus palvelimelle epäonnistui. Yritä uudelleen." +"Update failed", "Päivitys epäonnistui" +". Event update failed. Please try again.", ". Tapahtuman päivitys epäonnistui. Yritä uudelleen." +"Event updated", "Tapahtuma päivitetty" +" has been updated.", " on päivitetty." +". Event ", ". Tapahtuman " +" delete failed. Please try again.", " poisto epäonnistui. Yritä uudelleen." +" Failed to create event. Please try again.", " Tapahtuman luonti epäonnistui. Yritä uudelleen." +"Event created", "Tapahtuma luotu" +"undefined", "määrittelemätön" +"Select route", "Valitse reitti" +"No valid results found.", "Sopivia tuloksia ei löytynyt." +"Course file error", "Ratatiedostovirhe" +"The selected course file could not be read.", "Valittua ratatiedostoa ei voitu lukea." +"File read error", "Tiedoston lukuvirhe" +"Failed to open selected world file.", "Valitun world-tiedoston avaaminen epäonnistui." +"World file error", "World-tiedostovirhe" +"The selected world file could not be read.", "Valittua world-tiedostoa ei voitu lukea." +" is not recognised. Only .jpg and .gif files are supported at present.", " ei tunnistettu. Vain .jpg- ja .gif-tiedostoja tuetaan tällä hetkellä." +"Results file error", "Tulostiedostovirhe" +"The selected results file could not be read.", "Valittua tulostiedostoa ei voitu lukea." +"File type error", "Tiedostotyyppivirhe" +"Results file type is not recognised. Please select a valid file.", "Tulostiedoston tyyppiä ei tunnistettu. Valitse kelvollinen tiedosto." +"No map loaded", "Karttaa ei ole ladattu" +"Please load a map file before adding results.", "Lataa karttatiedosto ennen tulosten lisäämistä." +"Please load a map file before adding courses.", "Lataa karttatiedosto ennen ratojen lisäämistä." +"No map selected", "Karttaa ei ole valittu" +"Please load a map before drawing courses", "Lataa kartta ennen ratojen piirtämistä" +"Event name is not valid.", "Tapahtuman nimi ei ole kelvollinen." +"Club name is not valid.", "Seuran nimi ei ole kelvollinen." +"Date is not valid.", "Päivämäärä ei ole kelvollinen." +"Event level is not valid.", "Tapahtuman taso ei ole kelvollinen." +"Event format is not valid.", "Tapahtumaformaatti ei ole kelvollinen." +"No course information. Check your course XML file.", "Ei ratatiedon osia. Tarkista radan XML-tiedosto." +"No results information. Check your results file.", "Ei tulostietoja. Tarkista tulostiedostosi." +"Controls have not been adjusted on the map.", "Rasteja ei ole sovitettu kartalle." +"Are you sure you want to update", "Oletko varma, että haluat päivittää" +"Maps deleted", "Kartat poistettu" +"Selected maps have been deleted.", "Valitut kartat on poistettu." +". Delete failed. Please try again.", ". Poisto epäonnistui. Yritä uudelleen." +"Oversized map upload", "Liian suuren kartan lataus" +"Course file problem", "Ongelma ratatiedostossa" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Ratatiedosto ei täsmää kartan koordinaatteihin. Varmista, että olet valinnut oikean tiedoston." +"Result details", "Tuloksen tiedot" +"Event", "Tapahtuma" +"Select event", "Valitse tapahtuma" +"Edit event details", "Muokkaa tapahtuman tietoja" +"Read-only", "Vain luku" +"Excluded controls", "Poissuljetut rastit" +"Update event details", "Päivitä tapahtuman tiedot" +"No event selected", "Tapahtumaa ei ole valittu" +"days", "päivää" +"hours", "tuntia" +"minutes", "minuuttia" +"seconds", "sekuntia" +"Manager Login", "Ylläpitäjän kirjautuminen" +"Replay speed", "Toiston nopeus" +"By control", "Rasteittain" \ No newline at end of file diff --git a/lang/fr.txt b/lang/fr.txt index a0e350f..675113e 100644 --- a/lang/fr.txt +++ b/lang/fr.txt @@ -1,32 +1,38 @@ "code", "fr" "language", "Français" -"translation", "rma@helga-o.com" -"Events", "Compétition" +"translation", "rma@helga-o.com & L.Falcone#2026" +"Cancel", "Annuler" +"Events", "Compétitions" "Course", "Parcours" "Courses", "Parcours" -"Controls", "Contrôles" +"Controls", "Balises" "Results", "Résultats" "Draw", "Dessiner" "Show", "Afficher" "Runners", "Coureurs" -"Routes", "Tracés" +"Routes", "Traces" "Route", "Trace" "Name", "Nom" "Time", "Chrono" "Replay", "Rejouer" "All", "Tous" -"Help", "Aide" +"Help", "A propos" "Options", "Options" -"Reset", "RAZ" +"Reset", "Recentrer" "Zoom out", "Zoom -" "Zoom in", "Zoom +" -"Splits", "Splits" +"Stats", "Statistiques" +"Measure", "Mesurer" +"Rotate right", "Pivoter à droite" +"Rotate left", "Pivoter à gauche" +"Splits", "Temps inter." "Splits table", "Table des Temps intermédiaires" "Select runners on Results tab", "Sélectionner les coureurs dans l'onglet Résultats" -"Log in", "Login" +"Login", "Connexion" +"Log in", "Se connecter" "User name", "Utilisateur" "Password", "Mot de passe" -"Show controls", "Afficher les contrôles" +"Show controls", "Afficher toutes les balises" "Hide controls", "Cacher les contrôles" "Show initials", "Afficher les initiales" "Show names", "Afficher les noms" @@ -43,6 +49,7 @@ "Start at", "Début à" "Length", "Long." "Full tails", "Trainée" +"Tails length", "Longueur de trainée" "No results available", "Aucun résultat disponible" "Configuration options", "Options de configuration" "Language", "Langue" @@ -70,11 +77,13 @@ "Save GPS route", "Enregistrer un tracé GPS" "Move track and map together (or right click-drag)", "Déplacer simultanément le tracé et la carte (ou clic-droit et glisser)" "Map is georeferenced", "Carte géo-référencée" -"International event", "Compétition internationale" -"National event", "Compétition nationale" -"Regional event", "Compétition régionale" -"Local event", "Compétition locale" -"Training event", "Entraînement" +"Event level", "Niveau de la compétition" +"Select level", "Sélectionner le niveau" +"International", "Internationale" +"National", "Nationale" +"Regional", "Régionale" +"Local", "Locale" +"Training", "Entraînement" "Unknown", "Inconnu" "Warning", "Avertissement" "Your route has been saved", "Votre tracé a été enregistré" @@ -101,3 +110,131 @@ "GPS routes are saved separately and will not be overwritten.", "Les traces GPS sont enregistrées séparément et ne sont pas remplacées." "Search", "Rechercher" +"Add event", "Ajouter une course" +"Edit event", "Editer une course" +"Add map", "Ajouter une carte" +"Delete maps", "Supprimer des cartes" +"Event details", "Détails de la course" +"Event name", "Nom de la course" +"Map", "Carte" +"Select map", "Selectionner une carte" +"No results file", "Sans fichier de résultat" +"Sort results file", "Trier le fichier de résultat" +"Only select if the results file is not already properly sorted.", "Cocher seulement si le fichier n'est pas correctement trié." +"Add classes to course names", "Ajouter les catégories au nom des parcours" +"Individual courses (butterfly/score/relay)", "Parcours avec variations (papillons/score/relais)" +"Draw course", "Dessiner un parcours" +"Move map and controls together", "Déplacer enssemble la carte et les balises" +"Read-only mode", Lecture seule (modifiable dans "éditer une course") +"Create event", "Créer la course" +"Map details", "Détail de la carte" +"Map name", "Nom de la carte" +"Map file", "Fichier de carte (jpg, gif)" +"Georeferencing", "Géoréférencement" +"Georeferencing file", "Fichier de géoréférencement (jgw,gfw,wld)" +"Co-ordinate system", "Système de coordonnées" +"Not georeferenced", "Pas de géoréférencement" +"Name", "Nom" +"None found.", "Pas de carte inutilisé" +"Delete selected maps", "Supprimer les cartes selectionnées" +"Warning", "Attention" +"No route selected.", "Pas de trace selectionné." +"Route ", "La trace " +" has been deleted.", "à été supprimé" +" will be permanently deleted. Are you sure?", " vas être supprimé définitivement.Êtes vous sÛr?" +"Confirm route delete", "Confirmer la suppression de la trace" +"Delete route", "Supprimer la trace" +"No maps selected.", "Pas de carte selectionné." +"Selected maps will be deleted. Are you sure?", "Les cartes selectionnées vont êtres supprimer définitivement. Êtes vous sûr?" +"Confirm map deletion", "Confirmer la suppression de la carte" +"Event ", "La course " +" will be deleted. Are you sure?", " vas être supprimé. Êtes vous sûr?" +"Event deleted", "Course supprimé" +"Confirm event delete", "Confirmer la suppression de la course" +"Delete event", "Supprimer la course" +"Confirm new map", "Confirmer l'ajout de carte" +"Are you sure you want to add this map?", "Êtes vous sûr de vouloir ajouter cette carte" +"Confirm event update", "Confirmer la mise à jour de la course" +"Update event", "Mettre à jour la course" +"Event set-up incomplete", "Formulaire de création de curse incomplet" +" Please enter all necessary information and make sure controls are aligned before creating the event.", "Merci d'entrer toutes les informations nécessaires et de vérifier que les balises soit correctement positionnées avant de créer la course." +"Are you sure you want to create this event?" +"Confirm event creation", "Confirmer la création de la course" +"Create event", "Créer la course" + +"Login failed", "Échec de la connexion" +"User name or password incorrect. Please try again.", "Nom d'utilisateur ou mot de passe incorrect. Veuillez réessayer." +"Please enter user name and password of at least five characters", "Veuillez saisir un nom d'utilisateur et un mot de passe d'au moins cinq caractères" +"Map added", "Carte ajoutée" +" has been added with id ", " a été ajouté(e) avec l'identifiant " +"Save failed", "Échec de l'enregistrement" +". Failed to save map. Please try again.", ". Échec de l'enregistrement de la carte. Veuillez réessayer." +"Upload failed", "Échec du chargement" +". Failed to upload map. Please try again.", ". Échec du chargement de la carte. Veuillez réessayer." +"Update failed", "Échec de la mise à jour" +". Event update failed. Please try again.", ". Échec de la mise à jour de l'événement. Veuillez réessayer." +"Event updated", "Événement mis à jour" +" has been updated.", " a été mis à jour." +"Delete failed", "Échec de la suppression" +". Event ", ". L'événement " +" delete failed. Please try again.", " : échec de la suppression. Veuillez réessayer." +"Save failed", "Échec de l'enregistrement" +" Failed to create event. Please try again.", " Échec de la création de l'événement. Veuillez réessayer." +" has been added with id ", " a été ajouté(e) avec l'identifiant " +"Event created", "Événement créé" +"undefined", "Non défini" +"Select route", "Sélectionner la trace" +"No valid results found.", "Aucun résultat valide trouvé." +"Course file error", "Erreur du fichier de parcours" +"The selected course file could not be read.", "Le fichier de parcours sélectionné n'a pas pu être lu." +"File read error", "Erreur de lecture du fichier" +"Failed to open selected world file.", "Échec de l'ouverture du fichier world sélectionné." +"World file error", "Erreur du fichier world" +"The selected world file could not be read.", "Le fichier world sélectionné n'a pas pu être lu." +" is not recognised. Only .jpg and .gif files are supported at present.", " n'est pas reconnu. Seuls les fichiers .jpg et .gif sont supportés pour le moment." +"Results file error", "Erreur du fichier de résultats" +"The selected results file could not be read.", "Le fichier de résultats sélectionné n'a pas pu être lu." +"File type error", "Erreur de type de fichier" +"Results file type is not recognised. Please select a valid file.", "Le type du fichier de résultats n'est pas reconnu. Veuillez sélectionner un fichier valide." +"No map loaded", "Aucune carte chargée" +"Please load a map file before adding results.", "Veuillez charger un fichier de carte avant d'ajouter des résultats." +"Please load a map file before adding courses.", "Veuillez charger un fichier de carte avant d'ajouter des parcours." +"No map selected", "Aucune carte sélectionnée" +"Please load a map before drawing courses", "Veuillez charger une carte avant de tracer des parcours" +"Event name is not valid.", "Le nom de l'événement n'est pas valide." +"No map selected.", "Aucune carte sélectionnée." +"Club name is not valid.", "Le nom du club n'est pas valide." +"Date is not valid.", "La date n'est pas valide." +"Event level is not valid.", "Le niveau de l'événement n'est pas valide." +"Event format is not valid.", "Le format de l'événement n'est pas valide." +"No course information. Check your course XML file.", "Aucune information de parcours. Vérifiez votre fichier XML de parcours." +"No results information. Check your results file.", "Aucune information de résultats. Vérifiez votre fichier de résultats." +"Controls have not been adjusted on the map.", "Les postes n'ont pas été ajustés sur la carte." +"Are you sure you want to update", "Êtes vous sûr de vouloir mettre à jour" +"Route deleted", "Trace supprimé" +"Maps deleted", "Cartes supprimées" +"Selected maps have been deleted.", "Les cartes sélectionnées ont été supprimées." +". Delete failed. Please try again.", ". Échec de la suppression. Veuillez réessayer." +"Oversized map upload", "Chargement d'une carte trop volumineuse" +"Course file problem", "Problème avec le fichier de parcours" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Votre fichier de parcours ne correspond pas aux coordonnées de la carte. Veuillez vérifier que vous avez sélectionné le bon fichier." +"Result details", "Détails des résultats" +"Event", "Course" +"Select event", "Selectionner une course" +"Edit event details", "Editer les details la course" +"Read-only", "Lecture seule" +"Excluded controls", "Balises exclues" +"Update event details", "Mettre à jours les détails de la course" +"No event selected", "Pas de course selectionné" +"days", "jours" +"hours", "heures" +"minutes", "minutes" +"seconds", "secondes" +"Manager Login", "Connexion administrateur" +"Mass start", "Départ en masse" +"Real time", "Heure réelle" +"Replay speed", "Vitesse d'animation" +"By control", "Par inter-postes" + + + diff --git a/lang/it.txt b/lang/it.txt index b1a9922..02b12f6 100644 --- a/lang/it.txt +++ b/lang/it.txt @@ -98,3 +98,128 @@ "If you draw a new route it will overwrite the old route for this runner.", "Se disegni un nuovo percorso, quello vecchio sarà sovrascritto." "GPS routes are saved separately and will not be overwritten.", "I percorsi GPS sono salvati separatamente e non saranno sovrascritti." "Search", "Cerca" + +# translated automaticaly by Gemini AI +"Cancel", "Annulla" +"Rotate right", "Ruota a destra" +"Rotate left", "Ruota a sinistra" +"Tails length", "Lunghezza traccia" +"Align map to next control", "Allinea la mappa alla lanterna successiva" +"Route has been deleted", "Il percorso è stato eliminato" +"Delete failed", "Eliminazione fallita" +"Share route", "Condividi percorso" +"Copy and paste this link to share your route", "Copia e incolla questo link per condividere il tuo percorso" +"Add event", "Aggiungi gara" +"Edit event", "Modifica gara" +"Add map", "Aggiungi mappa" +"Delete maps", "Elimina mappe" +"Event details", "Dettagli gara" +"Event name", "Nome gara" +"Map", "Mappa" +"Select map", "Seleziona mappa" +"No results file", "Nessun file dei risultati" +"Sort results file", "Ordina il file dei risultati" +"Only select if the results file is not already properly sorted.", "Seleziona solo se il file dei risultati non è già ordinato correttamente." +"Add classes to course names", "Aggiungi le categorie ai nomi dei tracciati" +"Individual courses (butterfly/score/relay)", "Tracciati individuali (farfalla/score/staffetta)" +"Draw course", "Disegna tracciato" +"Move map and controls together", "Muovi mappa e lanterne insieme" +"Read-only mode", "Modalità sola lettura" +"Create event", "Crea gara" +"Map details", "Dettagli mappa" +"Map name", "Nome mappa" +"Map file", "File della mappa (jpg, gif)" +"Georeferencing", "Georeferenziazione" +"Georeferencing file", "File di georeferenziazione (jgw, gfw, wld)" +"Co-ordinate system", "Sistema di coordinate" +"Not georeferenced", "Non georeferenziata" +"None found.", "Nessuna trovata." +"Delete selected maps", "Elimina le mappe selezionate" +"No route selected.", "Nessun percorso selezionato." +"Route ", "Il percorso " +" has been deleted.", " è stato eliminato." +" will be permanently deleted. Are you sure?", " sarà eliminato definitivamente. Sei sicuro?" +"Confirm route delete", "Conferma eliminazione percorso" +"Delete route", "Elimina percorso" +"No maps selected.", "Nessuna mappa selezionata." +"Selected maps will be deleted. Are you sure?", "Le mappe selezionate saranno eliminate. Sei sicuro?" +"Confirm map deletion", "Conferma eliminazione mappa" +"Event ", "La gara " +" will be deleted. Are you sure?", " sarà eliminata. Sei sicuro?" +"Event deleted", "Gara eliminata" +"Confirm event delete", "Conferma eliminazione gara" +"Delete event", "Elimina gara" +"Confirm new map", "Conferma nuova mappa" +"Are you sure you want to add this map?", "Sei sicuro di voler aggiungere questa mappa?" +"Confirm event update", "Conferma aggiornamento gara" +"Update event", "Aggiorna gara" +"Event set-up incomplete", "Configurazione gara incompleta" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Inserisci tutte le informazioni necessarie e assicurati che i punti siano allineati prima di creare la gara." +"Are you sure you want to create this event?", "Sei sicuro di voler creare questa gara?" +"Confirm event creation", "Conferma creazione gara" +"Login failed", "Accesso fallito" +"User name or password incorrect. Please try again.", "Nome utente o password errati. Riprova." +"Please enter user name and password of at least five characters", "Inserisci un nome utente e una password di almeno cinque caratteri" +"Map added", "Mappa aggiunta" +" has been added with id ", " è stato aggiunto con l'id " +"Save failed", "Salvataggio fallito" +". Failed to save map. Please try again.", ". Impossibile salvare la mappa. Riprova." +"Upload failed", "Caricamento fallito" +". Failed to upload map. Please try again.", ". Impossibile caricare la mappa. Riprova." +"Update failed", "Aggiornamento fallito" +". Event update failed. Please try again.", ". Aggiornamento della gara fallito. Riprova." +"Event updated", "Gara aggiornata" +" has been updated.", " è stata aggiornata." +". Event ", ". La gara " +" delete failed. Please try again.", " eliminazione fallita. Riprova." +" Failed to create event. Please try again.", " Impossibile creare la gara. Riprova." +"Event created", "Gara creata" +"undefined", "non definito" +"Select route", "Seleziona percorso" +"No valid results found.", "Nessun risultato valido trovato." +"Course file error", "Errore nel file dei tracciati" +"The selected course file could not be read.", "Impossibile leggere il file dei tracciati selezionato." +"File read error", "Errore di lettura del file" +"Failed to open selected world file.", "Impossibile aprire il file world selezionato." +"World file error", "Errore nel file world" +"The selected world file could not be read.", "Impossibile leggere il file world selezionato." +" is not recognised. Only .jpg and .gif files are supported at present.", " non è riconosciuto. Al momento sono supportati solo i file .jpg e .gif." +"Results file error", "Errore nel file dei risultati" +"The selected results file could not be read.", "Impossibile leggere il file dei risultati selezionato." +"File type error", "Errore nel tipo di file" +"Results file type is not recognised. Please select a valid file.", "Il tipo di file dei risultati non è riconosciuto. Seleziona un file valido." +"No map loaded", "Nessuna mappa caricata" +"Please load a map file before adding results.", "Carica un file mappa prima di aggiungere i risultati." +"Please load a map file before adding courses.", "Carica un file mappa prima di aggiungere i tracciati." +"No map selected", "Nessuna mappa selezionata" +"Please load a map before drawing courses", "Carica una mappa prima di disegnare i tracciati" +"Event name is not valid.", "Il nome della gara non è valido." +"Club name is not valid.", "Il nome della società non è valido." +"Date is not valid.", "La data non è valida." +"Event level is not valid.", "Il livello della gara non è valido." +"Event format is not valid.", "Il formato della gara non è valido." +"No course information. Check your course XML file.", "Nessuna informazione sui tracciati. Controlla il file XML dei tracciati." +"No results information. Check your results file.", "Nessuna informazione sui risultati. Controlla il file dei risultati." +"Controls have not been adjusted on the map.", "I punti di controllo non sono stati regolati sulla mappa." +"Are you sure you want to update", "Sei sicuro di voler aggiornare" +"Maps deleted", "Mappe eliminate" +"Selected maps have been deleted.", "Le mappe selezionate sono state eliminate." +". Delete failed. Please try again.", ". Eliminazione fallita. Riprova." +"Oversized map upload", "Caricamento di una mappa troppo grande" +"Course file problem", "Problema con il file dei tracciati" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Il file dei tracciati non corrisponde alle coordinate della mappa. Verifica di aver selezionato il file corretto." +"Result details", "Dettagli dei risultati" +"Event", "Gara" +"Select event", "Seleziona gara" +"Edit event details", "Modifica dettagli gara" +"Read-only", "Sola lettura" +"Excluded controls", "Lanterne escluse" +"Update event details", "Aggiorna dettagli gara" +"No event selected", "Nessuna gara selezionata" +"days", "giorni" +"hours", "ore" +"minutes", "minuti" +"seconds", "secondi" +"Manager Login", "Accesso amministratore" +"Replay speed", "Velocità di riproduzione" +"By control", "Per lanterna" \ No newline at end of file diff --git a/lang/ja.txt b/lang/ja.txt index f921deb..0d166aa 100644 --- a/lang/ja.txt +++ b/lang/ja.txt @@ -103,3 +103,125 @@ "新しくルートを記入するとこの走者の古いルートが上書きされます" "GPS routes are saved separately and will not be overwritten.", "GPSルートは別途保存され、上書きさません。" "Search", "検索" + +# translated automaticaly by Gemini AI +"Cancel", "キャンセル" +"Tails length", "尻尾の長さ" +"Route has been deleted", "ルートは削除されました" +"Delete failed", "削除に失敗しました" +"Share route", "ルートを共有" +"Copy and paste this link to share your route", "ルートを共有するには、このリンクをコピーして貼り付けてください" +"Add event", "イベントを追加" +"Edit event", "イベントを編集" +"Add map", "地図を追加" +"Delete maps", "地図を削除" +"Event details", "イベントの詳細" +"Event name", "イベント名" +"Map", "地図" +"Select map", "地図を選択" +"No results file", "リザルトファイルがありません" +"Sort results file", "リザルトファイルを並べ替え" +"Only select if the results file is not already properly sorted.", "リザルトファイルがまだ適切に並べ替えられていない場合のみ選択してください。" +"Add classes to course names", "コース名にクラスを追加" +"Individual courses (butterfly/score/relay)", "個人コース (バタフライ/スコア/リレー)" +"Draw course", "コースを描く" +"Move map and controls together", "地図とコントロールを同時に移動" +"Read-only mode", "読み取り専用モード" +"Create event", "イベントを作成" +"Map details", "地図の詳細" +"Map name", "地図名" +"Map file", "地図ファイル (jpg, gif)" +"Georeferencing", "ジオレファレンス" +"Georeferencing file", "ジオレファレンスファイル (jgw, gfw, wld)" +"Co-ordinate system", "座標系" +"Not georeferenced", "ジオレファレンスなし" +"None found.", "見つかりません。" +"Delete selected maps", "選択した地図を削除" +"No route selected.", "ルートが選択されていません。" +"Route ", "ルート " +" has been deleted.", " が削除されました。" +" will be permanently deleted. Are you sure?", " は完全に削除されます。本当によろしいですか?" +"Confirm route delete", "ルート削除の確認" +"Delete route", "ルートを削除" +"No maps selected.", "地図が選択されていません。" +"Selected maps will be deleted. Are you sure?", "選択した地図が削除されます。本当によろしいですか?" +"Confirm map deletion", "地図削除の確認" +"Event ", "イベント " +" will be deleted. Are you sure?", " が削除されます。本当によろしいですか?" +"Event deleted", "イベントが削除されました" +"Confirm event delete", "イベント削除の確認" +"Delete event", "イベントを削除" +"Confirm new map", "新しい地図の確認" +"Are you sure you want to add this map?", "この地図を追加してもよろしいですか?" +"Confirm event update", "イベント更新の確認" +"Update event", "イベントを更新" +"Event set-up incomplete", "イベント設定が不完全です" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " イベントを作成する前に、必要な情報をすべて入力し、コントロールが整列していることを確認してください。" +"Are you sure you want to create this event?", "このイベントを作成してもよろしいですか?" +"Confirm event creation", "イベント作成の確認" +"Login failed", "ログイン失敗" +"User name or password incorrect. Please try again.", "ユーザー名またはパスワードが正しくありません。もう一度お試しください。" +"Please enter user name and password of at least five characters", "5文字以上のユーザー名とパスワードを入力してください" +"Map added", "地図が追加されました" +" has been added with id ", " がID付きで追加されました: " +"Save failed", "保存失敗" +". Failed to save map. Please try again.", ". 地図の保存に失敗しました。もう一度お試しください。" +"Upload failed", "アップロード失敗" +". Failed to upload map. Please try again.", ". 地図のアップロードに失敗しました。もう一度お試しください。" +"Update failed", "更新失敗" +". Event update failed. Please try again.", ". イベントの更新に失敗しました。もう一度お試しください。" +"Event updated", "イベントが更新されました" +" has been updated.", " が更新されました。" +". Event ", ". イベント " +" delete failed. Please try again.", " の削除に失敗しました。もう一度お試しください。" +" Failed to create event. Please try again.", " イベントの作成に失敗しました。もう一度お試しください。" +"Event created", "イベントが作成されました" +"undefined", "未定義" +"Select route", "ルートを選択" +"No valid results found.", "有効なリザルトが見つかりません。" +"Course file error", "コースファイルのエラー" +"The selected course file could not be read.", "選択されたコースファイルを読み込めませんでした。" +"File read error", "ファイル読み込みエラー" +"Failed to open selected world file.", "選択されたワールドファイルを開けませんでした。" +"World file error", "ワールドファイルのエラー" +"The selected world file could not be read.", "選択されたワールドファイルを読み込めませんでした。" +" is not recognised. Only .jpg and .gif files are supported at present.", " は認識されません。現在、.jpg および .gif ファイルのみがサポートされています。" +"Results file error", "リザルトファイルのエラー" +"The selected results file could not be read.", "選択されたリザルトファイルを読み込めませんでした。" +"File type error", "ファイルタイプのエラー" +"Results file type is not recognised. Please select a valid file.", "リザルトファイルの形式が認識されません。有効なファイルを選択してください。" +"No map loaded", "地図がロードされていません" +"Please load a map file before adding results.", "リザルトを追加する前に地図ファイルをロードしてください。" +"Please load a map file before adding courses.", "コースを追加する前に地図ファイルをロードしてください。" +"No map selected", "地図が選択されていません" +"Please load a map before drawing courses", "コースを描く前に地図をロードしてください" +"Event name is not valid.", "イベント名が正しくありません。" +"Club name is not valid.", "クラブ名が正しくありません。" +"Date is not valid.", "日付が正しくありません。" +"Event level is not valid.", "イベントレベルが正しくありません。" +"Event format is not valid.", "イベント形式が正しくありません。" +"No course information. Check your course XML file.", "コース情報がありません。コースのXMLファイルを確認してください。" +"No results information. Check your results file.", "リザルト情報がありません。リザルトファイルを確認してください。" +"Controls have not been adjusted on the map.", "コントロールが地図上で調整されていません。" +"Are you sure you want to update", "更新してもよろしいですか" +"Maps deleted", "地図が削除されました" +"Selected maps have been deleted.", "選択した地図が削除されました。" +". Delete failed. Please try again.", ". 削除に失敗しました。もう一度お試しください。" +"Oversized map upload", "容量超過の地図アップロード" +"Course file problem", "コースファイルの問題" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "コースファイルが地図の座標と一致しません。正しいファイルが選択されているか確認してください。" +"Result details", "リザルトの詳細" +"Event", "イベント" +"Select event", "イベントを選択" +"Edit event details", "イベントの詳細を編集" +"Read-only", "読み取り専用" +"Excluded controls", "除外されたコントロール" +"Update event details", "イベントの詳細を更新" +"No event selected", "イベントが選択されていません" +"days", "日" +"hours", "時間" +"minutes", "分" +"seconds", "秒" +"Manager Login", "管理者ログイン" +"Replay speed", "再生速度" +"By control", "コントロール毎" \ No newline at end of file diff --git a/lang/no.txt b/lang/no.txt index bc7730b..557f399 100644 --- a/lang/no.txt +++ b/lang/no.txt @@ -94,3 +94,131 @@ "Drag a handle to adjust track around locked point(s)", "Dra et håndtak for å justere et spor mellom festepunkter" "Search", "Søk" "Align map to next control", "Tilpass kartet mot neste post" + +# translated automaticaly by Gemini AI +"Cancel", "Avbryt" +"Rotate right", "Roter høyre" +"Rotate left", "Roter venstre" +"Tails length", "Halelengde" +"Route has been deleted", "Sporet har blitt slettet" +"Delete failed", "Sletting feilet" +"Share route", "Del spor" +"Copy and paste this link to share your route", "Kopier og lim inn denne lenken for å dele sporet ditt" +"Autofit", "Autotilpass" +"Route already drawn", "Sporet er allerede tegnet" +"If you draw a new route it will overwrite the old route for this runner.", "Hvis du tegner et nytt spor, vil det overskrive det gamle sporet for denne løperen." +"GPS routes are saved separately and will not be overwritten.", "GPS-spor lagres separat og vil ikke bli overskrevet." +"Add event", "Legg til løp" +"Edit event", "Rediger løp" +"Add map", "Legg til kart" +"Delete maps", "Slett kart" +"Event details", "Løpsdetaljer" +"Event name", "Løpsnavn" +"Map", "Kart" +"Select map", "Velg kart" +"No results file", "Ingen resultatfil" +"Sort results file", "Sorter resultatfil" +"Only select if the results file is not already properly sorted.", "Velg bare hvis resultatfilen ikke allerede er riktig sortert." +"Add classes to course names", "Legg til klasser i løypenavn" +"Individual courses (butterfly/score/relay)", "Individuelle løyper (sommerfugl/poeng/stafett)" +"Draw course", "Tegn løype" +"Move map and controls together", "Flytt kart og poster sammen" +"Read-only mode", "Skrivebeskyttet modus" +"Create event", "Opprett løp" +"Map details", "Kartdetaljer" +"Map name", "Kartnavn" +"Map file", "Kartfil (jpg, gif)" +"Georeferencing", "Georeferering" +"Georeferencing file", "Georefereringsfil (jgw, gfw, wld)" +"Co-ordinate system", "Koordinatsystem" +"Not georeferenced", "Ikke georeferert" +"None found.", "Ingen funnet." +"Delete selected maps", "Slett valgte kart" +"No route selected.", "Ingen spor valgt." +"Route ", "Spor " +" has been deleted.", " har blitt slettet." +" will be permanently deleted. Are you sure?", " vil bli permanent slettet. Er du sikker?" +"Confirm route delete", "Bekreft sletting av spor" +"Delete route", "Slett spor" +"No maps selected.", "Ingen kart valgt." +"Selected maps will be deleted. Are you sure?", "Valgte kart vil bli slettet. Er du sikker?" +"Confirm map deletion", "Bekreft sletting av kart" +"Event ", "Løp " +" will be deleted. Are you sure?", " vil bli slettet. Er du sikker?" +"Event deleted", "Løp slettet" +"Confirm event delete", "Bekreft sletting av løp" +"Delete event", "Slett løp" +"Confirm new map", "Bekreft nytt kart" +"Are you sure you want to add this map?", "Er du sikker på at du vil legge til dette kartet?" +"Confirm event update", "Bekreft oppdatering av løp" +"Update event", "Oppdater løp" +"Event set-up incomplete", "Løpsoppsett ufullstendig" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Vennligst legg inn all nødvendig informasjon og pass på at postene er riktig plassert før du oppretter løpet." +"Are you sure you want to create this event?", "Er du sikker på at du vil opprette dette løpet?" +"Confirm event creation", "Bekreft opprettelse av løp" +"Login failed", "Innlogging feilet" +"User name or password incorrect. Please try again.", "Feil brukernavn eller passord. Vennligst prøv igjen." +"Please enter user name and password of at least five characters", "Vennligst oppgi brukernavn og passord på minst fem tegn" +"Map added", "Kart lagt til" +" has been added with id ", " har blitt lagt til med id " +"Save failed", "Lagring feilet" +". Failed to save map. Please try again.", ". Kunne ikke lagre kart. Vennligst prøv igjen." +"Upload failed", "Opplasting feilet" +". Failed to upload map. Please try again.", ". Kunne ikke laste opp kart. Vennligst prøv igjen." +"Update failed", "Oppdatering feilet" +". Event update failed. Please try again.", ". Oppdatering av løp feilet. Vennligst prøv igjen." +"Event updated", "Løp oppdatert" +" has been updated.", " har blitt oppdatert." +". Event ", ". Løp " +" delete failed. Please try again.", " sletting feilet. Vennligst prøv igjen." +" Failed to create event. Please try again.", " Kunne ikke opprette løp. Vennligst prøv igjen." +"Event created", "Løp opprettet" +"undefined", "udefinert" +"Select route", "Velg spor" +"No valid results found.", "Ingen gyldige resultater funnet." +"Course file error", "Feil med løypefil" +"The selected course file could not be read.", "Den valgte løypefilen kunne ikke leses." +"File read error", "Feil ved lesing av fil" +"Failed to open selected world file.", "Kunne ikke åpne valgt world-fil." +"World file error", "Feil med world-fil" +"The selected world file could not be read.", "Den valgte world-filen kunne ikke leses." +" is not recognised. Only .jpg and .gif files are supported at present.", " er ikke gjenkjent. Bare .jpg og .gif-filer støttes for øyeblikket." +"Results file error", "Feil med resultatfil" +"The selected results file could not be read.", "Den valgte resultatfilen kunne ikke leses." +"File type error", "Feil filtype" +"Results file type is not recognised. Please select a valid file.", "Resultatfiltypen er ikke gjenkjent. Vennligst velg en gyldig fil." +"No map loaded", "Ingen kart lastet" +"Please load a map file before adding results.", "Vennligst last en kartfil før du legger til resultater." +"Please load a map file before adding courses.", "Vennligst last en kartfil før du legger til løyper." +"No map selected", "Ingen kart valgt" +"Please load a map before drawing courses", "Vennligst last et kart før du tegner løyper" +"Event name is not valid.", "Løpsnavnet er ikke gyldig." +"Club name is not valid.", "Klubbnavnet er ikke gyldig." +"Date is not valid.", "Datoen er ikke gyldig." +"Event level is not valid.", "Løpsnivået er ikke gyldig." +"Event format is not valid.", "Løpsformatet er ikke gyldig." +"No course information. Check your course XML file.", "Ingen løypeinformasjon. Sjekk løypas XML-fil." +"No results information. Check your results file.", "Ingen resultatinformasjon. Sjekk resultatfilen." +"Controls have not been adjusted on the map.", "Postene har ikke blitt justert på kartet." +"Are you sure you want to update", "Er du sikker på at du vil oppdatere" +"Maps deleted", "Kart slettet" +"Selected maps have been deleted.", "Valgte kart har blitt slettet." +". Delete failed. Please try again.", ". Sletting feilet. Vennligst prøv igjen." +"Oversized map upload", "For stor kartfil lastet opp" +"Course file problem", "Problem med løypefil" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Løypefilen din stemmer ikke med kartkoordinatene. Vennligst sjekk at du har valgt riktig fil." +"Result details", "Resultatdetaljer" +"Event", "Løp" +"Select event", "Velg løp" +"Edit event details", "Rediger løpsdetaljer" +"Read-only", "Skrivebeskyttet" +"Excluded controls", "Ekskluderte poster" +"Update event details", "Oppdater løpsdetaljer" +"No event selected", "Ingen løp valgt" +"days", "dager" +"hours", "timer" +"minutes", "minutter" +"seconds", "sekunder" +"Manager Login", "Administratorinnlogging" +"Replay speed", "Omløpshastighet" +"By control", "Per strekk" \ No newline at end of file diff --git a/lang/pt.txt b/lang/pt.txt index fc2945c..c11e208 100644 --- a/lang/pt.txt +++ b/lang/pt.txt @@ -101,3 +101,132 @@ "If you draw a new route it will overwrite the old route for this runner.", "Se você desenhar uma nova rota isto irá substituir a rota anterior para este corredor." "GPS routes are saved separately and will not be overwritten.", "Rotas do GPS são salvas separadamente e não serão substituídas." "Search", "Buscar" + +# translated automaticaly by Gemini AI +"Cancel", "Cancelar" +"Tails length", "Comprimento do rastro" +"Route has been deleted", "A rota foi excluída" +"Delete failed", "Falha na exclusão" +"Share route", "Compartilhar rota" +"Copy and paste this link to share your route", "Copie e cole este link para compartilhar sua rota" +"Event level", "Nível do evento" +"Select level", "Selecione o nível" +"International", "Internacional" +"National", "Nacional" +"Regional", "Regional" +"Local", "Local" +"Training", "Treino" +"Add event", "Adicionar evento" +"Edit event", "Editar evento" +"Add map", "Adicionar mapa" +"Delete maps", "Excluir mapas" +"Event details", "Detalhes do evento" +"Event name", "Nome do evento" +"Map", "Mapa" +"Select map", "Selecionar mapa" +"No results file", "Sem arquivo de resultados" +"Sort results file", "Ordenar arquivo de resultados" +"Only select if the results file is not already properly sorted.", "Selecione apenas se o arquivo de resultados já não estiver devidamente ordenado." +"Add classes to course names", "Adicionar categorias aos nomes dos percursos" +"Individual courses (butterfly/score/relay)", "Percursos individuais (borboleta/score/revezamento)" +"Draw course", "Desenhar percurso" +"Move map and controls together", "Mover mapa e controles juntos" +"Read-only mode", "Modo somente leitura" +"Create event", "Criar evento" +"Map details", "Detalhes do mapa" +"Map name", "Nome do mapa" +"Map file", "Arquivo de mapa (jpg, gif)" +"Georeferencing", "Georreferenciamento" +"Georeferencing file", "Arquivo de georreferenciamento (jgw, gfw, wld)" +"Co-ordinate system", "Sistema de coordenadas" +"Not georeferenced", "Não georreferenciado" +"None found.", "Nenhum encontrado." +"Delete selected maps", "Excluir mapas selecionados" +"No route selected.", "Nenhuma rota selecionada." +"Route ", "A rota " +" has been deleted.", " foi excluída." +" will be permanently deleted. Are you sure?", " será excluída permanentemente. Você tem certeza?" +"Confirm route delete", "Confirmar exclusão de rota" +"Delete route", "Excluir rota" +"No maps selected.", "Nenhum mapa selecionado." +"Selected maps will be deleted. Are you sure?", "Os mapas selecionados serão excluídos. Você tem certeza?" +"Confirm map deletion", "Confirmar exclusão de mapa" +"Event ", "O evento " +" will be deleted. Are you sure?", " será excluído. Você tem certeza?" +"Event deleted", "Evento excluído" +"Confirm event delete", "Confirmar exclusão de evento" +"Delete event", "Excluir evento" +"Confirm new map", "Confirmar novo mapa" +"Are you sure you want to add this map?", "Tem certeza de que deseja adicionar este mapa?" +"Confirm event update", "Confirmar atualização de evento" +"Update event", "Atualizar evento" +"Event set-up incomplete", "Configuração do evento incompleta" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Por favor, insira todas as informações necessárias e certifique-se de que os controles estão alinhados antes de criar o evento." +"Are you sure you want to create this event?", "Tem certeza de que deseja criar este evento?" +"Confirm event creation", "Confirmar criação de evento" +"Login failed", "Falha no login" +"User name or password incorrect. Please try again.", "Nome de usuário ou senha incorretos. Por favor, tente novamente." +"Please enter user name and password of at least five characters", "Por favor, insira um nome de usuário e senha com pelo menos cinco caracteres" +"Map added", "Mapa adicionado" +" has been added with id ", " foi adicionado com o id " +"Save failed", "Falha ao salvar" +". Failed to save map. Please try again.", ". Falha ao salvar o mapa. Por favor, tente novamente." +"Upload failed", "Falha no upload" +". Failed to upload map. Please try again.", ". Falha ao enviar o mapa. Por favor, tente novamente." +"Update failed", "Falha na atualização" +". Event update failed. Please try again.", ". Falha na atualização do evento. Por favor, tente novamente." +"Event updated", "Evento atualizado" +" has been updated.", " foi atualizado." +". Event ", ". O evento " +" delete failed. Please try again.", " falha ao excluir. Por favor, tente novamente." +" Failed to create event. Please try again.", " Falha ao criar o evento. Por favor, tente novamente." +"Event created", "Evento criado" +"undefined", "indefinido" +"Select route", "Selecionar rota" +"No valid results found.", "Nenhum resultado válido encontrado." +"Course file error", "Erro no arquivo de percurso" +"The selected course file could not be read.", "O arquivo de percurso selecionado não pôde ser lido." +"File read error", "Erro de leitura de arquivo" +"Failed to open selected world file.", "Falha ao abrir o arquivo world selecionado." +"World file error", "Erro no arquivo world" +"The selected world file could not be read.", "O arquivo world selecionado não pôde ser lido." +" is not recognised. Only .jpg and .gif files are supported at present.", " não é reconhecido. No momento, apenas arquivos .jpg e .gif são suportados." +"Results file error", "Erro no arquivo de resultados" +"The selected results file could not be read.", "O arquivo de resultados selecionado não pôde ser lido." +"File type error", "Erro no tipo de arquivo" +"Results file type is not recognised. Please select a valid file.", "O tipo de arquivo de resultados não é reconhecido. Por favor, selecione un arquivo válido." +"No map loaded", "Nenhum mapa carregado" +"Please load a map file before adding results.", "Por favor, carregue um arquivo de mapa antes de adicionar resultados." +"Please load a map file before adding courses.", "Por favor, carregue um arquivo de mapa antes de adicionar percursos." +"No map selected", "Nenhum mapa selecionado" +"Please load a map before drawing courses", "Por favor, carregue um mapa antes de desenhar percursos" +"Event name is not valid.", "O nome do evento não é válido." +"Club name is not valid.", "O nome do clube não é válido." +"Date is not valid.", "A data não é válida." +"Event level is not valid.", "O nível do evento não é válido." +"Event format is not valid.", "O formato do evento não é válido." +"No course information. Check your course XML file.", "Sem informações de percurso. Verifique seu arquivo XML de percurso." +"No results information. Check your results file.", "Sem informações de resultados. Verifique seu arquivo de resultados." +"Controls have not been adjusted on the map.", "Os controles não foram ajustados no mapa." +"Are you sure you want to update", "Tem certeza de que deseja atualizar" +"Maps deleted", "Mapas excluídos" +"Selected maps have been deleted.", "Os mapas selecionados foram excluídos." +". Delete failed. Please try again.", ". Falha na exclusão. Por favor, tente novamente." +"Oversized map upload", "Upload de mapa de tamanho excessivo" +"Course file problem", "Problema no arquivo de percurso" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Seu arquivo de percurso não corresponde às coordenadas do mapa. Por favor, verifique se selecionou o arquivo correto." +"Result details", "Detalhes do resultado" +"Event", "Evento" +"Select event", "Selecionar evento" +"Edit event details", "Editar detalhes do evento" +"Read-only", "Somente leitura" +"Excluded controls", "Controles excluídos" +"Update event details", "Atualizar detalhes do evento" +"No event selected", "Nenhum evento selecionado" +"days", "dias" +"hours", "horas" +"minutes", "minutos" +"seconds", "segundos" +"Manager Login", "Login do administrador" +"Replay speed", "Velocidade de repetição" +"By control", "Por interposto" \ No newline at end of file diff --git a/lang/ru.txt b/lang/ru.txt index 5895f28..4276221 100644 --- a/lang/ru.txt +++ b/lang/ru.txt @@ -85,3 +85,133 @@ "Right click to delete a handle", "Кликнуть правой кнопкой мыши для удаления линии" "Drag a handle to adjust track around locked point(s)", "Тянуть точку отметки для выравнивания трека по заблокированной точке" "Search", "Найти" + +# translated automaticaly by Gemini AI +"Cancel", "Отмена" +"Rotate right", "Повернуть вправо" +"Rotate left", "Повернуть влево" +"Tails length", "Длина трека" +"Align map to next control", "Выровнять карту по следующему КП" +"Route has been deleted", "Маршрут был удален" +"Delete failed", "Ошибка удаления" +"Share route", "Поделиться маршрутом" +"Copy and paste this link to share your route", "Скопируйте и вставьте эту ссылку, чтобы поделиться своим маршрутом" +"Autofit", "Автоподбор" +"Route already drawn", "Маршрут уже нарисован" +"If you draw a new route it will overwrite the old route for this runner.", "Если вы нарисуете новый маршрут, он перезапишет старый маршрут для этого участника." +"GPS routes are saved separately and will not be overwritten.", "GPS-треки сохраняются отдельно и не будут перезаписаны." +"Add event", "Добавить соревнование" +"Edit event", "Редактировать соревнование" +"Add map", "Добавить карту" +"Delete maps", "Удалить карты" +"Event details", "Детали соревнования" +"Event name", "Название соревнования" +"Map", "Карта" +"Select map", "Выбрать карту" +"No results file", "Нет файла результатов" +"Sort results file", "Сортировать файл результатов" +"Only select if the results file is not already properly sorted.", "Выбирайте только в том случае, если файл результатов еще не отсортирован должным образом." +"Add classes to course names", "Добавить группы к названиям дистанций" +"Individual courses (butterfly/score/relay)", "Индивидуальные дистанции (бабочка/рогейн/эстафета)" +"Draw course", "Нарисовать дистанцию" +"Move map and controls together", "Перемещать карту и КП одновременно" +"Read-only mode", "Режим «только для чтения»" +"Create event", "Создать соревнование" +"Map details", "Детали карты" +"Map name", "Название карты" +"Map file", "Файл карты (jpg, gif)" +"Georeferencing", "Геопривязка" +"Georeferencing file", "Файл геопривязки (jgw, gfw, wld)" +"Co-ordinate system", "Система координат" +"Not georeferenced", "Без геопривязки" +"None found.", "Ничего не найдено." +"Delete selected maps", "Удалить выбранные карты" +"No route selected.", "Маршрут не выбран." +"Route ", "Маршрут " +" has been deleted.", " был удален." +" will be permanently deleted. Are you sure?", " будет удален безвозвратно. Вы уверены?" +"Confirm route delete", "Подтвердить premature удаление маршрута" +"Delete route", "Удалить маршрут" +"No maps selected.", "Карты не выбраны." +"Selected maps will be deleted. Are you sure?", "Выбранные карты будут удалены. Вы уверены?" +"Confirm map deletion", "Подтвердить удаление карты" +"Event ", "Соревнование " +" will be deleted. Are you sure?", " будет удалено. Вы уверены?" +"Event deleted", "Соревнование удалено" +"Confirm event delete", "Подтвердить удаление соревнования" +"Delete event", "Удалить соревнование" +"Confirm new map", "Подтвердить новую карту" +"Are you sure you want to add this map?", "Вы уверены, что хотите добавить эту карту?" +"Confirm event update", "Подтвердить обновление соревнования" +"Update event", "Обновить соревнование" +"Event set-up incomplete", "Настройка соревнования не завершена" +" Please enter all necessary information and make sure controls are aligned before creating the event.", " Пожалуйста, введите всю необходимую информацию и убедитесь, что КП выровнены, прежде чем создавать соревнование." +"Are you sure you want to create this event?", "Вы уверены, что хотите создать это соревнование?" +"Confirm event creation", "Подтвердить создание соревнования" +"Login failed", "Ошибка входа" +"User name or password incorrect. Please try again.", "Неверное имя пользователя или пароль. Пожалуйста, попробуйте еще раз." +"Please enter user name and password of at least five characters", "Пожалуйста, введите имя пользователя и пароль длиной не менее пяти символов" +"Map added", "Карта добавлена" +" has been added with id ", " был(а) добавлен(а) с id " +"Save failed", "Ошибка сохранения" +". Failed to save map. Please try again.", ". Не удалось сохранить карту. Пожалуйста, попробуйте еще раз." +"Upload failed", "Ошибка загрузки" +". Failed to upload map. Please try again.", ". Не удалось загрузить карту. Пожалуйста, попробуйте еще раз." +"Update failed", "Ошибка обновления" +". Event update failed. Please try again.", ". Не удалось обновить соревнование. Пожалуйста, попробуйте еще раз." +"Event updated", "Соревнование обновлено" +" has been updated.", " был(а) обновлен(а)." +"Delete failed", "Ошибка удаления" +". Event ", ". Соревнование " +" delete failed. Please try again.", " : не удалось удалить. Пожалуйста, попробуйте еще раз." +" Failed to create event. Please try again.", " Не удалось создать соревнование. Пожалуйста, попробуйте еще раз." +"Event created", "Соревнование создано" +"undefined", "не определено" +"Select route", "Выбрать маршрут" +"No valid results found.", "Valid-результаты не найдены." +"Course file error", "Ошибка файла дистанции" +"The selected course file could not be read.", "Не удалось прочитать выбранный файл дистанции." +"File read error", "Ошибка чтения файла" +"Failed to open selected world file.", "Не удалось открыть выбранный world-файл." +"World file error", "Ошибка world-файла" +"The selected world file could not be read.", "Не удалось прочитать выбранный world-файл." +" is not recognised. Only .jpg and .gif files are supported at present.", " не распознается. В настоящее время поддерживаются только файлы .jpg и .gif." +"Results file error", "Ошибка файла результатов" +"The selected results file could not be read.", "Не удалось прочитать выбранный файл результатов." +"File type error", "Ошибка типа файла" +"Results file type is not recognised. Please select a valid file.", "Тип файла результатов не распознан. Пожалуйста, выберите корректный файл." +"No map loaded", "Карта не загружена" +"Please load a map file before adding results.", "Пожалуйста, загрузите файл карты перед добавлением результатов." +"Please load a map file before adding courses.", "Пожалуйста, загрузите файл карты перед добавлением дистанций." +"No map selected", "Карта не выбрана" +"Please load a map before drawing courses", "Пожалуйста, загрузите карту перед рисованием дистанций" +"Event name is not valid.", "Недопустимое название соревнования." +"Club name is not valid.", "Недопустимое название клуба." +"Date is not valid.", "Недопустимая дата." +"Event level is not valid.", "Недопустимый уровень соревнования." +"Event format is not valid.", "Недопустимый формат соревнования." +"No course information. Check your course XML file.", "Нет информации о дистанции. Проверьте ваш XML-файл дистанции." +"No results information. Check your results file.", "Нет информации о результатах. Проверьте ваш файл результатов." +"Controls have not been adjusted on the map.", "КП не были скорректированы на карте." +"Are you sure you want to update", "Вы уверены, что хотите обновить" +"Maps deleted", "Карты удалены" +"Selected maps have been deleted.", "Выбранные карты были удалены." +". Delete failed. Please try again.", ". Ошибка удаления. Пожалуйста, попробуйте еще раз." +"Oversized map upload", "Загружаемая карта слишком большого размера" +"Course file problem", "Проблема с файлом дистанции" +"Your course file does not match the map co-ordinates. Please check you have selected the correct file.", "Ваш файл дистанции не соответствует координатам карты. Пожалуйста, убедитесь, что вы выбрали правильный файл." +"Result details", "Детали результатов" +"Event", "Соревнование" +"Select event", "Выбрать соревнование" +"Edit event details", "Редактировать детали соревнования" +"Read-only", "Только для чтения" +"Excluded controls", "Исключенные КП" +"Update event details", "Обновить детали соревнования" +"No event selected", "Соревнование не выбрано" +"days", "дней" +"hours", "часов" +"minutes", "минут" +"seconds", "секунд" +"Manager Login", "Вход для администратора" +"Replay speed", "Скорость воспроизведения" +"By control", "По перегонам" diff --git a/src/js/animation.js b/src/js/animation.js index 735a049..ba2575f 100644 --- a/src/js/animation.js +++ b/src/js/animation.js @@ -538,7 +538,6 @@ export function initialiseAnimationPanel() { }) const btnRealTime = document.getElementById("btn-real-time") - btnRealTime.setAttribute("title", t("Real time", "")) btnRealTime.addEventListener("click", () => { replayByControl.classList.add("d-none") setReplayRealTime() @@ -550,9 +549,10 @@ export function initialiseAnimationPanel() { createByControlDropdown() replayByControl.classList.remove("d-none") }) - + createTailsDropdown() + let options = document.querySelectorAll("[data-toggle-names]") for (let opt of options) { opt.innerHTML = t(opt.dataset.toggleNames) @@ -560,6 +560,11 @@ export function initialiseAnimationPanel() { toggleNameDisplay(e.currentTarget.dataset.toggleNames) }) } + document.querySelector('label[for="btn-mass-start"]')?.setAttribute("title",t("Mass start", "")) + document.querySelector('label[for="btn-real-time"]')?.setAttribute("title",t("Real time", "")) + document.querySelector('label[for="btn-by-control"]')?.setAttribute("title",t("By control", "")) + document.getElementById("rg2-replay-speed").setAttribute("title", t("Replay speed", "")) + document.getElementById("rg2-tails-value").setAttribute("title", t("Tails length", "")) document.getElementById("rg2-toggle-names-value").setAttribute("title", t("Show names", "")) } diff --git a/src/js/manager.js b/src/js/manager.js index 00478f3..cbe110d 100644 --- a/src/js/manager.js +++ b/src/js/manager.js @@ -34,10 +34,16 @@ import { t } from "./translate" import { User } from "./user" import { createModalDialog, generateSelectOption, showWarningDialog, validateValue } from "./utils" import { Datepicker } from "vanillajs-datepicker" +import es from 'vanillajs-datepicker/locales/es'; +import fr from 'vanillajs-datepicker/locales/fr'; +import zhCN from 'vanillajs-datepicker/locales/zh-CN'; +Object.assign(Datepicker.locales, es, fr, zhCN); import { Worldfile } from "./worldfile" import L from "leaflet" // TODO import css somewhere else? import "leaflet/dist/leaflet.css" +import { getCurrentLanguage } from "./translate" +const lang = getCurrentLanguage() let user = null let newMap = new MapData() @@ -165,10 +171,10 @@ function checkResultsFileEncoding(e) { function confirmAddMap() { let dlg = {} - dlg.body = "Are you sure you want to add this map?" - dlg.title = "Confirm new map" - dlg.classes = "rg2-confirm-add-map-dialog" - dlg.doText = "Add map" + dlg.body = t("Are you sure you want to add this map?") + dlg.title = t("Confirm new map") + dlg.classes = t("rg2-confirm-add-map-dialog") + dlg.doText = t("Add map") dlg.onDo = doUploadMapFile createModalDialog(dlg) } @@ -178,25 +184,25 @@ function confirmCreateEvent(e) { const valid = validateData() if (valid !== "OK") { showWarningDialog( - "Event set-up incomplete", - valid + " Please enter all necessary information and make sure controls are aligned before creating the event." + t("Event set-up incomplete"), + valid + t(" Please enter all necessary information and make sure controls are aligned before creating the event.") ) return } let dlg = {} - dlg.body = "Are you sure you want to create this event?" - dlg.title = "Confirm event creation" + dlg.body = t("Are you sure you want to create this event?") + dlg.title = t("Confirm event creation") dlg.classes = "rg2-confirm-create-event-dialog" - dlg.doText = "Create event" + dlg.doText = t("Create event") dlg.onDo = doCreateEvent createModalDialog(dlg) } function confirmUpdateEvent() { let dlg = {} - dlg.body = `Are you sure you want to update ${document.getElementById("rg2-edit-event-name").value}?` - dlg.title = "Confirm event update" - dlg.doText = "Update event" + dlg.body = t("Are you sure you want to update") + " " + document.getElementById("rg2-edit-event-name").value + "?" + dlg.title = t("Confirm event update") + dlg.doText = t("Update event") dlg.onDo = doUpdateEvent createModalDialog(dlg) } @@ -486,13 +492,15 @@ export function enableManager() { eventSelectDatePicker = new Datepicker(document.getElementById("rg2-select-event-date"), { buttonClass: "btn", autohide: true, - format: "yyyy-mm-dd" + format: "yyyy-mm-dd", + language: lang }) eventEditDatePicker = new Datepicker(document.getElementById("rg2-edit-event-date"), { buttonClass: "btn", autohide: true, - format: "yyyy-mm-dd" + format: "yyyy-mm-dd", + language: lang }) document.getElementById("rg2-map-name").addEventListener("change", function () { @@ -626,8 +634,8 @@ function fitControlsToMap() { if (box.maxX < 0 || box.minX > mapSize.width || box.minY > mapSize.height || box.maxY < 0) { // warn and fit to track showWarningDialog( - "Course file problem", - "Your course file does not match the map co-ordinates. Please check you have selected the correct file." + t("Course file problem"), + t("Your course file does not match the map co-ordinates. Please check you have selected the correct file.") ) } else { georefOK = true @@ -789,7 +797,7 @@ function getCourseName(id) { } function getMapDropdown(maps) { - let html = generateSelectOption(config.INVALID_MAP_ID, "Select map", true) + let html = generateSelectOption(config.INVALID_MAP_ID, t("Select map"), true) // loop backwards so most recent map is first in list for (let i = maps.length - 1; i > -1; i -= 1) { html += generateSelectOption(i, maps[i].mapid + ": " + decode(maps[i].name)) @@ -816,14 +824,14 @@ function getResultInfoAsHTML() { } html += `
${runners}
` } else { - html = "No valid results found." + html = t("No valid results found.") } return html } function getRouteDeleteDropdown(id) { const routes = getRoutesForEvent(id) - let html = generateSelectOption("undefined", "Select route") + let html = generateSelectOption(t("undefined"), t("Select route")) for (let i = 0; i < routes.length; i += 1) { html += generateSelectOption( routes[i].resultid, @@ -879,8 +887,8 @@ function getVariantID(codes, courseid) { function handleEventAdded(response) { if (response.ok) { showWarningDialog( - "Event created", - document.getElementById("rg2-event-name").value + " has been added with id " + response.newid + "." + t("Event created"), + document.getElementById("rg2-event-name").value + t(" has been added with id ") + response.newid + "." ) // open newly created event in a separate window window.open(rg2Config.api_url.replace("rg2api.php", "") + "#" + response.newid) @@ -888,13 +896,13 @@ function handleEventAdded(response) { setEvent() // unused map data gets reset in eventListLoaded callback } else { - showWarningDialog("Save failed", response.status_msg + " Failed to create event. Please try again.") + showWarningDialog(t("Save failed"), response.status_msg + t(" Failed to create event. Please try again.")) } } const handleEventDeleted = (id) => (response) => { if (response.ok) { - showWarningDialog("Event deleted", "Event " + id + " has been deleted.") + showWarningDialog(t("Event deleted"), t("Event ") + id + " has been deleted.") activeEditEventID = null document.getElementById("btn-delete-event").setAttribute("disabled", true) document.getElementById("btn-delete-route").setAttribute("disabled", true) @@ -904,19 +912,19 @@ const handleEventDeleted = (id) => (response) => { // unused map data gets reset in eventListLoaded callback document.getElementById("rg2-edit-event-selected").replaceChildren() } else { - showWarningDialog("Delete failed", response.status_msg + ". Event " + id + " delete failed. Please try again.") + showWarningDialog(t("Delete failed"), response.status_msg + t(". Event ") + id + t(" delete failed. Please try again.")) } } const handleEventUpdated = (kartatid) => (response) => { if (response.ok) { - showWarningDialog("Event updated", "Event " + kartatid + " has been updated.") + showWarningDialog(t("Event updated"), t("Event ") + kartatid + t(" has been updated.")) setActiveEventIDByKartatID(kartatid) setEventTitleBar() doGetEvents() setEvent(kartatid) } else { - showWarningDialog("Update failed", response.status_msg + ". Event update failed. Please try again.") + showWarningDialog(t("Update failed"), response.status_msg + t(". Event update failed. Please try again.")) } } @@ -924,17 +932,17 @@ function handleLoginResponse(response) { if (response.ok) { enableManager() } else { - showWarningDialog("Login failed", "User name or password incorrect. Please try again.") + showWarningDialog(t("Login failed"), t("User name or password incorrect. Please try again.")) } } function handleMapAdded(response) { if (response.ok) { - showWarningDialog("Map added", response.name + " has been added with id " + response.newid + ".") + showWarningDialog(t("Map added"), response.name + t(" has been added with id ") + response.newid + ".") // update map dropdown doGetMaps() } else { - showWarningDialog("Save failed", response.status_msg + ". Failed to save map. Please try again.") + showWarningDialog(t("Save failed"), response.status_msg + t(". Failed to save map. Please try again.")) } } @@ -942,7 +950,7 @@ function handleMapUploaded(response) { if (response.ok) { doAddMap() } else { - showWarningDialog("Upload failed", response.status_msg + ". Failed to upload map. Please try again.") + showWarningDialog(t("Upload failed"), response.status_msg + t(". Failed to upload map. Please try again.")) } } @@ -958,7 +966,7 @@ function handleMapsLoaded(response) { const handleRouteDeleted = (kartatid, routeid) => (response) => { if (response.ok) { - showWarningDialog("Route deleted", "Route " + routeid + " has been deleted.") + showWarningDialog(t("Route deleted"), t("Route ") + routeid + t(" has been deleted.")) setActiveEventIDByKartatID(kartatid) setEventTitleBar() doGetEvents() @@ -973,9 +981,9 @@ const handleRouteDeleted = (kartatid, routeid) => (response) => { function handleUnusedMapsDeleted(response) { if (response.ok) { - showWarningDialog("Maps deleted", "Selected maps have been deleted.") + showWarningDialog(t("Maps deleted"), t("Selected maps have been deleted.")) } else { - showWarningDialog("Delete failed", response.status_msg + ". Delete failed. Please try again.") + showWarningDialog(t("Delete failed"), response.status_msg + t(". Delete failed. Please try again.")) } doGetMaps() } @@ -1023,7 +1031,7 @@ export function initialiseManager() { if (validUser) { doLogin() } else { - showWarningDialog("Login failed", "Please enter user name and password of at least five characters") + showWarningDialog(t("Login failed"), t("Please enter user name and password of at least five characters")) } }) } @@ -1123,7 +1131,7 @@ function processCourseFile(e) { document.getElementById("chk-enrich-course-names").classList.add("d-none") } coursesGeoreferenced = parsedCourses.georeferenced - displayInfoDialog("Course details", getCourseInfoAsHTML()) + displayInfoDialog(t("Course details"), getCourseInfoAsHTML()) createResultCourseMapping() displayCourseAllocations() fitControlsToMap() @@ -1148,7 +1156,7 @@ function processResultFile(e) { document.getElementById("rg2-manager-results-count").innerHTML = "Results (" + results.length + ")" if (results.length > 0) { resultCourses = parsedResults.resultCourses - displayInfoDialog("Result details", getResultInfoAsHTML()) + displayInfoDialog(t("Result details"), getResultInfoAsHTML()) displayCourseAllocations() } } @@ -1156,7 +1164,7 @@ function processResultFile(e) { function readCourses(e) { let reader = new FileReader() reader.onerror = function () { - showWarningDialog("Course file error", "The selected course file could not be read.") + showWarningDialog(t("Course file error"), t("The selected course file could not be read.")) } reader.onload = function (e) { @@ -1173,11 +1181,11 @@ function readGeorefFile(e) { try { reader.readAsText(e.target.files[0]) } catch (err) { - showWarningDialog("File read error", "Failed to open selected world file.") + showWarningDialog(t("File read error"), t("Failed to open selected world file.")) return } reader.onerror = function () { - showWarningDialog("World file error", "The selected world file could not be read.") + showWarningDialog(t("World file error"), t("The selected world file could not be read.")) } reader.onload = function (e) { // see http://en.wikipedia.org/wiki/World_file @@ -1208,8 +1216,8 @@ function readMapFile(e) { reader.readAsDataURL(e.target.files[0]) } else { showWarningDialog( - "File type error", - e.target.files[0].name + " is not recognised. Only .jpg and .gif files are supported at present." + t("File type error"), + e.target.files[0].name + t(" is not recognised. Only .jpg and .gif files are supported at present.") ) } } @@ -1218,7 +1226,7 @@ function readResults() { let reader = new FileReader() reader.onerror = function () { - showWarningDialog("Results file error", "The selected results file could not be read.") + showWarningDialog(t("Results file error"), t("The selected results file could not be read.")) } reader.onload = function (e) { checkResultsFileEncoding(e) @@ -1228,7 +1236,7 @@ function readResults() { resultsFileFormat = format reader.readAsText(resultsOrCourseFile, encodings[encodingIndex]) } else { - showWarningDialog("File type error", "Results file type is not recognised. Please select a valid file.") + showWarningDialog(t("File type error"), t("Results file type is not recognised. Please select a valid file.")) } } @@ -1300,7 +1308,7 @@ function setButtons() { const loadResults = document.getElementById("rg2-load-results-file") loadResults.addEventListener("click", (e) => { if (!mapLoaded) { - showWarningDialog("No map loaded", "Please load a map file before adding results.") + showWarningDialog(t("No map loaded"), t("Please load a map file before adding results.")) e.preventDefault() } }) @@ -1327,7 +1335,7 @@ function setButtons() { const load = document.getElementById("rg2-load-course-file") load.addEventListener("click", (e) => { if (!mapLoaded) { - showWarningDialog("No map loaded", "Please load a map file before adding courses.") + showWarningDialog(t("No map loaded"), t("Please load a map file before adding courses.")) e.preventDefault() } }) @@ -1400,7 +1408,7 @@ function startDrawingCourses() { document.getElementById("rg2-new-course-name").value document.getElementById("rg2-draw-courses").classList.remove("d-none") } else { - showWarningDialog("No map selected", "Please load a map before drawing courses") + showWarningDialog(t("No map selected"), t("Please load a map before drawing courses")) } } @@ -1449,35 +1457,35 @@ function updateGeorefMap() { function validateData() { if (document.getElementById("rg2-event-name").value === "") { - return "Event name is not valid." + return t("Event name is not valid.") } if (mapIndex === config.INVALID_MAP_ID) { - return "No map selected." + return t("No map selected.") } if (document.getElementById("rg2-select-club-name").value === "") { - return "Club name is not valid." + return t("Club name is not valid.") } if (eventSelectDatePicker.getDate("yyyy-mm-dd") === undefined) { - return "Date is not valid." + return t("Date is not valid.") } if (document.getElementById("rg2-select-event-level").value === "X") { - return "Event level is not valid." + return t("Event level is not valid.") } if (!format) { - return "Event format is not valid." + return t("Event format is not valid.") } if (courses.length === 0) { if (!drawingCourses) { - return "No course information. Check your course XML file." + return t("No course information. Check your course XML file.") } } if (results.length === 0) { if (hasResults) { - return "No results information. Check your results file." + return t("No results information. Check your results file.") } } if (!controlsAdjusted) { - return "Controls have not been adjusted on the map." + return t("Controls have not been adjusted on the map.") } return "OK" } @@ -1500,7 +1508,7 @@ function validateMapUpload(upload) { msg += "RG2 manager guide for " msg += "guidance on how to create map files." - showWarningDialog("Oversized map upload", msg) + showWarningDialog(t("Oversized map upload"), msg) } } } diff --git a/src/js/managerutils.js b/src/js/managerutils.js index b8d03b0..6817ab0 100644 --- a/src/js/managerutils.js +++ b/src/js/managerutils.js @@ -1,13 +1,14 @@ import { decode } from "html-entities" import { generateSelectOption, createModalDialog, showWarningDialog } from "./utils" +import { t } from "./translate" export function confirmDeleteEvent(doDeleteEvent) { const id = document.getElementById("rg2-edit-event-selected").value let dlg = {} - dlg.body = "Event " + id + " will be deleted. Are you sure?" - dlg.title = "Confirm event delete" + dlg.body = t("Event ") + id + t(" will be deleted. Are you sure?") + dlg.title = t("Confirm event delete") dlg.classes = "rg2-confirm-delete-event-dialog" - dlg.doText = "Delete event" + dlg.doText = t("Delete event") dlg.onDo = doDeleteEvent createModalDialog(dlg) } @@ -15,14 +16,14 @@ export function confirmDeleteEvent(doDeleteEvent) { export function confirmDeleteRoute(doDeleteRoute) { const routeid = document.getElementById("rg2-route-selected").value if (routeid === "undefined") { - showWarningDialog("Warning", "No route selected.") + showWarningDialog(t("Warning"), t("No route selected.")) return } let dlg = {} - dlg.body = "Route " + routeid + " will be permanently deleted. Are you sure?" - dlg.title = "Confirm route delete" + dlg.body = t("Route ") + routeid + t(" will be permanently deleted. Are you sure?") + dlg.title = t("Confirm route delete") dlg.classes = "rg2-confirm-route-delete-dialog" - dlg.doText = "Delete route" + dlg.doText = t("Delete route") dlg.onDo = doDeleteRoute createModalDialog(dlg) } @@ -43,22 +44,24 @@ export function confirmDeleteUnusedMaps(unusedMaps, doDeleteUnusedMaps) { } } if (checked.length === 0) { - showWarningDialog("Warning", "No maps selected.") + showWarningDialog(t("Warning"), t("No maps selected.")) return unusedMaps } const dlg = {} - dlg.body = "Selected maps will be deleted. Are you sure?" - dlg.title = "Confirm map deletion" - dlg.doText = "Delete maps" + dlg.body = t("Selected maps will be deleted. Are you sure?") + dlg.title = t("Confirm map deletion") + dlg.doText = t("Delete maps") dlg.onDo = doDeleteUnusedMaps createModalDialog(dlg) return unusedMaps } export function displayUnusedMaps(maps) { - let html = "
ID
Name
" + let html = "
ID
" + html += "
" if (maps.length === 0) { - html += "
None found.
" + html += "
" + t("None found.") + "
" document.getElementById("btn-delete-unused-maps").setAttribute("disabled", "") } else { for (let i = 0; i < maps.length; i += 1) { @@ -72,7 +75,7 @@ export function displayUnusedMaps(maps) { } export function getEventEditDropdown(events, activeID) { - let html = activeID ? "" : generateSelectOption(null, "No event selected", true) + let html = activeID ? "" : generateSelectOption(null, t("No event selected", ""), true) // loop backwards so most recent event is first in list for (let i = events.length - 1; i > -1; i -= 1) { html += generateSelectOption( @@ -89,7 +92,7 @@ export function getEventLevelDropdown() { const text = ["Select level", "Training", "Local", "Regional", "National", "International"] const values = ["X", "T", "L", "R", "N", "I"] for (let i = 0; i < text.length; i += 1) { - html += generateSelectOption(values[i], text[i], i === 0) + html += generateSelectOption(values[i], t(text[i]), i === 0) } return html } diff --git a/src/js/rg2ui.js b/src/js/rg2ui.js index 4b8a01c..32bb329 100644 --- a/src/js/rg2ui.js +++ b/src/js/rg2ui.js @@ -47,6 +47,7 @@ import { Runner } from "./runner" import { getStatsHeader, getStatsLayout, showStats } from "./stats" import { t, createLanguageDropdown } from "./translate" + const infoPanelControl = document.getElementById("rg2-show-info-panel-control") const rightInfoPanelEl = document.getElementById("rg2-right-info-panel") const rightInfoPanelTitle = document.getElementById("rg2-right-info-panel-title") @@ -291,8 +292,8 @@ export function configureUI() { displayInfoPanelDialog() infoPanelControl.classList.add("d-none") }) - initialiseButtons() + } export function createEventMenu() { @@ -339,7 +340,7 @@ function displayAboutDialog() { document.getElementById("rg2-manager-link").innerHTML = `Manager Login` + )}">${t("Manager Login", "")}` rightInfoPanel.show() } @@ -429,7 +430,9 @@ function gpsSpeedChanged(e) { } function initialiseButtons() { - document.getElementById("btn-about").addEventListener("click", (e) => { + + // click comportment + document.getElementById("btn-about").addEventListener("click", (e) => { displayAboutDialog(e) }) document.getElementById("btn-settings").addEventListener("click", (e) => { @@ -735,10 +738,19 @@ function tabActivated(e) { break default: break - } + } // Set scroll bar position in tab to how it was when user was last looking at it const scrollPos = document.getElementById("rg2-info-panel").getAttribute(getScrollPosAttrName()) document.getElementById("rg2-left-info-panel-body").scrollTop = scrollPos redraw() + + if (e.target.id === config.TAB_CREATE) { + requestAnimationFrame(() => { + }) + } } + + + + diff --git a/src/js/translate.js b/src/js/translate.js index f0d9808..918f2e3 100644 --- a/src/js/translate.js +++ b/src/js/translate.js @@ -62,6 +62,8 @@ export function setNewLanguage(lang) { dictionary = lang } translateAllText() + translateButtons() + translateManager() } export function t(str, element = "span") { @@ -86,3 +88,149 @@ function translateAllText() { el.innerText = t(keys[key], "") } } + +export function getCurrentLanguage() { + return dictionary.code +} + +function translateButtons() { + + const tooltips = { + "btn-reset": "Reset", + "btn-zoom-in": "Zoom in", + "btn-zoom-out": "Zoom out", + "btn-rotate-right": "Rotate right", + "btn-rotate-left": "Rotate left", + "btn-toggle-controls": "Show controls", + "btn-stats": "Stats", + "btn-splitsbrowser": "Splitsbrowser", + "btn-runners": "Runners", + "btn-measure": "Measure", + "btn-settings": "Options", + "btn-about": "Help" + }; + + Object.entries(tooltips).forEach(([id, text]) => {const el = document.getElementById(id); + if (el) {el.title = t(text, ""); + } + }); + + document.querySelector("label[for=rg2-user-name]").innerHTML = t("User name") + document.getElementById("rg2-user-name").placeholder = t("User name") + + document.querySelector("label[for=rg2-password]").innerHTML = t("Password") + document.getElementById("rg2-password").placeholder = t("Password") + + document.getElementById("btn-login").innerHTML = t("Log in") +} + +function translateManager() { + + const set = (selector, text, attr = "innerHTML") => { + const el = document.querySelector(selector); + if (el) el[attr] = t(text, ""); + }; + + const setById = (id, text, attr = "innerHTML") => { + const el = document.getElementById(id); + if (el) el[attr] = t(text, ""); + }; + + // --- Add Event --- + setById("rg2-event-details", "Event details"); + + const results = document.getElementById("rg2-manager-results-count"); + if (results) results.innerHTML = t("Results", "") + " (0)"; + + const courses = document.getElementById("rg2-manager-courses-count"); + if (courses) courses.innerHTML = t("Courses", "") + " (0)"; + + set("label[for=rg2-event-name]", "Event name"); + set("#rg2-event-name", "Event name", "placeholder"); + + set("label[for=rg2-select-map]", "Map"); + + set("label[for=rg2-select-club-name]", "Club"); + set("#rg2-select-club-name", "Club name", "placeholder"); + + set("label[for=rg2-select-event-date]", "Date"); + set("label[for=rg2-select-event-level]", "Event level"); + + set("label[for=rg2-enter-event-comments]", "Comments"); + set("#rg2-enter-event-comments", "Comments", "placeholder"); + + set("label[for=chk-no-results]", "No results file"); + set("label[for=chk-sort-results]", "Sort results file"); + + const sortInfo = document.querySelector("#chk-sort-results")?.closest(".mb-3")?.querySelector(".form-text"); + if (sortInfo) { + sortInfo.innerHTML = t("Only select if the results file is not already properly sorted.", ""); + } + + set("label[for=chk-enrich-course-names]", "Add classes to course names"); + set("label[for=chk-score-event]", "Individual courses (butterfly/score/relay)"); + + set("#btn-draw-courses", "Draw course"); + + set("label[for=rg2-new-course-name]", "Course"); + set("#rg2-new-course-name", "Course name", "placeholder"); + + set("label[for=chk-move-map-and-controls]", "Move map and controls together"); + set("label[for=chk-read-only]", "Read-only mode"); + + set("#btn-create-event", "Create event"); + + // --- Edit Event --- + setById("rg2-select-event", "Select event"); + set("label[for=rg2-edit-event-selected]", "Event"); + + setById("rg2-edit-event", "Edit event details"); + + set("label[for=rg2-edit-event-name]", "Event name"); + set("#rg2-edit-event-name", "Event name", "placeholder"); + + set("label[for=rg2-edit-club-name]", "Club"); + set("#rg2-edit-club-name", "Club name", "placeholder"); + + set("label[for=rg2-edit-event-level]", "Event level"); + + set("label[for=rg2-edit-event-comments]", "Comments"); + set("#rg2-edit-event-comments", "Comments", "placeholder"); + + set("label[for=rg2-edit-exclude]", "Excluded controls"); + set("#rg2-edit-exclude", "Excluded controls", "placeholder"); + + set("label[for=chk-edit-read-only]", "Read-only"); + + set("#btn-update-event", "Update event details"); + + setById("rg2-delete-route", "Delete route"); + set("label[for=rg2-route-selected]", "Route"); + set("#btn-delete-route", "Delete route"); + + setById("rg2-delete-event", "Delete event"); + set("#btn-delete-event", "Delete event"); + + // --- Add Map --- + setById("rg2-Map-details", "Map details"); + + set("label[for=rg2-map-name]", "Map name"); + set("#rg2-map-name", "Map name", "placeholder"); + + set("label[for=rg2-load-map-file]", "Map file"); + + setById("rg2-Georeferencing", "Georeferencing"); + + set("label[for=rg2-load-georef-file]", "Georeferencing file"); + set("label[for=rg2-georef-type]", "Co-ordinate system"); + + const georefSelect = document.getElementById("rg2-georef-type"); + if (georefSelect && georefSelect.options.length > 0) { + georefSelect.options[0].text = t("Not georeferenced", ""); + } + + set("#btn-add-map", "Add map"); + + // --- Delete Map --- + set("#btn-delete-unused-maps", "Delete selected maps"); +} \ No newline at end of file