Files
yourpart3/frontend/src/i18n/locales/fr/admin.json
Torsten Schulz (local) b59526b20d
All checks were successful
Deploy to production / deploy (push) Successful in 2m2s
feat(Localization, User Management): add missingUserId translations and enhance user ID handling
- Added translations for the "missingUserId" key in multiple languages to improve user feedback when user ID is not available.
- Updated the user ID handling in the store and WorkerSchedulesView component to ensure proper user identification when sending data to the daemon.
- Enhanced error handling to notify users when the user ID is missing, improving overall user experience.
2026-05-08 11:09:34 +02:00

531 lines
25 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"admin": {
"interests": {
"title": "[Admin] - Gérer les intérêts",
"newinterests": {
"name": "Nom d'intérêt",
"status": "Libéré",
"adultonly": "Réservé aux adultes",
"translations": "Traductions",
"isactive": "Activé",
"isadult": "Réservé aux adultes",
"delete": "Supprimer"
}
},
"contacts": {
"title": "[Admin] - Demandes de contact",
"date": "Date",
"from": "Expéditeur",
"actions": "Actes",
"open": "Modifier",
"finished": "Complet"
},
"editcontactrequest": {
"title": "[Admin] - Modifier la demande de contact"
},
"user": {
"name": "nom d'utilisateur",
"active": "Aktiv",
"blocked": "Gesperrt",
"actions": "Actes",
"search": "Suchen"
},
"vocabLessonReset": {
"title": "Sprachkurs: Lektionsfortschritt",
"intro": "Fortschritt, Übungsergebnisse und gespeicherter Lektionszustand für eine einzelne Lektion löschen (nicht der ganze Kurs). Es werden nur Sprachkurse gelistet, in die dieser Benutzer eingeschrieben ist.",
"loadCourses": "Eingeschriebene Kurse laden",
"selectCourse": "Kurs",
"selectLesson": "Lektion",
"reset": "Lektion für diesen Nutzer zurücksetzen",
"confirmTitle": "Lektionsfortschritt löschen",
"confirm": "Fortschritt der Lektion „{lesson}“ für {username} wirklich löschen?",
"success": "Lektionsfortschritt wurde zurückgesetzt.",
"error": "Zurücksetzen fehlgeschlagen.",
"pickUserFirst": "Zuerst einen Benutzer auswählen.",
"noEnrolledCourses": "Dieser Benutzer ist in keinem Sprachkurs eingeschrieben.",
"loadCoursesError": "Die Kursliste konnte nicht geladen werden.",
"loadingLessons": "Lektionen werden geladen …"
},
"vocabLessonMarkComplete": {
"divider": "Fortschritt reparieren (ohne Übungsergebnisse zu fälschen)",
"throughLabel": "Alle Lektionen bis Lektionsnummer (einschließlich)",
"hint": "Setzt fehlende oder offene Einträge auf „abgeschlossen“, inkl. Ziel-Score und erster Review-Welle. Bereits abgeschlossene Lektionen bleiben unverändert.",
"submit": "Bis hier als abgeschlossen markieren",
"confirmTitle": "Lektionen als abgeschlossen markieren",
"confirm": "Alle Lektionen mit Nummer ≤ {n} für {username} in diesem Kurs als abgeschlossen markieren?",
"success": "{marked} Lektion(en) neu als abgeschlossen gesetzt ({unchanged} waren bereits erledigt).",
"successNone": "Keine Änderung: alle betroffenen Lektionen ({unchanged}) waren bereits abgeschlossen.",
"error": "Markieren fehlgeschlagen."
},
"adultVerification": {
"title": "[Admin] - Erotik-Freigaben",
"intro": "Volljährige Nutzer können den Erotikbereich beantragen. Hier werden Anfragen geprüft und freigegeben oder abgelehnt.",
"username": "Benutzer",
"age": "Alter",
"statusLabel": "Status",
"requestLabel": "Nachweis",
"actions": "Actes",
"approve": "Freigeben",
"reject": "Ablehnen",
"resetPending": "Auf Prüfung setzen",
"openDocument": "Dokument ansehen",
"previewTitle": "Nachweis-Vorschau",
"closePreview": "Vorschau schließen",
"previewUnavailable": "Für diesen Dateityp ist hier keine Vorschau verfügbar.",
"documentMissing": "Le dossier de preuve n'a pas été trouvé sur le serveur.",
"empty": "Aucune demande correspondante trouvée.",
"loadError": "Les partages n'ont pas pu être chargés.",
"updateError": "Le statut n'a pas pu être modifié.",
"documentError": "Le document n'a pas pu être ouvert.",
"filters": {
"pending": "Ouvrir",
"approved": "Libéré",
"rejected": "Rejeté",
"all": "Tous"
},
"status": {
"none": "Non demandé",
"pending": "En cours d'examen",
"approved": "Libéré",
"rejected": "Rejeté"
},
"messages": {
"approved": "Libération accordée.",
"rejected": "Libération refusée.",
"pending": "Anfrage wieder auf Prüfung gesetzt."
}
},
"eroticModeration": {
"title": "[Admin] - Erotik-Moderation",
"intro": "Gemeldete Erotikbilder und -videos können hier geprüft, verborgen, gelöscht oder gegen den Account eskaliert werden.",
"empty": "Keine passenden Meldungen gefunden.",
"loadError": "Die Meldungen konnten nicht geladen werden.",
"actionError": "Die Moderationsaktion konnte nicht ausgeführt werden.",
"actionSuccess": "Die Moderationsaktion wurde gespeichert.",
"target": "Ziel",
"owner": "Besitzer",
"reporter": "Meldender",
"reason": "Grund",
"statusLabel": "Status",
"meta": "Zeit / Maßnahme",
"actions": "Actes",
"image": "Bild",
"video": "Video",
"hidden": "Verborgen",
"preview": "Vorschau",
"previewError": "Die Vorschau konnte nicht geladen werden.",
"dismiss": "Zurückweisen",
"hide": "Verbergen",
"restore": "Wieder freigeben",
"delete": "Supprimer",
"blockUploads": "Uploads sperren",
"revokeAccess": "Erotikzugang entziehen",
"notePrompt": "Notiz zur Moderationsentscheidung",
"actionLabels": {
"dismiss": "Zurückgewiesen",
"hide_content": "Verborgen",
"restore_content": "Libéré",
"delete_content": "Gelöscht",
"block_uploads": "Uploads gesperrt",
"revoke_access": "Zugang entzogen"
},
"filters": {
"open": "Ouvrir",
"actioned": "Bearbeitet",
"dismissed": "Zurückgewiesen",
"all": "Tous"
},
"status": {
"open": "Ouvrir",
"actioned": "Bearbeitet",
"dismissed": "Zurückgewiesen"
}
},
"rights": {
"add": "Recht hinzufügen",
"select": "Bitte wählen",
"current": "Aktuelle Rechte"
},
"forum": {
"title": "[Admin] - Forum",
"currentForums": "Existierende Foren",
"edit": "Ändern",
"delete": "Supprimer",
"createForum": "Anlegen",
"forumName": "Titel",
"create": "Anlegen",
"permissions": {
"label": "Berechtigungen",
"all": "Tout le monde",
"admin": "Administrateurs uniquement",
"teammember": "Membres de l'équipe uniquement",
"user": "Seulement certains utilisateurs",
"age": "Seulement à partir de 14 ans"
},
"selectPermissions": "Veuillez sélectionner",
"confirmDeleteMessage": "Faut-il vraiment supprimer le forum ?",
"confirmDeleteTitle": "Supprimer le forum"
},
"falukant": {
"edituser": {
"title": "Modifier l'utilisateur Falukant",
"username": "nom d'utilisateur",
"characterName": "Nom du personnage",
"user": "Benutzer",
"success": "Les modifications ont été enregistrées.",
"error": "Les modifications n'ont pas pu être enregistrées.",
"errorLoadingBranches": "Fehler beim Laden der Niederlassungen.",
"errorUpdatingStock": "Fehler beim Aktualisieren des Lagers.",
"stockUpdated": "Lager erfolgreich aktualisiert.",
"search": "Suchen",
"tabs": {
"userdata": "Benutzerdaten",
"branches": "Niederlassungen"
},
"branches": {
"title": "Niederlassungen & Lager",
"noStocks": "Kein Lager vorhanden",
"noBranches": "Keine Niederlassungen gefunden",
"addStock": "Lager hinzufügen",
"stockType": "Lagertyp",
"selectStockType": "Lagertyp auswählen",
"quantity": "Menge",
"allStocksAdded": "Alle verfügbaren Lagertypen sind bereits vorhanden"
},
"errorLoadingStockTypes": "Fehler beim Laden der Lagertypen.",
"errorAddingStock": "Fehler beim Hinzufügen des Lagers.",
"stockAdded": "Lager erfolgreich hinzugefügt.",
"invalidStockData": "Veuillez saisir des informations valides sur le type de stockage et la quantité.",
"pregnancy": {
"title": "Grossesse (Administrateur)",
"characterId": "ID du personnage",
"status": "Status",
"statusActive": "Enceinte jusqu'à",
"statusNone": "Pas enceinte",
"fatherId": "ID du personnage du père (facultatif)",
"fatherSelect": "Vater (Ehepartner / Verlobter / Liebhaber)",
"fatherNone": "— aucun père n'a été sauvé —",
"fatherHintList": "Liste des relations de ce caractère (mariage, fiançailles, histoire d'amour active).",
"fatherHintManual": "Kein passender Partner in der Datenbank: Vater-Charakter-ID manuell eintragen.",
"fatherManualPlaceholder": "ID du personnage",
"dueDays": "Tage bis zum Termin",
"dueDaysHint": "0 = Termin heute (Geburt kann je nach Spiel-Logik zeitnah anstehen).",
"force": "Schwangerschaft setzen",
"clear": "Schwangerschaft entfernen",
"successForce": "Schwangerschaft wurde gesetzt.",
"successClear": "Schwangerschaft wurde entfernt.",
"error": "Aktion fehlgeschlagen.",
"relationship": {
"married": "Ehepartner",
"engaged": "Verlobter",
"lover": "Liebhaber"
}
},
"birth": {
"title": "Geburt erzwingen (Admin)",
"motherHint": "Es wird der oben genannte Charakter (Mutter) verwendet.",
"fatherId": "Vater-Charakter-ID",
"fatherSelect": "Vater (Ehepartner / Verlobter / Liebhaber)",
"fatherChoose": "— Vater wählen —",
"fatherHintList": "Liste aus Beziehungen dieses Charakters.",
"fatherHintManual": "Kein Partner in der Liste: Vater-Charakter-ID manuell eintragen.",
"fatherRequired": "Bitte einen Vater auswählen oder die Charakter-ID angeben.",
"context": "Kontext",
"contextMarriage": "Ehe",
"contextLover": "Liebschaft",
"legitimacy": "Legitimität",
"legitimate": "Legitim",
"ackBastard": "Anerkannt unehelich",
"hiddenBastard": "Verborgen unehelich",
"gender": "Kind-Geschlecht",
"genderRandom": "Zufällig",
"male": "Männlich",
"female": "Weiblich",
"force": "Geburt auslösen",
"success": "Kind wurde angelegt (Taufe ausstehend).",
"error": "Geburt konnte nicht ausgelöst werden."
}
},
"map": {
"title": "Falukant Karten-Editor (Regionen)",
"description": "Zeichne Rechtecke auf der Falukant-Karte und weise sie Städten zu.",
"tabs": {
"regions": "Positionen",
"distances": "Entfernungen"
},
"regionList": "Städte",
"noCoords": "Keine Koordinaten gesetzt",
"currentRect": "Aktuelles Rechteck",
"hintDraw": "Wähle eine Stadt und ziehe mit der Maus ein Rechteck auf der Karte, um die Position festzulegen.",
"saveAll": "Enregistrer toutes les villes modifiées",
"connectionsTitle": "Connexions (region_distance)",
"source": "Depuis",
"target": "Après",
"selectSource": "Sélectionnez la ville source",
"selectTarget": "Sélectionnez la ville de destination",
"mode": "Type de transport",
"modeLand": "pays",
"modeWater": "Eau",
"modeAir": "Air",
"distance": "distance",
"saveConnection": "Enregistrer la connexion",
"pickOnMap": "Auf Karte wählen",
"errorSaveConnection": "Die Verbindung konnte nicht gespeichert werden.",
"errorDeleteConnection": "Die Verbindung konnte nicht gelöscht werden.",
"confirmDeleteConnection": "Verbindung wirklich löschen?"
},
"createNPC": {
"title": "NPCs erstellen",
"region": "Stadt",
"allRegions": "Alle Städte",
"ageRange": "Altersbereich",
"to": "bis",
"years": "Jahre",
"titleRange": "Titel-Bereich",
"count": "Anzahl pro Stadt-Titel-Kombination",
"countHelp": "Diese Anzahl wird für jede Kombination aus gewählter Stadt und Titel erstellt.",
"create": "NPCs erstellen",
"creating": "Erstelle...",
"result": "Ergebnis",
"createdCount": "{count} NPCs wurden erstellt.",
"combinationInfo": "{perCombination} PNJ par combinaison × {combinations} combinaisons = {count} PNJ au total",
"age": "Alter",
"errorLoadingRegions": "Erreur lors du chargement des villes.",
"errorLoadingTitles": "Erreur de chargement des titres.",
"errorCreating": "Erreur lors de la création des PNJ.",
"invalidAgeRange": "Tranche d'âge non valide.",
"invalidTitleRange": "Plage de titres non valide.",
"invalidCount": "Numéro invalide (1-500).",
"progress": "Progrès",
"progressDetails": "{actuel} créé par {total} PNJ",
"timeRemainingSeconds": "Temps restant : {secondes} secondes",
"timeRemainingMinutes": "Temps restant : {minutes} minutes {secondes} secondes",
"almostDone": "Presque fini...",
"jobNotFound": "Emploi introuvable ou expiré."
},
"workerSchedules": {
"title": "Exécutions du daemon",
"description": "Vue d'ensemble des exécutions planifiées des workers depuis le registre du daemon.",
"accessDenied": "Aucun accès à cette vue.",
"detailed": "Vue détaillée",
"autoRefresh": "Rafraîchissement automatique",
"refresh": "Rafraîchir",
"generatedAt": "Généré à",
"empty": "Aucun schedule disponible.",
"notConnected": "Aucune connexion daemon disponible.",
"sendError": "Échec de la requête vers le daemon.",
"responseError": "Impossible de traiter la réponse du daemon.",
"currentStep": "Étape actuelle",
"task": "Tâche",
"cadence": "Intervalle",
"nextRun": "Prochaine exécution au plus tard",
"remaining": "Restant",
"noTasks": "Aucune tâche pour ce worker.",
"missingUserId": "Aucun ID utilisateur disponible (setUserId manquant)."
}
},
"chatrooms": {
"title": "[Admin] - Gérer les salons de discussion",
"roomName": "Raumname",
"create": "Chatraum anlegen",
"edit": "Chatraum bearbeiten",
"type": "Typ",
"isPublic": "Öffentlich sichtbar",
"isAdultOnly": "Nur Erotikbereich",
"actions": "Actes",
"genderRestriction": {
"show": "Geschlechtsbeschränkung aktivieren",
"label": "Geschlechtsbeschränkung"
},
"minAge": {
"show": "Mindestalter angeben",
"label": "Mindestalter"
},
"maxAge": {
"show": "Höchstalter angeben",
"label": "Höchstalter"
},
"password": {
"show": "Passwortschutz aktivieren",
"label": "Passwort"
},
"friendsOfOwnerOnly": "Nur Freunde des Besitzers",
"requiredUserRight": {
"show": "Benötigtes Benutzerrecht angeben",
"label": "Benötigtes Benutzerrecht"
},
"roomtype": {
"chat": "Reden",
"dice": "Würfeln",
"poker": "Poker",
"hangman": "Hangman"
},
"rights": {
"talk": "Reden",
"scream": "Schreien",
"whisper": "Flüstern",
"start game": "Spiel starten",
"open room": "Raum öffnen",
"systemmessage": "Systemnachricht"
},
"confirmDelete": "Soll dieser Chatraum wirklich gelöscht werden?"
},
"match3": {
"title": "Match3 Level verwalten",
"newLevel": "Neues Level erstellen",
"editLevel": "Level bearbeiten",
"deleteLevel": "Level löschen",
"confirmDelete": "Möchtest du dieses Level wirklich löschen?",
"levelName": "Name",
"levelDescription": "Beschreibung",
"boardWidth": "Breite",
"boardHeight": "Höhe",
"moveLimit": "Zug-Limit",
"levelOrder": "Reihenfolge",
"boardLayout": "Board-Layout",
"tileTypes": "Types de tuiles disponibles",
"actions": "Actes",
"edit": "Modifier",
"delete": "Supprimer",
"save": "Sauvegarder",
"cancel": "Annuler",
"update": "Mise à jour",
"create": "Créer",
"boardControls": {
"fillAll": "Activer tout",
"clearAll": "Désactiver tout",
"invert": "Inverser"
},
"loading": "Niveau de chargement...",
"retry": "Essayer à nouveau",
"availableLevels": "Niveaux disponibles : {count}",
"levelFormat": "Niveau {number} : {name}",
"levelObjectives": "Level-Objekte",
"objectivesTitle": "Siegvoraussetzungen",
"addObjective": "Objektiv hinzufügen",
"removeObjective": "Entfernen",
"objectiveType": "Typ",
"objectiveTypeScore": "Punkte sammeln",
"objectiveTypeMatches": "Matches machen",
"objectiveTypeMoves": "Züge verwenden",
"objectiveTypeTime": "Zeit einhalten",
"objectiveTypeSpecial": "Spezialziel",
"objectiveOperator": "Operator",
"operatorGreaterEqual": "Größer oder gleich (≥)",
"operatorLessEqual": "Kleiner oder gleich (≤)",
"operatorEqual": "Gleich (=)",
"operatorGreater": "Größer als (>)",
"operatorLess": "Kleiner als (<)",
"objectiveTarget": "Zielwert",
"objectiveTargetPlaceholder": "z.B. 100",
"objectiveOrder": "Reihenfolge",
"objectiveOrderPlaceholder": "1, 2, 3...",
"objectiveDescription": "Beschreibung",
"objectiveDescriptionPlaceholder": "par ex. Collectez 100 points",
"objectiveRequired": "Requis pour terminer le niveau",
"noObjectives": "Aucune condition de victoire définie. Cliquez sur « Ajouter un objectif » pour en créer un."
},
"userStatistics": {
"title": "[Admin] - Statistiques utilisateur",
"totalUsers": "Nombre total d'utilisateurs",
"genderDistribution": "Répartition par sexe",
"ageDistribution": "Répartition par âge"
},
"taxiTools": {
"title": "Outils de taxi",
"description": "Gérer les plans, niveaux et configurations des taxis",
"mapEditor": {
"title": "Modifier la carte",
"availableMaps": "Cartes disponibles : {count}",
"newMap": "Neue Map erstellen",
"mapFormat": "{name} (Position: {x},{y})",
"mapName": "Map-Name",
"mapDescription": "Beschreibung",
"mapWidth": "Breite",
"mapHeight": "Höhe",
"tileSize": "Tile-Größe",
"positionX": "X-Position",
"positionY": "Y-Position",
"mapType": "Map-Typ",
"mapLayout": "Map-Layout",
"tilePalette": "Tile-Palette",
"streetNames": "Straßennamen",
"extraElements": "Zusätzliche Elemente",
"streetNameHorizontal": "Straßenname (horizontal)",
"streetNameVertical": "Straßenname (vertikal)",
"continueHorizontal": "In anderer Richtung fortführen (→)",
"continueVertical": "In anderer Richtung fortführen (↓)",
"continueOther": "In anderer Richtung fortführen",
"position": "position",
"fillAllRoads": "Toutes les rues",
"clearAll": "Supprimer tout",
"generateRandom": "Générer aléatoirement",
"delete": "Supprimer",
"update": "Mise à jour",
"cancel": "Annuler",
"create": "Créer",
"createSuccess": "La carte a été créée avec succès !",
"updateSuccess": "La carte a été mise à jour avec succès !",
"deleteSuccess": "La carte a été supprimée avec succès !"
}
},
"servicesStatus": {
"title": "Statut des services",
"description": "Surveiller l'état du backend, du chat et du démon",
"status": {
"connected": "Attachés ensemble",
"connecting": "Connecter...",
"disconnected": "Non connecté",
"error": "Erreur",
"unknown": "Inconnu"
},
"backend": {
"title": "Backend",
"connected": "Backend-Service ist erreichbar und verbunden"
},
"chat": {
"title": "Chat",
"connected": "Chat-Service ist erreichbar und verbunden"
},
"daemon": {
"title": "Daemon",
"connected": "Daemon-Service ist erreichbar und verbunden",
"connections": {
"title": "Aktive Verbindungen",
"none": "Keine aktiven Verbindungen",
"userId": "Benutzer-ID",
"username": "nom d'utilisateur",
"connections": "Verbindungen",
"duration": "Verbindungsdauer",
"lastPong": "Zeit seit letztem Pong",
"pingTimeouts": "Ping-Timeouts",
"pongReceived": "Pong empfangen",
"yes": "Ja",
"no": "Nein",
"notConnected": "Démon non connecté",
"sendError": "Erreur lors de l'envoi de la demande",
"error": "Erreur lors de l'obtention des connexions"
},
"websocketLog": {
"title": "Journal WebSocket",
"showLog": "Afficher le journal WebSocket",
"refresh": "Mise à jour",
"loading": "Chargement...",
"close": "Fermer",
"entryCount": "{count} entrées",
"noEntries": "Keine Log-Einträge vorhanden",
"notConnected": "Démon non connecté",
"sendError": "Erreur lors de l'envoi de la demande",
"parseError": "Fehler beim Verarbeiten der Antwort",
"timestamp": "Zeitstempel",
"direction": "Richtung",
"peer": "Peer",
"connUser": "Verbindungs-User",
"targetUser": "Ziel-User",
"event": "Event"
}
}
}
}
}