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

+179 -15
View File
@@ -960,7 +960,7 @@
"rateLimit": "Troppi tentativi. Attendi prima di riprovare."
},
"title": "Account collegati",
"subtitle": "Collega un account social per poter accedere con un clic",
"subtitle": "Collega un account sociale per accedere con un clic",
"connected": "Collegato",
"unavailable": "Non disponibile",
"login": {
@@ -1024,7 +1024,9 @@
"showPassword": "Mostra",
"hidePassword": "Nascondi",
"accountDetails": "Dettagli dell’account",
"credentials": "Credenziali e sicurezza"
"credentials": "Credenziali e sicurezza",
"ageVerified": "Ho 18+ e accetto il requisito di età.",
"invitedBy": "Invitato da {username}"
},
"forgot": {
"title": "Reimposta password",
@@ -1107,7 +1109,7 @@
"transactions": "Transazioni",
"vouchers": "Buoni",
"subscriptions": "Abbonamenti",
"referrals": "Inviti",
"referrals": "Referral",
"dailyRewards": "Ricompense giornaliere",
"rareValues": "Valori rari",
"badges": "Distintivi",
@@ -4390,7 +4392,7 @@
"vouchers": "Voucher",
"subscriptions": "Abbonamenti",
"calendar": "Calendario",
"referrals": "Inviti",
"referrals": "Referral",
"dailyRewards": "Ricompense giornaliere",
"history": "Cronologia",
"moderationTab": "Moderazione",
@@ -5989,6 +5991,64 @@
"NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.",
"Rename": "Rename"
}
},
"referrals": {
"title": "Referral",
"subtitle": "Sistema di invito",
"referralsToday": "Referral oggi",
"referralsTotal": "Referral totali",
"invitedTotal": "Inviti conteggiati",
"claims": "Ricompense riscattate",
"settings": "Impostazioni ricompensa",
"needed": "Referral necessari",
"rewardAmount": "Importo ricompensa",
"rewardCurrency": "Valuta ricompensa",
"blockSameIp": "Rifiuta i referral che condividono l'IP attuale dell'invitante",
"save": "Salva impostazioni",
"saving": "Salvataggio…",
"saved": "Impostazioni referral salvate.",
"saveError": "Le impostazioni referral non sono state salvate.",
"recent": "Referral recenti",
"unavailable": "I dati dei referral sono temporaneamente non disponibili.",
"empty": "Nessun referral ancora.",
"inviter": "Invitante",
"invitee": "Utente invitato",
"ip": "IP",
"date": "Data"
},
"dailyRewards": {
"title": "Ricompense di accesso giornaliere",
"subtitle": "Programma ricompense di accesso giornaliere",
"enabled": "Stato funzionalità",
"yes": "Attivato",
"no": "Disattivato",
"scheduleDays": "Giorni del programma",
"claimsToday": "Riscatti oggi",
"claimsTotal": "Riscatti totali",
"status": "Stato funzionalità",
"statusHint": "Quando disattivato, la carta ricompense viene nascosta e i nuovi riscatti vengono rifiutati.",
"disable": "Disattiva",
"enable": "Attiva",
"schedule": "Programma ricompense",
"day": "Giorno {day}",
"reward": "Ricompensa",
"amount": "Importo",
"actions": "Azioni",
"addDay": "Giorno",
"add": "Aggiungi giorno",
"save": "Salva",
"saving": "Salvataggio…",
"saved": "Programma ricompense salvato.",
"cancel": "Annulla",
"edit": "Modifica",
"delete": "Elimina",
"created": "Giorno ricompensa aggiunto.",
"updated": "Giorno ricompensa aggiornato.",
"deleted": "Giorno ricompensa rimosso.",
"saveError": "Il giorno ricompensa non è stato salvato.",
"deleteError": "Il giorno ricompensa non è stato rimosso.",
"confirmDeleteTitle": "Rimuovi giorno ricompensa",
"confirmDeleteBody": "Questo giorno ricompensa non verrà più concesso. I riscatti passati restano registrati."
}
},
"radioRequests": {
@@ -6286,7 +6346,7 @@
"login": "Accedi",
"never": "Mai",
"claimed": "Premio riscattato!",
"dailyClaimed": "Ricompensa giornaliera riscattata — torna domani!",
"dailyClaimed": "Ricompensa giornaliera riscattata — a domani!",
"welcome": "Il tuo spazio su {hotel}",
"noMotto": "Nessun motto",
"registered": "Iscritto dal {date}",
@@ -6342,9 +6402,9 @@
"dailyErrors": {
"already_claimed": "Hai già riscattato la ricompensa giornaliera di oggi.",
"disabled": "Le ricompense giornaliere sono attualmente disattivate.",
"bad_config": "Il programma delle ricompense giornaliere non è configurato correttamente. Contatta lo staff.",
"ratelimit": "Troppi tentativi. Attendi un momento e riprova.",
"error": "Non è stato possibile riscattare la ricompensa giornaliera. Riprova."
"bad_config": "Il programma ricompense giornaliere non è configurato correttamente. Contatta il personale.",
"ratelimit": "Troppi tentativi. Aspetta un momento e riprova.",
"error": "La ricompensa giornaliera non è stata riscattata. Riprova."
},
"messagesCaughtUp": "Nessun messaggio da leggere",
"messagesUnavailable": "Apri la posta per controllare",
@@ -6357,22 +6417,22 @@
"noUpcomingEvents": "Non sono ancora stati annunciati nuovi eventi.",
"roomsUnavailable": "Le stanze non sono al momento disponibili. Apri la community per riprovare.",
"dailyRewardTitle": "Ricompense giornaliere",
"dailyRewardHint": "Accedi ogni giorno e riscatta la ricompensa: la serie cresce fino ai giorni speciali.",
"dailyRewardHint": "Accedi ogni giorno e riscatta la tua ricompensa — le serie crescono fino ai grandi giorni.",
"dailyRewardDay": "Giorno {day}",
"dailyRewardStreak": "{count, plural, one {Serie: # giorno} other {Serie: # giorni}}",
"dailyRewardNextClaim": "Prossimo ritiro: {amount} {currency}",
"dailyRewardNextClaim": "Prossimo riscatto: {amount} {currency}",
"dailyRewardTomorrow": "Domani: {amount} {currency}",
"dailyRewardClaim": "Riscuoti la ricompensa giornaliera",
"dailyRewardClaimedToday": "Riscattata oggi — torna domani per la prossima ricompensa.",
"dailyRewardDisabled": "Le ricompense giornaliere sono attualmente disattivate. Puoi comunque esplorare l’hotel.",
"dailyRewardUnavailable": "Non è stato possibile caricare il programma delle ricompense giornaliere. Riprova.",
"dailyRewardClaim": "Riscatta ricompensa giornaliera",
"dailyRewardClaimedToday": "Riscattato oggi — torna domani per la prossima ricompensa.",
"dailyRewardDisabled": "Le ricompense giornaliere sono attualmente disattivate. Puoi esplorare l'hotel.",
"dailyRewardUnavailable": "Il programma ricompense giornaliere non è stato caricato. Riprova.",
"tasks": {
"title": "Da fare",
"support": "{count, plural, one {# ticket con risposta del supporto} other {# ticket con risposte del supporto}}",
"friends": "{count, plural, one {# richiesta di amicizia da controllare} other {# richieste di amicizia da controllare}}",
"event": "Il prossimo evento a cui sei iscritto: {title} · {date}",
"reward": "Il premio per gli inviti è pronto da ritirare",
"dailyReward": "La tua ricompensa giornaliera è pronta da ritirare",
"dailyReward": "La tua ricompensa giornaliera è pronta per il riscatto",
"empty": "Tutto a posto. Nessuna azione in attesa.",
"unavailable": "Non è stato possibile verificare alcune azioni. Quelle disponibili sono mostrate sopra.",
"retry": "Riprova",
@@ -6525,6 +6585,110 @@
},
"admin": {
"studio": {
"nitroCleanup": {
"alreadyRunning": "Una scansione è già in corso — connessa ad essa.",
"ageUnknown": "età sconosciuta",
"ageBelow": "< 1g",
"scanButton": "Scansiona risorse arredamento",
"scanningAssets": "Scansione delle risorse…",
"cancelButton": "Annulla",
"deleteSelected": "Elimina selezionati ({count})",
"deleting": "Eliminazione…",
"redownloadBroken": "Riscarica danneggiate",
"redownloading": "Riscaricamento…",
"autoClean": "Pulisci automaticamente i falsi vecchi",
"cleaning": "Pulizia…",
"exportManifest": "Esporta manifesto",
"exporting": "Esportazione…",
"phaseStems": "Caricamento steli di arredamento…",
"phaseReaddir": "Lettura delle directory delle risorse…",
"phaseValidate": "Convalida dei pacchetti .nitro…",
"phaseScanning": "Scansione…",
"scanProgressFiles": "{count} file",
"repairProgress": "ok {ok}, falliti {failed}",
"attachedNotice": "La scansione continua in background — i risultati appariranno al termine.",
"sessionCancelled": "Scansione annullata.",
"onlyOldLabel": "Mostra solo file più vecchi di",
"onlyOldAgeLabel": "Età minima in giorni per la visualizzazione",
"onlyOldToggle": "Nascondi file recenti",
"daysLabel": "giorni",
"autoAgeLabel": "Età minima in giorni per la pulizia automatica",
"loadingResult": "Caricamento del risultato della scansione…",
"scannedStat": "file di risorse scansionati",
"cachedNotice": "(in cache — le directory sono invariate)",
"fakeStat": "Nitro falsi (nessun elemento corrispondente)",
"brokenStat": "Nitro danneggiati (illeggibili)",
"groupEmpty": "Nessun risultato",
"selectedCount": "{count} selezionati",
"copiesBadge": "{count} copie",
"groupFakeLabel": "Nitro falsi",
"groupFakeDescription": "Questi file non corrispondono a nessun elemento in items_base — resti di arredamento eliminato o rinominato.",
"groupBrokenLabel": "Nitro danneggiati",
"groupBrokenDescription": "Questi file appartengono a un elemento ma non possono essere letti come un pacchetto Nitro valido.",
"groupSwfLabel": "SWF orfani",
"groupSwfDescription": "File .swf che non corrispondono a nessun elemento in items_base.",
"groupIconLabel": "Icone orfane",
"groupIconDescription": "File di icone che non corrispondono a nessun elemento in items_base.",
"warningText": "Eliminare un .nitro danneggiato lascia il suo elemento nel database senza pacchetto — preferisci di riscaricarlo, o lascia che l'audit del cataloglo lo ottenga in seguito. Le righe del database non vengono mai rimosse da questo strumento.",
"onlyAssetsTouched": "Solo i file delle risorse vengono toccati — FurnitureData.json e le righe del database restano intatte.",
"emptyHint": "Scansiona ogni directory di risorse di arredamento per trovare pacchetti nitro falsi e danneggiati oltre a SWF e icone orfani. Eliminali, riscarica i danneggiati o pulisci automaticamente i resti vecchi.",
"noResult": "Nessun risultato di scansione ancora — esegui prima una scansione delle risorse di arredamento.",
"scanFailed": "La scansione è fallita.",
"confirmDeleteTitle": "Eliminare {count} file di risorse?",
"confirmDeleteDescription": "I file verranno rimossi da ogni directory (public + gamedata specchiata). Le righe del database non vengono mai toccate.",
"confirmDeleteLabel": "Elimina",
"confirmRepairTitle": "Riscaricare {count} pacchetto/i .nitro danneggiato/i?",
"confirmRepairDescription": "I pacchetti verranno recuperati dalle sorgenti nitro configurate e sovrascritti su ogni directory (public + gamedata specchiata).",
"confirmRepairLabel": "Riscarica",
"confirmAutoCleanTitle": "Pulire automaticamente i nitro falsi più vecchi di {days} giorno/i?",
"confirmAutoCleanDescription": "Vengono rimossi solo i file .nitro falsi (nessun elemento corrispondente) più vecchi della soglia. I pacchetti danneggiati e i file recenti non vengono mai toccati.",
"confirmAutoCleanLabel": "Pulisci automaticamente",
"toastDeletePartial": "Eliminate {copies} copie, ma alcuni file non hanno potuto essere rimossi",
"toastDeleteDone": "Eliminate {copies} copie di file ({deleted} file)",
"toastRepairDone": "Riparati {count} pacchetti .nitro",
"toastRepairFailed": "Impossibile ottenere alcun pacchetto ({failed} falliti)",
"toastRepairCancelled": "Riparazione annullata",
"toastAutoCleanDone": "Puliti {deleted} vecchi file .nitro falsi ({copies} copie). Saltati {recent} recenti + {broken} danneggiati.",
"toastAutoCleanNothing": "Niente di abbastanza vecchio da rimuovere (saltati {recent} recenti, {broken} danneggiati)",
"toastManifestDownload": "Manifesto della scansione scaricato",
"gamedataTitle": "Pulizia dei dati di gioco",
"gamedataHint": "Anteprima prima: questo riscrive FurnitureData.json, FigureMap.json e FigureData.json. A differenza degli strumenti delle risorse sopra, rimuove le righe che non fanno riferimento a nulla — esamina i conteggi prima di eseguirlo.",
"gamedataScan": "Anteprima dei dati di gioco",
"gamedataScanning": "Scansione…",
"gamedataRun": "Esegui selezionati",
"gamedataRunning": "Pulizia…",
"gamedataNoResult": "Nessuna anteprima ancora — scansiona prima i file JSON dei dati di gioco.",
"gamedataCount_duplicates": "Duplicati di FurnitureData",
"gamedataCount_orphans": "FurnitureData orfani",
"gamedataCount_figureMap": "Problemi di FigureMap",
"gamedataCount_figureData": "FigureData inutilizzato",
"gamedataPass_dedupeFurnitureData": "Dedicuplica FurnitureData",
"gamedataPassDesc_dedupeFurnitureData": "Rimuove i classnames ripetuti all'interno di una sezione, conservando la voce con la revisione più alta.",
"gamedataPass_cleanFurnitureData": "Pulisci FurnitureData",
"gamedataPassDesc_cleanFurnitureData": "Rimuove le voci il cui pacchetto .nitro è assente da ogni directory.",
"gamedataPass_cleanFigureMap": "Pulisci FigureMap",
"gamedataPassDesc_cleanFigureMap": "Rimuove le parti che puntano a un set mancante in FigureData, oltre ai duplicati esatti.",
"gamedataPass_cleanFigureData": "Pulisci FigureData",
"gamedataPassDesc_cleanFigureData": "Rimuove i set a cui nessuna parte di FigureMap fa riferimento, poi le palette che nessun tipo di set utilizza. Deve essere eseguito dopo Pulisci FigureMap.",
"gamedataNothingSelected": "Seleziona almeno un passaggio di pulizia",
"gamedataConfirmTitle": "Riscrivere i file JSON dei dati di gioco?",
"gamedataConfirmDescription": "{passes} passaggio/i verranno eseguiti su {duplicates} gruppi duplicati, {orphans} righe orfane, {figureMap} problemi di FigureMap e {figureData} voci FigureData inutilizzate. Le righe vengono rimosse senza backup — questo non può essere annullato.",
"gamedataConfirmLabel": "Riscrivi file",
"gamedataDifferingWarning": "Almeno un duplicato non è una copia esatta della voce conservata, quindi la riga eliminata conteneva dati che il sopravvissuto non ha.",
"gamedataCrossSectionNote": "{count} classname/i esistono sia in roomitemtypes che in wallitemtypes. Questi vengono solo segnalati — rimuoverne uno cambiherebbe il tipo di un elemento.",
"gamedataToastDone": "La pulizia dei dati di gioco ha rimosso {removed} righe",
"gamedataToastNothing": "I dati di gioco erano già puliti",
"gamedataMaxRemovalsLabel": "Max righe per passaggio",
"gamedataMaxRemovalsHint": "0 usa il valore predefinito 500. Un passaggio che ne rimuoverebbe più si ferma e chiede invece di scrivere.",
"gamedataLimitTitle": "{pass} rimuoverebbe {wouldRemove} righe, oltre il limite di {maxRemovals}.",
"gamedataLimitDescription": "Quel passaggio non ha scritto nulla, quindi i file sono invariati. Controlla prima i percorsi delle risorse — una directory sbagliata rende ogni riga orfana. Aumentare il limite è un'esecuzione separata e deliberata.",
"gamedataLimitOverride": "Rimuovi comunque {wouldRemove} righe",
"historyTitle": "Cronologia della pulizia automatica",
"historyScheduled": "programmato",
"historyManual": "manuale",
"historyEntry": "Rimossi {deleted} ({copies} copie); saltati {recent} recenti e {broken} danneggiati",
"historyErrors": "{count} errori"
},
"importDiagnostics": {
"attempts": "Diagnostica file sorgente",
"preliminary": "Controllo preliminare: questi indirizzi sono stati verificati senza scaricare i file. L'importazione validerà i file originali.",