diff --git a/src/about/translations/de.json b/src/about/translations/de.json new file mode 100644 index 000000000..b015ced0a --- /dev/null +++ b/src/about/translations/de.json @@ -0,0 +1,7 @@ +{ + "title": "Über {appName}", + "description": "MicroPython für {lego} Powered Up Smart Hubs.", + "licenseButton": { "label": "Software-Lizenzen" }, + "changelogButton": { "label": "Änderungsprotokoll" }, + "websiteButton": { "label": "Pybricks-Webseite" } +} diff --git a/src/activities/translations/de.json b/src/activities/translations/de.json new file mode 100644 index 000000000..254b9ae89 --- /dev/null +++ b/src/activities/translations/de.json @@ -0,0 +1,5 @@ +{ + "title": "Aktivitäten", + "explorer": "Datei-Explorer", + "settings": "Einstellungen & Hilfe" +} diff --git a/src/alerts/translations/de.json b/src/alerts/translations/de.json new file mode 100644 index 000000000..3ad500bca --- /dev/null +++ b/src/alerts/translations/de.json @@ -0,0 +1,6 @@ +{ + "message": "Ein unerwarteter Fehler ist aufgetreten. Bitte melden Sie diesen Fehler, damit wir eine bessere Fehlermeldung erstellen können.", + "technicalInfo": "Erweitern für detaillierte technische Informationen", + "copyErrorMessage": "Fehlermeldung kopieren", + "reportBug": "Fehler melden" +} diff --git a/src/app/alerts/translations/de.json b/src/app/alerts/translations/de.json new file mode 100644 index 000000000..5ea1cb51c --- /dev/null +++ b/src/app/alerts/translations/de.json @@ -0,0 +1,5 @@ +{ + "updateServerFailure": { + "message": "Verbindung zum Update-Server fehlgeschlagen. Die Internetverbindung oder der Server könnte nicht verfügbar sein. Versuchen Sie es später erneut." + } +} diff --git a/src/app/translations/de.json b/src/app/translations/de.json new file mode 100644 index 000000000..5c07039dd --- /dev/null +++ b/src/app/translations/de.json @@ -0,0 +1,8 @@ +{ + "landmark": { + "activities": "Aktivitäten", + "editor": "Editor", + "terminal": "Terminal", + "documentation": "Dokumentation" + } +} diff --git a/src/ble/alerts/translations/de.json b/src/ble/alerts/translations/de.json new file mode 100644 index 000000000..a62196fd3 --- /dev/null +++ b/src/ble/alerts/translations/de.json @@ -0,0 +1,35 @@ +{ + "noWebBluetooth": { + "message": "Dieser Browser unterstützt Web Bluetooth nicht oder es ist nicht aktiviert.", + "suggestion": "Verwenden Sie einen unterstützten Browser wie Google Chrome oder Microsoft Edge.", + "linux": "Web Bluetooth ist unter Linux experimentell und muss manuell aktiviert werden. Kopieren Sie den untenstehenden Link und fügen Sie ihn in die Adressleiste ein.", + "action": "Weitere Informationen" + }, + "bluetoothNotAvailable": { + "message": "Es wurde kein Bluetooth-Adapter gefunden oder die Berechtigung zur Nutzung wurde nicht erteilt.", + "suggestion": "Bitte verbinden oder aktivieren Sie einen Bluetooth Low Energy Adapter, stellen Sie sicher, dass Ihr Browser die Berechtigung zur Nutzung hat und starten Sie den Browser neu.", + "browserSupport": "Einige Browser wie Brave und Opera unterstützen Web Bluetooth nicht. Verwenden Sie einen unterstützten Browser wie Chrome, Edge oder auf iOS WebBLE." + }, + "noGatt": { + "message": "Der Webbrowser hat keine Berechtigung zur Nutzung von Bluetooth Low Energy erteilt." + }, + "missingService": { + "message": "Mit Hub verbunden, aber {serviceName}-Dienst konnte nicht gefunden werden.", + "suggestion1": "Stellen Sie sicher, dass Sie die neueste Firmware verwenden.", + "suggestion2": "Wenn das Problem weiterhin besteht, versuchen Sie das Gerät \"{hubName}\" in Ihren OS-Bluetooth-Einstellungen zu entfernen und dann erneut zu verbinden." + }, + "noHub": { + "message": "Kein Hub erkannt.", + "suggestion": "Haben Sie die Pybricks-Firmware bereits installiert?", + "flashFirmwareButton": "Pybricks-Firmware installieren", + "troubleshootButton": "Fehlerbehebung" + }, + "newPybricksProfile": { + "message": "Der verbundene Hub verwendet eine neuere Version des Pybricks-Kommunikationsprofils. Einige Funktionen funktionieren möglicherweise nicht korrekt.", + "versions": "Der Hub hat {hubVersion}, während {app} {appVersion} unterstützt.", + "suggestion": "Downgraden Sie die Hub-Firmware oder aktualisieren Sie {app}, um Probleme zu vermeiden." + }, + "disconnected": { + "message": "Der Hub ist nicht mehr verbunden. Bitte verbinden Sie ihn erneut und versuchen Sie es noch einmal." + } +} diff --git a/src/components/translations/de.json b/src/components/translations/de.json new file mode 100644 index 000000000..4dd48073b --- /dev/null +++ b/src/components/translations/de.json @@ -0,0 +1,12 @@ +{ + "helpButton": { + "label": "Hilfe", + "description": "Klicken Sie hier, um die Hilfe für das Kontrollkästchen {helpForLabel} anzuzeigen." + }, + "helpDialog": { + "title": "Hilfe", + "closeButton": { + "label": "Schließen" + } + } +} diff --git a/src/editor/translations/de.json b/src/editor/translations/de.json new file mode 100644 index 000000000..f0c555c2f --- /dev/null +++ b/src/editor/translations/de.json @@ -0,0 +1,20 @@ +{ + "tablist": { + "label": "Editor" + }, + "welcome": "Willkommen", + "placeholder": "Schreiben Sie hier Ihr Programm...", + "check": "Syntax prüfen", + "toggleDocs": "Dokumentation ein-/ausblenden", + "copy": "Kopieren", + "paste": "Einfügen", + "selectAll": "Alles auswählen", + "undo": "Rückgängig", + "redo": "Wiederholen", + "closeFile": { "tooltip": "{fileName} schließen" }, + "contextMenu": { "label": "Editor-Kontextmenü" }, + "docs": { + "show": "Dokumentation anzeigen", + "hide": "Dokumentation ausblenden" + } +} diff --git a/src/explorer/alerts/translations/de.json b/src/explorer/alerts/translations/de.json new file mode 100644 index 000000000..aec537f32 --- /dev/null +++ b/src/explorer/alerts/translations/de.json @@ -0,0 +1,11 @@ +{ + "fileInUse": { + "message": "Die Datei '{fileName}' konnte nicht geöffnet werden. Sie ist bereits in einem anderen Fenster geöffnet." + }, + "noFilesToBackup": { + "message": "Es gibt keine Dateien zum Sichern. Erstellen Sie zuerst eine neue Datei, indem Sie auf das {icon} Symbol klicken." + }, + "noPyFiles": { + "message": "In der {zip} Datei waren keine {py} Dateien enthalten." + } +} diff --git a/src/explorer/deleteFileAlert/translations/de.json b/src/explorer/deleteFileAlert/translations/de.json new file mode 100644 index 000000000..a5cba370a --- /dev/null +++ b/src/explorer/deleteFileAlert/translations/de.json @@ -0,0 +1,7 @@ +{ + "message": "Die Datei '{fileName}' wird endgültig gelöscht. Dies kann nicht rückgängig gemacht werden.", + "action": { + "accept": "Löschen", + "cancel": "Behalten" + } +} diff --git a/src/explorer/duplicateFileDialog/translations/de.json b/src/explorer/duplicateFileDialog/translations/de.json new file mode 100644 index 000000000..0b9925869 --- /dev/null +++ b/src/explorer/duplicateFileDialog/translations/de.json @@ -0,0 +1,6 @@ +{ + "title": "'{fileName}' duplizieren", + "action": { + "accept": "Duplizieren" + } +} diff --git a/src/explorer/fileNameFormGroup/translations/de.json b/src/explorer/fileNameFormGroup/translations/de.json new file mode 100644 index 000000000..5a80a22f5 --- /dev/null +++ b/src/explorer/fileNameFormGroup/translations/de.json @@ -0,0 +1,13 @@ +{ + "label": "Dateiname", + "helpText": { + "isOk": "OK!", + "isEmpty": "Dateiname darf nicht leer sein.", + "hasSpaces": "Dateiname darf keine Leerzeichen enthalten.", + "hasFileExtension": "Die Dateierweiterung wird automatisch hinzugefügt.", + "hasInvalidFirstCharacter": "Dateiname muss mit einem Buchstaben ({letters}) oder Unterstrich ({underscore}) beginnen.", + "hasInvalidCharacters": "Dateiname darf nur Buchstaben ({letters}), Zahlen ({numbers}) und Unterstriche ({underscore}) enthalten.", + "alreadyExists": "Eine Datei mit diesem Namen existiert bereits. Versuchen Sie einen anderen Namen.", + "fixIt": "Automatisch korrigieren." + } +} diff --git a/src/explorer/newFileWizard/translations/de.json b/src/explorer/newFileWizard/translations/de.json new file mode 100644 index 000000000..ae6d77881 --- /dev/null +++ b/src/explorer/newFileWizard/translations/de.json @@ -0,0 +1,16 @@ +{ + "title": "Neue Datei erstellen", + "template": { + "label": "Vorlage" + }, + "useTemplate": { + "label": "Eine Vorlage verwenden", + "description": { + "checked": "Neue Datei für den ausgewählten Hub erstellen.", + "unchecked": "Neue leere Datei erstellen." + } + }, + "action": { + "create": "Erstellen" + } +} diff --git a/src/explorer/renameFileDialog/translations/de.json b/src/explorer/renameFileDialog/translations/de.json new file mode 100644 index 000000000..52b4ce26a --- /dev/null +++ b/src/explorer/renameFileDialog/translations/de.json @@ -0,0 +1,6 @@ +{ + "title": "'{fileName}' umbenennen", + "action": { + "rename": "Umbenennen" + } +} diff --git a/src/explorer/renameImportDialog/translations/de.json b/src/explorer/renameImportDialog/translations/de.json new file mode 100644 index 000000000..df58c52cb --- /dev/null +++ b/src/explorer/renameImportDialog/translations/de.json @@ -0,0 +1,8 @@ +{ + "title": "Importierte Datei umbenennen", + "message": "Der Name der importierten Datei '{fileName}' ist in {appName} nicht erlaubt. Bitte ändern Sie den Namen unten.", + "action": { + "skip": "Import dieser Datei überspringen", + "rename": "Umbenennen" + } +} diff --git a/src/explorer/replaceImportDialog/translations/de.json b/src/explorer/replaceImportDialog/translations/de.json new file mode 100644 index 000000000..36359c782 --- /dev/null +++ b/src/explorer/replaceImportDialog/translations/de.json @@ -0,0 +1,12 @@ +{ + "title": "Bestehende Datei ersetzen?", + "message": "Es existiert bereits eine Datei mit dem gleichen Namen wie die importierte Datei '{fileName}'.", + "option": { + "remember": "Diese Antwort für weitere Konflikte merken." + }, + "action": { + "skip": "Bestehende Datei behalten und Import dieser Datei überspringen", + "replace": "Bestehende Datei durch die importierte Datei ersetzen", + "rename": "Bestehende Datei behalten und importierte Datei umbenennen" + } +} diff --git a/src/explorer/translations/de.json b/src/explorer/translations/de.json new file mode 100644 index 000000000..cd8165bfa --- /dev/null +++ b/src/explorer/translations/de.json @@ -0,0 +1,33 @@ +{ + "header": { + "toolbar": { + "title": "Datei-Aktionen", + "exportAll": "Alle Dateien sichern", + "import": "Datei importieren", + "addNew": "Neue Datei erstellen" + } + }, + "tree": { + "label": "Dateien", + "liveDescriptor": { + "intro": { + "accessibilityGuide": "Bedienungshilfen für Dateibaum {treeLabel}.", + "navigation": "Navigieren Sie mit den Pfeiltasten durch den Baum. Beginnen Sie mit der Eingabe eines Dateinamens, um nach einer Datei zu suchen. Weitere Tastenkombinationen sind verfügbar:", + "keybindings": { + "primaryAction": "{key} um die Datei im Code-Editor zu öffnen", + "rename": "{key} um die ausgewählte Datei umzubenennen", + "duplicate": "{key} um die ausgewählte Datei zu duplizieren", + "export": "{key} um die ausgewählte Datei zu exportieren", + "delete": "{key} um die ausgewählte Datei zu löschen" + } + }, + "searching": "Suche läuft." + } + }, + "treeItem": { + "renameTooltip": "{fileName} umbenennen", + "duplicateTooltip": "{fileName} duplizieren", + "exportTooltip": "{fileName} exportieren", + "deleteTooltip": "{fileName} löschen" + } +} diff --git a/src/firmware/alerts/translations/de.json b/src/firmware/alerts/translations/de.json new file mode 100644 index 000000000..139721a78 --- /dev/null +++ b/src/firmware/alerts/translations/de.json @@ -0,0 +1,31 @@ +{ + "dfuError": { + "message": "Beim Installieren der Firmware ist ein USB-Fehler aufgetreten.", + "suggestion": "Stellen Sie sicher, dass das USB-Kabel nicht beschädigt und fest mit dem Hub und dem Computer verbunden ist.", + "tryAgainButton": "Erneut versuchen" + }, + "noWebUsb": { + "message": "Dieser Browser unterstützt Web USB nicht oder Web USB ist nicht aktiviert.", + "suggestion": "Verwenden Sie einen unterstützten Browser wie Google Chrome oder Microsoft Edge." + }, + "noDfuHub": { + "message": "Ihr Hub wurde nicht gefunden?", + "suggestion1": { + "windows": "Möglicherweise müssen Sie einen USB-Treiber manuell installieren, bevor Sie eine Verbindung zu Ihrem Hub herstellen können.", + "linux": "Möglicherweise müssen Sie udev-Regeln hinzufügen, bevor Sie eine Verbindung zu Ihrem Hub herstellen können." + }, + "troubleshootButton": "Fehlerbehebungstipps", + "installUsbDriverButton": "USB-Treiber installieren", + "configureUdevRulesButton": "udev-Regeln konfigurieren" + }, + "noDfuInterface": { + "message": "Das ist sehr ungewöhnlich. Das USB-Gerät enthielt nicht die erwartete Schnittstelle." + }, + "flashProgress": { + "erasing": "Alte Firmware wird gelöscht: {percent}", + "flashing": "Neue Firmware wird installiert: {percent}" + }, + "releaseButton": { + "message": "Sie können jetzt den Ein/Aus-Schalter am Hub loslassen." + } +} diff --git a/src/firmware/bootloaderInstructions/translations/de.json b/src/firmware/bootloaderInstructions/translations/de.json new file mode 100644 index 000000000..a02ca4674 --- /dev/null +++ b/src/firmware/bootloaderInstructions/translations/de.json @@ -0,0 +1,23 @@ +{ + "warning": { + "linux": { + "message": "Wenn Sie Pybricks noch nie mit USB unter Linux verwendet haben, müssen Sie udev-Regeln konfigurieren, bevor Sie die Firmware installieren können. {learnMore}", + "learnMore": "Mehr erfahren." + }, + "windows": { + "message": "Verwenden Sie Pybricks zum ersten Mal auf diesem Computer? Möglicherweise müssen Sie den USB-Treiber für diesen Hub-Typ manuell installieren. {instructions}", + "instructions": "Klicken Sie für Anweisungen." + } + }, + "button": { + "bluetooth": "Bluetooth-Taste", + "power": "Taste" + }, + "light": { + "bluetooth": "Bluetooth-Licht", + "status": "Hub-Licht" + }, + "lightPattern": { + "bluetooth": "pink-grün-blau-aus" + } +} diff --git a/src/firmware/dfuWindowsDriverInstallDialog/translations/de.json b/src/firmware/dfuWindowsDriverInstallDialog/translations/de.json new file mode 100644 index 000000000..005765269 --- /dev/null +++ b/src/firmware/dfuWindowsDriverInstallDialog/translations/de.json @@ -0,0 +1,61 @@ +{ + "title": "Windows DFU USB-Treiber Installationsanleitung", + "backButton": { + "label": "Zurück" + }, + "nextButton": { + "label": "Weiter" + }, + "doneButton": { + "label": "Fertig" + }, + "step": { + "1": { + "message": "Klicken Sie mit der rechten Maustaste auf das Windows {startMenu} und dann auf {deviceManager}.", + "startMenu": "Startmenü", + "deviceManager": "Geräte-Manager" + }, + "2": { + "message": "Suchen Sie nach {dfuUsbHubName} unter {otherDevices}.", + "otherDevices": "Andere Geräte", + "properties": "Eigenschaften", + "listedWithWarning": "Wenn es mit einem Warnsymbol aufgeführt ist, klicken Sie mit der rechten Maustaste darauf und wählen Sie {properties}.", + "listedWithoutWarning": "Wenn es an anderer Stelle ohne Warnsymbol aufgeführt ist, ist der Treiber bereits installiert. Sie können dieses Fenster schließen.", + "notListed": "Wenn Sie es gar nicht sehen, stellen Sie sicher, dass sich der Hub im DFU-Update-Modus befindet und versuchen Sie es erneut. Schließen Sie dieses Fenster, um die Video-Anleitung anzusehen." + }, + "3": { + "message": "Klicken Sie im Dialog {properties} auf die Schaltfläche {updateDriver}.", + "properties": "{dfuUsbHubName} Eigenschaften", + "updateDriver": "Treiber aktualisieren..." + }, + "4": { + "message": "Klicken Sie im Dialog {updateDrivers} auf die Schaltfläche {browse}.", + "updateDrivers": "Treiber aktualisieren", + "browse": "Auf diesem Computer nach Treibern suchen" + }, + "5": { + "message": "Klicken Sie dann auf die Schaltfläche {letMePick}.", + "letMePick": "Aus einer Liste von verfügbaren Treibern auf dem Computer auswählen" + }, + "6": { + "message": "Wählen Sie in der Liste der Gerätetypen {usbDevices} aus und klicken Sie dann auf die Schaltfläche {next}.", + "usbDevices": "USB-Geräte", + "next": "Weiter" + }, + "7": { + "message": "Wählen Sie in der Liste {manufacturer} den Eintrag {winUsbDevice} aus. Wählen Sie dann in der Liste {model} ebenfalls {winUsbDevice} aus. Klicken Sie dann auf die Schaltfläche {next}.", + "manufacturer": "Hersteller", + "winUsbDevice": "WinUsb Device", + "model": "Modell", + "next": "Weiter" + }, + "8": { + "message": "Ein Warndialog zeigt an, dass der Treiber nicht empfohlen wird. Klicken Sie trotzdem auf {yes}, um fortzufahren. Der Treiber ist kompatibel.", + "yes": "Ja" + }, + "9": { + "message": "Die Treiberinstallation ist abgeschlossen. Klicken Sie auf die Schaltfläche {close}.", + "close": "Schließen" + } + } +} diff --git a/src/firmware/installPybricksDialog/translations/de.json b/src/firmware/installPybricksDialog/translations/de.json new file mode 100644 index 000000000..b3ebcfa07 --- /dev/null +++ b/src/firmware/installPybricksDialog/translations/de.json @@ -0,0 +1,72 @@ +{ + "title": "Pybricks-Firmware installieren", + "selectHubPanel": { + "title": "Hub-Typ auswählen", + "message": "Wählen Sie Ihren Hub aus.", + "notOnListButton": { + "label": "Was ist mit anderen Hubs?", + "info": { + "mindstorms": { + "title": "{legoMindstormsRegisteredTrademark} Steine", + "intro": "{appName} unterstützt derzeit keine früheren Generationen von {legoMindstormsRegisteredTrademark}.", + "help": { + "message": "Aber mit Ihrer Hilfe ist das möglich! Klicken Sie auf die {sponsor} Schaltfläche oben rechts, um zu sehen, wie Sie uns unterstützen können.", + "sponsor": "Sponsor" + }, + "rcx": "RCX: Könnte im Streaming-Modus funktionieren.", + "nxt": "NXT: Wir haben das getestet. Es könnte funktionieren!", + "ev3": "EV3: Unterstützt mit Visual Studio Code." + }, + "poweredUp": { + "title": "Andere Hubs", + "intro": "Unterstützung für diese Hubs ist derzeit nicht geplant.", + "wedo2": "WeDo 2.0 Smart Hub.", + "duploTrain": "Duplo Train Hub.", + "mario": "Mario/Luigi/Peach." + } + } + }, + "advanced": { + "label": "Erweitert", + "customFirmwareDropzone": { + "label": "Benutzerdefinierte Firmware .zip-Datei hier ablegen oder zum Durchsuchen klicken." + } + }, + "customFirmware": { + "message": "Benutzerdefinierte Firmware ausgewählt.", + "hubType": "Hub-Typ: {hubTypeName}", + "firmwareVersion": "Firmware-Version: {version}", + "clearButton": "Löschen" + } + }, + "licensePanel": { + "title": "Lizenzen akzeptieren", + "licenseText": { + "error": "Beim Abrufen der Firmware-Datei ist ein Problem aufgetreten." + }, + "acceptCheckbox": { + "label": "Ich habe die Lizenzbedingungen gelesen und stimme ihnen zu." + } + }, + "optionsPanel": { + "title": "Optionen konfigurieren", + "hubName": { + "label": "Hub-Name", + "labelInfo": "(optional)", + "help": "Wählen Sie einen Bluetooth-Namen für Ihren Hub. Wenn Sie mehrere Hubs haben, können Sie sie beim Verbinden leichter unterscheiden.", + "error": "Der Name ist zu lang." + } + }, + "bootloaderPanel": { + "title": "Installieren" + }, + "backButton": { + "label": "Zurück" + }, + "nextButton": { + "label": "Weiter" + }, + "flashFirmwareButton": { + "label": "Installieren" + } +} diff --git a/src/firmware/restoreOfficialDialog/translations/de.json b/src/firmware/restoreOfficialDialog/translations/de.json new file mode 100644 index 000000000..cc84e80d0 --- /dev/null +++ b/src/firmware/restoreOfficialDialog/translations/de.json @@ -0,0 +1,27 @@ +{ + "title": "Offizielle {lego} Firmware wiederherstellen", + "backButton": { + "label": "Zurück" + }, + "nextButton": { + "label": "Weiter" + }, + "doneButton": { + "label": "Fertig" + }, + "selectHubPanel": { + "title": "Hub auswählen", + "message": "Wählen Sie den Hub aus, auf dem die offizielle {lego} Firmware wiederhergestellt werden soll, und klicken Sie dann auf {next}." + }, + "restoreFirmwarePanel": { + "title": "Firmware wiederherstellen", + "instruction2": { + "ble": { + "message": "Wenn der Fortschrittsbalken fertig ist, wird der Hub neu gestartet und die App wird sich verbinden. Die offizielle Firmware wurde wiederhergestellt." + }, + "updateApp": "Sobald die Wiederherstellung abgeschlossen ist, verwenden Sie die {app} App, um die neueste offizielle Firmware zu erhalten.", + "updateAppVersion": "Sie können dafür Version 2 (Legacy) oder Version 3 verwenden." + }, + "flashButton": "Wiederherstellen" + } +} diff --git a/src/hub/alerts/translations/de.json b/src/hub/alerts/translations/de.json new file mode 100644 index 000000000..5035405bf --- /dev/null +++ b/src/hub/alerts/translations/de.json @@ -0,0 +1,6 @@ +{ + "userProgramSize": { + "message": "Dieses Programm ist zu groß. Die kompilierte Größe beträgt {actual} Bytes, aber der Hub kann nur {max} Bytes aufnehmen.", + "suggestion": "Versuchen Sie, ungenutzten Code zu entfernen oder Namen und Zeichenketten zu verkürzen." + } +} diff --git a/src/i18n.ts b/src/i18n.ts index 754d29bc0..03b60b802 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// Copyright (c) 2020-2023 The Pybricks Authors +// Copyright (c) 2020-2025 The Pybricks Authors import { I18n, I18nManager, TranslateOptions } from '@shopify/react-i18n'; import type { @@ -8,11 +8,24 @@ import type { TranslationDictionary, } from '@shopify/react-i18n/build/ts/types'; -// TODO: add locale setting and use browser preferred language as default +// TODO: add locale setting + +/** Get the user's preferred language, falling back to 'en' if not supported */ +function getPreferredLanguage(): string { + // List of languages we support + const supportedLanguages = ['en', 'de']; + + // Get browser language (e.g. 'de' from 'de-DE') + const browserLang = navigator.language.split('-')[0]; + + // Return browser language if supported, otherwise fallback to English + return supportedLanguages.includes(browserLang) ? browserLang : 'en'; +} /** The global i18n manager. */ export const i18nManager = new I18nManager({ - locale: 'en', + locale: getPreferredLanguage(), + fallbackLocale: 'en', onError: (err): void => console.error(err), }); diff --git a/src/licenses/translations/de.json b/src/licenses/translations/de.json new file mode 100644 index 000000000..eb4f00ac0 --- /dev/null +++ b/src/licenses/translations/de.json @@ -0,0 +1,16 @@ +{ + "title": "Open-Source-Software-Lizenzen", + "description": "{name} basiert auf Open-Source-Software. Durch die Nutzung von {name} stimmen Sie den Bedingungen aller enthaltenen Software-Lizenzen zu.", + "packageList": { + "label": "Pakete" + }, + "packageLabel": "Paket:", + "authorLabel": "Autor:", + "licenseLabel": "Lizenz:", + "error": { + "fetchFailed": "Lizenzdaten konnten nicht geladen werden." + }, + "help": { + "selectPackage": "Wählen Sie ein Paket aus, um die Lizenz anzuzeigen." + } +} diff --git a/src/mpy/alerts/translations/de.json b/src/mpy/alerts/translations/de.json new file mode 100644 index 000000000..1611ce6a3 --- /dev/null +++ b/src/mpy/alerts/translations/de.json @@ -0,0 +1,6 @@ +{ + "compilerError": { + "message": "MicroPython-Datei konnte nicht kompiliert werden.", + "gotoErrorButton": "Zum Fehler gehen" + } +} diff --git a/src/notifications/translations/de.json b/src/notifications/translations/de.json new file mode 100644 index 000000000..47efd62d6 --- /dev/null +++ b/src/notifications/translations/de.json @@ -0,0 +1,46 @@ +{ + "app": { + "noUpdateFound": "{appName} ist bereits auf dem neuesten Stand." + }, + "ble": { + "gattServiceNotFound": "Mit Hub verbunden, aber {serviceName}-Dienst konnte nicht gefunden werden.\nStellen Sie sicher, dass Sie die neueste Firmware verwenden.\nWenn das Problem weiterhin besteht, versuchen Sie das Gerät \"{hubName}\" in Ihren OS-Bluetooth-Einstellungen zu entfernen und dann erneut zu verbinden.", + "unexpectedError": "Unerwarteter Fehler beim Verbindungsversuch: {errorMessage}" + }, + "editor": { + "failedToOpenFile": "Datei konnte nicht geöffnet werden.", + "failedToSaveFile": "Programm konnte nicht gespeichert werden." + }, + "explorer": { + "failedToImportFiles": "Datei(en) konnten nicht importiert werden.", + "failedToCreate": "Datei konnte nicht erstellt werden.", + "failedToDuplicate": "Datei konnte nicht dupliziert werden.", + "failedToExport": "Datei konnte nicht exportiert werden.", + "failedToDelete": "Datei konnte nicht gelöscht werden.", + "failedToArchive": "Dateien konnten nicht archiviert werden." + }, + "fileStorage": { + "failedToInitialize": "Dateispeicher konnte nicht initialisiert werden. Änderungen werden nicht automatisch gespeichert." + }, + "flashFirmware": { + "timedOut": "Der Hub hat zu lange nicht reagiert. Starten Sie den Hub neu und versuchen Sie es erneut.", + "bleError": "Es gab ein Problem mit Bluetooth.", + "disconnected": "Der Hub wurde vor Abschluss der Installation getrennt. Starten Sie den Hub neu und versuchen Sie es erneut.", + "hubError": "Der Hub meldet einen Fehler.", + "unsupportedDevice": "Der angeschlossene Hub wird nicht unterstützt.", + "failToFetch": "Firmware konnte nicht vom Server geladen werden: {status}", + "badZipFile": "Der firmware.zip-Datei fehlen erforderliche Dateien oder sie ist ungültig.", + "badMetadata": "Die firmware.metadata.json-Datei enthält fehlende oder ungültige Einträge. Beheben Sie dies und versuchen Sie es erneut.", + "compileError": "Die enthaltene main.py-Datei konnte nicht kompiliert werden. Beheben Sie dies und versuchen Sie es erneut.", + "sizeTooBig": "Die kombinierte Firmware und main.py sind zu groß für den Flash-Speicher.", + "unexpectedError": "Unerwarteter Fehler bei der Firmware-Installation: {errorMessage}" + }, + "mpy": { + "error": "{errorMessage}" + }, + "serviceWorker": { + "update": { + "message": "Eine neue Version von {appName} ist verfügbar. Klicken Sie auf {action}, um die neue Version zu verwenden.", + "action": "Neustart" + } + } +} diff --git a/src/settings/translations/de.json b/src/settings/translations/de.json new file mode 100644 index 000000000..0dc7be1d4 --- /dev/null +++ b/src/settings/translations/de.json @@ -0,0 +1,56 @@ +{ + "title": "Einstellungen & Hilfe", + "appearance": { + "title": "Erscheinungsbild", + "darkMode": { + "label": "Dunkelmodus", + "help": "Aktivieren Sie den Dunkelmodus. Deaktivieren Sie ihn für den hellen Modus." + }, + "zoom": { + "help": "Verwenden Sie {in} und {out} zum Zoomen." + } + }, + "firmware": { + "title": "Firmware", + "flashPybricksButton": { + "label": "Pybricks-Firmware installieren" + }, + "flashLegoButton": { + "label": "Offizielle {lego}-Firmware wiederherstellen" + } + }, + "help": { + "title": "Hilfe", + "projects": { + "label": "Beispielprojekte" + }, + "support": { + "label": "Support" + }, + "chat": { + "label": "Chat" + }, + "bugs": { + "label": "Fehlermeldungen" + } + }, + "app": { + "title": "App", + "offlineUseHelp": "Bereit für Offline-Nutzung.", + "install": { + "label": "Als App installieren" + }, + "checkForUpdate": { + "label": "Nach Updates suchen" + }, + "restart": { + "label": "Neustart für Update-Installation" + }, + "about": { + "label": "Über" + }, + "tour": { + "label": "Einführungstour" + } + } +} diff --git a/src/sponsor/alerts/translations/de.json b/src/sponsor/alerts/translations/de.json new file mode 100644 index 000000000..6276f7d41 --- /dev/null +++ b/src/sponsor/alerts/translations/de.json @@ -0,0 +1,5 @@ +{ + "addressCopied": { + "message": "Adresse in die Zwischenablage kopiert. Verwenden Sie eine Wallet, die ENS-Adressen unterstützt, um zu spenden." + } +} diff --git a/src/sponsor/translations/de.json b/src/sponsor/translations/de.json new file mode 100644 index 000000000..402863516 --- /dev/null +++ b/src/sponsor/translations/de.json @@ -0,0 +1,27 @@ +{ + "title": "{pybricks} unterstützen", + "whoAreWe": { + "heading": "Wer sind wir?", + "team": { + "about": "Pybricks wird von einem kleinen {team} betrieben, unterstützt von einer weltweiten Community von Open-Source-Programmierer-Enthusiasten.", + "team": "Team" + }, + "mission": "Unsere Mission ist es, Robotik unterhaltsam und zugänglich zu machen und einer Million Menschen das Programmieren beizubringen. Und Sie können dabei helfen!" + }, + "whyDonate": { + "heading": "Warum spenden?", + "body": "Spenden helfen uns:" + }, + "donateReason": { + "keepPybricksFree": "Pybricks für alle kostenlos zu halten.", + "supportNewHubs": "Pybricks auf neuen Hubs, Motoren und Sensoren zu unterstützen.", + "writeDocs": "Dokumentation und Tutorials zu erstellen.", + "exploreFeatures": "Große neue Funktionen wie Multitasking oder blockbasierte Programmierung zu entwickeln.", + "supportOthers": "Projekte zu unterstützen, auf denen Pybricks aufbaut, wie MicroPython." + }, + "donateOptions": { + "heading": "Wie Sie spenden können", + "options": "Sie können die folgenden Links für eine einmalige oder monatliche Spende nutzen.", + "thanks": "Vielen Dank, wir wissen das wirklich zu schätzen!" + } +} diff --git a/src/status-bar/translations/de.json b/src/status-bar/translations/de.json new file mode 100644 index 000000000..a6dd22cc0 --- /dev/null +++ b/src/status-bar/translations/de.json @@ -0,0 +1,22 @@ +{ + "completionEngineStatus": { + "label": "Statusanzeige der Code-Vervollständigungs-Engine", + "message": { + "loading": "Die Code-Vervollständigungs-Engine startet und wird in Kürze bereit sein.", + "ready": "Die Code-Vervollständigungs-Engine ist einsatzbereit.", + "failed": "Die Code-Vervollständigungs-Engine funktioniert nicht mehr.", + "unknown": "Die Code-Vervollständigungs-Engine wurde noch nicht gestartet." + } + }, + "hubInfo": { + "title": "Verbundener Hub", + "connectedTo": "Verbunden mit:", + "hubType": "Hub-Typ:", + "firmware": "Firmware:" + }, + "battery": { + "title": "Batterie", + "low": "Batteriestand ist niedrig. Hub wird sich bald ausschalten.", + "ok": "Batteriestand ist OK." + } +} diff --git a/src/terminal/translations/de.json b/src/terminal/translations/de.json new file mode 100644 index 000000000..5a6c1337c --- /dev/null +++ b/src/terminal/translations/de.json @@ -0,0 +1,6 @@ +{ + "copy": "Kopieren", + "paste": "Einfügen", + "selectAll": "Alles auswählen", + "clear": "Löschen" +} diff --git a/src/toolbar/buttons/bluetooth/translations/de.json b/src/toolbar/buttons/bluetooth/translations/de.json new file mode 100644 index 000000000..82afd5a04 --- /dev/null +++ b/src/toolbar/buttons/bluetooth/translations/de.json @@ -0,0 +1,7 @@ +{ + "label": "Bluetooth", + "tooltip": { + "connect": "Mit Bluetooth verbinden", + "disconnect": "Bluetooth-Verbindung trennen" + } +} diff --git a/src/toolbar/buttons/repl/translations/de.json b/src/toolbar/buttons/repl/translations/de.json new file mode 100644 index 000000000..e212da16c --- /dev/null +++ b/src/toolbar/buttons/repl/translations/de.json @@ -0,0 +1,4 @@ +{ + "label": "REPL", + "tooltip": "Interaktiv im Terminal programmieren (REPL)" +} diff --git a/src/toolbar/buttons/run/translations/de.json b/src/toolbar/buttons/run/translations/de.json new file mode 100644 index 000000000..3047f9544 --- /dev/null +++ b/src/toolbar/buttons/run/translations/de.json @@ -0,0 +1,7 @@ +{ + "label": "Ausführen", + "tooltip": { + "action": "Dieses Programm ausführen ({key})", + "progress": "Wird heruntergeladen... {percent}" + } +} diff --git a/src/toolbar/buttons/sponsor/translations/de.json b/src/toolbar/buttons/sponsor/translations/de.json new file mode 100644 index 000000000..ad647f053 --- /dev/null +++ b/src/toolbar/buttons/sponsor/translations/de.json @@ -0,0 +1,6 @@ +{ + "label": "Unterstützen", + "tooltip": { + "action": "Erfahren Sie, wie Sie die Entwicklung von Pybricks unterstützen können." + } +} diff --git a/src/toolbar/buttons/stop/translations/de.json b/src/toolbar/buttons/stop/translations/de.json new file mode 100644 index 000000000..1256831cf --- /dev/null +++ b/src/toolbar/buttons/stop/translations/de.json @@ -0,0 +1,4 @@ +{ + "label": "Stopp", + "tooltip": "Alles stoppen ({key})" +} diff --git a/src/toolbar/translations/de.json b/src/toolbar/translations/de.json new file mode 100644 index 000000000..d92f543c7 --- /dev/null +++ b/src/toolbar/translations/de.json @@ -0,0 +1,3 @@ +{ + "label": "Editor" +} diff --git a/src/tour/translations/de.json b/src/tour/translations/de.json new file mode 100644 index 000000000..fe9a56c01 --- /dev/null +++ b/src/tour/translations/de.json @@ -0,0 +1,34 @@ +{ + "back": "Zurück", + "close": "Schließen", + "last": "Letzte", + "next": "Weiter", + "open": "Dialog öffnen", + "skip": "Überspringen", + "steps": { + "welcome": { + "message": "Willkommen bei {appName}.", + "action": "Klicken Sie auf {next}, um die wichtigsten Funktionen zu entdecken." + }, + "newFile": { + "message": "Klicken Sie auf die {icon} Schaltfläche, um ein neues Programm zu erstellen." + }, + "backupFiles": { + "message": "Verlieren Sie Ihre Arbeit nicht.", + "action": "Klicken Sie auf {icon}, um Ihre Programme zu sichern." + }, + "flashPybricksFirmware": { + "message": "Um {appName} zu nutzen, müssen Sie die Pybricks-Firmware installieren." + }, + "restoreOfficialFirmware": { + "message": "Sie können die offizielle {lego} Firmware jederzeit wiederherstellen." + }, + "connectToHub": { + "message": "Klicken Sie auf die Bluetooth-Schaltfläche, um eine Verbindung herzustellen." + }, + "downloadAndRun": { + "message": "Sobald verbunden, klicken Sie auf die {icon} Schaltfläche, um Ihr Programm auszuführen.", + "runAgain": "Das Programm ist jetzt auf dem Hub gespeichert. Drücken Sie die Taste am Hub, um es erneut auszuführen." + } + } +}