move locales to client/ui/i18n

This commit is contained in:
Eduard Gert
2026-05-26 12:34:01 +02:00
parent 67a1f3c4fe
commit 91e0520f27
12 changed files with 30 additions and 21 deletions
+3 -3
View File
@@ -80,7 +80,7 @@ The Header's "more" dropdown owns a `viewMode: "default" | "advanced"` `useState
## Localisation (i18n)
Bootstrap lives in `src/i18n/index.ts` and is awaited before render in `app.tsx`. It reads the current language from `Preferences.Get()`, statically imports every bundle JSON (`en/common.json`, `de/common.json`, `hu/common.json` today), initialises i18next with `fallbackLng: "en"` and `interpolation: { prefix: "{", suffix: "}" }`, and subscribes to the `netbird:preferences:changed` Wails event so a flip from any window (tray, settings, another renderer) calls `i18next.changeLanguage` here.
Bootstrap lives in `src/lib/i18n.ts` and is awaited before render in `app.tsx`. It reads the current language from `Preferences.Get()`, statically imports every bundle JSON (`en/common.json`, `de/common.json`, `hu/common.json` today) from the shared tree at `client/ui/i18n/locales/` (sibling of the Go i18n package — same JSON drives both tray and React), initialises i18next with `fallbackLng: "en"` and `interpolation: { prefix: "{", suffix: "}" }`, and subscribes to the `netbird:preferences:changed` Wails event so a flip from any window (tray, settings, another renderer) calls `i18next.changeLanguage` here.
**No first-run detection.** When no preferences file exists, `Preferences.Get()` returns `{language: "en"}` from the Go-side in-memory default. The frontend treats `en` as the fallback (i18next `fallbackLng: "en"`) and users pick a different language via the picker in `SettingsGeneral`. The Go store persists on the first explicit `SetLanguage`.
@@ -117,9 +117,9 @@ if (result !== confirmLabel) return;
Compare against the variable, never against an English literal.
**Bundle files.** Keys live in `src/i18n/locales/<code>/common.json` as a flat key→string map (`"settings.tabs.general": "General"`). Placeholders use single braces: `"Install version {version}"`. Adding a key: add to `en/common.json` first (the fallback), then every other locale. Missing keys fall back to English; if even that misses, i18next returns the key itself so the gap is visible in the UI rather than blank.
**Bundle files.** Keys live in `client/ui/i18n/locales/<code>/common.json` as a flat key→string map (`"settings.tabs.general": "General"`). Placeholders use single braces: `"Install version {version}"`. Adding a key: add to `en/common.json` first (the fallback), then every other locale. Missing keys fall back to English; if even that misses, i18next returns the key itself so the gap is visible in the UI rather than blank.
**Adding a language.** Drop `src/i18n/locales/<code>/common.json` and append the row to `src/i18n/locales/_index.json`. Also drop the matching `<code>.svg` into `src/assets/flags/1x1/` — source those from the NetBird dashboard repo's same-name folder so the icon set stays consistent: https://github.com/netbirdio/dashboard/tree/main/public/assets/flags/1x1 . **Only check in flags for languages we actually ship** — `LanguagePicker.tsx` eager-globs that directory at build time, so every SVG in it gets bundled into the Wails app whether referenced or not. `src/i18n/index.ts` discovers bundles via `import.meta.glob('./locales/*/common.json', { eager: true })`, so no code change is needed to wire the new locale in. Vite still inlines each bundle at build time, same chunk shape as static imports. The Go side reads the same tree (embedded via `client/ui/main.go`'s `embed.FS`), so the tray menu localises automatically off the same files.
**Adding a language.** Drop `client/ui/i18n/locales/<code>/common.json` and append the row to `client/ui/i18n/locales/_index.json`. Also drop the matching `<code>.svg` into `src/assets/flags/1x1/` — source those from the NetBird dashboard repo's same-name folder so the icon set stays consistent: https://github.com/netbirdio/dashboard/tree/main/public/assets/flags/1x1 . **Only check in flags for languages we actually ship** — `LanguagePicker.tsx` eager-globs that directory at build time, so every SVG in it gets bundled into the Wails app whether referenced or not. `src/lib/i18n.ts` discovers bundles via `import.meta.glob('../../../i18n/locales/*/common.json', { eager: true })` (the locales tree lives outside `frontend/`, so `vite.config.ts` whitelists the parent dir under `server.fs.allow`), so no code change is needed to wire the new locale in. Vite still inlines each bundle at build time, same chunk shape as static imports. The Go side reads the same tree (embedded via `client/ui/main.go`'s `embed.FS`), so the tray menu localises automatically off the same files.
**Language picker.** `src/modules/settings/LanguagePicker.tsx` is mounted inside the Language section of `SettingsGeneral.tsx`. It populates from `I18n.Languages()` (matches `_index.json`) and calls `Preferences.SetLanguage(code)` on selection. The preference write triggers `netbird:preferences:changed`, which both the local i18next instance and every other open window listen to.
+3 -3
View File
@@ -40,7 +40,7 @@ Subscribe with `Events.On(name, handler)` from `@wailsio/runtime`. Handlers rece
| `netbird:status` | `Status` | Daemon SubscribeStatus snapshot — connection-state change, peer-list change, address change, mgmt/signal flip. Synthetic `StatusDaemonUnavailable` is emitted when the gRPC socket is unreachable, and a synthetic `Connecting` is emitted at the start of an active profile switch. |
| `netbird:event` | `SystemEvent` | One push per daemon SubscribeEvents item (DNS / network / authentication / connectivity / system). Used by the tray for OS toasts; the TS side reads events through `Status.events` instead. |
| `netbird:update:available` | `UpdateAvailable` | Daemon detected a new version (fan-out of the `new_version_available` metadata key). |
| `netbird:preferences:changed` | `{ language: string }` | Fires after every successful `Preferences.SetLanguage` (including the caller's own window). `src/i18n/index.ts` subscribes and calls `i18next.changeLanguage`. |
| `netbird:preferences:changed` | `{ language: string }` | Fires after every successful `Preferences.SetLanguage` (including the caller's own window). `src/lib/i18n.ts` subscribes and calls `i18next.changeLanguage`. |
| `netbird:update:progress` | `UpdateProgress` | Daemon enforced-update install progress (`action: "show"` etc.). |
| `browser-login:cancel` | (none) | Either the user closed the `BrowserLogin` window (Go-emitted) or the page's Cancel button (frontend-emitted). |
| `trigger-login` | (none) | Reserved by the tray for asking the frontend to start an SSO flow. `layouts/ConnectionStatusSwitch.tsx` subscribes and runs `startLogin()`; no Go-side emitter today. |
@@ -177,7 +177,7 @@ I18n.Languages(): Promise<Language[]> // from _index.json
I18n.Bundle(code: LanguageCode): Promise<Record<string,string>> // full key→text map
```
Source of truth is `frontend/src/i18n/locales/`. The frontend's i18next bootstrap doesn't need `I18n.Bundle` at runtime (bundles are statically imported by Vite), but the language picker reads `I18n.Languages()` so the list matches `_index.json` without duplicating it in TS.
Source of truth is `client/ui/i18n/locales/` (shared with the Go tray). The frontend's i18next bootstrap doesn't need `I18n.Bundle` at runtime (bundles are statically imported by Vite via the glob in `src/lib/i18n.ts`), but the language picker reads `I18n.Languages()` so the list matches `_index.json` without duplicating it in TS.
## `Preferences`
@@ -186,7 +186,7 @@ Preferences.Get(): Promise<UIPreferences> // { language: strin
Preferences.SetLanguage(code: LanguageCode): Promise<void> // rejects on unknown code
```
`SetLanguage` validates against the loaded `i18n.Bundle`, persists to `os.UserConfigDir()/netbird/ui-preferences.json`, and emits `netbird:preferences:changed`. The frontend's `src/i18n/index.ts` listens to that event and calls `i18next.changeLanguage` so a flip in any window paints in all of them. Missing preferences file → defaults to `en`, written on first read.
`SetLanguage` validates against the loaded `i18n.Bundle`, persists to `os.UserConfigDir()/netbird/ui-preferences.json`, and emits `netbird:preferences:changed`. The frontend's `src/lib/i18n.ts` listens to that event and calls `i18next.changeLanguage` so a flip in any window paints in all of them. Missing preferences file → defaults to `en`, written on first read.
## Daemon `Status.status` values
@@ -1,7 +0,0 @@
{
"languages": [
{"code": "en", "displayName": "English", "englishName": "English"},
{"code": "de", "displayName": "Deutsch", "englishName": "German"},
{"code": "hu", "displayName": "Magyar", "englishName": "Hungarian"}
]
}
@@ -1,328 +0,0 @@
{
"tray.tooltip": "NetBird",
"tray.status.disconnected": "Getrennt",
"tray.status.daemonUnavailable": "Nicht aktiv",
"tray.status.error": "Fehler",
"tray.session.expiresIn": "Läuft ab in {remaining}",
"tray.menu.open": "NetBird öffnen",
"tray.menu.connect": "Verbinden",
"tray.menu.disconnect": "Trennen",
"tray.menu.exitNode": "Exit-Node",
"tray.menu.networks": "Ressourcen",
"tray.menu.profiles": "Profile",
"tray.menu.settings": "Einstellungen",
"tray.menu.debugBundle": "Debug-Paket erstellen",
"tray.menu.about": "Über",
"tray.menu.github": "GitHub",
"tray.menu.documentation": "Dokumentation",
"tray.menu.downloadLatest": "Neueste Version herunterladen",
"tray.menu.installVersion": "Version {version} installieren",
"tray.menu.guiVersion": "Oberfläche: {version}",
"tray.menu.daemonVersion": "Daemon: {version}",
"tray.menu.versionUnknown": "—",
"tray.menu.quit": "Beenden",
"notify.update.title": "NetBird-Update verfügbar",
"notify.update.body": "NetBird {version} ist verfügbar.",
"notify.update.enforcedSuffix": " Ihr Administrator verlangt dieses Update.",
"notify.error.title": "Fehler",
"notify.error.connect": "Verbindung fehlgeschlagen",
"notify.error.disconnect": "Trennen fehlgeschlagen",
"notify.error.switchProfile": "Wechsel zu {profile} fehlgeschlagen",
"notify.sessionExpired.title": "NetBird-Sitzung abgelaufen",
"notify.sessionExpired.body": "Ihre NetBird-Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
"notify.sessionWarning.title": "Sitzung läuft bald ab",
"notify.sessionWarning.body": "Ihre NetBird-Sitzung läuft in {remaining} ab. Klicken Sie auf Jetzt verlängern, um zu erneuern.",
"notify.sessionWarning.bodyGeneric": "Ihre NetBird-Sitzung läuft bald ab. Klicken Sie auf Jetzt verlängern, um zu erneuern.",
"notify.sessionWarning.extend": "Jetzt verlängern",
"notify.sessionWarning.dismiss": "Verwerfen",
"notify.sessionWarning.failed": "NetBird-Sitzung konnte nicht verlängert werden",
"notify.sessionWarning.successTitle": "NetBird-Sitzung verlängert",
"notify.sessionWarning.successBody": "Ihre Sitzung wurde erneuert.",
"common.cancel": "Abbrechen",
"common.save": "Speichern",
"common.saveChanges": "Änderungen speichern",
"common.saving": "Speichert…",
"common.close": "Schließen",
"common.delete": "Löschen",
"common.create": "Erstellen",
"common.add": "Hinzufügen",
"common.remove": "Entfernen",
"common.refresh": "Aktualisieren",
"common.loading": "Lädt…",
"common.netbird": "NetBird",
"connect.status.disconnected": "Getrennt",
"connect.status.connecting": "Verbindet…",
"connect.status.connected": "Verbunden",
"connect.status.disconnecting": "Trennt…",
"connect.status.daemonUnavailable": "Daemon nicht verfügbar",
"connect.status.loginRequired": "Anmeldung erforderlich",
"connect.error.loginTitle": "Anmeldung fehlgeschlagen",
"connect.error.connectTitle": "Verbindung fehlgeschlagen",
"connect.error.disconnectTitle": "Trennen fehlgeschlagen",
"nav.peers.title": "Peers",
"nav.peers.description": "{online} von {total} online",
"nav.resources.title": "Ressourcen",
"nav.resources.description": "{active} von {total} aktiv",
"nav.exitNode.title": "Exit-Node",
"nav.exitNode.none": "{total} verfügbar",
"header.openSettings": "Einstellungen öffnen",
"header.togglePanel": "Seitenleiste umschalten",
"profile.selector.loading": "Lädt…",
"profile.selector.noProfile": "Kein Profil",
"profile.selector.searchPlaceholder": "Profil nach Namen suchen…",
"profile.selector.emptyTitle": "Keine Profile gefunden",
"profile.selector.emptyDescription": "Versuchen Sie einen anderen Suchbegriff oder erstellen Sie ein neues Profil.",
"profile.selector.newProfile": "Neues Profil",
"profile.selector.moreOptions": "Weitere Optionen",
"profile.selector.deregister": "Abmelden",
"profile.selector.delete": "Profil löschen",
"profile.dialog.title": "Neues Profil",
"profile.dialog.description": "Mit Profilen können Sie mehrere NetBird-Verbindungen nebeneinander verwalten. Geben Sie Ihrem Profil einen aussagekräftigen Namen.",
"profile.dialog.placeholder": "z. B. Arbeit",
"profile.deregister.title": "Profil abmelden",
"profile.deregister.message": "Sind Sie sicher, dass Sie \"{name}\" abmelden möchten? Sie müssen sich erneut anmelden, um es zu nutzen.",
"profile.deregister.confirm": "Abmelden",
"profile.delete.title": "Profil löschen",
"profile.delete.message": "Sind Sie sicher, dass Sie \"{name}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"profile.error.switchTitle": "Profilwechsel fehlgeschlagen",
"profile.error.deregisterTitle": "Abmeldung fehlgeschlagen",
"profile.error.deleteTitle": "Löschen des Profils fehlgeschlagen",
"profile.error.createTitle": "Erstellen des Profils fehlgeschlagen",
"profile.error.loadTitle": "Laden der Profile fehlgeschlagen",
"settings.error.loadTitle": "Laden der Einstellungen fehlgeschlagen",
"settings.error.saveTitle": "Speichern der Einstellungen fehlgeschlagen",
"settings.error.debugBundleTitle": "Debug-Paket fehlgeschlagen",
"settings.tabs.general": "Allgemein",
"settings.tabs.network": "Netzwerk",
"settings.tabs.security": "Sicherheit",
"settings.tabs.ssh": "SSH",
"settings.tabs.advanced": "Erweitert",
"settings.tabs.troubleshooting": "Fehlerbehebung",
"settings.tabs.about": "Über",
"settings.tabs.updateAvailable": "Update verfügbar",
"settings.general.section.general": "Allgemein",
"settings.general.section.connection": "Verbindung",
"settings.general.connectOnStartup.label": "Beim Start verbinden",
"settings.general.connectOnStartup.help": "Beim Start des Dienstes automatisch eine Verbindung herstellen.",
"settings.general.notifications.label": "Desktop-Benachrichtigungen",
"settings.general.notifications.help": "Desktop-Benachrichtigungen für neue Updates und Verbindungsereignisse anzeigen.",
"settings.general.language.label": "Anzeigesprache",
"settings.general.language.help": "Wählen Sie die Sprache der NetBird-Oberfläche.",
"settings.general.language.search": "Sprache suchen…",
"settings.general.language.empty": "Keine Sprachen gefunden.",
"settings.general.management.label": "Management-Server",
"settings.general.management.help": "Mit NetBird Cloud oder Ihrem eigenen self-hosted Management-Server verbinden. Änderungen lösen eine Neuverbindung des Clients aus.",
"settings.general.management.cloud": "Cloud",
"settings.general.management.selfHosted": "Self-hosted",
"settings.general.management.urlPlaceholder": "https://netbird.selfhosted.com:443",
"settings.general.management.urlError": "Bitte geben Sie eine gültige URL ein, z. B. https://netbird.selfhosted.com:443",
"settings.general.management.switchCloudTitle": "Zu NetBird Cloud wechseln?",
"settings.general.management.switchCloudMessage": "Dadurch wird die Verbindung zu Ihrem self-hosted Management-Server getrennt und eine neue Verbindung zu NetBird Cloud hergestellt. Möglicherweise müssen Sie sich erneut anmelden.",
"settings.general.management.switchCloudConfirm": "Zu Cloud wechseln",
"settings.network.section.connectivity": "Konnektivität",
"settings.network.section.routingDns": "Routing & DNS",
"settings.network.lazy.label": "Verzögerte Verbindungen",
"settings.network.lazy.help": "Statt durchgehend aktive Verbindungen zu halten, aktiviert NetBird sie bei Bedarf anhand von Aktivität oder Signalisierung.",
"settings.network.monitor.label": "Bei Netzwerkwechsel neu verbinden",
"settings.network.monitor.help": "Das Netzwerk überwachen und bei Änderungen (z. B. WLAN-Wechsel, Ethernet-Änderungen oder Rückkehr aus dem Ruhezustand) automatisch neu verbinden.",
"settings.network.dns.label": "DNS aktivieren",
"settings.network.dns.help": "NetBird-verwaltete DNS-Einstellungen auf den Host-Resolver anwenden.",
"settings.network.clientRoutes.label": "Client-Routen aktivieren",
"settings.network.clientRoutes.help": "Routen von anderen Peers übernehmen, um deren Netzwerke zu erreichen.",
"settings.network.serverRoutes.label": "Server-Routen aktivieren",
"settings.network.serverRoutes.help": "Lokale Routen dieses Hosts an andere Peers ankündigen.",
"settings.security.section.firewall": "Firewall",
"settings.security.section.encryption": "Verschlüsselung",
"settings.security.blockInbound.label": "Eingehenden Verkehr blockieren",
"settings.security.blockInbound.help": "Unaufgeforderte Verbindungen von Peers zu diesem Gerät und den von ihm gerouteten Netzwerken ablehnen. Ausgehender Verkehr ist nicht betroffen.",
"settings.security.blockLan.label": "LAN-Zugriff blockieren",
"settings.security.blockLan.help": "Verhindert, dass Peers Ihr lokales Netzwerk oder dessen Geräte erreichen, wenn dieses Gerät deren Verkehr routet.",
"settings.security.rosenpass.label": "Quantenresistenz aktivieren",
"settings.security.rosenpass.help": "Einen post-quanten Schlüsselaustausch via Rosenpass zusätzlich zu WireGuard® hinzufügen.",
"settings.security.rosenpassPermissive.label": "Permissiven Modus aktivieren",
"settings.security.rosenpassPermissive.help": "Verbindungen zu Peers ohne Quantenresistenz-Unterstützung erlauben.",
"settings.ssh.section.server": "Server",
"settings.ssh.section.capabilities": "Funktionen",
"settings.ssh.section.authentication": "Authentifizierung",
"settings.ssh.server.label": "SSH-Server aktivieren",
"settings.ssh.server.help": "Den NetBird SSH-Server auf diesem Host ausführen, damit andere Peers sich verbinden können.",
"settings.ssh.root.label": "Root-Login erlauben",
"settings.ssh.root.help": "Peers dürfen sich als root anmelden. Deaktivieren, um ein nicht-privilegiertes Konto zu erfordern.",
"settings.ssh.sftp.label": "SFTP erlauben",
"settings.ssh.sftp.help": "Dateien sicher über native SFTP- oder SCP-Clients übertragen.",
"settings.ssh.localForward.label": "Lokale Portweiterleitung",
"settings.ssh.localForward.help": "Verbundene Peers können lokale Ports zu von diesem Host erreichbaren Diensten tunneln.",
"settings.ssh.remoteForward.label": "Remote-Portweiterleitung",
"settings.ssh.remoteForward.help": "Verbundene Peers können Ports dieses Hosts an ihren eigenen Rechner weitergeben.",
"settings.ssh.jwt.label": "JWT-Authentifizierung aktivieren",
"settings.ssh.jwt.help": "Jede SSH-Sitzung gegen Ihren IdP für Identität und Audit prüfen. Deaktivieren, um sich nur auf Netzwerk-ACL-Richtlinien zu verlassen — sinnvoll, wenn kein IdP verfügbar ist.",
"settings.ssh.jwtTtl.label": "JWT-Cache-TTL",
"settings.ssh.jwtTtl.help": "Wie lange dieser Client ein JWT zwischenspeichert, bevor bei ausgehenden SSH-Verbindungen erneut nachgefragt wird. Auf 0 setzen, um den Cache zu deaktivieren und bei jeder Verbindung zu authentifizieren.",
"settings.ssh.jwtTtl.suffix": "Sekunde(n)",
"settings.advanced.section.interface": "Schnittstelle",
"settings.advanced.section.security": "Sicherheit",
"settings.advanced.interfaceName.label": "Name",
"settings.advanced.interfaceName.error": "Verwende 1–15 Buchstaben, Ziffern, Punkt, Bindestrich oder Unterstrich.",
"settings.advanced.interfaceName.errorMac": "Muss mit „utun“ und einer Zahl beginnen (z. B. utun100).",
"settings.advanced.port.label": "Port",
"settings.advanced.port.error": "Gib einen Port zwischen {min} und {max} ein.",
"settings.advanced.mtu.label": "MTU",
"settings.advanced.mtu.error": "Gib eine MTU zwischen {min} und {max} ein.",
"settings.advanced.psk.label": "Pre-shared Key",
"settings.advanced.psk.help": "Optionaler WireGuard-PSK für zusätzliche symmetrische Verschlüsselung. Nicht identisch mit einem NetBird Setup Key. Sie kommunizieren nur mit Peers, die denselben Pre-shared Key verwenden.",
"settings.troubleshooting.section.title": "Debug-Paket",
"settings.troubleshooting.intro": "Ein Debug-Paket hilft dem NetBird-Support bei der Untersuchung von Verbindungsproblemen. <br /> Es ist eine .zip-Datei mit Logs, Systemdetails und Debug-Informationen Ihres Geräts.",
"settings.troubleshooting.anonymize.label": "Sensible Informationen anonymisieren",
"settings.troubleshooting.anonymize.help": "Versteckt öffentliche IP-Adressen und nicht-NetBird-Domains in Logs.",
"settings.troubleshooting.systemInfo.label": "Systeminformationen einschließen",
"settings.troubleshooting.systemInfo.help": "OS, Kernel, Netzwerkschnittstellen und Routing-Tabellen einschließen.",
"settings.troubleshooting.upload.label": "Paket an NetBird-Server hochladen",
"settings.troubleshooting.upload.help": "Lädt das Paket sicher hoch und gibt einen Upload-Schlüssel zurück. Teilen Sie den Schlüssel über GitHub oder Slack mit dem NetBird-Support, anstatt die Datei direkt anzuhängen.",
"settings.troubleshooting.trace.label": "Trace-Logs erfassen",
"settings.troubleshooting.trace.help": "Erhöht das Logging auf TRACE und schaltet NetBird kurz aus und wieder ein, um Verbindungs-Logs zu erfassen. Das vorherige Level wird nach Erstellung des Pakets wiederhergestellt.",
"settings.troubleshooting.duration.label": "Aufzeichnungsdauer",
"settings.troubleshooting.duration.help": "Wie lange Trace-Logs vor der Paketerstellung erfasst werden sollen.",
"settings.troubleshooting.duration.suffix": "Minute(n)",
"settings.troubleshooting.create": "Paket erstellen",
"settings.troubleshooting.progress.description": "Logs, Systemdetails und Verbindungszustand werden gesammelt. Dies dauert in der Regel einen Moment — lassen Sie dieses Fenster geöffnet, bis es abgeschlossen ist.",
"settings.troubleshooting.cancelling": "Wird abgebrochen…",
"settings.troubleshooting.done.uploadedTitle": "Debug-Paket erfolgreich hochgeladen!",
"settings.troubleshooting.done.savedTitle": "Paket gespeichert",
"settings.troubleshooting.done.uploadedDescription": "Teilen Sie den unten angezeigten Upload-Schlüssel mit dem NetBird-Support. Eine lokale Kopie wurde ebenfalls auf Ihrem Gerät gespeichert.",
"settings.troubleshooting.done.savedDescription": "Ihr Debug-Paket wurde lokal gespeichert.",
"settings.troubleshooting.done.copyKey": "Schlüssel kopieren",
"settings.troubleshooting.done.openFolder": "Ordner öffnen",
"settings.troubleshooting.done.openFileLocation": "Speicherort öffnen",
"settings.troubleshooting.uploadFailedWithReason": "Upload fehlgeschlagen: {reason} Das Paket wurde trotzdem lokal gespeichert.",
"settings.troubleshooting.uploadFailed": "Upload fehlgeschlagen. Das Paket wurde trotzdem lokal gespeichert.",
"settings.troubleshooting.stage.preparingTrace": "Wechsel zu Trace-Logging…",
"settings.troubleshooting.stage.reconnecting": "NetBird wird neu verbunden…",
"settings.troubleshooting.stage.capturing": "Logs werden erfasst — {elapsed} / {total}",
"settings.troubleshooting.stage.restoring": "Vorheriges Log-Level wird wiederhergestellt…",
"settings.troubleshooting.stage.bundling": "Debug-Paket wird erstellt…",
"settings.troubleshooting.stage.uploading": "Wird zu NetBird hochgeladen…",
"settings.troubleshooting.stage.cancelling": "Wird abgebrochen…",
"settings.about.client": "NetBird Client v{version}",
"settings.about.clientName": "NetBird Client",
"settings.about.development": "[Entwicklung]",
"settings.about.gui": "Oberfläche v{version}",
"settings.about.copyright": "© {year} NetBird. Alle Rechte vorbehalten.",
"settings.about.links.imprint": "Impressum",
"settings.about.links.privacy": "Datenschutz",
"settings.about.links.cla": "CLA",
"settings.about.links.terms": "Nutzungsbedingungen",
"update.banner.message": "NetBird {version} ist installationsbereit.",
"update.banner.later": "Später",
"update.banner.installNow": "Jetzt installieren",
"update.card.versionAvailableDownload": "Version {version} ist zum Herunterladen verfügbar.",
"update.card.versionAvailableInstall": "Version {version} ist zur Installation verfügbar.",
"update.card.whatsNew": "Was ist neu?",
"update.card.installNow": "Jetzt installieren",
"update.card.getInstaller": "Herunterladen",
"update.card.autoCheckInterval": "NetBird sucht im Hintergrund nach Updates.",
"update.card.changelog": "Änderungsprotokoll",
"update.card.onLatestVersion": "Du verwendest die neueste Version",
"update.header.tooltip": "Update verfügbar",
"update.overlay.updatingVersion": "NetBird wird auf v{version} aktualisiert",
"update.overlay.updating": "NetBird wird aktualisiert",
"update.overlay.description": "Eine neuere Version ist verfügbar und wird installiert. NetBird startet nach Abschluss des Updates automatisch neu.",
"update.overlay.error.timeoutTitle": "Update dauert zu lange",
"update.overlay.error.timeoutDescription": "Die Installation von {target} hat zu lange gedauert und wurde nicht abgeschlossen.",
"update.overlay.error.canceledTitle": "Update wurde abgebrochen",
"update.overlay.error.canceledDescription": "Das Update auf {target} wurde vor dem Abschluss abgebrochen.",
"update.overlay.error.failTitle": "Update konnte nicht installiert werden",
"update.overlay.error.failDescription": "{target} konnte nicht installiert werden.",
"update.overlay.error.unknownMessage": "unbekannter Fehler",
"update.overlay.error.targetVersion": "v{version}",
"update.overlay.error.targetFallback": "die neue Version",
"update.error.loadStateTitle": "Laden des Update-Status fehlgeschlagen",
"update.error.triggerTitle": "Update-Start fehlgeschlagen",
"update.page.versionLine": "Client wird aktualisiert auf: {version}.",
"update.page.versionLineGeneric": "Client wird aktualisiert.",
"update.page.outdated": "Ihre Client-Version ist älter als die im Management eingestellte Auto-Update-Version.",
"update.page.status.running": "Aktualisiert",
"update.page.status.timeout": "Zeitüberschreitung beim Update. Bitte erneut versuchen.",
"update.page.status.canceled": "Update abgebrochen.",
"update.page.status.failed": "Update fehlgeschlagen: {message}",
"update.page.status.unknownError": "unbekannter Update-Fehler",
"update.page.failedTitle": "Update fehlgeschlagen",
"update.page.timeoutMessage": "Zeitüberschreitung beim Update.",
"update.page.dontClose": "Bitte schließen Sie dieses Fenster nicht.",
"update.page.updating": "Aktualisiert…",
"update.page.complete": "Update abgeschlossen",
"update.page.failed": "Update fehlgeschlagen",
"browserLogin.title": "Setzen Sie den Anmeldevorgang im Browser fort",
"browserLogin.notSeeing": "Sehen Sie den Browser-Tab nicht?",
"browserLogin.tryAgain": "Erneut versuchen",
"browserLogin.openFailedTitle": "Browser konnte nicht geöffnet werden",
"sessionExpired.title": "Sitzung abgelaufen",
"sessionExpired.description": "Ihre NetBird-Sitzung ist abgelaufen. Melden Sie sich erneut an, damit Ihre Geräte verbunden bleiben.",
"sessionExpired.later": "Später",
"sessionExpired.signIn": "Anmelden",
"sessionAboutToExpire.title": "Sitzung läuft bald ab",
"sessionAboutToExpire.description": "Ihre NetBird-Sitzung läuft in Kürze ab. Bleiben Sie verbunden, damit Ihre Geräte online bleiben.",
"sessionAboutToExpire.stay": "Verbunden bleiben",
"sessionAboutToExpire.logout": "Abmelden",
"sessionAboutToExpire.expired": "Sitzung abgelaufen",
"sessionAboutToExpire.extendFailedTitle": "Sitzungsverlängerung fehlgeschlagen",
"sessionAboutToExpire.logoutFailedTitle": "Abmeldung fehlgeschlagen",
"peers.search.placeholder": "Nach Peer-Name, DNS oder IP-Adresse suchen",
"peers.filter.all": "Alle",
"peers.filter.online": "Online",
"peers.filter.offline": "Offline",
"peers.empty": "Keine Peers entsprechen den aktuellen Filtern.",
"networks.search.placeholder": "Nach Netzwerk, Bereich oder Domain suchen",
"networks.filter.all": "Alle",
"networks.filter.selected": "Ausgewählt",
"networks.filter.overlapping": "Überlappend",
"networks.empty": "Keine Netzwerke entsprechen den aktuellen Filtern.",
"networks.selected": "Ausgewählt",
"networks.unselected": "Nicht ausgewählt",
"exitNodes.search.placeholder": "Exit Nodes suchen",
"exitNodes.empty": "Keine Exit Nodes verfügbar.",
"exitNodes.active": "Aktiv",
"exitNodes.inactive": "Inaktiv",
"quickActions.connect": "Verbinden",
"quickActions.disconnect": "Trennen",
"daemon.unavailable.title": "NetBird-Dienst läuft nicht",
"daemon.unavailable.description": "Die App stellt automatisch die Verbindung wieder her, sobald der Dienst läuft.",
"daemon.unavailable.docsLink": "Dokumentation",
"error.jwt_clock_skew": "Anmeldung fehlgeschlagen: Die Uhr dieses Geräts ist nicht mit dem Server synchron. Bitte synchronisieren Sie die Systemuhr und versuchen Sie es erneut.",
"error.jwt_expired": "Ihr Anmeldetoken ist abgelaufen. Bitte melden Sie sich erneut an.",
"error.jwt_signature_invalid": "Anmeldung fehlgeschlagen: Die Token-Signatur ist ungültig. Bitte wenden Sie sich an Ihren Administrator.",
"error.session_expired": "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
"error.invalid_setup_key": "Der Setup-Schlüssel fehlt oder ist ungültig.",
"error.permission_denied": "Die Anmeldung wurde vom Server abgelehnt.",
"error.daemon_unreachable": "Der NetBird-Dienst antwortet nicht. Bitte prüfen Sie, ob der Dienst läuft.",
"error.unknown": "Vorgang fehlgeschlagen. Technische Details siehe unten."
}
@@ -1,344 +0,0 @@
{
"tray.tooltip": "NetBird",
"tray.status.disconnected": "Disconnected",
"tray.status.daemonUnavailable": "Not running",
"tray.status.error": "Error",
"tray.session.expiresIn": "Expires in {remaining}",
"tray.menu.open": "Open NetBird",
"tray.menu.connect": "Connect",
"tray.menu.disconnect": "Disconnect",
"tray.menu.exitNode": "Exit Node",
"tray.menu.networks": "Resources",
"tray.menu.profiles": "Profiles",
"tray.menu.settings": "Settings",
"tray.menu.debugBundle": "Create Debug Bundle",
"tray.menu.about": "About",
"tray.menu.github": "GitHub",
"tray.menu.documentation": "Documentation",
"tray.menu.downloadLatest": "Download latest version",
"tray.menu.installVersion": "Install version {version}",
"tray.menu.guiVersion": "GUI: {version}",
"tray.menu.daemonVersion": "Daemon: {version}",
"tray.menu.versionUnknown": "—",
"tray.menu.quit": "Quit",
"notify.update.title": "NetBird update available",
"notify.update.body": "NetBird {version} is available.",
"notify.update.enforcedSuffix": " Your administrator requires this update.",
"notify.error.title": "Error",
"notify.error.connect": "Failed to connect",
"notify.error.disconnect": "Failed to disconnect",
"notify.error.switchProfile": "Failed to switch to {profile}",
"notify.sessionExpired.title": "NetBird session expired",
"notify.sessionExpired.body": "Your NetBird session has expired. Please log in again.",
"notify.sessionWarning.title": "Session expires soon",
"notify.sessionWarning.body": "Your NetBird session expires in {remaining}. Click Extend now to renew.",
"notify.sessionWarning.bodyGeneric": "Your NetBird session is about to expire. Click Extend now to renew.",
"notify.sessionWarning.extend": "Extend now",
"notify.sessionWarning.dismiss": "Dismiss",
"notify.sessionWarning.failed": "Failed to extend NetBird session",
"notify.sessionWarning.successTitle": "NetBird session extended",
"notify.sessionWarning.successBody": "Your session has been refreshed.",
"common.cancel": "Cancel",
"common.save": "Save",
"common.saveChanges": "Save Changes",
"common.saving": "Saving…",
"common.close": "Close",
"common.delete": "Delete",
"common.create": "Create",
"common.add": "Add",
"common.remove": "Remove",
"common.refresh": "Refresh",
"common.loading": "Loading…",
"common.netbird": "NetBird",
"connect.status.disconnected": "Disconnected",
"connect.status.connecting": "Connecting...",
"connect.status.connected": "Connected",
"connect.status.disconnecting": "Disconnecting...",
"connect.status.daemonUnavailable": "Daemon unavailable",
"connect.status.loginRequired": "Login required",
"connect.error.loginTitle": "Login Failed",
"connect.error.connectTitle": "Connect Failed",
"connect.error.disconnectTitle": "Disconnect Failed",
"nav.peers.title": "Peers",
"nav.peers.description": "{online} of {total} Online",
"nav.resources.title": "Resources",
"nav.resources.description": "{active} of {total} Active",
"nav.exitNode.title": "Exit Node",
"nav.exitNode.none": "{total} available",
"header.openSettings": "Open settings",
"header.togglePanel": "Toggle side panel",
"profile.selector.loading": "Loading...",
"profile.selector.noProfile": "No profile",
"profile.selector.searchPlaceholder": "Search profile by name...",
"profile.selector.emptyTitle": "No Profiles Found",
"profile.selector.emptyDescription": "Try a different search term or create a new profile.",
"profile.selector.newProfile": "New Profile",
"profile.selector.moreOptions": "More options",
"profile.selector.deregister": "Deregister",
"profile.selector.delete": "Delete",
"profile.dialog.title": "Enter Profile Name",
"profile.dialog.description": "Choose a memorable name.",
"profile.dialog.placeholder": "e.g. Work",
"profile.dialog.submit": "Add Profile",
"profile.dialog.required": "Please enter a profile name, e.g. Work, Home",
"header.menu.settings": "Settings",
"header.menu.defaultView": "Default View",
"header.menu.advancedView": "Advanced View",
"header.menu.updateAvailable": "Update Available",
"profile.deregister.title": "Deregister Profile",
"profile.deregister.message": "Are you sure you want to deregister \"{name}\"? You will need to log in again to use it.",
"profile.deregister.confirm": "Deregister",
"profile.delete.title": "Delete Profile",
"profile.delete.message": "Are you sure you want to delete \"{name}\"? This action cannot be undone.",
"profile.error.switchTitle": "Switch Profile Failed",
"profile.error.deregisterTitle": "Deregister Profile Failed",
"profile.error.deleteTitle": "Delete Profile Failed",
"profile.error.createTitle": "Create Profile Failed",
"profile.error.loadTitle": "Load Profiles Failed",
"profile.dropdown.activeProfile": "Active profile",
"profile.dropdown.switchProfile": "Switch Profile",
"profile.dropdown.noEmail": "Other",
"profile.dropdown.addProfile": "Add Profile",
"profile.dropdown.manageProfiles": "Manage Profiles",
"profile.dropdown.settings": "Settings",
"settings.profiles.section.profiles": "Profiles",
"settings.profiles.intro": "Keep separate NetBird identities side by side, for example work and personal accounts, or different management servers. Add, deregister, or delete profiles below.",
"settings.profiles.addProfile": "Add Profile",
"settings.profiles.active": "Active",
"settings.profiles.emptyTitle": "No Profiles",
"settings.profiles.emptyDescription": "Create a profile to connect to a NetBird management server.",
"settings.error.loadTitle": "Load Settings Failed",
"settings.error.saveTitle": "Save Settings Failed",
"settings.error.debugBundleTitle": "Debug Bundle Failed",
"settings.tabs.general": "General",
"settings.tabs.network": "Network",
"settings.tabs.security": "Security",
"settings.tabs.profiles": "Profiles",
"settings.tabs.ssh": "SSH",
"settings.tabs.advanced": "Advanced",
"settings.tabs.troubleshooting": "Troubleshooting",
"settings.tabs.about": "About",
"settings.tabs.updateAvailable": "Update Available",
"settings.general.section.general": "General",
"settings.general.section.connection": "Connection",
"settings.general.connectOnStartup.label": "Connect on Startup",
"settings.general.connectOnStartup.help": "Automatically establish a connection when the service starts.",
"settings.general.notifications.label": "Desktop Notifications",
"settings.general.notifications.help": "Show desktop notifications for new updates and connection events.",
"settings.general.language.label": "Display Language",
"settings.general.language.help": "Choose the language for the NetBird interface.",
"settings.general.language.search": "Search language…",
"settings.general.language.empty": "No languages match.",
"settings.general.management.label": "Management Server",
"settings.general.management.help": "Connect to NetBird Cloud or your own self-hosted management server. Changes will reconnect the client.",
"settings.general.management.cloud": "Cloud",
"settings.general.management.selfHosted": "Self-hosted",
"settings.general.management.urlPlaceholder": "https://netbird.selfhosted.com:443",
"settings.general.management.urlError": "Please enter a valid URL, e.g., https://netbird.selfhosted.com:443",
"settings.general.management.switchCloudTitle": "Switch to NetBird Cloud?",
"settings.general.management.switchCloudMessage": "This will disconnect from your self-hosted management server and reconnect to NetBird Cloud. You may need to log in again.",
"settings.general.management.switchCloudConfirm": "Switch to Cloud",
"settings.network.section.connectivity": "Connectivity",
"settings.network.section.routingDns": "Routing & DNS",
"settings.network.lazy.label": "Lazy Connections",
"settings.network.lazy.help": "Instead of maintaining always-on connections, NetBird activates them on-demand based on activity or signaling.",
"settings.network.monitor.label": "Reconnect on Network Change",
"settings.network.monitor.help": "Monitor the network and automatically reconnect on changes such as Wi-Fi switching, Ethernet changes, or resume from sleep.",
"settings.network.dns.label": "Enable DNS",
"settings.network.dns.help": "Apply NetBird-managed DNS settings to the host resolver.",
"settings.network.clientRoutes.label": "Enable Client Routes",
"settings.network.clientRoutes.help": "Accept routes from other peers to reach their networks.",
"settings.network.serverRoutes.label": "Enable Server Routes",
"settings.network.serverRoutes.help": "Advertise this host's local routes to other peers.",
"settings.security.section.firewall": "Firewall",
"settings.security.section.encryption": "Encryption",
"settings.security.blockInbound.label": "Block Inbound Traffic",
"settings.security.blockInbound.help": "Reject unsolicited connections from peers to this device and any networks it routes. Outbound traffic is unaffected.",
"settings.security.blockLan.label": "Block LAN Access",
"settings.security.blockLan.help": "Prevent peers from reaching your local network or its devices when this device routes their traffic.",
"settings.security.rosenpass.label": "Enable Quantum-Resistance",
"settings.security.rosenpass.help": "Add a post-quantum key exchange via Rosenpass on top of WireGuard®.",
"settings.security.rosenpassPermissive.label": "Enable Permissive Mode",
"settings.security.rosenpassPermissive.help": "Allow connections to peers without quantum-resistance support.",
"settings.ssh.section.server": "Server",
"settings.ssh.section.capabilities": "Capabilities",
"settings.ssh.section.authentication": "Authentication",
"settings.ssh.server.label": "Enable SSH Server",
"settings.ssh.server.help": "Run the NetBird SSH server on this host so other peers can connect to it.",
"settings.ssh.root.label": "Allow Root Login",
"settings.ssh.root.help": "Let peers sign in as the root user. Disable to require a non-privileged account.",
"settings.ssh.sftp.label": "Allow SFTP",
"settings.ssh.sftp.help": "Transfer files securely using native SFTP or SCP clients.",
"settings.ssh.localForward.label": "Local Port Forwarding",
"settings.ssh.localForward.help": "Let connecting peers tunnel local ports to services reachable from this host.",
"settings.ssh.remoteForward.label": "Remote Port Forwarding",
"settings.ssh.remoteForward.help": "Let connecting peers expose ports on this host back to their own machine.",
"settings.ssh.jwt.label": "Enable JWT Authentication",
"settings.ssh.jwt.help": "Verify each SSH session against your IdP for user identity and audit. Disable to rely on network ACL policies only, useful when no IdP is available.",
"settings.ssh.jwtTtl.label": "JWT Cache TTL",
"settings.ssh.jwtTtl.help": "How long this client caches a JWT before prompting again on outgoing SSH connections. Set to 0 to disable caching and authenticate on every connection.",
"settings.ssh.jwtTtl.suffix": "Second(s)",
"settings.advanced.section.interface": "Interface",
"settings.advanced.section.security": "Security",
"settings.advanced.interfaceName.label": "Name",
"settings.advanced.port.label": "Port",
"settings.advanced.mtu.label": "MTU",
"settings.advanced.psk.label": "Pre-shared Key",
"settings.advanced.psk.help": "Optional WireGuard PSK for extra symmetric encryption. Not the same as a NetBird Setup Key. You will only communicate with peers that use the same pre-shared key.",
"settings.troubleshooting.section.title": "Debug bundle",
"settings.troubleshooting.intro": "A debug bundle helps NetBird support investigate connection problems. <br /> It's a .zip file with logs, system details and debug information from your device.",
"settings.troubleshooting.anonymize.label": "Anonymize Sensitive Information",
"settings.troubleshooting.anonymize.help": "Hides public IP addresses and non-NetBird domains from logs.",
"settings.troubleshooting.systemInfo.label": "Include System Information",
"settings.troubleshooting.systemInfo.help": "Include OS, kernel, network interfaces, and routing tables.",
"settings.troubleshooting.upload.label": "Upload Bundle to NetBird Servers",
"settings.troubleshooting.upload.help": "Securely uploads the bundle and returns an upload key. Share the key with NetBird support over GitHub or Slack instead of attaching the file directly.",
"settings.troubleshooting.trace.label": "Capture Trace Logs",
"settings.troubleshooting.trace.help": "Raises logging to TRACE and cycles NetBird up and down to capture connection logs. The previous level is restored after the bundle is built.",
"settings.troubleshooting.duration.label": "Capture Duration",
"settings.troubleshooting.duration.help": "How long to capture trace logs before generating the bundle.",
"settings.troubleshooting.duration.suffix": "Minute(s)",
"settings.troubleshooting.create": "Create Bundle",
"settings.troubleshooting.progress.description": "Collecting logs, system details, and connection state. This usually takes a moment — keep this window open until it completes.",
"settings.troubleshooting.cancelling": "Cancelling…",
"settings.troubleshooting.done.uploadedTitle": "Debug bundle successfully uploaded!",
"settings.troubleshooting.done.savedTitle": "Bundle saved",
"settings.troubleshooting.done.uploadedDescription": "Share the upload key below with NetBird support. A local copy was also saved on your device.",
"settings.troubleshooting.done.savedDescription": "Your debug bundle has been saved locally.",
"settings.troubleshooting.done.copyKey": "Copy Key",
"settings.troubleshooting.done.openFolder": "Open Folder",
"settings.troubleshooting.done.openFileLocation": "Open file location",
"settings.troubleshooting.uploadFailedWithReason": "Upload failed: {reason} The bundle is still saved locally.",
"settings.troubleshooting.uploadFailed": "Upload failed. The bundle is still saved locally.",
"settings.troubleshooting.stage.preparingTrace": "Switching to trace logging…",
"settings.troubleshooting.stage.reconnecting": "Reconnecting NetBird…",
"settings.troubleshooting.stage.capturing": "Capturing logs — {elapsed} / {total}",
"settings.troubleshooting.stage.restoring": "Restoring previous log level…",
"settings.troubleshooting.stage.bundling": "Generating debug bundle…",
"settings.troubleshooting.stage.uploading": "Uploading to NetBird…",
"settings.troubleshooting.stage.cancelling": "Cancelling…",
"settings.about.client": "NetBird Client v{version}",
"settings.about.clientName": "NetBird Client",
"settings.about.development": "[Development]",
"settings.about.gui": "GUI v{version}",
"settings.about.copyright": "© {year} NetBird. All Rights Reserved.",
"settings.about.links.imprint": "Imprint",
"settings.about.links.privacy": "Privacy",
"settings.about.links.cla": "CLA",
"settings.about.links.terms": "Terms of Service",
"update.banner.message": "NetBird {version} is ready to install.",
"update.banner.later": "Later",
"update.banner.installNow": "Install now",
"update.card.versionAvailableDownload": "Version {version} is available for download.",
"update.card.versionAvailableInstall": "Version {version} is available for install.",
"update.card.whatsNew": "What's new?",
"update.card.installNow": "Install Now",
"update.card.getInstaller": "Download",
"update.card.autoCheckInterval": "NetBird checks for updates in the background.",
"update.card.changelog": "Changelog",
"update.card.onLatestVersion": "You're on the latest version",
"update.header.tooltip": "Update Available",
"update.overlay.updatingVersion": "Updating NetBird to v{version}",
"update.overlay.updating": "Updating NetBird",
"update.overlay.description": "A newer version is available and is being installed. NetBird will restart automatically once the update is finished.",
"update.overlay.error.timeoutTitle": "Update Is Taking Too Long",
"update.overlay.error.timeoutDescription": "Installing {target} took too long and didn't finish.",
"update.overlay.error.canceledTitle": "Update Was Stopped",
"update.overlay.error.canceledDescription": "The update to {target} was canceled before it finished.",
"update.overlay.error.failTitle": "Couldn't Install the Update",
"update.overlay.error.failDescription": "{target} couldn't be installed.",
"update.overlay.error.unknownMessage": "unknown error",
"update.overlay.error.targetVersion": "v{version}",
"update.overlay.error.targetFallback": "the new version",
"update.error.loadStateTitle": "Load Update State Failed",
"update.error.triggerTitle": "Start Update Failed",
"update.page.versionLine": "Updating client to: {version}.",
"update.page.versionLineGeneric": "Updating client.",
"update.page.outdated": "Your client version is older than the auto-update version set in Management.",
"update.page.status.running": "Updating",
"update.page.status.timeout": "Update timed out. Please try again.",
"update.page.status.canceled": "Update canceled.",
"update.page.status.failed": "Update failed: {message}",
"update.page.status.unknownError": "unknown update error",
"update.page.failedTitle": "Update Failed",
"update.page.timeoutMessage": "Update timed out.",
"update.page.dontClose": "Please don't close this window.",
"update.page.updating": "Updating…",
"update.page.complete": "Update complete",
"update.page.failed": "Update failed",
"browserLogin.title": "Continue in your browser to complete the login",
"browserLogin.notSeeing": "Not seeing the browser tab?",
"browserLogin.tryAgain": "Try again",
"sessionExpired.title": "Session expired",
"sessionExpired.description": "Your NetBird session has expired. Sign in again to keep your devices connected.",
"sessionExpired.later": "Later",
"sessionExpired.signIn": "Sign in",
"sessionAboutToExpire.title": "Session expiring soon",
"sessionAboutToExpire.description": "Your NetBird session will expire shortly. Stay connected to keep your devices online.",
"sessionAboutToExpire.stay": "Stay connected",
"sessionAboutToExpire.logout": "Logout",
"sessionAboutToExpire.expired": "Session expired",
"sessionAboutToExpire.extendFailedTitle": "Extend Session Failed",
"peers.search.placeholder": "Search by peer name, DNS or IP address",
"peers.filter.all": "All",
"peers.filter.online": "Online",
"peers.filter.offline": "Offline",
"peers.empty": "No peers match the current filters.",
"networks.search.placeholder": "Search by network, range or domain",
"networks.filter.all": "All",
"networks.filter.selected": "Selected",
"networks.filter.overlapping": "Overlapping",
"networks.empty": "No networks match the current filters.",
"networks.selected": "Selected",
"networks.unselected": "Not selected",
"exitNodes.search.placeholder": "Search exit nodes",
"exitNodes.empty": "No exit nodes available.",
"exitNodes.active": "Active",
"exitNodes.inactive": "Inactive",
"quickActions.connect": "Connect",
"quickActions.disconnect": "Disconnect",
"daemon.unavailable.title": "NetBird Service Is Not Running",
"daemon.unavailable.description": "The app will reconnect automatically once the service is running.",
"daemon.unavailable.docsLink": "Documentation",
"error.jwt_clock_skew": "Sign-in failed: this device's clock is out of sync with the server. Please sync your system clock and try again.",
"error.jwt_expired": "Your sign-in token has expired. Please sign in again.",
"error.jwt_signature_invalid": "Sign-in failed: the token signature is invalid. Please contact your administrator.",
"error.session_expired": "Your session has expired. Please sign in again.",
"error.invalid_setup_key": "The setup key is missing or invalid.",
"error.permission_denied": "Sign-in was rejected by the server.",
"error.daemon_unreachable": "The NetBird daemon is not responding. Please check that the service is running.",
"error.unknown": "Operation failed. See details for the technical message."
}
@@ -1,328 +0,0 @@
{
"tray.tooltip": "NetBird",
"tray.status.disconnected": "Lekapcsolva",
"tray.status.daemonUnavailable": "Nem fut",
"tray.status.error": "Hiba",
"tray.session.expiresIn": "Lejár {remaining} múlva",
"tray.menu.open": "NetBird megnyitása",
"tray.menu.connect": "Csatlakozás",
"tray.menu.disconnect": "Bontás",
"tray.menu.exitNode": "Kilépő csomópont",
"tray.menu.networks": "Erőforrások",
"tray.menu.profiles": "Profilok",
"tray.menu.settings": "Beállítások",
"tray.menu.debugBundle": "Hibakeresési csomag készítése",
"tray.menu.about": "Névjegy",
"tray.menu.github": "GitHub",
"tray.menu.documentation": "Dokumentáció",
"tray.menu.downloadLatest": "Legfrissebb verzió letöltése",
"tray.menu.installVersion": "{version} verzió telepítése",
"tray.menu.guiVersion": "Felület: {version}",
"tray.menu.daemonVersion": "Daemon: {version}",
"tray.menu.versionUnknown": "—",
"tray.menu.quit": "Kilépés",
"notify.update.title": "NetBird frissítés elérhető",
"notify.update.body": "Elérhető a NetBird {version}.",
"notify.update.enforcedSuffix": " A rendszergazda kötelezővé tette ezt a frissítést.",
"notify.error.title": "Hiba",
"notify.error.connect": "Csatlakozás sikertelen",
"notify.error.disconnect": "Bontás sikertelen",
"notify.error.switchProfile": "Átváltás sikertelen erre: {profile}",
"notify.sessionExpired.title": "NetBird munkamenet lejárt",
"notify.sessionExpired.body": "A NetBird munkamenet lejárt. Kérjük, jelentkezzen be újra.",
"notify.sessionWarning.title": "Munkamenet hamarosan lejár",
"notify.sessionWarning.body": "A NetBird munkamenet {remaining} múlva lejár. Kattints a Meghosszabbítás gombra a megújításhoz.",
"notify.sessionWarning.bodyGeneric": "A NetBird munkamenet hamarosan lejár. Kattints a Meghosszabbítás gombra a megújításhoz.",
"notify.sessionWarning.extend": "Meghosszabbítás",
"notify.sessionWarning.dismiss": "Elvetés",
"notify.sessionWarning.failed": "A NetBird munkamenet meghosszabbítása sikertelen",
"notify.sessionWarning.successTitle": "NetBird munkamenet meghosszabbítva",
"notify.sessionWarning.successBody": "A munkamenet frissítve.",
"common.cancel": "Mégse",
"common.save": "Mentés",
"common.saveChanges": "Módosítások mentése",
"common.saving": "Mentés…",
"common.close": "Bezárás",
"common.delete": "Törlés",
"common.create": "Létrehozás",
"common.add": "Hozzáadás",
"common.remove": "Eltávolítás",
"common.refresh": "Frissítés",
"common.loading": "Betöltés…",
"common.netbird": "NetBird",
"connect.status.disconnected": "Lekapcsolva",
"connect.status.connecting": "Csatlakozás…",
"connect.status.connected": "Csatlakoztatva",
"connect.status.disconnecting": "Bontás…",
"connect.status.daemonUnavailable": "Daemon nem elérhető",
"connect.status.loginRequired": "Bejelentkezés szükséges",
"connect.error.loginTitle": "Bejelentkezés sikertelen",
"connect.error.connectTitle": "Csatlakozás sikertelen",
"connect.error.disconnectTitle": "Bontás sikertelen",
"nav.peers.title": "Társak",
"nav.peers.description": "{online} / {total} online",
"nav.resources.title": "Erőforrások",
"nav.resources.description": "{active} / {total} aktív",
"nav.exitNode.title": "Kilépő csomópont",
"nav.exitNode.none": "{total} elérhető",
"header.openSettings": "Beállítások megnyitása",
"header.togglePanel": "Oldalsó panel váltása",
"profile.selector.loading": "Betöltés…",
"profile.selector.noProfile": "Nincs profil",
"profile.selector.searchPlaceholder": "Profil keresése név alapján…",
"profile.selector.emptyTitle": "Nem található profil",
"profile.selector.emptyDescription": "Próbáljon más keresőkifejezést, vagy hozzon létre új profilt.",
"profile.selector.newProfile": "Új profil",
"profile.selector.moreOptions": "További műveletek",
"profile.selector.deregister": "Leválasztás",
"profile.selector.delete": "Profil törlése",
"profile.dialog.title": "Új profil",
"profile.dialog.description": "A profilok lehetővé teszik, hogy különálló NetBird-kapcsolatokat tartson egymás mellett. Adjon profiljának egy könnyen megjegyezhető nevet.",
"profile.dialog.placeholder": "pl. Munka",
"profile.deregister.title": "Profil leválasztása",
"profile.deregister.message": "Biztosan le szeretné választani a következőt: \"{name}\"? Újra be kell jelentkeznie a használatához.",
"profile.deregister.confirm": "Leválasztás",
"profile.delete.title": "Profil törlése",
"profile.delete.message": "Biztosan törölni szeretné a következőt: \"{name}\"? Ez a művelet nem vonható vissza.",
"profile.error.switchTitle": "Profilváltás sikertelen",
"profile.error.deregisterTitle": "Leválasztás sikertelen",
"profile.error.deleteTitle": "Profil törlése sikertelen",
"profile.error.createTitle": "Profil létrehozása sikertelen",
"profile.error.loadTitle": "Profilok betöltése sikertelen",
"settings.error.loadTitle": "Beállítások betöltése sikertelen",
"settings.error.saveTitle": "Beállítások mentése sikertelen",
"settings.error.debugBundleTitle": "Hibakeresési csomag sikertelen",
"settings.tabs.general": "Általános",
"settings.tabs.network": "Hálózat",
"settings.tabs.security": "Biztonság",
"settings.tabs.ssh": "SSH",
"settings.tabs.advanced": "Speciális",
"settings.tabs.troubleshooting": "Hibaelhárítás",
"settings.tabs.about": "Névjegy",
"settings.tabs.updateAvailable": "Frissítés elérhető",
"settings.general.section.general": "Általános",
"settings.general.section.connection": "Kapcsolat",
"settings.general.connectOnStartup.label": "Csatlakozás indításkor",
"settings.general.connectOnStartup.help": "A szolgáltatás indulásakor automatikusan kapcsolatot létesít.",
"settings.general.notifications.label": "Asztali értesítések",
"settings.general.notifications.help": "Asztali értesítések megjelenítése új frissítésekről és kapcsolati eseményekről.",
"settings.general.language.label": "Megjelenítési nyelv",
"settings.general.language.help": "Válassza ki a NetBird felület nyelvét.",
"settings.general.language.search": "Nyelv keresése…",
"settings.general.language.empty": "Nincs találat.",
"settings.general.management.label": "Kezelőszerver",
"settings.general.management.help": "Csatlakozás a NetBird Cloudhoz vagy saját self-hosted kezelőszerverhez. A módosítások újracsatlakozást váltanak ki.",
"settings.general.management.cloud": "Felhő",
"settings.general.management.selfHosted": "Saját üzemeltetésű",
"settings.general.management.urlPlaceholder": "https://netbird.selfhosted.com:443",
"settings.general.management.urlError": "Adjon meg egy érvényes URL-t, pl. https://netbird.selfhosted.com:443",
"settings.general.management.switchCloudTitle": "Átváltás a NetBird Cloudra?",
"settings.general.management.switchCloudMessage": "Ez megszünteti a kapcsolatot a saját üzemeltetésű kezelőszerverrel, és újra csatlakozik a NetBird Cloudhoz. Lehet, hogy újra be kell jelentkeznie.",
"settings.general.management.switchCloudConfirm": "Váltás a felhőre",
"settings.network.section.connectivity": "Kapcsolódás",
"settings.network.section.routingDns": "Útválasztás és DNS",
"settings.network.lazy.label": "Késleltetett kapcsolatok",
"settings.network.lazy.help": "Állandó kapcsolatok fenntartása helyett a NetBird igény szerint, aktivitás vagy jelzés alapján aktiválja azokat.",
"settings.network.monitor.label": "Újracsatlakozás hálózatváltáskor",
"settings.network.monitor.help": "A hálózat figyelése és automatikus újracsatlakozás változások (pl. Wi-Fi-váltás, Ethernet-változás vagy alvó állapotból való visszatérés) esetén.",
"settings.network.dns.label": "DNS engedélyezése",
"settings.network.dns.help": "A NetBird által kezelt DNS-beállítások alkalmazása a gazda DNS-feloldójára.",
"settings.network.clientRoutes.label": "Kliens útvonalak engedélyezése",
"settings.network.clientRoutes.help": "Más társak útvonalainak elfogadása az ő hálózataik eléréséhez.",
"settings.network.serverRoutes.label": "Szerver útvonalak engedélyezése",
"settings.network.serverRoutes.help": "Ennek a gazdának a helyi útvonalainak meghirdetése más társak számára.",
"settings.security.section.firewall": "Tűzfal",
"settings.security.section.encryption": "Titkosítás",
"settings.security.blockInbound.label": "Bejövő forgalom blokkolása",
"settings.security.blockInbound.help": "Visszautasítja a társaktól érkező nem kért kapcsolatokat ezen eszközhöz és az általa irányított hálózatokhoz. A kimenő forgalmat nem érinti.",
"settings.security.blockLan.label": "LAN-hozzáférés blokkolása",
"settings.security.blockLan.help": "Megakadályozza, hogy a társak elérjék a helyi hálózatot vagy annak eszközeit, amikor ez az eszköz irányítja a forgalmukat.",
"settings.security.rosenpass.label": "Kvantumellenálló titkosítás engedélyezése",
"settings.security.rosenpass.help": "Post-kvantum kulcscsere hozzáadása Rosenpass segítségével a WireGuard® tetejére.",
"settings.security.rosenpassPermissive.label": "Engedékeny mód engedélyezése",
"settings.security.rosenpassPermissive.help": "Kapcsolatok engedélyezése kvantumellenálló titkosítás nélküli társakkal.",
"settings.ssh.section.server": "Szerver",
"settings.ssh.section.capabilities": "Képességek",
"settings.ssh.section.authentication": "Hitelesítés",
"settings.ssh.server.label": "SSH szerver engedélyezése",
"settings.ssh.server.help": "Futtassa a NetBird SSH szervert ezen a gazdán, hogy más társak csatlakozhassanak.",
"settings.ssh.root.label": "Root bejelentkezés engedélyezése",
"settings.ssh.root.help": "Társak bejelentkezhetnek root felhasználóként. Tiltsa le, ha nem privilegizált fiók szükséges.",
"settings.ssh.sftp.label": "SFTP engedélyezése",
"settings.ssh.sftp.help": "Fájlok biztonságos átvitele natív SFTP- vagy SCP-kliensekkel.",
"settings.ssh.localForward.label": "Helyi porttovábbítás",
"settings.ssh.localForward.help": "A csatlakozó társak helyi portokat alagútba helyezhetnek erről a gazdáról elérhető szolgáltatásokhoz.",
"settings.ssh.remoteForward.label": "Távoli porttovábbítás",
"settings.ssh.remoteForward.help": "A csatlakozó társak ezen a gazdán lévő portokat tehetnek elérhetővé a saját gépük számára.",
"settings.ssh.jwt.label": "JWT-hitelesítés engedélyezése",
"settings.ssh.jwt.help": "Minden SSH-munkamenet ellenőrzése az IdP-vel a felhasználói identitás és audit céljából. Tiltsa le, ha csak a hálózati ACL-szabályokra kíván támaszkodni — hasznos, ha nincs elérhető IdP.",
"settings.ssh.jwtTtl.label": "JWT gyorsítótár TTL",
"settings.ssh.jwtTtl.help": "Mennyi ideig őrzi meg a kliens a JWT-t, mielőtt újra kérné a kimenő SSH-kapcsolatoknál. 0 érték esetén a gyorsítótárazás kikapcsol, és minden kapcsolatnál hitelesít.",
"settings.ssh.jwtTtl.suffix": "másodperc",
"settings.advanced.section.interface": "Interfész",
"settings.advanced.section.security": "Biztonság",
"settings.advanced.interfaceName.label": "Név",
"settings.advanced.interfaceName.error": "Használj 1–15 betűt, számot, pontot, kötőjelet vagy aláhúzást.",
"settings.advanced.interfaceName.errorMac": "„utun” után számmal kezdődjön (pl. utun100).",
"settings.advanced.port.label": "Port",
"settings.advanced.port.error": "Adj meg egy portot {min} és {max} között.",
"settings.advanced.mtu.label": "MTU",
"settings.advanced.mtu.error": "Adj meg egy MTU értéket {min} és {max} között.",
"settings.advanced.psk.label": "Pre-shared kulcs",
"settings.advanced.psk.help": "Opcionális WireGuard PSK további szimmetrikus titkosításhoz. Nem azonos a NetBird telepítőkulccsal. Csak olyan társakkal kommunikál, akik ugyanazt a pre-shared kulcsot használják.",
"settings.troubleshooting.section.title": "Hibakeresési csomag",
"settings.troubleshooting.intro": "A hibakeresési csomag segít a NetBird támogatásnak a kapcsolati problémák kivizsgálásában. <br /> Egy .zip fájl, amely naplókat, rendszerinformációkat és hibakeresési adatokat tartalmaz az eszközéről.",
"settings.troubleshooting.anonymize.label": "Érzékeny információk anonimizálása",
"settings.troubleshooting.anonymize.help": "Elrejti a nyilvános IP-címeket és a nem-NetBird tartományokat a naplókban.",
"settings.troubleshooting.systemInfo.label": "Rendszerinformációk beillesztése",
"settings.troubleshooting.systemInfo.help": "Tartalmazza az OS-t, a kernelt, a hálózati interfészeket és az útválasztási táblákat.",
"settings.troubleshooting.upload.label": "Csomag feltöltése a NetBird szerverekre",
"settings.troubleshooting.upload.help": "Biztonságosan feltölti a csomagot, és visszaad egy feltöltési kulcsot. Ossza meg a kulcsot a NetBird támogatással a GitHubon vagy Slacken keresztül a fájl közvetlen csatolása helyett.",
"settings.troubleshooting.trace.label": "Trace naplók rögzítése",
"settings.troubleshooting.trace.help": "TRACE szintre emeli a naplózást, és újraindítja a NetBird kapcsolatot a kapcsolati naplók rögzítéséhez. Az előző szint a csomag elkészülte után visszaáll.",
"settings.troubleshooting.duration.label": "Rögzítés időtartama",
"settings.troubleshooting.duration.help": "Mennyi ideig rögzítse a trace naplókat a csomag elkészítése előtt.",
"settings.troubleshooting.duration.suffix": "perc",
"settings.troubleshooting.create": "Csomag létrehozása",
"settings.troubleshooting.progress.description": "Naplók, rendszerinformációk és kapcsolati állapot gyűjtése folyamatban. Általában néhány pillanatot vesz igénybe — tartsa nyitva ezt az ablakot a befejezésig.",
"settings.troubleshooting.cancelling": "Megszakítás…",
"settings.troubleshooting.done.uploadedTitle": "A hibakeresési csomag feltöltése sikeres!",
"settings.troubleshooting.done.savedTitle": "Csomag elmentve",
"settings.troubleshooting.done.uploadedDescription": "Ossza meg az alábbi feltöltési kulcsot a NetBird támogatással. A helyi másolat is elmentve van az eszközén.",
"settings.troubleshooting.done.savedDescription": "A hibakeresési csomag helyileg elmentve.",
"settings.troubleshooting.done.copyKey": "Kulcs másolása",
"settings.troubleshooting.done.openFolder": "Mappa megnyitása",
"settings.troubleshooting.done.openFileLocation": "Fájl helyének megnyitása",
"settings.troubleshooting.uploadFailedWithReason": "Feltöltés sikertelen: {reason} A csomag továbbra is el van mentve helyileg.",
"settings.troubleshooting.uploadFailed": "Feltöltés sikertelen. A csomag továbbra is el van mentve helyileg.",
"settings.troubleshooting.stage.preparingTrace": "Váltás trace naplózásra…",
"settings.troubleshooting.stage.reconnecting": "NetBird újracsatlakoztatása…",
"settings.troubleshooting.stage.capturing": "Naplók rögzítése — {elapsed} / {total}",
"settings.troubleshooting.stage.restoring": "Korábbi napló szint visszaállítása…",
"settings.troubleshooting.stage.bundling": "Hibakeresési csomag generálása…",
"settings.troubleshooting.stage.uploading": "Feltöltés a NetBirdhöz…",
"settings.troubleshooting.stage.cancelling": "Megszakítás…",
"settings.about.client": "NetBird Kliens v{version}",
"settings.about.clientName": "NetBird Kliens",
"settings.about.development": "[Fejlesztés]",
"settings.about.gui": "Felület v{version}",
"settings.about.copyright": "© {year} NetBird. Minden jog fenntartva.",
"settings.about.links.imprint": "Impresszum",
"settings.about.links.privacy": "Adatvédelem",
"settings.about.links.cla": "CLA",
"settings.about.links.terms": "Felhasználási feltételek",
"update.banner.message": "A NetBird {version} telepítésre kész.",
"update.banner.later": "Később",
"update.banner.installNow": "Telepítés most",
"update.card.versionAvailableDownload": "A {version} verzió letöltésre elérhető.",
"update.card.versionAvailableInstall": "A {version} verzió telepítésre elérhető.",
"update.card.whatsNew": "Mi az újdonság?",
"update.card.installNow": "Telepítés most",
"update.card.getInstaller": "Letöltés",
"update.card.autoCheckInterval": "A NetBird a háttérben keres frissítéseket.",
"update.card.changelog": "Változásnapló",
"update.card.onLatestVersion": "A legfrissebb verziót használod",
"update.header.tooltip": "Frissítés elérhető",
"update.overlay.updatingVersion": "NetBird frissítése a következőre: v{version}",
"update.overlay.updating": "NetBird frissítése",
"update.overlay.description": "Egy újabb verzió elérhető és települ. A NetBird automatikusan újraindul a frissítés befejeztével.",
"update.overlay.error.timeoutTitle": "A frissítés túl sokáig tart",
"update.overlay.error.timeoutDescription": "A(z) {target} telepítése túl sokáig tartott, és nem fejeződött be.",
"update.overlay.error.canceledTitle": "A frissítés megszakítva",
"update.overlay.error.canceledDescription": "A(z) {target} frissítését megszakították a befejezés előtt.",
"update.overlay.error.failTitle": "A frissítés nem telepíthető",
"update.overlay.error.failDescription": "A(z) {target} nem volt telepíthető.",
"update.overlay.error.unknownMessage": "ismeretlen hiba",
"update.overlay.error.targetVersion": "v{version}",
"update.overlay.error.targetFallback": "az új verzió",
"update.error.loadStateTitle": "Frissítési állapot betöltése sikertelen",
"update.error.triggerTitle": "Frissítés indítása sikertelen",
"update.page.versionLine": "Kliens frissítése erre: {version}.",
"update.page.versionLineGeneric": "Kliens frissítése.",
"update.page.outdated": "Az Ön kliensverziója régebbi, mint a Managementben beállított automatikus frissítési verzió.",
"update.page.status.running": "Frissítés",
"update.page.status.timeout": "A frissítés időtúllépés miatt megszakadt. Kérjük, próbálja újra.",
"update.page.status.canceled": "Frissítés megszakítva.",
"update.page.status.failed": "Frissítés sikertelen: {message}",
"update.page.status.unknownError": "ismeretlen frissítési hiba",
"update.page.failedTitle": "Frissítés sikertelen",
"update.page.timeoutMessage": "Frissítés időtúllépés.",
"update.page.dontClose": "Kérjük, ne zárja be ezt az ablakot.",
"update.page.updating": "Frissítés…",
"update.page.complete": "Frissítés kész",
"update.page.failed": "Frissítés sikertelen",
"browserLogin.title": "Folytassa a böngészőben a bejelentkezés befejezéséhez",
"browserLogin.notSeeing": "Nem látja a böngésző fülét?",
"browserLogin.tryAgain": "Próbálja újra",
"browserLogin.openFailedTitle": "A böngésző megnyitása sikertelen",
"sessionExpired.title": "Munkamenet lejárt",
"sessionExpired.description": "A NetBird munkamenete lejárt. Jelentkezzen be újra, hogy az eszközei kapcsolatban maradjanak.",
"sessionExpired.later": "Később",
"sessionExpired.signIn": "Bejelentkezés",
"sessionAboutToExpire.title": "A munkamenet hamarosan lejár",
"sessionAboutToExpire.description": "A NetBird munkamenete hamarosan lejár. Maradjon csatlakoztatva, hogy az eszközei elérhetők maradjanak.",
"sessionAboutToExpire.stay": "Maradjon csatlakoztatva",
"sessionAboutToExpire.logout": "Kijelentkezés",
"sessionAboutToExpire.expired": "Munkamenet lejárt",
"sessionAboutToExpire.extendFailedTitle": "A munkamenet meghosszabbítása sikertelen",
"sessionAboutToExpire.logoutFailedTitle": "Kijelentkezés sikertelen",
"peers.search.placeholder": "Keresés társ neve, DNS vagy IP-cím alapján",
"peers.filter.all": "Összes",
"peers.filter.online": "Online",
"peers.filter.offline": "Offline",
"peers.empty": "Egyetlen társ sem felel meg a jelenlegi szűrőknek.",
"networks.search.placeholder": "Keresés hálózat, tartomány vagy domain alapján",
"networks.filter.all": "Összes",
"networks.filter.selected": "Kiválasztott",
"networks.filter.overlapping": "Átfedő",
"networks.empty": "Egyetlen hálózat sem felel meg a jelenlegi szűrőknek.",
"networks.selected": "Kiválasztva",
"networks.unselected": "Nincs kiválasztva",
"exitNodes.search.placeholder": "Keresés a kilépő csomópontok között",
"exitNodes.empty": "Nincs elérhető kilépő csomópont.",
"exitNodes.active": "Aktív",
"exitNodes.inactive": "Inaktív",
"quickActions.connect": "Csatlakozás",
"quickActions.disconnect": "Bontás",
"daemon.unavailable.title": "A NetBird szolgáltatás nem fut",
"daemon.unavailable.description": "Az alkalmazás automatikusan újracsatlakozik, amint a szolgáltatás újra elérhető.",
"daemon.unavailable.docsLink": "Dokumentáció",
"error.jwt_clock_skew": "A bejelentkezés sikertelen: az eszköz órája eltér a szerverétől. Kérjük, szinkronizálja a rendszer óráját, majd próbálja újra.",
"error.jwt_expired": "A bejelentkezési token lejárt. Kérjük, jelentkezzen be újra.",
"error.jwt_signature_invalid": "A bejelentkezés sikertelen: a token aláírása érvénytelen. Kérjük, lépjen kapcsolatba a rendszergazdával.",
"error.session_expired": "A munkamenet lejárt. Kérjük, jelentkezzen be újra.",
"error.invalid_setup_key": "A telepítési kulcs hiányzik vagy érvénytelen.",
"error.permission_denied": "A szerver elutasította a bejelentkezést.",
"error.daemon_unreachable": "A NetBird szolgáltatás nem válaszol. Kérjük, ellenőrizze, hogy fut-e a szolgáltatás.",
"error.unknown": "A művelet meghiúsult. A technikai részleteket a Details mezőben találja."
}
+11 -7
View File
@@ -4,14 +4,18 @@ import { Events } from "@wailsio/runtime";
import { Preferences, I18n } from "@bindings/services";
// Vite glob-imports every shipped bundle at build time. Adding a language
// only requires dropping the new folder under src/i18n/locales/ and the
// row in _index.json — no edit to this file. The `eager: true` import
// keeps the bundles inlined in the main JS chunk, same shape as a static
// import. Path is relative on purpose — alias-based globs (`@/…`) silently
// resolve to an empty match in some Vite dev-mode setups.
// Vite glob-imports every shipped bundle at build time. The locales tree
// lives outside `frontend/` (at `client/ui/i18n/locales`) so the Go tray
// and the React app share one JSON source. Adding a language only
// requires dropping the new folder there and the row in `_index.json` —
// no edit to this file. The `eager: true` import keeps the bundles
// inlined in the main JS chunk, same shape as a static import. Path is
// relative on purpose — alias-based globs (`@/…`) silently resolve to an
// empty match in some Vite dev-mode setups. `server.fs.allow` in
// `vite.config.ts` whitelists the parent directory so the dev server
// serves the JSON.
const bundleModules = import.meta.glob<Record<string, string>>(
"../i18n/locales/*/common.json",
"../../../i18n/locales/*/common.json",
{ eager: true, import: "default" },
);
+5
View File
@@ -19,5 +19,10 @@ export default defineConfig({
host: "127.0.0.1",
port: 9245,
strictPort: true,
fs: {
// The i18n bundles live at ../i18n/locales (shared with the Go tray).
// Whitelist the parent dir so Vite's dev server serves them.
allow: [path.resolve(__dirname, ".."), __dirname],
},
},
});