diff --git a/README.md b/README.md index d22ab86..3afbc93 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ annotated default based on [`config.ini.example`](config.ini.example). | Key | Default | Values | | --- | --- | --- | | `meta.schema_version` | `1` | `1` | -| `toolbox.language` | `system` | `system`, `zh-Hans`, `zh-Hant`, `en`, `ja`, `ko`, `fr`, `de`, `es`, `pt-BR`, `ar` | +| `toolbox.language` | `system` | `system`, `zh-Hans`, `zh-Hant`, `en`, `ja`, `ko`, `fr`, `de`, `it`, `es`, `pt-BR`, `pl`, `ru`, `ar` | | `startup.open_after_load` | `none` | `none`, `home_menu` | | `home_screen.show_title_ids` | `false` | `true`, `false` | | `game_menu.show_onionhen_options` | `true` | `true`, `false` | diff --git a/README_ZH.md b/README_ZH.md index 324bedc..fc4ef6e 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -210,7 +210,7 @@ OnionHEN 通过以下两个运行时视图创建并共享同一套配置 schema | 配置项 | 默认值 | 可用值 | | --- | --- | --- | | `meta.schema_version` | `1` | `1` | -| `toolbox.language` | `system` | `system`, `zh-Hans`, `zh-Hant`, `en`, `ja`, `ko`, `fr`, `de`, `es`, `pt-BR`, `ar` | +| `toolbox.language` | `system` | `system`, `zh-Hans`, `zh-Hant`, `en`, `ja`, `ko`, `fr`, `de`, `it`, `es`, `pt-BR`, `pl`, `ru`, `ar` | | `startup.open_after_load` | `none` | `none`, `home_menu` | | `home_screen.show_title_ids` | `false` | `true`, `false` | | `game_menu.show_onionhen_options` | `true` | `true`, `false` | diff --git a/config.ini.example b/config.ini.example index f86cbe6..1451666 100644 --- a/config.ini.example +++ b/config.ini.example @@ -11,7 +11,7 @@ schema_version=1 [toolbox] # language controls the Toolbox UI and notification language. -# Available values: system, zh-Hans, zh-Hant, en, ja, ko, fr, de, es, pt-BR, ar +# Available values: system, zh-Hans, zh-Hant, en, ja, ko, fr, de, it, es, pt-BR, pl, ru, ar # system follows the PS5 system language when it can be detected. language=system diff --git a/source/i18n/README.md b/source/i18n/README.md index 9cb0140..212e618 100644 --- a/source/i18n/README.md +++ b/source/i18n/README.md @@ -5,8 +5,10 @@ ELF. The console does not load locale files at runtime. Current locales: `zh-CN.json` (简体中文), `zh-TW.json` (繁體中文), `en-US.json` (English), `ja-JP.json` (日本語), `ko-KR.json` (한국어), -`fr-FR.json` (Français), `de-DE.json` (Deutsch), `es-ES.json` (Español), -`pt-BR.json` (Português do Brasil), and `ar-SA.json` (العربية, trial). +`fr-FR.json` (Français), `de-DE.json` (Deutsch), `it-IT.json` (Italiano), +`es-ES.json` (Español), `pt-BR.json` (Português do Brasil), +`pl-PL.json` (Polski), `ru-RU.json` (Русский), and `ar-SA.json` +(العربية, trial). The generator scans every `*.json` in this directory. Each locale is selectable in Toolbox and via `toolbox.language`. The Settings XML is still LTR, so Arabic glyphs render but the page layout is not mirrored. @@ -96,9 +98,9 @@ the runtime mapping: `meta.id` in `notify_i18n.c` / `toolbox_i18n.cpp`. 5. If the PS5 system language should pick it when Toolbox language is `system`, add that id in `onion_notify_resolve_language` - (`0` → `ja`, `2`/`22` → `fr`, `3`/`20` → `es`, `4` → `de`, - `7`/`17` → `pt-BR`, `9` → `ko`, `10` → `zh-Hant`, `11` → `zh-Hans`, - `21` → `ar`; everything else is `en`). + (`0` → `ja`, `2`/`22` → `fr`, `3`/`20` → `es`, `4` → `de`, `5` → `it`, + `7`/`17` → `pt-BR`, `8` → `ru`, `9` → `ko`, `10` → `zh-Hant`, + `11` → `zh-Hans`, `16` → `pl`, `21` → `ar`; everything else is `en`). ## Intentional exclusions @@ -122,8 +124,8 @@ Checked against call sites (not just the JSON files): - Toolbox menus, game-options cheat entry, PKG `GetString` hooks, and About donor/WeChat labels go through `toolbox_i18n::tr()`. - Daemon / util / shellui / bootstrapper toasts go through `notify.*` - keys. Host tests cover zh-Hans, zh-Hant, en, ja, ko, fr, de, es, - pt-BR, and ar lookup. + keys. Host tests cover zh-Hans, zh-Hant, en, ja, ko, fr, de, it, es, + pt-BR, pl, ru, and ar lookup. - Four toolbox keys are unused leftovers from an older menu grouping: `group.lang`, `group.lang.sub`, `group.shortcuts`, `group.shortcuts.sub`. They are translated but not shown. diff --git a/source/i18n/ar-SA.json b/source/i18n/ar-SA.json index 83ec9af..8c4f646 100644 --- a/source/i18n/ar-SA.json +++ b/source/i18n/ar-SA.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "الإصدار: %s", "about.donate": "ادعم هذا المشروع", diff --git a/source/i18n/de-DE.json b/source/i18n/de-DE.json index bca0bc8..07cfdfb 100644 --- a/source/i18n/de-DE.json +++ b/source/i18n/de-DE.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "Build: %s", "about.donate": "Dieses Projekt unterstützen", diff --git a/source/i18n/en-US.json b/source/i18n/en-US.json index 8145fff..beac262 100644 --- a/source/i18n/en-US.json +++ b/source/i18n/en-US.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "Build: %s", "about.donate": "Support this project", diff --git a/source/i18n/es-ES.json b/source/i18n/es-ES.json index 76309b1..a9d7737 100644 --- a/source/i18n/es-ES.json +++ b/source/i18n/es-ES.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "Compilación: %s", "about.donate": "Apoyar este proyecto", diff --git a/source/i18n/fr-FR.json b/source/i18n/fr-FR.json index 5eb642a..03fc1db 100644 --- a/source/i18n/fr-FR.json +++ b/source/i18n/fr-FR.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "Compilation : %s", "about.donate": "Soutenir ce projet", diff --git a/source/i18n/generate_catalog.py b/source/i18n/generate_catalog.py index 30fa6b3..056f0b4 100644 --- a/source/i18n/generate_catalog.py +++ b/source/i18n/generate_catalog.py @@ -31,8 +31,11 @@ FILENAME_IDS = { "ko-KR.json": ("ko", False), "fr-FR.json": ("fr", False), "de-DE.json": ("de", False), + "it-IT.json": ("it", False), "es-ES.json": ("es", False), "pt-BR.json": ("pt-BR", False), + "pl-PL.json": ("pl", False), + "ru-RU.json": ("ru", False), "ar-SA.json": ("ar", False), } diff --git a/source/i18n/it-IT.json b/source/i18n/it-IT.json new file mode 100644 index 0000000..d09d379 --- /dev/null +++ b/source/i18n/it-IT.json @@ -0,0 +1,316 @@ +{ + "meta": { + "id": "it", + "bcp47": "it-IT", + "fallback": false + }, + "toolbox": { + "root.title": "★Cassetta degli attrezzi OnionHEN", + "group.pkg": "Installazione e gestione dei contenuti", + "group.pkg.sub": "Installare PKG e gestire i contenuti aggiuntivi", + "group.payloads": "Payload e kernel", + "group.payloads.sub": "ELF di payload e Kstuff", + "group.game": "Strumenti di gioco", + "group.game.sub": "Trucchi del gioco in esecuzione", + "group.display": "Monitoraggio e visualizzazione", + "group.display.sub": "Overlay in partita, indicatori sulla schermata iniziale e voce nelle opzioni di gioco", + "group.connection": "Account, connessione e Remote Play", + "group.connection.sub": "Associazione Remote Play e dettagli di connessione", + "group.system": "Sistema e hardware", + "group.system.sub": "Ventola, modalità riposo, archiviazione e attivazione licenza", + "group.shortcuts": "Scorciatoie del controller", + "group.shortcuts.sub": "Le scorciatoie restano attive dopo il riavvio finché la cassetta è attiva; le combinazioni funzionano anche fuori dal gioco", + "group.preferences": "Preferenze", + "group.preferences.sub": "Avvio, lingua della cassetta e scorciatoie del controller", + "group.debug": "Debug avanzato", + "group.debug.sub": "Registri, controllo del jailbreak delle app e ambiente NP", + "group.about": "Informazioni", + "group.about.sub": "Riconoscimenti, donazioni e info sul progetto", + "group.lang": "Lingua dell’interfaccia", + "group.lang.sub": "Uscire e riaprire la cassetta dopo il cambio", + "pkg.installer": "Programma di installazione pacchetti", + "pkg.installer.sub": "Aprire l’installer di sistema per installare giochi o app PKG", + "pkg.add_content": "Gestione contenuti aggiuntivi", + "pkg.add_content.sub": "Gestire extra, patch e DLC dei giochi installati", + "pkg.msg.options": "Opzioni installer PKG", + "pkg.msg.installing": "OnionHEN sta installando il PKG selezionato", + "pkg.msg.yes": "Sì", + "pkg.msg.no": "No", + "pkg.msg.sort": "Ordinamento PKG OnionHEN", + "pkg.msg.sort_az": "Nome (A-Z)", + "pkg.msg.sort_za": "Nome (Z-A)", + "pkg.msg.updated": "Aggiornato", + "pkg.msg.wait": "Attendere...", + "pkg.msg.ok": "OK", + "pkg.msg.cancel": "Annulla", + "pkg.msg.select_all": "Seleziona tutto", + "payloads.link": "Payload", + "payloads.link.sub": "Sfogliare e avviare i file ELF nelle cartelle payloads", + "kstuff.group": "Kstuff", + "kstuff.group.sub": "Gestire il caricamento e la sostituzione della patch del kernel", + "kstuff.autoload": "Caricare Kstuff automaticamente all’avvio di OnionHEN", + "kstuff.autoload.sub": "Se attivo, la patch del kernel si carica a ogni avvio di OnionHEN", + "kstuff.delete": "Rimuovere il Kstuff esterno (/data/OnionHEN/kstuff.elf)", + "kstuff.delete.desc": "Dopo la rimozione, OnionHEN torna al Kstuff integrato", + "cheats.link": "Trucchi", + "cheats.link.sub": "Attivare o disattivare i trucchi del gioco in esecuzione", + "remote_play.link": "Remote Play", + "remote_play.link.sub": "Mostrare PIN e dati account per il Remote Play da telefono o PC", + "game_opts.toggle": "Opzioni di gioco OnionHEN", + "game_opts.toggle.sub": "Mostrare le voci OnionHEN (come i trucchi) nel menu delle opzioni di gioco", + "overlay.group": "Overlay di gioco", + "overlay.group.sub": "Barra a tutta larghezza + sfondo nero semitrasparente opzionale", + "overlay.enabled": "Barra di monitoraggio", + "overlay.enabled.desc": "Mostrare la barra di monitoraggio completa in partita", + "overlay.background": "Sfondo della barra di monitoraggio", + "overlay.background.desc": "Mostrare lo sfondo semitrasparente dietro la barra", + "overlay.pos": "Posizione della barra di monitoraggio", + "overlay.pos.sub": "Tutta la larghezza sul bordo dello schermo; valori al centro: CPU · GPU · RAM · IP", + "overlay.pos.top": "Bordo superiore", + "overlay.pos.bottom": "Bordo inferiore", + "overlay.gpu": "GPU", + "overlay.gpu.desc": "Mostrare temperatura GPU e uso della VRAM", + "overlay.cpu": "CPU", + "overlay.cpu.desc": "Mostrare temperatura CPU e uso medio", + "overlay.cpu_all": "Mostrare l’uso di tutti i core CPU", + "overlay.cpu_all.desc": "Mostrare i 8 core uno per uno (allarga la barra)", + "overlay.ram": "Memoria", + "overlay.ram.desc": "Mostrare l’uso della memoria di sistema", + "overlay.ip": "Indirizzo IP", + "overlay.ip.desc": "Mostrare l’IP LAN della console", + "disp_tids": "Mostrare il Title ID nella schermata iniziale", + "disp_tids.sub": "Mostrare il Title ID di ogni gioco nella schermata iniziale; solo a cassetta attiva", + "fan.group": "Controllo ventola", + "fan.group.sub": "Regolare la velocità della ventola in base a una soglia di temperatura", + "fan.enable": "Attivare la soglia manuale della ventola", + "fan.enable.sub": "Se disattivato, il sistema usa la politica ventola predefinita", + "fan.threshold": "Regolare la soglia della ventola", + "fan.threshold.sub": "Inserire i gradi Celsius; raggiunta questa temperatura la ventola accelera", + "rest.group": "Modalità riposo", + "rest.group.sub": "Ridurre blocchi e anomalie all’ingresso in modalità riposo", + "rest.delay": "Ritardare l’attivazione della cassetta (secondi)", + "rest.delay.sub": "Attendere qualche secondo in più dopo il risveglio dalla modalità riposo prima di applicare le patch", + "hdd.external": "HDD esterno", + "hdd.external.sub": "Aprire la pagina di sistema per formattare e gestire l’HDD esterno", + "license.bd": "Attivazione Blu-ray (licenza)", + "license.bd.sub": "Aprire la pagina di attivazione licenza dei dischi Blu-ray", + "startup.open_after_load": "Aprire automaticamente dopo il caricamento di OnionHEN", + "startup.open_after_load.sub": "Scegliere se OnionHEN resta sulla schermata attuale o torna alla schermata iniziale", + "startup.open_after_load.confirm": "Le modifiche si applicheranno al prossimo caricamento di OnionHEN.", + "startup.open_after_load.confirm_phrase": "OK,Annulla", + "startup.none": "Nessuno", + "startup.home_menu": "Schermata iniziale", + "sc.cheats": "Aprire il menu dei trucchi", + "sc.cheats.sub": "Aprire i trucchi da qualsiasi schermata, anche in partita, con una combinazione del controller", + "sc.toolbox": "Aprire la cassetta degli attrezzi OnionHEN", + "sc.toolbox.sub": "Aprire la cassetta da qualsiasi schermata, anche in partita, con una combinazione del controller", + "sc.off": "Disattivato (nessuna scorciatoia)", + "sc.r3_l3": "Tenere premuti R3 + L3", + "sc.l2_tri": "Tenere premuti L2 + △", + "sc.long_options": "Pressione prolungata di Options", + "sc.long_share": "Pressione prolungata di Share", + "sc.share": "Premere Share", + "sc.l2_r3": "Tenere premuti L2 + R3", + "log.level": "Livello dei registri", + "log.level.sub": "Quanto dettaglio registrare; i livelli più alti danno più diagnostica", + "log.off": "Disattivato", + "log.error": "Solo errori", + "log.warn": "Avvisi ed errori", + "log.info": "Informazioni (consigliato)", + "log.debug": "Debug", + "log.trace": "Traccia", + "app_jailbreak.enabled": "Attivare il jailbreak delle app", + "app_jailbreak.enabled.sub": "Ascoltare le richieste di jailbreak dalle app autorizzate", + "debug.jb": "Notifiche di jailbreak delle app", + "debug.jb.sub": "Mostrare una notifica dopo un jailbreak riuscito", + "debug.np_env": "Ambiente NP", + "debug.np_env.sub": "Modificare la stringa di ambiente PlayStation Network; la console si riavvia dopo il salvataggio", + "debug.np_env.confirm": "Il sistema si riavvierà per applicare questa impostazione.", + "debug.np_env.confirm_phrase": "OK,Annulla", + "lang.list": "Lingua della cassetta", + "lang.list.sub": "Uscire e riaprire la cassetta dopo il cambio perché l’interfaccia si aggiorni per intero", + "lang.system": "Lingua del sistema", + "lang.zh": "简体中文", + "lang.zh_hant": "繁體中文", + "lang.en": "English", + "lang.ja": "日本語", + "lang.ko": "한국어", + "lang.fr": "Français", + "lang.de": "Deutsch", + "lang.it": "Italiano", + "lang.es": "Español", + "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", + "lang.ar": "العربية", + "about.build": "Build: %s", + "about.donate": "Sostenere questo progetto", + "about.donate.sub": "Il progetto vi piace? Potete sostenerlo su Ko-fi", + "about.donate.methods": "★ Modi per donare", + "about.wechat": "- WeChat | polichan01", + "about.donors": "★ Donatori ★", + "about.credits": "Riconoscimenti OnionHEN", + "about.credits.sub": "Linea, tester e ringraziamenti", + "about.lineage": "★ Linea ★", + "about.lineage.etahen": "- etaHEN (LightningMods) — base di codice di OnionHEN", + "about.lineage.goldhen": "- GoldHEN (SiSTR0) — predecessore spirituale dell’HEN tutto-in-uno su PS4", + "about.testers": "★ Grazie ai tester ★", + "about.testers.intro": "Grazie a ogni tester che ha aiutato questo progetto a crescere. La vostra partecipazione e il vostro sostegno lo fanno andare avanti.", + "about.more": "Per altre info e aggiornamenti, seguite i canali di pubblicazione del progetto", + "about.projects": "Progetti inclusi in OnionHEN", + "about.projects.sub": "Componenti realmente usati o integrati in questo albero", + "about.projects.info": "★ Dipendenze e componenti integrati in questo albero", + "payload.title": "Payload", + "payload.auto_title": "★ Avvio automatico dei payload", + "payload.auto.link": "★ Avvio automatico dei payload", + "payload.auto.sub": "Scegliere i file .elf in payloads/ da avviare con OnionHEN", + "payload.start_stop_fmt": "Avvia/ferma %s (percorso: %s) (%s)", + "payload.autostart_fmt": "Attiva/disattiva l’avvio automatico di %s (%s)", + "cheats.none": "Trucchi OnionHEN - nessun gioco aperto", + "cheats.none.hint": "Avviare prima un gioco, poi aprire il menu dei trucchi", + "cheats.missing": "Nessun trucco per questo gioco/versione (mettere i file in /data/OnionHEN/cheats/)", + "cheats.game_menu": "★ Trucchi OnionHEN", + "cheats.title_fmt": "Trucchi OnionHEN - %s - %s", + "cheats.ver_unknown": "Impossibile rilevare la versione della patch", + "cheats.not_running_fmt": "%s non è in esecuzione; aprire il gioco per attivare i trucchi", + "cheats.authors_fmt": "Autori dei trucchi: %s", + "cheats.on_off": "On/Off", + "cheats.enable_fmt": "Per %s, attiva/disattiva %s", + "rp.title": "Dettagli di connessione Remote Play", + "rp.need_reboot": "L’account è stato attivato da OnionHEN; riavviare la console prima di usare Remote Play.", + "rp.account_id_fmt": "ID account: %s", + "rp.account_id_decoded_fmt": "ID account decodificato: %s", + "rp.pin_fmt": "Codice PIN: %04u %04u ", + "rp.init_error": "Inizializzazione di Remote Play non riuscita; uscire da questa pagina e riprovare", + "rp.account_error": "Impossibile leggere l’ID account dell’utente attuale", + "rp.pin_error": "Impossibile ottenere un PIN Remote Play", + "rp.notify.countdown": "Associazione Remote Play: %u secondi rimanenti", + "rp.notify.paired": "Remote Play associato, pronto per la connessione", + "rp.notify.timeout": "Tempo di associazione Remote Play scaduto", + "rp.save_usb": "Salvare i dati Remote Play su USB", + "rp.save_usb.sub": "Scrivere PIN e dati account attuali su una chiavetta USB inserita, per vederli sul PC", + "plapps.title": "Homebrew payload OnionHEN - Applicazioni", + "plapps.version_fmt": "%s | versione: %s" + }, + "notifications": { + "notify.boot.starting": "OnionHEN è in avvio...", + "notify.boot.welcome": "Benvenuti in OnionHEN", + "notify.boot.goto_toolbox": "Vai alla cassetta degli attrezzi OnionHEN", + "notify.boot.made_by": " · di ", + "notify.boot.cleaned_up": "OnionHEN è stato ripulito.", + "notify.kstuff.no_elf_header": "Kstuff «%s» non ha un’intestazione ELF valida.", + "notify.kstuff.loading": "Caricamento di Kstuff da: %s", + "notify.net.socket_create": "Creazione del socket non riuscita: %s", + "notify.net.socket_options": "Impostazione delle opzioni del socket non riuscita: %s", + "notify.net.socket_bind": "Bind del socket non riuscito: %s", + "notify.net.socket_listen": "Ascolto sul socket non riuscito: %s", + "notify.net.socket_accept": "Accettazione della connessione non riuscita: %s", + "notify.elfldr.need_9021": "Avviare prima elfldr sulla porta 9021, poi rieseguire OnionHEN.", + "notify.elfldr.launch_util": "avvio di util tramite elfldr non riuscito", + "notify.kstuff.load_failed": "Caricamento di Kstuff non riuscito, si continua senza", + "notify.kstuff.load_elfldr_failed": "Caricamento di Kstuff tramite elfldr non riuscito, si continua", + "notify.elfldr.launch_daemon": "avvio del daemon tramite elfldr non riuscito", + "notify.priv.unable": "Impossibile elevare i privilegi", + "notify.mount.system_ex": "montaggio di /system_ex non riuscito\nse vedi questo messaggio, riavvia la console", + "notify.mount.system": "montaggio di /system non riuscito\nse vedi questo messaggio, riavvia la console", + "notify.crash.resolved": "L’errore fatale è stato risolto\n\nnon c’è nulla di cui preoccuparsi", + "notify.crash.main": "OnionHEN si è interrotto…\n\nInviare /data/OnionHEN/OnionHEN_crash.log al Discord PKG-Zone: https://discord.gg/BduZHudWGj", + "notify.stack.shutdown": "Stack OnionHEN arrestato (util + ShellUI + daemon; Kstuff resta attivo)", + "notify.fan.open_failed": "Impossibile aprire le impostazioni della ventola.", + "notify.fan.set_failed": "Impossibile impostare la velocità della ventola.", + "notify.toolbox.no_shellui_pid": "Impossibile ottenere il PID di ShellUI", + "notify.toolbox.inject_failed": "Iniezione della cassetta non riuscita", + "notify.toolbox.load_failed": "Caricamento della cassetta OnionHEN non riuscito", + "notify.toolbox.load_timeout": "Caricamento della cassetta OnionHEN non riuscito (tempo scaduto, ShellUI resta in esecuzione)", + "notify.toolbox.shellui_restarted": "SceShellUI si è riavviato durante il caricamento della cassetta OnionHEN", + "notify.util.restarting": "OnionHEN Utility non è in esecuzione, riavvio...", + "notify.util.restarted": "Servizi OnionHEN Utility riavviati correttamente", + "notify.util.restart_failed": "Riavvio dei servizi OnionHEN Utility non riuscito — elfldr privato :9020 non disponibile", + "notify.loader.recovering": "Il loader di runtime OnionHEN :9020 non è disponibile; recupero tramite :9021...", + "notify.loader.recovered": "Loader di runtime OnionHEN ripristinato su :9020", + "notify.loader.recover_failed": "Ripristino del loader :9020 non riuscito; serve un elfldr esterno :9021", + "notify.payload.autostart_skipped": "Avvio automatico dei payload utente saltato: elfldr privato :9020 non disponibile", + "notify.rest.reactivating": "Uscita dalla modalità riposo — riattivazione della cassetta OnionHEN...", + "notify.jailbreak.granted": "All’app (PID %i) è stato concesso un jailbreak", + "notify.settings.created": "Configurazione OnionHEN creata: /data/OnionHEN/config.ini", + "notify.settings.read_failed": "Lettura del file delle impostazioni non riuscita", + "notify.fs.size_failed": "calcolo della dimensione totale di %s non riuscito", + "notify.fs.copy_file": "copia del file non riuscita: %s", + "notify.fs.copy_recursive": "copia ricorsiva non riuscita: %s", + "notify.ipc.json_parse": "Errore nell’analisi JSON", + "notify.ipc.invalid_path": "Lunghezza percorso non valida: %d", + "notify.fs.unmount": "Smontaggio non riuscito | errore: %s", + "notify.fs.remount": "errore di rimontaggio: %s\nPercorso: %s", + "notify.ipc.unused": "Questo comando non è più usato", + "notify.fan.invalid_speed": "Velocità ventola non valida: %d. Deve essere tra 0 e 100.", + "notify.fan.disabled": "La regolazione della velocità della ventola è disattivata.", + "notify.fan.adjusted": "Soglia della ventola impostata a %i °C.", + "notify.fan.adjust_failed": "Regolazione della velocità della ventola non riuscita.", + "notify.settings.reloaded": "Impostazioni ricaricate", + "notify.ipc.unknown_command": "Comando sconosciuto 0x%X", + "notify.app.not_found": "app %s non trovata", + "notify.net.ip_changed": "Indirizzo IP cambiato in %s", + "notify.util.crashed": "Il demone delle utility OnionHEN si è interrotto…\n\nAlcune funzioni non saranno disponibili fino al riavvio", + "notify.util.crash_recovering": "Il demone delle utility OnionHEN si è interrotto…\n\nTentativo di recupero...", + "notify.game.tid_failed": "Impossibile ottenere il Title ID", + "notify.game.version_failed": "Impossibile ottenere la versione del gioco", + "notify.game.sfo_failed": "Lettura del file SFO non riuscita", + "notify.payload.load_failed": "Caricamento del payload non riuscito\nPercorso: %s\nIdentificatore: %s", + "notify.payload.load_failed_path": "Caricamento del payload non riuscito.\nPercorso: %s", + "notify.payload.launched": "Payload avviato\nPercorso: %s\nIdentificatore: %s", + "notify.cheats.none": "Nessun trucco per %s versione %s.", + "notify.payload.elf_only": "Sono supportati solo payload .elf:\n%s", + "notify.payload.invalid_elf": "File ELF non valido: %s", + "notify.payload.invalid_name": "Nome ELF non valido: %s", + "notify.payload.loading": "Caricamento del payload %s...", + "notify.payload.launch_failed": "Avvio del payload %s non riuscito (%s)", + "notify.app.launch_failed": "Avvio dell’app non riuscito, codice di errore: %d", + "notify.app.launching": "Avvio dell’app %s e controllo delle patch...", + "notify.app.launch_returned": "LaunchApp ha restituito: %d", + "notify.cheats.game_not_running": "Il gioco non è in esecuzione; avvialo prima di attivare i trucchi", + "notify.cheats.no_pid": "[ERRORE] Impossibile attivare %s\nPID del gioco non trovato", + "notify.cheats.toggle_banner": "★ %s [%s] ★", + "notify.common.on": "ON", + "notify.common.off": "OFF", + "notify.cheats.activate_failed": "[ERRORE] Impossibile attivare %s", + "notify.kstuff.next_boot_on": "Kstuff verrà caricato al prossimo avvio", + "notify.kstuff.next_boot_off": "Kstuff NON verrà caricato al prossimo avvio", + "notify.kstuff.deleted": "Il Kstuff esterno è stato eliminato", + "notify.rp.usb_missing": "Salvataggio dei dati Remote Play non riuscito, USB non trovata", + "notify.rp.save_open_failed": "Impossibile aprire il file dei dati Remote Play", + "notify.rp.saved": "Dati Remote Play salvati in /mnt%s", + "notify.overlay.disable_cpu_first": "Per disattivare il monitoraggio CPU, disattivare prima «uso di tutti i core CPU»", + "notify.overlay.enable_cpu_first": "Per cambiare la modalità di monitoraggio CPU, attivare prima il monitoraggio CPU", + "notify.process.killed": "%s terminato", + "notify.payload.autostart_file": "Creazione del file di avvio automatico non riuscita", + "notify.fan.not_enabled": "La soglia manuale della temperatura della ventola non è attiva", + "notify.shortcut.toolbox_cheats": "Le scorciatoie della cassetta e dei trucchi non possono coincidere; la selezione attuale NON verrà salvata", + "notify.shortcut.toolbox_cheats_long": "Le scorciatoie lunghe della cassetta e dei trucchi non possono coincidere; la selezione attuale NON verrà salvata", + "notify.shortcut.cheats_toolbox": "Le scorciatoie dei trucchi e della cassetta non possono coincidere; la selezione attuale NON verrà salvata", + "notify.shortcut.cheats_toolbox_long": "Le scorciatoie lunghe dei trucchi e della cassetta non possono coincidere; la selezione attuale NON verrà salvata", + "notify.lang.saved": "Lingua salvata. Uscire e riaprire la cassetta per applicarla.", + "notify.hook.load_assembly": "Caricamento dell’assembly non riuscito", + "notify.hook.target": "Destinazione dell’hook non trovata", + "notify.hook.install": "Installazione dell’hook non riuscita", + "notify.hook.lnc_image": "Impossibile ottenere l’immagine LncUtilWrapper", + "notify.hook.layer_manager": "Impossibile ottenere la classe LayerManager", + "notify.hook.find_scene": "Impossibile ottenere il metodo FindContainerSceneByPath", + "notify.hook.find_scene_exc": "Eccezione durante la chiamata a FindContainerSceneByPath", + "notify.hook.game_scene": "Impossibile ottenere il ContainerScene del gioco", + "notify.hook.regmgr": "sceRegMgrGetInt non trovato", + "notify.hook.kill_app": "Detour di KillAppWithReason non riuscito", + "notify.hook.rnps_find": "ioctl di decifratura RNPS non trovato", + "notify.hook.rnps_detour": "Detour dell’ioctl di decifratura RNPS non riuscito", + "notify.hook.boot": "detour di BootHelper.Boot non riuscito", + "notify.hook.capture": "Detour di CaptureScreen non riuscito", + "notify.hook.master": "Impossibile ottenere l’indirizzo master", + "notify.app.reload_scenes": "Ricaricamento delle scene %s", + "notify.pkg.installing": "Installazione del pacchetto da:\n%s", + "notify.pkg.finished": "Installazione terminata, codice: %d", + "notify.rp.reg_get": "SCE_REGMGR: impossibile leggere REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.reg_set": "SCE_REGMGR: impossibile impostare REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.reg_verify": "SCE_REGMGR: impossibile verificare REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.confirm": "sceRemoteplayConfirmDeviceRegist 0x%X stato associazione: %d errore associazione: %d", + "notify.brand": "OnionHEN" + } +} diff --git a/source/i18n/ja-JP.json b/source/i18n/ja-JP.json index 5736d99..5c48f5e 100644 --- a/source/i18n/ja-JP.json +++ b/source/i18n/ja-JP.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "ビルド:%s", "about.donate": "このプロジェクトを支援する", diff --git a/source/i18n/ko-KR.json b/source/i18n/ko-KR.json index 0fbffb8..3c78357 100644 --- a/source/i18n/ko-KR.json +++ b/source/i18n/ko-KR.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "빌드: %s", "about.donate": "이 프로젝트 후원하기", diff --git a/source/i18n/pl-PL.json b/source/i18n/pl-PL.json new file mode 100644 index 0000000..d316336 --- /dev/null +++ b/source/i18n/pl-PL.json @@ -0,0 +1,316 @@ +{ + "meta": { + "id": "pl", + "bcp47": "pl-PL", + "fallback": false + }, + "toolbox": { + "root.title": "★Narzędzia OnionHEN", + "group.pkg": "Instalacja i zarządzanie zawartością", + "group.pkg.sub": "Instalacja PKG i zarządzanie zawartością dodatkową", + "group.payloads": "Payloady i jądro", + "group.payloads.sub": "Pliki ELF payloadów i Kstuff", + "group.game": "Narzędzia gry", + "group.game.sub": "Cheaty bieżącej gry", + "group.display": "Monitorowanie i wyświetlanie", + "group.display.sub": "Nakładka w grze, wskaźniki na ekranie głównym i pozycja w opcjach gry", + "group.connection": "Konto, połączenie i Remote Play", + "group.connection.sub": "Parowanie Remote Play i dane połączenia", + "group.system": "System i sprzęt", + "group.system.sub": "Wentylator, tryb spoczynku, pamięć i aktywacja licencji", + "group.shortcuts": "Skróty kontrolera", + "group.shortcuts.sub": "Skróty zostają po restarcie, dopóki narzędzia są włączone; kombinacje działają także poza grą", + "group.preferences": "Preferencje", + "group.preferences.sub": "Zachowanie przy starcie, język narzędzi i skróty kontrolera", + "group.debug": "Zaawansowana diagnostyka", + "group.debug.sub": "Dzienniki, sterowanie jailbreakiem aplikacji i środowisko NP", + "group.about": "Informacje", + "group.about.sub": "Podziękowania, wsparcie i informacje o projekcie", + "group.lang": "Język interfejsu", + "group.lang.sub": "Po zmianie zamknij narzędzia i otwórz je ponownie", + "pkg.installer": "Instalator pakietów", + "pkg.installer.sub": "Otwórz instalator systemowy, aby zainstalować gry lub aplikacje PKG", + "pkg.add_content": "Menedżer zawartości dodatkowej", + "pkg.add_content.sub": "Zarządzaj dodatkami, łatami i DLC zainstalowanych gier", + "pkg.msg.options": "Opcje instalatora PKG", + "pkg.msg.installing": "OnionHEN instaluje wybrany PKG", + "pkg.msg.yes": "Tak", + "pkg.msg.no": "Nie", + "pkg.msg.sort": "Sortowanie PKG OnionHEN", + "pkg.msg.sort_az": "Nazwa (A-Z)", + "pkg.msg.sort_za": "Nazwa (Z-A)", + "pkg.msg.updated": "Zaktualizowano", + "pkg.msg.wait": "Czekaj...", + "pkg.msg.ok": "OK", + "pkg.msg.cancel": "Anuluj", + "pkg.msg.select_all": "Zaznacz wszystko", + "payloads.link": "Payload", + "payloads.link.sub": "Przeglądaj i uruchamiaj pliki ELF z folderów payloads", + "kstuff.group": "Kstuff", + "kstuff.group.sub": "Ładowanie i podmiana łatki jądra", + "kstuff.autoload": "Automatycznie ładuj Kstuff przy starcie OnionHEN", + "kstuff.autoload.sub": "Po włączeniu łatka jądra ładuje się przy każdym starcie OnionHEN", + "kstuff.delete": "Usuń zewnętrzny Kstuff (/data/OnionHEN/kstuff.elf)", + "kstuff.delete.desc": "Po usunięciu OnionHEN wraca do wbudowanego Kstuff", + "cheats.link": "Cheaty", + "cheats.link.sub": "Włączaj i wyłączaj cheaty bieżącej gry", + "remote_play.link": "Remote Play", + "remote_play.link.sub": "PIN i dane konta do Remote Play z telefonu lub komputera", + "game_opts.toggle": "Opcje gry OnionHEN", + "game_opts.toggle.sub": "Pokazuj pozycje OnionHEN (np. cheaty) w menu opcji gry", + "overlay.group": "Nakładka gry", + "overlay.group.sub": "Pasek na całą szerokość + opcjonalne półprzezroczyste czarne tło", + "overlay.enabled": "Pasek monitorowania", + "overlay.enabled.desc": "Pokazuj pełny pasek monitorowania w grze", + "overlay.background": "Tło paska monitorowania", + "overlay.background.desc": "Pokazuj półprzezroczyste tło za paskiem", + "overlay.pos": "Położenie paska monitorowania", + "overlay.pos.sub": "Pełna szerokość przy krawędzi ekranu; wartości na środku: CPU · GPU · RAM · IP", + "overlay.pos.top": "Górna krawędź", + "overlay.pos.bottom": "Dolna krawędź", + "overlay.gpu": "GPU", + "overlay.gpu.desc": "Temperatura GPU i użycie VRAM", + "overlay.cpu": "CPU", + "overlay.cpu.desc": "Temperatura CPU i średnie użycie", + "overlay.cpu_all": "Użycie wszystkich rdzeni CPU", + "overlay.cpu_all.desc": "Pokazuj wszystkie 8 rdzeni osobno (pasek się poszerza)", + "overlay.ram": "Pamięć", + "overlay.ram.desc": "Użycie pamięci systemowej", + "overlay.ip": "Adres IP", + "overlay.ip.desc": "IP LAN konsoli", + "disp_tids": "Pokazuj Title ID na ekranie głównym", + "disp_tids.sub": "Title ID każdej gry na ekranie głównym; tylko gdy narzędzia są włączone", + "fan.group": "Sterowanie wentylatorem", + "fan.group.sub": "Prędkość wentylatora według progu temperatury", + "fan.enable": "Włącz ręczny próg wentylatora", + "fan.enable.sub": "Gdy wyłączone, system używa domyślnej polityki wentylatora", + "fan.threshold": "Próg wentylatora", + "fan.threshold.sub": "Podaj stopnie Celsjusza; po osiągnięciu tej temperatury wentylator przyspiesza", + "rest.group": "Tryb spoczynku", + "rest.group.sub": "Mniej zacięć i usterek przy wchodzeniu w tryb spoczynku", + "rest.delay": "Opóźnij aktywację narzędzi (sekundy)", + "rest.delay.sub": "Poczekaj kilka sekund po wybudzeniu z trybu spoczynku, zanim zostaną nałożone łatki", + "hdd.external": "Zewnętrzny HDD", + "hdd.external.sub": "Otwórz stronę systemową formatowania i zarządzania dyskiem zewnętrznym", + "license.bd": "Aktywacja Blu-ray (licencja)", + "license.bd.sub": "Otwórz stronę aktywacji licencji płyt Blu-ray", + "startup.open_after_load": "Otwórz automatycznie po załadowaniu OnionHEN", + "startup.open_after_load.sub": "Zostać na bieżącym ekranie czy wrócić do ekranu głównego", + "startup.open_after_load.confirm": "Zmiany zadziałają przy następnym ładowaniu OnionHEN.", + "startup.open_after_load.confirm_phrase": "OK,Anuluj", + "startup.none": "Brak", + "startup.home_menu": "Ekran główny", + "sc.cheats": "Otwórz menu cheatów", + "sc.cheats.sub": "Otwieraj cheaty z dowolnego ekranu, także w grze, kombinacją przycisków", + "sc.toolbox": "Otwórz narzędzia OnionHEN", + "sc.toolbox.sub": "Otwieraj narzędzia z dowolnego ekranu, także w grze, kombinacją przycisków", + "sc.off": "Wyłączone (bez skrótu)", + "sc.r3_l3": "Przytrzymaj R3 + L3", + "sc.l2_tri": "Przytrzymaj L2 + △", + "sc.long_options": "Długie naciśnięcie Options", + "sc.long_share": "Długie naciśnięcie Share", + "sc.share": "Naciśnij Share", + "sc.l2_r3": "Przytrzymaj L2 + R3", + "log.level": "Poziom dziennika", + "log.level.sub": "Szczegółowość dzienników OnionHEN; wyższy poziom to więcej diagnostyki", + "log.off": "Wyłączone", + "log.error": "Tylko błędy", + "log.warn": "Ostrzeżenia i błędy", + "log.info": "Informacje (zalecane)", + "log.debug": "Debug", + "log.trace": "Śledzenie", + "app_jailbreak.enabled": "Włącz jailbreak aplikacji", + "app_jailbreak.enabled.sub": "Nasłuchuj żądań jailbreaku od dozwolonych aplikacji", + "debug.jb": "Powiadomienia o jailbreaku aplikacji", + "debug.jb.sub": "Pokaż powiadomienie po udanym jailbreaku aplikacji", + "debug.np_env": "Środowisko NP", + "debug.np_env.sub": "Zmień ciąg środowiska PlayStation Network; po zapisaniu konsola się uruchomi ponownie", + "debug.np_env.confirm": "System uruchomi się ponownie, aby zastosować to ustawienie.", + "debug.np_env.confirm_phrase": "OK,Anuluj", + "lang.list": "Język narzędzi", + "lang.list.sub": "Po zmianie zamknij narzędzia i otwórz je ponownie, aby interfejs odświeżył się w całości", + "lang.system": "Język systemu", + "lang.zh": "简体中文", + "lang.zh_hant": "繁體中文", + "lang.en": "English", + "lang.ja": "日本語", + "lang.ko": "한국어", + "lang.fr": "Français", + "lang.de": "Deutsch", + "lang.it": "Italiano", + "lang.es": "Español", + "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", + "lang.ar": "العربية", + "about.build": "Kompilacja: %s", + "about.donate": "Wesprzyj ten projekt", + "about.donate.sub": "Podoba Ci się projekt? Możesz go wesprzeć na Ko-fi", + "about.donate.methods": "★ Sposoby wsparcia", + "about.wechat": "- WeChat | polichan01", + "about.donors": "★ Darczyńcy ★", + "about.credits": "Podziękowania OnionHEN", + "about.credits.sub": "Rodowód, testerzy i napisy", + "about.lineage": "★ Rodowód ★", + "about.lineage.etahen": "- etaHEN (LightningMods) — baza kodu OnionHEN", + "about.lineage.goldhen": "- GoldHEN (SiSTR0) — duchowy poprzednik all-in-one HEN na PS4", + "about.testers": "★ Dzięki testerom ★", + "about.testers.intro": "Dziękujemy każdemu testerowi, który pomógł temu projektowi urosnąć. Wasz udział i wsparcie pchają go dalej.", + "about.more": "Więcej informacji i aktualizacji znajdziesz w kanałach publikacji projektu", + "about.projects": "Projekty zawarte w OnionHEN", + "about.projects.sub": "Komponenty faktycznie używane lub wbudowane w tym drzewie", + "about.projects.info": "★ Zależności i wbudowane komponenty tego drzewa", + "payload.title": "Payload", + "payload.auto_title": "★ Autostart payloadów", + "payload.auto.link": "★ Autostart payloadów", + "payload.auto.sub": "Wybierz pliki .elf z payloads/, które startują z OnionHEN", + "payload.start_stop_fmt": "Uruchom/zatrzymaj %s (ścieżka: %s) (%s)", + "payload.autostart_fmt": "Włącz/wyłącz autostart %s (%s)", + "cheats.none": "Cheaty OnionHEN - brak otwartej gry", + "cheats.none.hint": "Najpierw uruchom grę, potem otwórz menu cheatów", + "cheats.missing": "Brak cheatów dla tej gry/wersji (umieść pliki w /data/OnionHEN/cheats/)", + "cheats.game_menu": "★ Cheaty OnionHEN", + "cheats.title_fmt": "Cheaty OnionHEN - %s - %s", + "cheats.ver_unknown": "Nie udało się wykryć wersji łatki", + "cheats.not_running_fmt": "%s nie jest uruchomiona; otwórz grę, aby włączyć cheaty", + "cheats.authors_fmt": "Autorzy cheatów: %s", + "cheats.on_off": "Wł./Wył.", + "cheats.enable_fmt": "Dla %s: włącz/wyłącz %s", + "rp.title": "Dane połączenia Remote Play", + "rp.need_reboot": "Konto zostało aktywowane przez OnionHEN; uruchom konsolę ponownie przed Remote Play.", + "rp.account_id_fmt": "ID konta: %s", + "rp.account_id_decoded_fmt": "Zdekodowane ID konta: %s", + "rp.pin_fmt": "Kod PIN: %04u %04u ", + "rp.init_error": "Nie udało się zainicjować Remote Play; opuść tę stronę i spróbuj ponownie", + "rp.account_error": "Nie udało się odczytać ID konta bieżącego użytkownika", + "rp.pin_error": "Nie udało się uzyskać PIN-u Remote Play", + "rp.notify.countdown": "Parowanie Remote Play: pozostało %u s", + "rp.notify.paired": "Remote Play sparowany, można się łączyć", + "rp.notify.timeout": "Czas parowania Remote Play minął", + "rp.save_usb": "Zapisz dane Remote Play na USB", + "rp.save_usb.sub": "Zapisz bieżący PIN i dane konta na włożonym pendrive, aby obejrzeć je na PC", + "plapps.title": "Homebrew payloadów OnionHEN - Aplikacje", + "plapps.version_fmt": "%s | wersja: %s" + }, + "notifications": { + "notify.boot.starting": "OnionHEN się uruchamia...", + "notify.boot.welcome": "Witamy w OnionHEN", + "notify.boot.goto_toolbox": "Przejdź do narzędzi OnionHEN", + "notify.boot.made_by": " · autor: ", + "notify.boot.cleaned_up": "OnionHEN został posprzątany.", + "notify.kstuff.no_elf_header": "Kstuff „%s” nie ma poprawnego nagłówka ELF.", + "notify.kstuff.loading": "Ładowanie Kstuff z: %s", + "notify.net.socket_create": "Nie udało się utworzyć gniazda: %s", + "notify.net.socket_options": "Nie udało się ustawić opcji gniazda: %s", + "notify.net.socket_bind": "Nie udało się powiązać gniazda: %s", + "notify.net.socket_listen": "Nie udało się nasłuchiwać na gnieździe: %s", + "notify.net.socket_accept": "Nie udało się przyjąć połączenia: %s", + "notify.elfldr.need_9021": "Najpierw uruchom elfldr na porcie 9021, potem ponownie OnionHEN.", + "notify.elfldr.launch_util": "nie udało się uruchomić util przez elfldr", + "notify.kstuff.load_failed": "Nie udało się załadować Kstuff, kontynuacja bez niego", + "notify.kstuff.load_elfldr_failed": "Nie udało się załadować Kstuff przez elfldr, kontynuacja", + "notify.elfldr.launch_daemon": "nie udało się uruchomić daemona przez elfldr", + "notify.priv.unable": "Nie udało się podnieść uprawnień", + "notify.mount.system_ex": "nie udało się zamontować /system_ex\njeśli to widzisz, uruchom konsolę ponownie", + "notify.mount.system": "nie udało się zamontować /system\njeśli to widzisz, uruchom konsolę ponownie", + "notify.crash.resolved": "Błąd krytyczny został naprawiony\n\nnie ma powodu do niepokoju", + "notify.crash.main": "OnionHEN uległ awarii…\n\nWyślij /data/OnionHEN/OnionHEN_crash.log na Discord PKG-Zone: https://discord.gg/BduZHudWGj", + "notify.stack.shutdown": "Stos OnionHEN zatrzymany (util + ShellUI + daemon; Kstuff działa dalej)", + "notify.fan.open_failed": "Nie udało się otworzyć ustawień wentylatora.", + "notify.fan.set_failed": "Nie udało się ustawić prędkości wentylatora.", + "notify.toolbox.no_shellui_pid": "Nie udało się pobrać PID ShellUI", + "notify.toolbox.inject_failed": "Nie udało się wstrzyknąć narzędzi", + "notify.toolbox.load_failed": "Nie udało się załadować narzędzi OnionHEN", + "notify.toolbox.load_timeout": "Nie udało się załadować narzędzi OnionHEN (przekroczono czas, ShellUI działa dalej)", + "notify.toolbox.shellui_restarted": "SceShellUI uruchomił się ponownie podczas ładowania narzędzi OnionHEN", + "notify.util.restarting": "OnionHEN Utility nie działa, ponowne uruchamianie...", + "notify.util.restarted": "Usługi OnionHEN Utility uruchomiono ponownie", + "notify.util.restart_failed": "Nie udało się ponownie uruchomić usług OnionHEN Utility — prywatny elfldr :9020 niedostępny", + "notify.loader.recovering": "Loader środowiska OnionHEN :9020 jest niedostępny; odzyskiwanie przez :9021...", + "notify.loader.recovered": "Loader środowiska OnionHEN odzyskany na :9020", + "notify.loader.recover_failed": "Nie udało się odzyskać loadera :9020; potrzebny zewnętrzny elfldr :9021", + "notify.payload.autostart_skipped": "Pominięto autostart payloadów użytkownika: prywatny elfldr :9020 niedostępny", + "notify.rest.reactivating": "Wyjście z trybu spoczynku — ponowna aktywacja narzędzi OnionHEN...", + "notify.jailbreak.granted": "Aplikacja (PID %i) otrzymała jailbreak", + "notify.settings.created": "Utworzono konfigurację OnionHEN: /data/OnionHEN/config.ini", + "notify.settings.read_failed": "Nie udało się odczytać pliku ustawień", + "notify.fs.size_failed": "nie udało się obliczyć całkowitego rozmiaru %s", + "notify.fs.copy_file": "nie udało się skopiować pliku: %s", + "notify.fs.copy_recursive": "kopiowanie rekurencyjne nie powiodło się: %s", + "notify.ipc.json_parse": "Błąd analizy JSON", + "notify.ipc.invalid_path": "Nieprawidłowa długość ścieżki: %d", + "notify.fs.unmount": "Odmontowanie nie powiodło się | błąd: %s", + "notify.fs.remount": "błąd ponownego montowania: %s\nŚcieżka: %s", + "notify.ipc.unused": "To polecenie nie jest już używane", + "notify.fan.invalid_speed": "Nieprawidłowa prędkość wentylatora: %d. Musi być między 0 a 100.", + "notify.fan.disabled": "Regulacja prędkości wentylatora jest wyłączona.", + "notify.fan.adjusted": "Próg wentylatora ustawiono na %i °C.", + "notify.fan.adjust_failed": "Nie udało się zmienić prędkości wentylatora.", + "notify.settings.reloaded": "Ustawienia wczytano ponownie", + "notify.ipc.unknown_command": "Nieznane polecenie 0x%X", + "notify.app.not_found": "nie znaleziono aplikacji %s", + "notify.net.ip_changed": "Adres IP zmieniono na %s", + "notify.util.crashed": "Demon narzędzi OnionHEN uległ awarii…\n\nCzęść funkcji będzie niedostępna do ponownego uruchomienia", + "notify.util.crash_recovering": "Demon narzędzi OnionHEN uległ awarii…\n\nPróba odzyskania...", + "notify.game.tid_failed": "Nie udało się pobrać Title ID", + "notify.game.version_failed": "Nie udało się pobrać wersji gry", + "notify.game.sfo_failed": "Nie udało się odczytać pliku SFO", + "notify.payload.load_failed": "Nie udało się załadować payloadu\nŚcieżka: %s\nIdentyfikator: %s", + "notify.payload.load_failed_path": "Nie udało się załadować payloadu.\nŚcieżka: %s", + "notify.payload.launched": "Payload uruchomiony\nŚcieżka: %s\nIdentyfikator: %s", + "notify.cheats.none": "Brak cheatów dla %s w wersji %s.", + "notify.payload.elf_only": "Obsługiwane są tylko payloady .elf:\n%s", + "notify.payload.invalid_elf": "Nieprawidłowy plik ELF: %s", + "notify.payload.invalid_name": "Nieprawidłowa nazwa ELF: %s", + "notify.payload.loading": "Ładowanie payloadu %s...", + "notify.payload.launch_failed": "Nie udało się uruchomić payloadu %s (%s)", + "notify.app.launch_failed": "Nie udało się uruchomić aplikacji, kod błędu: %d", + "notify.app.launching": "Uruchamianie aplikacji %s i sprawdzanie łatek...", + "notify.app.launch_returned": "LaunchApp zwrócił: %d", + "notify.cheats.game_not_running": "Gra nie jest uruchomiona; uruchom ją, zanim włączysz cheaty", + "notify.cheats.no_pid": "[BŁĄD] Nie udało się włączyć %s\nnie znaleziono PID gry", + "notify.cheats.toggle_banner": "★ %s [%s] ★", + "notify.common.on": "WŁ.", + "notify.common.off": "WYŁ.", + "notify.cheats.activate_failed": "[BŁĄD] Nie udało się włączyć %s", + "notify.kstuff.next_boot_on": "Kstuff zostanie załadowany przy następnym starcie", + "notify.kstuff.next_boot_off": "Kstuff NIE zostanie załadowany przy następnym starcie", + "notify.kstuff.deleted": "Zewnętrzny Kstuff został usunięty", + "notify.rp.usb_missing": "Nie udało się zapisać danych Remote Play, nie znaleziono USB", + "notify.rp.save_open_failed": "Nie udało się otworzyć pliku danych Remote Play", + "notify.rp.saved": "Dane Remote Play zapisano w /mnt%s", + "notify.overlay.disable_cpu_first": "Aby wyłączyć monitor CPU, najpierw wyłącz „użycie wszystkich rdzeni CPU”", + "notify.overlay.enable_cpu_first": "Aby zmienić tryb monitora CPU, najpierw włącz monitor CPU", + "notify.process.killed": "%s zakończony", + "notify.payload.autostart_file": "Nie udało się utworzyć pliku autostartu", + "notify.fan.not_enabled": "Ręczny próg temperatury wentylatora nie jest włączony", + "notify.shortcut.toolbox_cheats": "Skróty narzędzi i cheatów nie mogą być takie same; bieżący wybór NIE zostanie zapisany", + "notify.shortcut.toolbox_cheats_long": "Długie skróty narzędzi i cheatów nie mogą być takie same; bieżący wybór NIE zostanie zapisany", + "notify.shortcut.cheats_toolbox": "Skróty cheatów i narzędzi nie mogą być takie same; bieżący wybór NIE zostanie zapisany", + "notify.shortcut.cheats_toolbox_long": "Długie skróty cheatów i narzędzi nie mogą być takie same; bieżący wybór NIE zostanie zapisany", + "notify.lang.saved": "Język zapisany. Zamknij narzędzia i otwórz je ponownie, aby zastosować.", + "notify.hook.load_assembly": "Nie udało się załadować zestawu", + "notify.hook.target": "Nie znaleziono celu haka", + "notify.hook.install": "Nie udało się zainstalować haka", + "notify.hook.lnc_image": "Nie udało się pobrać obrazu LncUtilWrapper", + "notify.hook.layer_manager": "Nie udało się pobrać klasy LayerManager", + "notify.hook.find_scene": "Nie udało się pobrać metody FindContainerSceneByPath", + "notify.hook.find_scene_exc": "Wyjątek podczas wywołania FindContainerSceneByPath", + "notify.hook.game_scene": "Nie udało się pobrać ContainerScene gry", + "notify.hook.regmgr": "Nie znaleziono sceRegMgrGetInt", + "notify.hook.kill_app": "Nie udało się wykonać detour KillAppWithReason", + "notify.hook.rnps_find": "Nie znaleziono ioctl deszyfrowania RNPS", + "notify.hook.rnps_detour": "Nie udało się wykonać detour ioctl deszyfrowania RNPS", + "notify.hook.boot": "nie udało się wykonać detour BootHelper.Boot", + "notify.hook.capture": "Nie udało się wykonać detour CaptureScreen", + "notify.hook.master": "Nie udało się pobrać adresu głównego", + "notify.app.reload_scenes": "Ponowne ładowanie scen %s", + "notify.pkg.installing": "Instalowanie pakietu z:\n%s", + "notify.pkg.finished": "Instalacja zakończona, kod: %d", + "notify.rp.reg_get": "SCE_REGMGR: nie udało się odczytać REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.reg_set": "SCE_REGMGR: nie udało się ustawić REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.reg_verify": "SCE_REGMGR: nie udało się zweryfikować REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.confirm": "sceRemoteplayConfirmDeviceRegist 0x%X stan parowania: %d błąd parowania: %d", + "notify.brand": "OnionHEN" + } +} diff --git a/source/i18n/pt-BR.json b/source/i18n/pt-BR.json index afbe56f..b05b0f1 100644 --- a/source/i18n/pt-BR.json +++ b/source/i18n/pt-BR.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "Build: %s", "about.donate": "Apoiar este projeto", diff --git a/source/i18n/ru-RU.json b/source/i18n/ru-RU.json new file mode 100644 index 0000000..f309662 --- /dev/null +++ b/source/i18n/ru-RU.json @@ -0,0 +1,316 @@ +{ + "meta": { + "id": "ru", + "bcp47": "ru-RU", + "fallback": false + }, + "toolbox": { + "root.title": "★Инструменты OnionHEN", + "group.pkg": "Установка и управление контентом", + "group.pkg.sub": "Установка PKG и управление дополнительным контентом", + "group.payloads": "Полезные нагрузки и ядро", + "group.payloads.sub": "ELF полезных нагрузок и Kstuff", + "group.game": "Игровые средства", + "group.game.sub": "Читы текущей игры", + "group.display": "Мониторинг и отображение", + "group.display.sub": "Оверлей в игре, индикаторы на начальном экране и пункт в параметрах игры", + "group.connection": "Учётная запись, связь и Remote Play", + "group.connection.sub": "Сопряжение Remote Play и сведения о подключении", + "group.system": "Система и оборудование", + "group.system.sub": "Вентилятор, режим покоя, накопители и активация лицензии", + "group.shortcuts": "Сочетания кнопок контроллера", + "group.shortcuts.sub": "Пока инструменты активны, сочетания сохраняются после перезагрузки; комбинации работают и вне игры", + "group.preferences": "Настройки", + "group.preferences.sub": "Поведение при запуске, язык инструментов и сочетания кнопок", + "group.debug": "Расширенная отладка", + "group.debug.sub": "Журналы, управление джейлбрейком приложений и среда NP", + "group.about": "О программе", + "group.about.sub": "Благодарности, поддержка и сведения о проекте", + "group.lang": "Язык интерфейса", + "group.lang.sub": "После смены закройте инструменты и откройте снова", + "pkg.installer": "Установщик пакетов", + "pkg.installer.sub": "Открыть системный установщик, чтобы поставить игры или приложения PKG", + "pkg.add_content": "Диспетчер дополнительного контента", + "pkg.add_content.sub": "Дополнения, обновления и DLC установленных игр", + "pkg.msg.options": "Параметры установщика PKG", + "pkg.msg.installing": "OnionHEN устанавливает выбранный PKG", + "pkg.msg.yes": "Да", + "pkg.msg.no": "Нет", + "pkg.msg.sort": "Сортировка PKG OnionHEN", + "pkg.msg.sort_az": "Имя (A–Я)", + "pkg.msg.sort_za": "Имя (Я–A)", + "pkg.msg.updated": "Обновлено", + "pkg.msg.wait": "Подождите...", + "pkg.msg.ok": "ОК", + "pkg.msg.cancel": "Отмена", + "pkg.msg.select_all": "Выбрать все", + "payloads.link": "Payload", + "payloads.link.sub": "Просмотр и запуск ELF из папок payloads", + "kstuff.group": "Kstuff", + "kstuff.group.sub": "Загрузка и замена патча ядра", + "kstuff.autoload": "Автозагрузка Kstuff при старте OnionHEN", + "kstuff.autoload.sub": "Если включено, патч ядра подгружается при каждом запуске OnionHEN", + "kstuff.delete": "Удалить внешний Kstuff (/data/OnionHEN/kstuff.elf)", + "kstuff.delete.desc": "После удаления OnionHEN вернётся к встроенному Kstuff", + "cheats.link": "Читы", + "cheats.link.sub": "Включать и выключать читы текущей игры", + "remote_play.link": "Remote Play", + "remote_play.link.sub": "PIN и данные учётной записи для Remote Play с телефона или ПК", + "game_opts.toggle": "Параметры игры OnionHEN", + "game_opts.toggle.sub": "Показывать пункты OnionHEN (например, читы) в меню параметров игры", + "overlay.group": "Игровой оверлей", + "overlay.group.sub": "Полоса во всю ширину + полупрозрачный чёрный фон по желанию", + "overlay.enabled": "Полоса мониторинга", + "overlay.enabled.desc": "Показывать полную полосу мониторинга в игре", + "overlay.background": "Фон полосы мониторинга", + "overlay.background.desc": "Показывать полупрозрачный фон за полосой", + "overlay.pos": "Положение полосы мониторинга", + "overlay.pos.sub": "На всю ширину у края экрана; показатели по центру: CPU · GPU · RAM · IP", + "overlay.pos.top": "Верхний край", + "overlay.pos.bottom": "Нижний край", + "overlay.gpu": "GPU", + "overlay.gpu.desc": "Температура GPU и занятость видеопамяти", + "overlay.cpu": "CPU", + "overlay.cpu.desc": "Температура CPU и средняя загрузка", + "overlay.cpu_all": "Загрузка всех ядер CPU", + "overlay.cpu_all.desc": "Показывать все 8 ядер по отдельности (полоса станет шире)", + "overlay.ram": "Память", + "overlay.ram.desc": "Занятость системной памяти", + "overlay.ip": "IP-адрес", + "overlay.ip.desc": "LAN IP консоли", + "disp_tids": "Показывать Title ID на начальном экране", + "disp_tids.sub": "Title ID каждой игры на начальном экране; только пока инструменты активны", + "fan.group": "Управление вентилятором", + "fan.group.sub": "Скорость вентилятора по порогу температуры", + "fan.enable": "Включить ручной порог вентилятора", + "fan.enable.sub": "Если выключено, действует штатная политика вентилятора", + "fan.threshold": "Порог вентилятора", + "fan.threshold.sub": "Градусы Цельсия; по достижении этой температуры вентилятор ускоряется", + "rest.group": "Режим покоя", + "rest.group.sub": "Меньше зависаний и сбоев при входе в режим покоя", + "rest.delay": "Отложить активацию инструментов (сек.)", + "rest.delay.sub": "Подождать ещё несколько секунд после выхода из режима покоя, прежде чем накладывать патчи", + "hdd.external": "Внешний HDD", + "hdd.external.sub": "Системная страница форматирования и управления внешним диском", + "license.bd": "Активация Blu-ray (лицензия)", + "license.bd.sub": "Системная страница активации лицензии дисков Blu-ray", + "startup.open_after_load": "Открывать автоматически после загрузки OnionHEN", + "startup.open_after_load.sub": "Остаться на текущем экране или вернуться на начальный", + "startup.open_after_load.confirm": "Изменения вступят в силу при следующей загрузке OnionHEN.", + "startup.open_after_load.confirm_phrase": "ОК,Отмена", + "startup.none": "Нет", + "startup.home_menu": "Начальный экран", + "sc.cheats": "Открыть меню читов", + "sc.cheats.sub": "Открывать читы с любого экрана, в том числе в игре, комбинацией кнопок", + "sc.toolbox": "Открыть инструменты OnionHEN", + "sc.toolbox.sub": "Открывать инструменты с любого экрана, в том числе в игре, комбинацией кнопок", + "sc.off": "Выкл. (без сочетания)", + "sc.r3_l3": "Удерживать R3 + L3", + "sc.l2_tri": "Удерживать L2 + △", + "sc.long_options": "Долгое нажатие Options", + "sc.long_share": "Долгое нажатие Share", + "sc.share": "Нажать Share", + "sc.l2_r3": "Удерживать L2 + R3", + "log.level": "Уровень журнала", + "log.level.sub": "Подробность журналов OnionHEN; чем выше уровень, тем больше диагностики", + "log.off": "Выкл.", + "log.error": "Только ошибки", + "log.warn": "Предупреждения и ошибки", + "log.info": "Сведения (рекомендуется)", + "log.debug": "Отладка", + "log.trace": "Трассировка", + "app_jailbreak.enabled": "Джейлбрейк приложений", + "app_jailbreak.enabled.sub": "Принимать запросы джейлбрейка от разрешённых приложений", + "debug.jb": "Уведомления о джейлбрейке приложений", + "debug.jb.sub": "Показывать уведомление после успешного джейлбрейка", + "debug.np_env": "Среда NP", + "debug.np_env.sub": "Изменить строку среды PlayStation Network; после сохранения консоль перезагрузится", + "debug.np_env.confirm": "Система перезагрузится, чтобы применить этот параметр.", + "debug.np_env.confirm_phrase": "ОК,Отмена", + "lang.list": "Язык инструментов", + "lang.list.sub": "После смены закройте инструменты и откройте снова, чтобы интерфейс полностью обновился", + "lang.system": "Язык системы", + "lang.zh": "简体中文", + "lang.zh_hant": "繁體中文", + "lang.en": "English", + "lang.ja": "日本語", + "lang.ko": "한국어", + "lang.fr": "Français", + "lang.de": "Deutsch", + "lang.it": "Italiano", + "lang.es": "Español", + "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", + "lang.ar": "العربية", + "about.build": "Сборка: %s", + "about.donate": "Поддержать проект", + "about.donate.sub": "Нравится проект? Можно поддержать его на Ko-fi", + "about.donate.methods": "★ Способы поддержки", + "about.wechat": "- WeChat | polichan01", + "about.donors": "★ Жертвователи ★", + "about.credits": "Благодарности OnionHEN", + "about.credits.sub": "Родословная, тестировщики и титры", + "about.lineage": "★ Родословная ★", + "about.lineage.etahen": "- etaHEN (LightningMods) — исходная база OnionHEN", + "about.lineage.goldhen": "- GoldHEN (SiSTR0) — духовный предшественник все-в-одном HEN для PS4", + "about.testers": "★ Спасибо тестировщикам ★", + "about.testers.intro": "Спасибо каждому, кто помог проекту вырасти. Ваше участие и поддержка двигают его дальше.", + "about.more": "Новости и обновления — в каналах публикации проекта", + "about.projects": "Проекты в составе OnionHEN", + "about.projects.sub": "Компоненты, которые реально используются или встроены в это дерево", + "about.projects.info": "★ Зависимости и встроенные компоненты этого дерева", + "payload.title": "Payload", + "payload.auto_title": "★ Автозапуск полезных нагрузок", + "payload.auto.link": "★ Автозапуск полезных нагрузок", + "payload.auto.sub": "Выбрать .elf в payloads/, которые стартуют вместе с OnionHEN", + "payload.start_stop_fmt": "Запустить/остановить %s (путь: %s) (%s)", + "payload.autostart_fmt": "Вкл./выкл. автозапуск %s (%s)", + "cheats.none": "Читы OnionHEN — игра не открыта", + "cheats.none.hint": "Сначала запустите игру, затем откройте меню читов", + "cheats.missing": "Нет читов для этой игры/версии (положите файлы в /data/OnionHEN/cheats/)", + "cheats.game_menu": "★ Читы OnionHEN", + "cheats.title_fmt": "Читы OnionHEN - %s - %s", + "cheats.ver_unknown": "Не удалось определить версию патча", + "cheats.not_running_fmt": "%s не запущена; откройте игру, чтобы включить читы", + "cheats.authors_fmt": "Авторы читов: %s", + "cheats.on_off": "Вкл./выкл.", + "cheats.enable_fmt": "Для %s: вкл./выкл. %s", + "rp.title": "Сведения о подключении Remote Play", + "rp.need_reboot": "Учётная запись активирована OnionHEN; перезагрузите консоль перед Remote Play.", + "rp.account_id_fmt": "ID учётной записи: %s", + "rp.account_id_decoded_fmt": "Декодированный ID учётной записи: %s", + "rp.pin_fmt": "PIN-код: %04u %04u ", + "rp.init_error": "Не удалось инициализировать Remote Play; выйдите со страницы и повторите", + "rp.account_error": "Не удалось прочитать ID учётной записи текущего пользователя", + "rp.pin_error": "Не удалось получить PIN Remote Play", + "rp.notify.countdown": "Сопряжение Remote Play: осталось %u с", + "rp.notify.paired": "Remote Play сопряжён, можно подключаться", + "rp.notify.timeout": "Время сопряжения Remote Play истекло", + "rp.save_usb": "Сохранить данные Remote Play на USB", + "rp.save_usb.sub": "Записать текущие PIN и данные учётной записи на вставленный USB-накопитель, чтобы смотреть на ПК", + "plapps.title": "Homebrew-нагрузки OnionHEN — приложения", + "plapps.version_fmt": "%s | версия: %s" + }, + "notifications": { + "notify.boot.starting": "OnionHEN запускается...", + "notify.boot.welcome": "Добро пожаловать в OnionHEN", + "notify.boot.goto_toolbox": "Перейти к инструментам OnionHEN", + "notify.boot.made_by": " · автор: ", + "notify.boot.cleaned_up": "OnionHEN очищен.", + "notify.kstuff.no_elf_header": "У Kstuff «%s» нет допустимого заголовка ELF.", + "notify.kstuff.loading": "Загрузка Kstuff из: %s", + "notify.net.socket_create": "Не удалось создать сокет: %s", + "notify.net.socket_options": "Не удалось задать параметры сокета: %s", + "notify.net.socket_bind": "Не удалось привязать сокет: %s", + "notify.net.socket_listen": "Не удалось начать прослушивание сокета: %s", + "notify.net.socket_accept": "Не удалось принять соединение: %s", + "notify.elfldr.need_9021": "Сначала запустите elfldr на порту 9021, затем снова OnionHEN.", + "notify.elfldr.launch_util": "не удалось запустить util через elfldr", + "notify.kstuff.load_failed": "Не удалось загрузить Kstuff, продолжаем без него", + "notify.kstuff.load_elfldr_failed": "Не удалось загрузить Kstuff через elfldr, продолжаем", + "notify.elfldr.launch_daemon": "не удалось запустить daemon через elfldr", + "notify.priv.unable": "Не удалось повысить привилегии", + "notify.mount.system_ex": "не удалось смонтировать /system_ex\nесли видите это — перезагрузите консоль", + "notify.mount.system": "не удалось смонтировать /system\nесли видите это — перезагрузите консоль", + "notify.crash.resolved": "Фатальная ошибка устранена\n\nбеспокоиться не о чем", + "notify.crash.main": "OnionHEN аварийно завершился…\n\nОтправьте /data/OnionHEN/OnionHEN_crash.log в Discord PKG-Zone: https://discord.gg/BduZHudWGj", + "notify.stack.shutdown": "Стек OnionHEN остановлен (util + ShellUI + daemon; Kstuff продолжает работать)", + "notify.fan.open_failed": "Не удалось открыть настройки вентилятора.", + "notify.fan.set_failed": "Не удалось задать скорость вентилятора.", + "notify.toolbox.no_shellui_pid": "Не удалось получить PID ShellUI", + "notify.toolbox.inject_failed": "Не удалось внедрить инструменты", + "notify.toolbox.load_failed": "Не удалось загрузить инструменты OnionHEN", + "notify.toolbox.load_timeout": "Не удалось загрузить инструменты OnionHEN (тайм-аут, ShellUI продолжает работать)", + "notify.toolbox.shellui_restarted": "SceShellUI перезапустился при загрузке инструментов OnionHEN", + "notify.util.restarting": "OnionHEN Utility не запущен, перезапуск...", + "notify.util.restarted": "Службы OnionHEN Utility успешно перезапущены", + "notify.util.restart_failed": "Не удалось перезапустить службы OnionHEN Utility — частный elfldr :9020 недоступен", + "notify.loader.recovering": "Загрузчик среды OnionHEN :9020 недоступен; восстановление через :9021...", + "notify.loader.recovered": "Загрузчик среды OnionHEN восстановлен на :9020", + "notify.loader.recover_failed": "Не удалось восстановить загрузчик :9020; нужен внешний elfldr :9021", + "notify.payload.autostart_skipped": "Автозапуск пользовательских нагрузок пропущен: частный elfldr :9020 недоступен", + "notify.rest.reactivating": "Выход из режима покоя — повторная активация инструментов OnionHEN...", + "notify.jailbreak.granted": "Приложению (PID %i) предоставлен джейлбрейк", + "notify.settings.created": "Конфигурация OnionHEN создана: /data/OnionHEN/config.ini", + "notify.settings.read_failed": "Не удалось прочитать файл настроек", + "notify.fs.size_failed": "не удалось вычислить общий размер %s", + "notify.fs.copy_file": "не удалось скопировать файл: %s", + "notify.fs.copy_recursive": "рекурсивное копирование не удалось: %s", + "notify.ipc.json_parse": "Ошибка разбора JSON", + "notify.ipc.invalid_path": "Недопустимая длина пути: %d", + "notify.fs.unmount": "Не удалось размонтировать | ошибка: %s", + "notify.fs.remount": "ошибка повторного монтирования: %s\nПуть: %s", + "notify.ipc.unused": "Эта команда больше не используется", + "notify.fan.invalid_speed": "Недопустимая скорость вентилятора: %d. Нужно значение от 0 до 100.", + "notify.fan.disabled": "Регулировка скорости вентилятора выключена.", + "notify.fan.adjusted": "Порог вентилятора установлен на %i °C.", + "notify.fan.adjust_failed": "Не удалось изменить скорость вентилятора.", + "notify.settings.reloaded": "Настройки перечитаны", + "notify.ipc.unknown_command": "Неизвестная команда 0x%X", + "notify.app.not_found": "приложение %s не найдено", + "notify.net.ip_changed": "IP-адрес изменён на %s", + "notify.util.crashed": "Демон утилит OnionHEN аварийно завершился…\n\nЧасть функций будет недоступна до перезагрузки", + "notify.util.crash_recovering": "Демон утилит OnionHEN аварийно завершился…\n\nПытаемся восстановить...", + "notify.game.tid_failed": "Не удалось получить Title ID", + "notify.game.version_failed": "Не удалось получить версию игры", + "notify.game.sfo_failed": "Не удалось прочитать файл SFO", + "notify.payload.load_failed": "Не удалось загрузить полезную нагрузку\nПуть: %s\nИдентификатор: %s", + "notify.payload.load_failed_path": "Не удалось загрузить полезную нагрузку.\nПуть: %s", + "notify.payload.launched": "Полезная нагрузка запущена\nПуть: %s\nИдентификатор: %s", + "notify.cheats.none": "Нет читов для %s версии %s.", + "notify.payload.elf_only": "Поддерживаются только нагрузки .elf:\n%s", + "notify.payload.invalid_elf": "Недопустимый файл ELF: %s", + "notify.payload.invalid_name": "Недопустимое имя ELF: %s", + "notify.payload.loading": "Загрузка полезной нагрузки %s...", + "notify.payload.launch_failed": "Не удалось запустить полезную нагрузку %s (%s)", + "notify.app.launch_failed": "Не удалось запустить приложение, код ошибки: %d", + "notify.app.launching": "Запуск приложения %s, проверка патчей...", + "notify.app.launch_returned": "LaunchApp вернул: %d", + "notify.cheats.game_not_running": "Игра не запущена; сначала запустите её, затем включайте читы", + "notify.cheats.no_pid": "[ОШИБКА] Не удалось включить %s\nPID игры не найден", + "notify.cheats.toggle_banner": "★ %s [%s] ★", + "notify.common.on": "ВКЛ", + "notify.common.off": "ВЫКЛ", + "notify.cheats.activate_failed": "[ОШИБКА] Не удалось включить %s", + "notify.kstuff.next_boot_on": "Kstuff будет загружен при следующем запуске", + "notify.kstuff.next_boot_off": "Kstuff НЕ будет загружен при следующем запуске", + "notify.kstuff.deleted": "Внешний Kstuff удалён", + "notify.rp.usb_missing": "Не удалось сохранить данные Remote Play, USB не найден", + "notify.rp.save_open_failed": "Не удалось открыть файл данных Remote Play", + "notify.rp.saved": "Данные Remote Play сохранены в /mnt%s", + "notify.overlay.disable_cpu_first": "Чтобы выключить мониторинг CPU, сначала отключите «загрузку всех ядер CPU»", + "notify.overlay.enable_cpu_first": "Чтобы сменить режим мониторинга CPU, сначала включите мониторинг CPU", + "notify.process.killed": "%s завершён", + "notify.payload.autostart_file": "Не удалось создать файл автозапуска", + "notify.fan.not_enabled": "Ручной порог температуры вентилятора не включён", + "notify.shortcut.toolbox_cheats": "Сочетания инструментов и читов не могут совпадать; текущий выбор НЕ будет сохранён", + "notify.shortcut.toolbox_cheats_long": "Длинные сочетания инструментов и читов не могут совпадать; текущий выбор НЕ будет сохранён", + "notify.shortcut.cheats_toolbox": "Сочетания читов и инструментов не могут совпадать; текущий выбор НЕ будет сохранён", + "notify.shortcut.cheats_toolbox_long": "Длинные сочетания читов и инструментов не могут совпадать; текущий выбор НЕ будет сохранён", + "notify.lang.saved": "Язык сохранён. Закройте инструменты и откройте снова, чтобы применить.", + "notify.hook.load_assembly": "Не удалось загрузить сборку", + "notify.hook.target": "Цель перехвата не найдена", + "notify.hook.install": "Не удалось установить перехват", + "notify.hook.lnc_image": "Не удалось получить образ LncUtilWrapper", + "notify.hook.layer_manager": "Не удалось получить класс LayerManager", + "notify.hook.find_scene": "Не удалось получить метод FindContainerSceneByPath", + "notify.hook.find_scene_exc": "Исключение при вызове FindContainerSceneByPath", + "notify.hook.game_scene": "Не удалось получить ContainerScene игры", + "notify.hook.regmgr": "sceRegMgrGetInt не найден", + "notify.hook.kill_app": "Сбой обхода KillAppWithReason", + "notify.hook.rnps_find": "ioctl расшифровки RNPS не найден", + "notify.hook.rnps_detour": "Сбой обхода ioctl расшифровки RNPS", + "notify.hook.boot": "сбой обхода BootHelper.Boot", + "notify.hook.capture": "Сбой обхода CaptureScreen", + "notify.hook.master": "Не удалось получить главный адрес", + "notify.app.reload_scenes": "Перезагрузка сцен %s", + "notify.pkg.installing": "Установка пакета из:\n%s", + "notify.pkg.finished": "Установка завершена, код: %d", + "notify.rp.reg_get": "SCE_REGMGR: не удалось прочитать REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.reg_set": "SCE_REGMGR: не удалось задать REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.reg_verify": "SCE_REGMGR: не удалось проверить REMOTEPLAY_rp_enable (0x%x)", + "notify.rp.confirm": "sceRemoteplayConfirmDeviceRegist 0x%X состояние сопряжения: %d ошибка сопряжения: %d", + "notify.brand": "OnionHEN" + } +} diff --git a/source/i18n/zh-CN.json b/source/i18n/zh-CN.json index 00aa464..aec9a32 100644 --- a/source/i18n/zh-CN.json +++ b/source/i18n/zh-CN.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "构建版本:%s", "about.donate": "支持本项目", diff --git a/source/i18n/zh-TW.json b/source/i18n/zh-TW.json index 3d60f5a..517e4fe 100644 --- a/source/i18n/zh-TW.json +++ b/source/i18n/zh-TW.json @@ -138,7 +138,10 @@ "lang.fr": "Français", "lang.de": "Deutsch", "lang.es": "Español", + "lang.it": "Italiano", "lang.pt_br": "Português (Brasil)", + "lang.pl": "Polski", + "lang.ru": "Русский", "lang.ar": "العربية", "about.build": "組建版本:%s", "about.donate": "支持本專案", diff --git a/source/libonion_platform/include/onion/notify_i18n.h b/source/libonion_platform/include/onion/notify_i18n.h index f36864c..e637b95 100644 --- a/source/libonion_platform/include/onion/notify_i18n.h +++ b/source/libonion_platform/include/onion/notify_i18n.h @@ -19,6 +19,9 @@ typedef enum onion_notify_language { ONION_NOTIFY_LANG_KO = 7, ONION_NOTIFY_LANG_ES = 8, ONION_NOTIFY_LANG_PT_BR = 9, + ONION_NOTIFY_LANG_IT = 10, + ONION_NOTIFY_LANG_RU = 11, + ONION_NOTIFY_LANG_PL = 12, } onion_notify_language_t; /** Select the resolved language used by plain and rich notifications. */ @@ -30,10 +33,11 @@ onion_notify_language_t onion_notify_get_language(void); /** * Resolve the shared toolbox language setting. * ui_language: 0=system, 1=zh-Hans, 2=en, 3=ar, 4=zh-Hant, 5=ja, 6=fr, - * 7=de, 8=ko, 9=es, 10=pt-BR. + * 7=de, 8=ko, 9=es, 10=pt-BR, 11=it, 12=ru, 13=pl. * system_language is the value returned for SCE_SYSTEM_SERVICE_PARAM_ID_LANG - * (0=Japanese, 2/22=French, 3/20=Spanish, 4=German, 7/17=Portuguese, - * 9=Korean, 10=zh-Hant, 11=zh-Hans, 21=Arabic; anything else follows English). + * (0=Japanese, 2/22=French, 3/20=Spanish, 4=German, 5=Italian, + * 7/17=Portuguese, 8=Russian, 9=Korean, 10=zh-Hant, 11=zh-Hans, + * 16=Polish, 21=Arabic; anything else follows English). */ onion_notify_language_t onion_notify_resolve_language(int ui_language, int system_language); diff --git a/source/libonion_platform/source/notify_i18n.c b/source/libonion_platform/source/notify_i18n.c index 4a68931..0fb5ad0 100644 --- a/source/libonion_platform/source/notify_i18n.c +++ b/source/libonion_platform/source/notify_i18n.c @@ -13,7 +13,7 @@ static atomic_int gLanguage = ATOMIC_VAR_INIT(ONION_NOTIFY_LANG_EN); static int language_is_known(onion_notify_language_t language) { return language >= ONION_NOTIFY_LANG_ZH_HANS && - language <= ONION_NOTIFY_LANG_PT_BR; + language <= ONION_NOTIFY_LANG_PL; } static const char *locale_id_for_language(onion_notify_language_t language) { @@ -36,6 +36,12 @@ static const char *locale_id_for_language(onion_notify_language_t language) { return "es"; case ONION_NOTIFY_LANG_PT_BR: return "pt-BR"; + case ONION_NOTIFY_LANG_IT: + return "it"; + case ONION_NOTIFY_LANG_RU: + return "ru"; + case ONION_NOTIFY_LANG_PL: + return "pl"; case ONION_NOTIFY_LANG_EN: default: return "en"; @@ -87,6 +93,12 @@ onion_notify_language_t onion_notify_resolve_language(int ui_language, return ONION_NOTIFY_LANG_ES; case 10: return ONION_NOTIFY_LANG_PT_BR; + case 11: + return ONION_NOTIFY_LANG_IT; + case 12: + return ONION_NOTIFY_LANG_RU; + case 13: + return ONION_NOTIFY_LANG_PL; default: break; } @@ -103,15 +115,21 @@ onion_notify_language_t onion_notify_resolve_language(int ui_language, return ONION_NOTIFY_LANG_ES; case 4: /* German */ return ONION_NOTIFY_LANG_DE; + case 5: /* Italian */ + return ONION_NOTIFY_LANG_IT; case 7: /* Portuguese (Portugal) */ case 17: /* Portuguese (Brazil) */ return ONION_NOTIFY_LANG_PT_BR; + case 8: /* Russian */ + return ONION_NOTIFY_LANG_RU; case 9: /* Korean */ return ONION_NOTIFY_LANG_KO; case 10: /* Traditional Chinese */ return ONION_NOTIFY_LANG_ZH_HANT; case 11: /* Simplified Chinese */ return ONION_NOTIFY_LANG_ZH_HANS; + case 16: /* Polish */ + return ONION_NOTIFY_LANG_PL; case 21: /* Arabic */ return ONION_NOTIFY_LANG_AR; default: diff --git a/source/libonion_settings/include/onion/settings.hpp b/source/libonion_settings/include/onion/settings.hpp index bbd8283..401f30e 100644 --- a/source/libonion_settings/include/onion/settings.hpp +++ b/source/libonion_settings/include/onion/settings.hpp @@ -62,6 +62,9 @@ inline constexpr int kUiLanguageDe = 7; inline constexpr int kUiLanguageKo = 8; inline constexpr int kUiLanguageEs = 9; inline constexpr int kUiLanguagePtBr = 10; +inline constexpr int kUiLanguageIt = 11; +inline constexpr int kUiLanguageRu = 12; +inline constexpr int kUiLanguagePl = 13; inline constexpr int kStartupOpenNone = 0; inline constexpr int kStartupOpenHomeMenu = 1; @@ -147,7 +150,8 @@ struct Settings { // [toolbox] // 0 = system (default), 1 = zh-Hans, 2 = en, 3 = ar, 4 = zh-Hant, - // 5 = ja, 6 = fr, 7 = de, 8 = ko, 9 = es, 10 = pt-BR + // 5 = ja, 6 = fr, 7 = de, 8 = ko, 9 = es, 10 = pt-BR, 11 = it, + // 12 = ru, 13 = pl int ui_lang = kUiLanguageSystem; // [logging] diff --git a/source/libonion_settings/source/settings.cpp b/source/libonion_settings/source/settings.cpp index d110c38..7f85aba 100644 --- a/source/libonion_settings/source/settings.cpp +++ b/source/libonion_settings/source/settings.cpp @@ -148,6 +148,20 @@ int parse_language(const char *s, int def) { streq_ci(s, "pt_pt")) { return kUiLanguagePtBr; } + if (streq_ci(s, "it") || streq_ci(s, "italian") || + streq_ci(s, "it-IT") || streq_ci(s, "it_it") || + streq_ci(s, "italiano")) { + return kUiLanguageIt; + } + if (streq_ci(s, "ru") || streq_ci(s, "russian") || + streq_ci(s, "ru-RU") || streq_ci(s, "ru_ru")) { + return kUiLanguageRu; + } + if (streq_ci(s, "pl") || streq_ci(s, "polish") || + streq_ci(s, "pl-PL") || streq_ci(s, "pl_pl") || + streq_ci(s, "polski")) { + return kUiLanguagePl; + } return def; } @@ -175,6 +189,12 @@ const char *language_name(int v) { return "es"; case kUiLanguagePtBr: return "pt-BR"; + case kUiLanguageIt: + return "it"; + case kUiLanguageRu: + return "ru"; + case kUiLanguagePl: + return "pl"; case kUiLanguageSystem: default: return "system"; @@ -600,7 +620,7 @@ std::string settings_serialize(const Settings &in) { b += "\n"; b += "[toolbox]\n"; b += "# language controls the Toolbox UI and notification language.\n"; - b += "# Available values: system, zh-Hans, zh-Hant, en, ja, ko, fr, de, es, pt-BR, ar\n"; + b += "# Available values: system, zh-Hans, zh-Hant, en, ja, ko, fr, de, it, es, pt-BR, pl, ru, ar\n"; b += "# system follows the PS5 system language when it can be detected.\n"; b += "language=" + std::string(language_name(in.ui_lang)) + "\n"; b += "\n"; diff --git a/source/shellui/include/toolbox_i18n.hpp b/source/shellui/include/toolbox_i18n.hpp index 94c6444..b321199 100644 --- a/source/shellui/include/toolbox_i18n.hpp +++ b/source/shellui/include/toolbox_i18n.hpp @@ -22,6 +22,9 @@ enum class Lang : int { Ko = 7, Es = 8, PtBr = 9, + It = 10, + Ru = 11, + Pl = 12, }; /** Active language for tr() (from settings or explicit set). */ @@ -33,15 +36,16 @@ int active_ui_lang_value(); /** * Apply an explicit UI language setting value. * 1=zh-Hans, 2=en, 3=ar, 4=zh-Hant, 5=ja, 6=fr, 7=de, 8=ko, 9=es, - * 10=pt-BR. Invalid values fall back to zh-Hans. + * 10=pt-BR, 11=it, 12=ru, 13=pl. Invalid values fall back to zh-Hans. */ void apply_ui_lang(int ui_lang); /** * Apply the stored UI language setting. * 0=system, 1=zh-Hans, 2=en, 3=ar, 4=zh-Hant, 5=ja, 6=fr, 7=de, 8=ko, - * 9=es, 10=pt-BR. This is a configuration boundary: system is queried - * here once, then XML and notifications reuse the resolved language. + * 9=es, 10=pt-BR, 11=it, 12=ru, 13=pl. This is a configuration + * boundary: system is queried here once, then XML and notifications + * reuse the resolved language. */ void apply_system_or_ui_lang(int ui_lang); diff --git a/source/shellui/src/onpress_system.cpp b/source/shellui/src/onpress_system.cpp index 27b7a91..cd7bb61 100644 --- a/source/shellui/src/onpress_system.cpp +++ b/source/shellui/src/onpress_system.cpp @@ -88,7 +88,7 @@ static OnPressResult id_custom_game_opts(OnPressContext &ctx) { static OnPressResult id_ui_lang(OnPressContext &ctx) { int v = atoi(ctx.value.c_str()); - if (v < onion::kUiLanguageSystem || v > onion::kUiLanguagePtBr) + if (v < onion::kUiLanguageSystem || v > onion::kUiLanguagePl) v = onion::kUiLanguageSystem; if (v == g_settings.ui_lang) return OnPressResult::EarlyReturn; diff --git a/source/shellui/src/toolbox_i18n.cpp b/source/shellui/src/toolbox_i18n.cpp index 26d2e3c..216be99 100644 --- a/source/shellui/src/toolbox_i18n.cpp +++ b/source/shellui/src/toolbox_i18n.cpp @@ -45,6 +45,12 @@ Lang lang_from_notify(onion_notify_language_t language) { return Lang::Es; case ONION_NOTIFY_LANG_PT_BR: return Lang::PtBr; + case ONION_NOTIFY_LANG_IT: + return Lang::It; + case ONION_NOTIFY_LANG_RU: + return Lang::Ru; + case ONION_NOTIFY_LANG_PL: + return Lang::Pl; case ONION_NOTIFY_LANG_EN: default: return Lang::En; @@ -71,6 +77,12 @@ onion_notify_language_t notify_from_lang(Lang lang) { return ONION_NOTIFY_LANG_ES; case Lang::PtBr: return ONION_NOTIFY_LANG_PT_BR; + case Lang::It: + return ONION_NOTIFY_LANG_IT; + case Lang::Ru: + return ONION_NOTIFY_LANG_RU; + case Lang::Pl: + return ONION_NOTIFY_LANG_PL; case Lang::En: default: return ONION_NOTIFY_LANG_EN; @@ -97,6 +109,12 @@ Lang lang_from_ui_value(int ui_lang) { return Lang::Es; case 10: return Lang::PtBr; + case 11: + return Lang::It; + case 12: + return Lang::Ru; + case 13: + return Lang::Pl; case 1: default: return Lang::ZhHans; @@ -123,6 +141,12 @@ const char *locale_id_for_lang(Lang lang) { return "es"; case Lang::PtBr: return "pt-BR"; + case Lang::It: + return "it"; + case Lang::Ru: + return "ru"; + case Lang::Pl: + return "pl"; case Lang::En: default: return "en"; @@ -162,6 +186,12 @@ int active_ui_lang_value() { return 9; case Lang::PtBr: return 10; + case Lang::It: + return 11; + case Lang::Ru: + return 12; + case Lang::Pl: + return 13; case Lang::ZhHans: default: return 1; @@ -170,7 +200,7 @@ int active_ui_lang_value() { void set_lang(Lang lang) { if (static_cast(lang) < static_cast(Lang::ZhHans) || - lang > Lang::PtBr) + lang > Lang::Pl) lang = Lang::ZhHans; onion_notify_set_language(notify_from_lang(lang)); } diff --git a/source/shellui/src/toolbox_xml.cpp b/source/shellui/src/toolbox_xml.cpp index 3cfd8b9..da8154d 100644 --- a/source/shellui/src/toolbox_xml.cpp +++ b/source/shellui/src/toolbox_xml.cpp @@ -632,8 +632,11 @@ void append_toolbox_preferences_group(ps5ui::Group& g) { .item("id_ui_lang_ko", toolbox_i18n::tr("lang.ko"), "8") .item("id_ui_lang_fr", toolbox_i18n::tr("lang.fr"), "6") .item("id_ui_lang_de", toolbox_i18n::tr("lang.de"), "7") + .item("id_ui_lang_it", toolbox_i18n::tr("lang.it"), "11") .item("id_ui_lang_es", toolbox_i18n::tr("lang.es"), "9") .item("id_ui_lang_pt_br", toolbox_i18n::tr("lang.pt_br"), "10") + .item("id_ui_lang_pl", toolbox_i18n::tr("lang.pl"), "13") + .item("id_ui_lang_ru", toolbox_i18n::tr("lang.ru"), "12") .item("id_ui_lang_ar", toolbox_i18n::tr("lang.ar"), "3"); }, toolbox_i18n::tr("lang.list.sub"), toolbox_val("id_ui_lang", "0")) diff --git a/source/util/tests/test_platform_notify.c b/source/util/tests/test_platform_notify.c index ad8fc9f..6ab7f64 100644 --- a/source/util/tests/test_platform_notify.c +++ b/source/util/tests/test_platform_notify.c @@ -68,6 +68,12 @@ static int test_notify_language_resolution(void) { onion_notify_resolve_language(9, 1)); TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_PT_BR, onion_notify_resolve_language(10, 1)); + TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_IT, + onion_notify_resolve_language(11, 1)); + TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_RU, + onion_notify_resolve_language(12, 1)); + TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_PL, + onion_notify_resolve_language(13, 1)); TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_AR, onion_notify_resolve_language(0, 21)); TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_JA, @@ -94,6 +100,12 @@ static int test_notify_language_resolution(void) { onion_notify_resolve_language(0, 17)); TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_PT_BR, onion_notify_resolve_language(0, 7)); + TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_IT, + onion_notify_resolve_language(0, 5)); + TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_RU, + onion_notify_resolve_language(0, 8)); + TEST_ASSERT_EQ_INT(ONION_NOTIFY_LANG_PL, + onion_notify_resolve_language(0, 16)); return 0; } @@ -130,6 +142,15 @@ static int test_notify_format_localized(void) { onion_notify_set_language(ONION_NOTIFY_LANG_PT_BR); format_msg(out, sizeof(out), 1, "notify.priv.unable"); TEST_ASSERT_STREQ("[OnionHEN] Não foi possível elevar os privilégios", out); + onion_notify_set_language(ONION_NOTIFY_LANG_IT); + format_msg(out, sizeof(out), 1, "notify.priv.unable"); + TEST_ASSERT_STREQ("[OnionHEN] Impossibile elevare i privilegi", out); + onion_notify_set_language(ONION_NOTIFY_LANG_RU); + format_msg(out, sizeof(out), 1, "notify.priv.unable"); + TEST_ASSERT_STREQ("[OnionHEN] Не удалось повысить привилегии", out); + onion_notify_set_language(ONION_NOTIFY_LANG_PL); + format_msg(out, sizeof(out), 1, "notify.priv.unable"); + TEST_ASSERT_STREQ("[OnionHEN] Nie udało się podnieść uprawnień", out); return 0; } diff --git a/source/util/tests/test_settings.cpp b/source/util/tests/test_settings.cpp index c1f78e2..f921e8e 100644 --- a/source/util/tests/test_settings.cpp +++ b/source/util/tests/test_settings.cpp @@ -430,6 +430,9 @@ static int test_language_new_locales_roundtrip(void) { {onion::kUiLanguageKo, "ko", "ko-KR"}, {onion::kUiLanguageEs, "es", "es-MX"}, {onion::kUiLanguagePtBr, "pt-BR", "portuguese"}, + {onion::kUiLanguageIt, "it", "italiano"}, + {onion::kUiLanguageRu, "ru", "ru-RU"}, + {onion::kUiLanguagePl, "pl", "polski"}, }; for (const auto &c : cases) { diff --git a/source/util/tests/test_toolbox_i18n.cpp b/source/util/tests/test_toolbox_i18n.cpp index c88fe54..3515fc2 100644 --- a/source/util/tests/test_toolbox_i18n.cpp +++ b/source/util/tests/test_toolbox_i18n.cpp @@ -190,6 +190,40 @@ static int test_pt_br(void) { return 0; } +static int test_it(void) { + set_lang(Lang::It); + TEST_ASSERT_TRUE( + std::strcmp(tr("root.title"), "★Cassetta degli attrezzi OnionHEN") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("cheats.link"), "Trucchi") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("rest.group"), "Modalità riposo") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("lang.it"), "Italiano") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("cheats.enable_fmt"), + "Per %s, attiva/disattiva %s") == 0); + return 0; +} + +static int test_ru(void) { + set_lang(Lang::Ru); + TEST_ASSERT_TRUE(std::strcmp(tr("root.title"), "★Инструменты OnionHEN") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("cheats.link"), "Читы") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("rest.group"), "Режим покоя") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("lang.ru"), "Русский") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("cheats.enable_fmt"), + "Для %s: вкл./выкл. %s") == 0); + return 0; +} + +static int test_pl(void) { + set_lang(Lang::Pl); + TEST_ASSERT_TRUE(std::strcmp(tr("root.title"), "★Narzędzia OnionHEN") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("cheats.link"), "Cheaty") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("rest.group"), "Tryb spoczynku") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("lang.pl"), "Polski") == 0); + TEST_ASSERT_TRUE(std::strcmp(tr("cheats.enable_fmt"), + "Dla %s: włącz/wyłącz %s") == 0); + return 0; +} + static int test_apply_ui_lang(void) { apply_ui_lang(2); TEST_ASSERT_TRUE(active_lang() == Lang::En); @@ -221,6 +255,15 @@ static int test_apply_ui_lang(void) { apply_ui_lang(10); TEST_ASSERT_TRUE(active_lang() == Lang::PtBr); TEST_ASSERT_EQ_INT(10, active_ui_lang_value()); + apply_ui_lang(11); + TEST_ASSERT_TRUE(active_lang() == Lang::It); + TEST_ASSERT_EQ_INT(11, active_ui_lang_value()); + apply_ui_lang(12); + TEST_ASSERT_TRUE(active_lang() == Lang::Ru); + TEST_ASSERT_EQ_INT(12, active_ui_lang_value()); + apply_ui_lang(13); + TEST_ASSERT_TRUE(active_lang() == Lang::Pl); + TEST_ASSERT_EQ_INT(13, active_ui_lang_value()); apply_ui_lang(99); /* invalid → zh */ TEST_ASSERT_TRUE(active_lang() == Lang::ZhHans); return 0; @@ -272,6 +315,15 @@ static int test_format(void) { set_lang(Lang::PtBr); TEST_ASSERT_TRUE(format("cheats.enable_fmt", "Game", "God") == "Para Game, ativar/desativar God"); + set_lang(Lang::It); + TEST_ASSERT_TRUE(format("cheats.enable_fmt", "Game", "God") == + "Per Game, attiva/disattiva God"); + set_lang(Lang::Ru); + TEST_ASSERT_TRUE(format("cheats.enable_fmt", "Game", "God") == + "Для Game: вкл./выкл. God"); + set_lang(Lang::Pl); + TEST_ASSERT_TRUE(format("cheats.enable_fmt", "Game", "God") == + "Dla Game: włącz/wyłącz God"); return 0; } @@ -287,6 +339,9 @@ extern "C" int test_toolbox_i18n_suite(void) { fails += onion_test_run("i18n.ko", test_ko); fails += onion_test_run("i18n.es", test_es); fails += onion_test_run("i18n.pt_br", test_pt_br); + fails += onion_test_run("i18n.it", test_it); + fails += onion_test_run("i18n.ru", test_ru); + fails += onion_test_run("i18n.pl", test_pl); fails += onion_test_run("i18n.apply_ui_lang", test_apply_ui_lang); fails += onion_test_run("i18n.system_lang_host_fallback", test_system_lang_host_fallback);