feat(i18n): complete message parity across all 25 locales
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s

The admin.studio.nitroCleanup section (102 keys) only existed in en and
nl, so 23 locales fell back to English for the entire Nitro Cleanup
panel. The referrals and dailyRewards keys were missing from the same
23 locales, and en itself was missing 6 keys that nl had.

Add the missing keys to every locale with translations, so all 25
locales now carry the same 6063 keys.
This commit is contained in:
openhands committed 2026-09-27 18:38:58 +02:00
1 parent 944527e078
commit bc00ecf08c
24 files changed
+4483 -182

No files matched your search

+195 -8
View File
@@ -817,9 +817,9 @@
"enable": "Aktiver 2FA",
"rateLimit": "Too many attempts. Please wait before trying again."
},
"title": "Tilknyttede konti",
"subtitle": "Link en social konto, så du kan logge ind med et enkelt klik",
"connected": "Forbundet",
"title": "Linkede konti",
"subtitle": "Link en social konto, så du kan logge med et klik",
"connected": "Linket",
"unavailable": "Ikke tilgængelig",
"login": {
"title": "Log ind",
@@ -882,7 +882,9 @@
"hidePassword": "Hide",
"accountDetails": "Account details",
"credentials": "Credentials & security",
"newestCitizens": "Newest citizens"
"newestCitizens": "Newest citizens",
"ageVerified": "Jeg er 18+ og accepterer alderskravet.",
"invitedBy": "Inviteret af {username}"
},
"forgot": {
"title": "Nulstil adgangskode",
@@ -1048,7 +1050,9 @@
"cmsErrors": "CMS errors",
"themeBuilder": "Theme builder",
"openSidebar": "Open menu",
"closeSidebar": "Close menu"
"closeSidebar": "Close menu",
"referrals": "Henvisninger",
"dailyRewards": "Daglige belønninger"
},
"dashboard": {
"title": "Dashboard",
@@ -4336,7 +4340,9 @@
"importAudit": "Audit",
"themeBuilder": "Theme Builder",
"studio": "Studio",
"cmsErrors": "CMS errors"
"cmsErrors": "CMS errors",
"referrals": "Henvisninger",
"dailyRewards": "Daglige belønninger"
},
"events": "Events",
"eventsSubtitle": "Hotel events and event types",
@@ -5843,6 +5849,64 @@
"NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.",
"Rename": "Rename"
}
},
"referrals": {
"title": "Henvisninger",
"subtitle": "Invitationssystem",
"referralsToday": "Henvisninger i dag",
"referralsTotal": "Samlede henvisninger",
"invitedTotal": "Inviterede talt op",
"claims": "Belønninger hævet",
"settings": "Belønningsindstillinger",
"needed": "Nødvendige henvisninger",
"rewardAmount": "Belønningsbeløb",
"rewardCurrency": "Belønningsvaluta",
"blockSameIp": "Afvis henvisninger, der deler invitererens nuværende IP",
"save": "Gem indstillinger",
"saving": "Gemmer…",
"saved": "Henvisningsindstillinger gemt.",
"saveError": "Henvisningsindstillinger kunne ikke gemmes.",
"recent": "Seneste henvisninger",
"unavailable": "Henvisningsdata er midlertidigt utilgængelig.",
"empty": "Ingen henvisninger endnu.",
"inviter": "Inviterer",
"invitee": "Inviteret bruger",
"ip": "IP",
"date": "Dato"
},
"dailyRewards": {
"title": "Daglige login-belønninger",
"subtitle": "Daglig login-belønningsplan",
"enabled": "Funktionsstatus",
"yes": "Aktiveret",
"no": "Deaktiveret",
"scheduleDays": "Planens dage",
"claimsToday": "Hævninger i dag",
"claimsTotal": "Samlede hævninger",
"status": "Funktionsstatus",
"statusHint": "Når deaktiveret, skjules belønningkortet og nye hævninger afvises.",
"disable": "Deaktiver",
"enable": "Aktiver",
"schedule": "Belønningsplan",
"day": "Dag {day}",
"reward": "Belønning",
"amount": "Beløb",
"actions": "Handlinger",
"addDay": "Dag",
"add": "Tilføj dag",
"save": "Gem",
"saving": "Gemmer…",
"saved": "Belønningsplan gemt.",
"cancel": "Annuller",
"edit": "Rediger",
"delete": "Slet",
"created": "Belønningsdag tilføjet.",
"updated": "Belønningsdag opdateret.",
"deleted": "Belønningsdag fjernet.",
"saveError": "Belønningsdag kunne ikke gemmes.",
"deleteError": "Belønningsdag kunne ikke fjernes.",
"confirmDeleteTitle": "Fjern belønningsdag",
"confirmDeleteBody": "Denne belønningsdag vil ikke længere blive givet. Tidligere hævninger forbliver registreret."
}
},
"error": {
@@ -6223,8 +6287,27 @@
"empty": "You're all caught up. No actions waiting.",
"unavailable": "Some actions could not be checked. Available actions are shown above.",
"retry": "Try again",
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again."
}
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.",
"dailyReward": "Din daglige belønning er klar til at blive hævet"
},
"dailyClaimed": "Daglig belønning hævet — ses i morgen!",
"dailyErrors": {
"already_claimed": "Du har allerede hævet dagens daglige belønning.",
"disabled": "Daglige belønninger er deaktiveret i øjeblikket.",
"bad_config": "Den daglige belønningsplan er ikke konfigureret korrekt. Kontakt personalet.",
"ratelimit": "For mange forsøg. Vent et øjeblik og prøv igen.",
"error": "Den daglige belønning kunne ikke hæves. Prøv venligst igen."
},
"dailyRewardTitle": "Daglige belønninger",
"dailyRewardHint": "Log ind hver dag og hæv din belønning — serier vokser indtil de store dage.",
"dailyRewardDay": "Dag {day}",
"dailyRewardStreak": "{count, plural, one {Serie: # dag} other {Serie: # dage}}",
"dailyRewardNextClaim": "Næste hævning: {amount} {currency}",
"dailyRewardTomorrow": "I morgen: {amount} {currency}",
"dailyRewardClaim": "Hæv daglig belønning",
"dailyRewardClaimedToday": "Hævet i dag — kom tilbage i morgen for den næste belønning.",
"dailyRewardDisabled": "Daglige belønninger er deaktiveret i øjeblikket. Du kan udforske hotellet.",
"dailyRewardUnavailable": "Den daglige belønningsplan kunne ikke indlæses. Prøv venligst igen."
},
"housekeeping": {
"preview": {
@@ -6502,6 +6585,110 @@
},
"admin": {
"studio": {
"nitroCleanup": {
"alreadyRunning": "En scan kører allerede — tilsluttet den.",
"ageUnknown": "alder ukendt",
"ageBelow": "< 1d",
"scanButton": "Scan møbelaktiver",
"scanningAssets": "Scanner aktiver…",
"cancelButton": "Annuller",
"deleteSelected": "Slet valgte ({count})",
"deleting": "Sletter…",
"redownloadBroken": "Download beskadigede igen",
"redownloading": "Downloader igen…",
"autoClean": "Ryd automatisk gamle falske",
"cleaning": "Rydder op…",
"exportManifest": "Eksportér manifest",
"exporting": "Eksporterer…",
"phaseStems": "Indlæser møbelstammer…",
"phaseReaddir": "Læser aktiverkataloger…",
"phaseValidate": "Validerer .nitro-pakker…",
"phaseScanning": "Scanner…",
"scanProgressFiles": "{count} filer",
"repairProgress": "ok {ok}, fejlede {failed}",
"attachedNotice": "Scan fortsætter i baggrunden — resultaterne vises, når den er færdig.",
"sessionCancelled": "Scan annulleret.",
"onlyOldLabel": "Vis kun filer ældre end",
"onlyOldAgeLabel": "Mindste alder i dage for visning",
"onlyOldToggle": "Skjul nylige filer",
"daysLabel": "dage",
"autoAgeLabel": "Mindste alder i dage for automatisk oprydning",
"loadingResult": "Indlæser scanresultat…",
"scannedStat": "aktiver-filer scannet",
"cachedNotice": "(cachet — katalogerne er uændrede)",
"fakeStat": "Falske nitro (intet matchende element)",
"brokenStat": "Beskadigede nitro (kan ikke parses)",
"groupEmpty": "Intet fundet",
"selectedCount": "{count} valgt",
"copiesBadge": "{count} kopier",
"groupFakeLabel": "Falske nitro",
"groupFakeDescription": "Disse filer matcher intet element i items_base — rester fra slettede eller omdøbte møbler.",
"groupBrokenLabel": "Beskadigede nitro",
"groupBrokenDescription": "Disse filer tilhører et element, men kan ikke parses som en gyldig Nitro-pakke.",
"groupSwfLabel": "Forældreløse SWF-filer",
"groupSwfDescription": ".swf-filer, der matcher intet element i items_base.",
"groupIconLabel": "Forældreløse ikoner",
"groupIconDescription": "Ikonfiler, der matcher intet element i items_base.",
"warningText": "Hvis du sletter en beskadiget .nitro, forbliver elementet i databasen uden pakke — overvej at downloade den igen, eller lad katalogrevisionen finde den senere. Database-rækker fjernes aldrig af dette værktøj.",
"onlyAssetsTouched": "Kun aktiver-filer berøres — FurnitureData.json og database-rækker forbliver intakte.",
"emptyHint": "Scan hvert møbelaktiver-katalog for at finde falske og beskadigede nitro-pakker samt forældreløse SWF-filer og ikoner. Slet dem, download de beskadigede igen eller ryd automatisk gamle rester op.",
"noResult": "Endnu intet scanresultat — kør en møbelaktiver-scan først.",
"scanFailed": "Scanningen fejlede.",
"confirmDeleteTitle": "Slet {count} fil(er)?",
"confirmDeleteDescription": "Filerne fjernes fra alle kataloger (public + spejlede gamedata). Database-rækker berøres aldrig.",
"confirmDeleteLabel": "Slet",
"confirmRepairTitle": "Download {count} beskadiget(ede) .nitro-pakke(r) igen?",
"confirmRepairDescription": "Pakkerne hentes igen fra de konfigurerede nitro-kilder og skrives over alle kataloger (public + spejlede gamedata).",
"confirmRepairLabel": "Download igen",
"confirmAutoCleanTitle": "Ryd automatisk falske nitro ældre end {days} dag(e)?",
"confirmAutoCleanDescription": "Kun falske .nitro-filer (intet matchende element) ældre end tærsklen fjernes. Beskadigede pakker og nylige filer berøres aldrig.",
"confirmAutoCleanLabel": "Ryd automatisk",
"toastDeletePartial": "Slettede {copies} kopier, men nogle filer kunne ikke fjernes",
"toastDeleteDone": "Slettede {copies} filkopier ({deleted} filer)",
"toastRepairDone": "Reparerede {count} .nitro-pakker",
"toastRepairFailed": "Kunne ikke finde nogen pakke ({failed} fejlede)",
"toastRepairCancelled": "Reparation annulleret",
"toastAutoCleanDone": "Ryddede {deleted} gamle falske .nitro-filer op ({copies} kopier). Sprang {recent} nylige + {broken} beskadigede over.",
"toastAutoCleanNothing": "Intet gammelt nok til at fjernes (sprang {recent} nylige, {broken} beskadigede over)",
"toastManifestDownload": "Scanmanifest downloadet",
"gamedataTitle": "Oprydnig af spilledata",
"gamedataHint": "Vis forhåndsvisning først: dette omskriver FurnitureData.json, FigureMap.json og FigureData.json. I modsætning til aktiver-værktøjene ovenfor fjerner det rækker, der ikke refererer til noget — gennemgå tællingerne før du kører det.",
"gamedataScan": "Forhåndsvis spilledata",
"gamedataScanning": "Scanner…",
"gamedataRun": "Kør valgte",
"gamedataRunning": "Rydder op…",
"gamedataNoResult": "Ingen forhåndsvisning endnu — scan JSON-filerne for spilledata først.",
"gamedataCount_duplicates": "FurnitureData-dubletter",
"gamedataCount_orphans": "FurnitureData-forældreløse",
"gamedataCount_figureMap": "FigureMap-problemer",
"gamedataCount_figureData": "Ubrugt FigureData",
"gamedataPass_dedupeFurnitureData": "Fjern dubletter i FurnitureData",
"gamedataPassDesc_dedupeFurnitureData": "Fjerner gentagne classnames i én sektion og beholde posten med den højeste revision.",
"gamedataPass_cleanFurnitureData": "Ryd FurnitureData op",
"gamedataPassDesc_cleanFurnitureData": "Fjerner postere, hvor der ikke findes en .nitro-pakke i noget katalog.",
"gamedataPass_cleanFigureMap": "Ryd FigureMap op",
"gamedataPassDesc_cleanFigureMap": "Fjerner dele, der peger på en manglende sæt i FigureData, plus nøjagtige dubletter.",
"gamedataPass_cleanFigureData": "Ryd FigureData op",
"gamedataPassDesc_cleanFigureData": "Fjerner sæt, som ingen FigureMap-del refererer til, derefter paletter, som ingen sæt-type bruger. Skal køre efter Ryd FigureMap op.",
"gamedataNothingSelected": "Vælg mindst ét oprydnings Trin",
"gamedataConfirmTitle": "Omskriv JSON-filer for spilledata?",
"gamedataConfirmDescription": "{passes} trin vil køre mod {duplicates} dubletgrupper, {orphans} forældreløse rækker, {figureMap} FigureMap-problemer og {figureData} ubrugte FigureData-poster. Rækker fjernes uden backup — dette kan ikke fortrydes.",
"gamedataConfirmLabel": "Omskriv filer",
"gamedataDifferingWarning": "Mindst ét dublet er ikke en nøjagtig kopi af posten, der beholdes, så den slettede række indeholdt data, som den overlevende ikke har.",
"gamedataCrossSectionNote": "{count} classname(r) findes både i roomitemtypes og wallitemtypes. Disse rapporteres kun — fjerne én ville ændre et elements type.",
"gamedataToastDone": "Oprydning af spilledata fjernede {removed} rækker",
"gamedataToastNothing": "Spilledata var allerede ren",
"gamedataMaxRemovalsLabel": "Maks. rækker pr. trin",
"gamedataMaxRemovalsHint": "0 bruger standardværdien 500. Et trin, der ville fjerne mere, stopper og spørger i stedet for at skrive.",
"gamedataLimitTitle": "{pass} ville fjerne {wouldRemove} rækker, over grænsen på {maxRemovals}.",
"gamedataLimitDescription": "Dette trin skrev intet, så filerne er uændrede. Tjek aktiver-stierne først — en forkert mappe får hver række til at se forældreløs ud. Hæve grænsen er en separat, bevidst kørsel.",
"gamedataLimitOverride": "Fjern alligevel {wouldRemove} rækker",
"historyTitle": "Historik for automatisk oprydning",
"historyScheduled": "planlagt",
"historyManual": "manuelt",
"historyEntry": "Fjernet {deleted} ({copies} kopier); sprang {recent} nylige og {broken} beskadigede over",
"historyErrors": "{count} fejl"
},
"importDiagnostics": {
"attempts": "Fildiagnostik",
"preliminary": "Foreløbig kontrol af adresser; indholdet valideres under import.",