From 78a00399ab3aad595242386eb9e65a58e78a4397 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 10 Jul 2026 16:07:28 +0200 Subject: [PATCH 1/4] Allow to define and modify custom names for saved states --- Core/SaveState.cpp | 16 ++++++++++++++-- Core/SaveState.h | 3 +++ UI/PauseScreen.cpp | 31 +++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 1dee9fa660..a0972237e0 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -66,6 +66,7 @@ constexpr int SCREENSHOT_FAILURE_RETRIES = 6; static const char * const STATE_EXTENSION = "ppst"; static const char * const UNDO_STATE_EXTENSION = "undo.ppst"; static const char * const UNDO_SCREENSHOT_EXTENSION = "undo.jpg"; +static const char * const NAME_EXTENSION = "txt"; static const char * const LOAD_UNDO_NAME = "load_undo.ppst"; @@ -469,12 +470,10 @@ int g_screenshotFailures; if (NetworkWarnUserIfOnlineAndCantSavestate()) { return; } - Path fn = GenerateSaveSlotPath(gamePrefix, slot, STATE_EXTENSION); Path fnUndo = GenerateSaveSlotPath(gamePrefix, slot, UNDO_STATE_EXTENSION); if (!fn.empty()) { Path shot = GenerateSaveSlotPath(gamePrefix, slot, SCREENSHOT_EXTENSION); - std::string prefix(gamePrefix); auto renameCallback = [fn, fnUndo, prefix, slot, callback](Status status, std::string_view message, std::string_view metadata) { if (status != Status::FAILURE) { @@ -535,10 +534,12 @@ int g_screenshotFailures; void DeleteSlot(std::string_view gamePrefix, int slot) { Path fn = GenerateSaveSlotPath(gamePrefix, slot, STATE_EXTENSION); Path shot = GenerateSaveSlotPath(gamePrefix, slot, SCREENSHOT_EXTENSION); + Path fnName = GenerateSaveSlotPath(gamePrefix, slot, NAME_EXTENSION); if (File::Exists(fn)) { DeleteIfExists(fn); DeleteIfExists(shot); + DeleteIfExists(fnName); } Rescan(gamePrefix); } @@ -706,6 +707,17 @@ int g_screenshotFailures; return GetSaveFileDateAsString(fn); } + std::string GetSlotCustomName(std::string_view gamePrefix, int slot) { + Path path = GenerateSaveSlotPath(gamePrefix, slot, NAME_EXTENSION); + std::string result = ""; + File::ReadBinaryFileToString(path, &result); + return result; + } + + void SetSlotCustomName(std::string_view gamePrefix, int slot, std::string_view new_name){ + File::WriteStringToFile(true, new_name, GenerateSaveSlotPath(gamePrefix, slot, NAME_EXTENSION)); + } + std::vector Flush() { std::lock_guard guard(mutex); std::vector copy = g_pendingOperations; diff --git a/Core/SaveState.h b/Core/SaveState.h index ba5ae44f0b..b20a689c53 100644 --- a/Core/SaveState.h +++ b/Core/SaveState.h @@ -74,7 +74,10 @@ namespace SaveState { int GetOldestSlot(std::string_view gamePrefix); std::string GetSlotDateAsString(std::string_view gamePrefix, int slot); + + std::string GetSlotCustomName(std::string_view gamePrefix, int slot); Path GenerateSaveSlotPath(std::string_view gamePrefix, int slot, const char *extension); + void SetSlotCustomName(std::string_view gamePrefix, int slot, std::string_view newName); std::string GetTitle(const Path &filename); diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 478fa0adc3..9c3007cfca 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -135,6 +135,7 @@ protected: grid->Add(undoButton)->OnClick.Handle(this, &ScreenshotViewScreen::OnUndoState); } grid->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK")))->OnClick.Handle(this, &UIScreen::OnBack); + grid->Add(new Choice(di->T("Modify State Name"), ImageID("I_EDIT_TEXT")))->OnClick.Handle(this, &ScreenshotViewScreen::OnChangeState); scroll->Add(content); parent->Add(scroll); @@ -145,11 +146,13 @@ private: void OnLoadState(UI::EventParams &e); void OnUndoState(UI::EventParams &e); void OnDeleteState(UI::EventParams &e); + void OnChangeState(UI::EventParams &e); Path screenshotFilename_; Path gamePath_; std::string saveStatePrefix_; std::string title_; + std::string customNameTemp_; int slot_; }; @@ -204,6 +207,19 @@ void ScreenshotViewScreen::OnDeleteState(UI::EventParams &e) { })); } +void ScreenshotViewScreen::OnChangeState(UI::EventParams &e) { + auto di = GetI18NCategory(I18NCat::DIALOG); + + customNameTemp_ = SaveState::GetSlotCustomName(saveStatePrefix_, slot_); + + UI::TextEditPopupScreen *popupScreen = new UI::TextEditPopupScreen(&customNameTemp_, "", di->T("Modify the state name"), 64); + popupScreen->OnChange.Add([this](UI::EventParams &e) { + SaveState::SetSlotCustomName(saveStatePrefix_, slot_, customNameTemp_); + TriggerFinish(DR_YES); // DR_YES signals that we need a refresh, but not to close the pause menu. + }); + screenManager()->push(popupScreen); +} + class SaveSlotView : public UI::LinearLayout { public: SaveSlotView(std::string_view saveStatePrefix, int slot, UI::LayoutParams *layoutParams = nullptr); @@ -226,6 +242,10 @@ public: return SaveState::GetSlotDateAsString(saveStatePrefix_, slot_); } + std::string GetCustomName() const { + return SaveState::GetSlotCustomName(saveStatePrefix_, slot_); + } + UI::Event OnStateLoaded; UI::Event OnStateSaved; UI::Event OnScreenshotClicked; @@ -277,7 +297,6 @@ SaveSlotView::SaveSlotView(std::string_view saveStatePrefix, int slot, UI::Layou saveStateButton_ = buttons->Add(new Button(pa->T("Save State"), new LinearLayoutParams(0.0, Gravity::G_VCENTER))); saveStateButton_->OnClick.Handle(this, &SaveSlotView::OnSaveState); - fv->OnClick.Add([this](UI::EventParams &e) { e.v = this; OnScreenshotClicked.Trigger(e); @@ -289,6 +308,14 @@ SaveSlotView::SaveSlotView(std::string_view saveStatePrefix, int slot, UI::Layou loadStateButton_->OnClick.Handle(this, &SaveSlotView::OnLoadState); } + std::string nameStr = SaveState::GetSlotCustomName(saveStatePrefix_, slot_); + + if (!nameStr.empty()) { + TextView *nameView = new TextView(nameStr, new LinearLayoutParams(0.0, Gravity::G_VCENTER)); + nameView->SetSmall(true); + lines->Add(nameView)->SetShadow(true); + } + std::string dateStr = SaveState::GetSlotDateAsString(saveStatePrefix_, slot_); if (slot_ == g_Config.iAutoLoadSaveState - 3) { @@ -425,7 +452,7 @@ void GamePauseScreen::CreateSavestateControls(UI::LinearLayout *leftColumnItems, g_Config.iCurrentStateSlot = v->GetSlot(); if (SaveState::HasSaveInSlot(saveStatePrefix_, slot)) { Path fn = v->GetScreenshotFilename(); - std::string title = v->GetScreenshotTitle(); + std::string title = v->GetCustomName(); Screen *screen = new ScreenshotViewScreen(fn, saveStatePrefix_, title, v->GetSlot(), gamePath_); screenManager()->push(screen); } From 55f53d452323f9710a97a3fa5367fb4d1f7eb1b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 12 Sep 2026 10:56:34 -0600 Subject: [PATCH 2/4] Savestate names: read from the cached listing, and tidy up the name files GetSlotCustomName hit the disk for every slot each time the pause screen built its views, almost always for a file that isn't there. Rescan's listing already knows, and HasSaveInSlot - which gates whether the name is even shown - reads the same map, so this can't hide a name the old code would have found. SetSlotCustomName now rescans, so a rename is visible without depending on the pause screen happening to rescan on its way back. Also: clearing a name deletes the file instead of leaving an empty one behind, and the extension is "name.txt" rather than plain "txt", so an unrelated "_.txt" in the savestate folder isn't read as a slot name. Co-Authored-By: Claude Opus 5 (1M context) --- Core/SaveState.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index a0972237e0..1dfa5a86ee 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -66,7 +66,9 @@ constexpr int SCREENSHOT_FAILURE_RETRIES = 6; static const char * const STATE_EXTENSION = "ppst"; static const char * const UNDO_STATE_EXTENSION = "undo.ppst"; static const char * const UNDO_SCREENSHOT_EXTENSION = "undo.jpg"; -static const char * const NAME_EXTENSION = "txt"; +// Namespaced the way UNDO_STATE_EXTENSION is, so a stray "_.txt" someone happened to +// leave in the savestate folder isn't mistaken for a slot's name. +static const char * const NAME_EXTENSION = "name.txt"; static const char * const LOAD_UNDO_NAME = "load_undo.ppst"; @@ -708,14 +710,29 @@ int g_screenshotFailures; } std::string GetSlotCustomName(std::string_view gamePrefix, int slot) { + // Most slots don't have a name file, and this gets called for every slot each time the + // pause screen builds its views - so consult the listing before touching the disk. + if (!SaveStateFileExists(gamePrefix, slot, NAME_EXTENSION)) { + return std::string(); + } Path path = GenerateSaveSlotPath(gamePrefix, slot, NAME_EXTENSION); - std::string result = ""; + std::string result; File::ReadBinaryFileToString(path, &result); return result; } void SetSlotCustomName(std::string_view gamePrefix, int slot, std::string_view new_name){ - File::WriteStringToFile(true, new_name, GenerateSaveSlotPath(gamePrefix, slot, NAME_EXTENSION)); + const Path path = GenerateSaveSlotPath(gamePrefix, slot, NAME_EXTENSION); + if (new_name.empty()) { + // Clearing the name. Leaving an empty file behind would work, but it'd stay in the + // savestate folder for good - a slot with no name shouldn't have a name file. + DeleteIfExists(path); + } else { + File::WriteStringToFile(true, new_name, path); + } + // What we just wrote (or removed) isn't reflected in the listing GetSlotCustomName reads, + // so without this the change wouldn't show up until something else happened to rescan. + Rescan(gamePrefix); } std::vector Flush() { From 6600d1c05f9434cec7d63d0f01b7bd16bb5d4e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 12 Sep 2026 11:55:21 -0600 Subject: [PATCH 3/4] Savestate browser: delete the screenshot and name file along with the state Deleting a savestate from the savedata screen goes through GameInfo::Delete, not SaveState::DeleteSlot, and it only knew about the .jpg - so the slot's .name.txt was left behind with nothing to belong to. Rather than teach the UI the naming scheme a third time, SaveState now answers what sits beside a state. Co-Authored-By: Claude Opus 5 (1M context) --- Core/SaveState.cpp | 15 +++++++++++++++ Core/SaveState.h | 6 ++++++ UI/GameInfoCache.cpp | 8 +++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 1dfa5a86ee..810b82f0db 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -735,6 +735,21 @@ int g_screenshotFailures; Rescan(gamePrefix); } + std::vector GetCompanionFilePaths(const Path &statePath) { + const std::string stateExtension = std::string(".") + STATE_EXTENSION; + // A path that isn't a savestate yields nothing, which WithReplacedExtension now tells us + // rather than handing back the path itself. An undo state does work, and correctly: + // "x.undo.ppst" maps onto "x.undo.jpg". + std::vector paths; + for (const char *extension : { SCREENSHOT_EXTENSION, NAME_EXTENSION }) { + Path companion; + if (statePath.WithReplacedExtension(stateExtension, std::string(".") + extension, &companion)) { + paths.push_back(companion); + } + } + return paths; + } + std::vector Flush() { std::lock_guard guard(mutex); std::vector copy = g_pendingOperations; diff --git a/Core/SaveState.h b/Core/SaveState.h index b20a689c53..746c4c3f11 100644 --- a/Core/SaveState.h +++ b/Core/SaveState.h @@ -79,6 +79,12 @@ namespace SaveState { Path GenerateSaveSlotPath(std::string_view gamePrefix, int slot, const char *extension); void SetSlotCustomName(std::string_view gamePrefix, int slot, std::string_view newName); + // The files that sit beside a savestate and mean nothing without it: its screenshot, and the + // slot's custom name if it was given one. Anything deleting a .ppst from outside DeleteSlot - + // the savestate browser does exactly that - has to take these along, or they stay in the + // savestate folder for good. Returns nothing for a path that isn't a savestate. + std::vector GetCompanionFilePaths(const Path &statePath); + std::string GetTitle(const Path &filename); // Load the specified file into the current state (async.) diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 5d353f2eb2..20fa67ae97 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -170,9 +170,11 @@ bool GameInfo::Delete() { const Path &ppstPath = filePath_; INFO_LOG(Log::System, "Deleting file %s", ppstPath.c_str()); MoveFileToTrashOrDelete(ppstPath); - Path screenshotPath; - if (filePath_.WithReplacedExtension(".ppst", ".jpg", &screenshotPath) && File::Exists(screenshotPath)) { - MoveFileToTrashOrDelete(screenshotPath); + // The screenshot and the slot's custom name are no use without the state itself. + for (const Path &companion : SaveState::GetCompanionFilePaths(ppstPath)) { + if (File::Exists(companion)) { + MoveFileToTrashOrDelete(companion); + } } return true; } From 202b78d95b2cc7872a684137283905853246344c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 14 Sep 2026 10:59:38 -0600 Subject: [PATCH 4/4] AI-generated translation strings --- .claude/commands/add-string.md | 22 +++++++++++++++------- UI/PauseScreen.cpp | 4 ++-- assets/lang/ar_AE.ini | 2 ++ assets/lang/az_AZ.ini | 2 ++ assets/lang/be_BY.ini | 2 ++ assets/lang/bg_BG.ini | 2 ++ assets/lang/ca_ES.ini | 2 ++ assets/lang/cz_CZ.ini | 2 ++ assets/lang/da_DK.ini | 2 ++ assets/lang/de_DE.ini | 2 ++ assets/lang/dr_ID.ini | 2 ++ assets/lang/en_US.ini | 2 ++ assets/lang/es_ES.ini | 2 ++ assets/lang/es_LA.ini | 2 ++ assets/lang/fa_IR.ini | 2 ++ assets/lang/fi_FI.ini | 2 ++ assets/lang/fr_FR.ini | 2 ++ assets/lang/gl_ES.ini | 2 ++ assets/lang/gr_EL.ini | 2 ++ assets/lang/he_IL.ini | 2 ++ assets/lang/he_IL_invert.ini | 2 ++ assets/lang/hr_HR.ini | 2 ++ assets/lang/hu_HU.ini | 2 ++ assets/lang/id_ID.ini | 2 ++ assets/lang/it_IT.ini | 2 ++ assets/lang/ja_JP.ini | 2 ++ assets/lang/jv_ID.ini | 2 ++ assets/lang/km_KH.ini | 2 ++ assets/lang/ko_KR.ini | 2 ++ assets/lang/ku_SO.ini | 2 ++ assets/lang/lo_LA.ini | 2 ++ assets/lang/lt-LT.ini | 2 ++ assets/lang/ms_MY.ini | 2 ++ assets/lang/nl_NL.ini | 2 ++ assets/lang/nn_NO.ini | 2 ++ assets/lang/no_NO.ini | 2 ++ assets/lang/pl_PL.ini | 2 ++ assets/lang/pt_BR.ini | 2 ++ assets/lang/pt_PT.ini | 2 ++ assets/lang/ro_RO.ini | 2 ++ assets/lang/ru_RU.ini | 2 ++ assets/lang/sv_SE.ini | 2 ++ assets/lang/tg_PH.ini | 2 ++ assets/lang/th_TH.ini | 2 ++ assets/lang/tr_TR.ini | 2 ++ assets/lang/uk_UA.ini | 2 ++ assets/lang/vi_VN.ini | 2 ++ assets/lang/zh_CN.ini | 2 ++ assets/lang/zh_TW.ini | 2 ++ docs/translations.md | 20 +++++++++++++------- 50 files changed, 124 insertions(+), 16 deletions(-) diff --git a/.claude/commands/add-string.md b/.claude/commands/add-string.md index 17860191d3..aa3a3dc71d 100644 --- a/.claude/commands/add-string.md +++ b/.claude/commands/add-string.md @@ -51,9 +51,9 @@ Follow the workflow in docs/translations.md. Run langtool from No trailing `# comments` on those lines, they'd end up inside the translation. Placeholders like `%1` and `%d` have to appear verbatim in the translation, in whatever position the target language needs them. - **If you don't know a language well enough to be confident, leave it out.** A key that's missing - from a language file falls back to the English string at runtime, which is normal and fine - much - better than a confident guess that nobody in the project can read well enough to catch. + **If you don't know a language well enough to be confident, leave it out.** Step 4 gives those + languages the English string as a placeholder, which is much better than a confident guess that + nobody in the project can read well enough to catch. If a language deliberately keeps the English string (a term like "Vsync" that language doesn't translate), that's different from not knowing - include it with the English text. It gets written @@ -65,9 +65,17 @@ Follow the workflow in docs/translations.md. Run langtool from Note this overwrites any existing value for that key, so if the key already had human translations, check what you're about to replace first. The section has to exist already. -4. `cargo run -- validate` - always, at the end. It must print `Found 0 problems.` +4. `cargo run -- add-new-key "$1" "$2"` - **always, every language file ends up with the key.** This + writes `Key = Key` (plain English, no `# same as English` marker, so it still reads as + outstanding work) into every language you skipped, and leaves the ones you translated alone. A + missing key would fall back to the English string at runtime anyway, but then it looks exactly + like a translated one in the files, and translators can't see what's left to do. + + Don't reach for `copy-missing-lines` to do this - it fills in placeholders repo-wide, and drags + several hundred lines of unrelated housekeeping (other missing keys, obsolete keys commented out) + into your diff. + +5. `cargo run -- validate` - always, at the end. It must print `Found 0 problems.` Finally, report which languages you translated and which you skipped and why, and leave the changes -uncommitted for review unless asked otherwise. If you want the languages you skipped to carry the -English string as a visible placeholder rather than just falling back to it, that's -`cargo run -- copy-missing-lines`. +uncommitted for review unless asked otherwise. diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 9c3007cfca..6ba07ad694 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -135,7 +135,7 @@ protected: grid->Add(undoButton)->OnClick.Handle(this, &ScreenshotViewScreen::OnUndoState); } grid->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK")))->OnClick.Handle(this, &UIScreen::OnBack); - grid->Add(new Choice(di->T("Modify State Name"), ImageID("I_EDIT_TEXT")))->OnClick.Handle(this, &ScreenshotViewScreen::OnChangeState); + grid->Add(new Choice(di->T("Rename state"), ImageID("I_EDIT_TEXT")))->OnClick.Handle(this, &ScreenshotViewScreen::OnChangeState); scroll->Add(content); parent->Add(scroll); @@ -212,7 +212,7 @@ void ScreenshotViewScreen::OnChangeState(UI::EventParams &e) { customNameTemp_ = SaveState::GetSlotCustomName(saveStatePrefix_, slot_); - UI::TextEditPopupScreen *popupScreen = new UI::TextEditPopupScreen(&customNameTemp_, "", di->T("Modify the state name"), 64); + UI::TextEditPopupScreen *popupScreen = new UI::TextEditPopupScreen(&customNameTemp_, "", di->T("Save state name"), 64); popupScreen->OnChange.Add([this](UI::EventParams &e) { SaveState::SetSlotCustomName(saveStatePrefix_, slot_, customNameTemp_); TriggerFinish(DR_YES); // DR_YES signals that we need a refresh, but not to close the pause menu. diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index d2a8d0d6e5..1a4403d169 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -499,6 +499,7 @@ Old savedata detected = ‎بيانات حفظ قديمة قد إكتشفت Options = ‎إعدادات Password = كلمة السر Remove = إزالة +Rename state = إعادة تسمية الحالة # AI translated Reset = ‎إستعادة Resize = ‎تغيير الحجم Restart = إعادة التشغيل @@ -507,6 +508,7 @@ Retry = ‎حاول مجدداً Right side = الجانب الأيمن # AI translated Save = ‎حفظ Save completed = ‎الحفظ إكتمل. +Save state name = اسم الحالة # AI translated Saving = ‎يحفظ\nمن فضلك إنتظر... SavingFailed = ‎غير قادر علي حفظ البيانات. Search = البحث diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 2935eb99b0..620f39cf78 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -490,6 +490,7 @@ Old savedata detected = Köhnə qorunuş tapıldı Options = Seçimlər Password = Keçid sözü Remove = Qaldır +Rename state = Durumu yenidən adlandır # AI translated Reset = Sıfırla Resize = Ölçülə Restart = Yenidən başlat @@ -498,6 +499,7 @@ Retry = Bir daha yoxla Right side = Sağ yön Save = Qoru Save completed = Qorunuş tamamlandı +Save state name = Durum adı # AI translated Saving = Qorunur\nBuyurun, Gözləyin... SavingFailed = Veriləni qorumaq olmur. Search = Axtar diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index f0328f0d86..3e92d57fad 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -489,6 +489,7 @@ Old savedata detected = Old savedata detected Options = Опцыі Password = Пароль Remove = Выдаліць +Rename state = Перайменаваць стан # AI translated Reset = Скінуць Resize = Змяніць памер Restart = Перазапусціць @@ -497,6 +498,7 @@ Retry = Паўтарыць спробу Right side = Правы бок # AI translated Save = Захаваць Save completed = Save completed. +Save state name = Назва стану # AI translated Saving = Saving\nPlease wait... SavingFailed = Unable to save data. Search = Пошук diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index eeccc93cad..d714636186 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -491,6 +491,7 @@ Old savedata detected = Old savedata detected Options = Опции Password = Парола Remove = Премахване +Rename state = Преименувай състоянието # AI translated Reset = Нулиране Resize = Преоразмеряване Restart = Рестартиране @@ -499,6 +500,7 @@ Retry = Нов опит Right side = Дясна страна # AI translated Save = Запази Save completed = Съхраняването завършено. +Save state name = Име на състоянието # AI translated Saving = Съхраняване\nМоля изчакайте... SavingFailed = Unable to save data. Search = Търсене diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 7b0b05eb37..56035733ec 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -491,6 +491,7 @@ Old savedata detected = S'han detectar dades del joc antigues. Options = Opcions Password = Password Remove = Borrar +Rename state = Reanomena l'estat # AI translated Reset = Reiniciar Resize = Canviar la mida Restart = Restart @@ -499,6 +500,7 @@ Retry = Reintentar Right side = Costat dret # AI translated Save = Guardar Save completed = Guardat completat +Save state name = Nom de l'estat # AI translated Saving = Guardant\nEspera un moment... SavingFailed = Les dades no s'han pogut guardar. Search = Cercar diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 76495fede0..68f495d926 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -491,6 +491,7 @@ Old savedata detected = Zjištěna stará uložená data Options = Volby Password = Password Remove = Remove +Rename state = Přejmenovat stav # AI translated Reset = Resetovat Resize = Velikost Restart = Restart @@ -499,6 +500,7 @@ Retry = Zkusit znovu Right side = Pravá strana # AI translated Save = Uložit Save completed = Ukládání dokončeno. +Save state name = Název stavu # AI translated Saving = Ukládání\nČekejte prosím... SavingFailed = Nelze uložit data. Search = Search diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 76ae18a9a7..ef351f1c9a 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -491,6 +491,7 @@ Old savedata detected = Gamle savedata fundet Options = Optioner Password = Password Remove = Remove +Rename state = Omdøb spil-status # AI translated Reset = Nulstil Resize = Størrelse Restart = Restart @@ -499,6 +500,7 @@ Retry = Prøv igen Right side = Højre side # AI translated Save = Gem Save completed = Gemt. +Save state name = Navn på spil-status # AI translated Saving = Gemmer\nVent venligst... SavingFailed = Ikke muligt at gemme data. Search = Search diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 1d47cb92af..9780199478 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -490,6 +490,7 @@ Old savedata detected = Alte Speicherdaten entdeckt Options = Optionen Password = Passwort Remove = Entfernen +Rename state = Spielstand umbenennen # AI translated Reset = Zurücksetzen Resize = Größe ändern Restart = Neustart @@ -498,6 +499,7 @@ Retry = Neuversuch Right side = Rechte Seite Save = Speichern Save completed = Speichern abgeschlossen +Save state name = Name des Spielstands # AI translated Saving = Speichern\nBitte warten... SavingFailed = Daten konnten nicht gespeichert werden Search = Suche diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index b21319e144..34fd97224c 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -489,6 +489,7 @@ Old savedata detected = Old savedata detected Options = Options Password = Password Remove = Remove +Rename state = Rename state Reset = Reset Resize = Resize Restart = Restart @@ -497,6 +498,7 @@ Retry = Retry Right side = Sisi kanan # AI translated Save = Save Save completed = Mangkami dianna. +Save state name = Save state name Saving = Di'annai\nTajammi... SavingFailed = Unable to save data. Search = Search diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index d3e8433fd5..da16615b1c 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -515,6 +515,7 @@ Old savedata detected = Old savedata detected Options = Options Password = Password Remove = Remove +Rename state = Rename state Reset = Reset Resize = Resize Restart = Restart @@ -523,6 +524,7 @@ Retry = Retry Right side = Right side Save = Save Save completed = Save completed. +Save state name = Save state name Saving = Saving\nPlease wait... SavingFailed = Unable to save data. Search = Search diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index d95a9a0670..864dbe1b5c 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -492,6 +492,7 @@ Old savedata detected = Encontrado guardado previo. Options = Opciones Password = Contraseña Remove = Borrar +Rename state = Renombrar estado # AI translated Reset = Restablecer Resize = Tamaño Restart = Reiniciar @@ -500,6 +501,7 @@ Retry = Reintentar Right side = Lado derecho # AI translated Save = Guardar Save completed = Datos guardados. +Save state name = Nombre del estado # AI translated Saving = Guardando\nPor favor, espera un momento... SavingFailed = No se pueden guardar los datos. Search = Buscar diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index ad31584108..a2b13f0fe7 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -491,6 +491,7 @@ Old savedata detected = Se han detectado datos del juego antiguos. Options = Opciones Password = Contraseña Remove = Remover +Rename state = Renombrar estado # AI translated Reset = Reiniciar Resize = Redimencionar Tamaño Restart = Reiniciar @@ -499,6 +500,7 @@ Retry = Reintentar Right side = Lado derecho # AI translated Save = Guardar Save completed = Los datos del juego han sido almacenados. +Save state name = Nombre del estado # AI translated Saving = Guardando\nPor Favor espere... SavingFailed = Los datos del juego no se pudieron guardar. Search = Buscar diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index de4b18c4ec..1e88077157 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -490,6 +490,7 @@ Old savedata detected = Old savedata detected Options = تنظیمات Password = رمز عبور Remove = حذف +Rename state = تغییر نام وضعیت # AI translated Reset = بازیابی Resize = اندازه گیری Restart = Restart @@ -498,6 +499,7 @@ Retry = تلاش مجدد Right side = سمت راست # AI translated Save = ‎ذخیره Save completed = ‎.ذخیره تکمیل شد +Save state name = نام وضعیت # AI translated Saving = ‎در حال ذخیره\n...منتظر بمانید SavingFailed = Unable to save data. Search = جستجو diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index a1e0d3e649..acae7fff93 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -491,6 +491,7 @@ Old savedata detected = Vanha tallennustieto havaittu Options = Asetukset Password = Salasana Remove = Poista +Rename state = Nimeä tila uudelleen # AI translated Reset = Nollaa Resize = Muuta kokoa Restart = Käynnistä uudelleen @@ -499,6 +500,7 @@ Retry = Retry Right side = Oikea puoli # AI translated Save = Tallenna Save completed = Tallennus onnistui. +Save state name = Tilatallennuksen nimi # AI translated Saving = Tallentaa\nOdota... SavingFailed = Ei voitu tallentaa. Search = Etsi diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 8bec5c1481..04b8409801 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -515,6 +515,7 @@ Old savedata detected = Ancienne sauvegarde détectée Options = Options Password = Password Remove = Remove +Rename state = Renommer l'état # AI translated Reset = Remise à 0 Resize = Zoomer Restart = Restart @@ -523,6 +524,7 @@ Retry = Réessayer Right side = Côté droit Save = Sauvegarder Save completed = Sauvegarde terminée. +Save state name = Nom de l'état # AI translated Saving = Sauvegarde\nVeuillez patienter... SavingFailed = Sauvegarde impossible. Search = Rechercher diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 946cb64abd..3a9fd2ae23 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -491,6 +491,7 @@ Old savedata detected = Detectados datos de gardado antigos. Options = Options Password = Password Remove = Remove +Rename state = Renomear estado # AI translated Reset = Reiniciar Resize = Tamaño Restart = Restart @@ -499,6 +500,7 @@ Retry = Reintentar Right side = Lado dereito # AI translated Save = Gardar Save completed = Gardado completado. +Save state name = Nome do estado # AI translated Saving = Gardando\nAgarda un momento... SavingFailed = Os datos non se puideron gardar. Search = Search diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index ebfd0f9a88..1855e0502b 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -491,6 +491,7 @@ Old savedata detected = Εντοπίστηκαν παλαιά αρχεία απ Options = ΕΠΙΛΟΓΕΣ Password = Password Remove = Remove +Rename state = Μετονομασία κατάστασης # AI translated Reset = ΕΠΑΝΑΦΟΡΑ Resize = ΑΛΛΑΓΗ ΜΕΓΕΘΟΥΣ Restart = Restart @@ -499,6 +500,7 @@ Retry = ΕΠΑΝΑΛΗΨΗ Right side = Δεξιά πλευρά # AI translated Save = ΑΠΟΘΗΚΕΥΣΗ Save completed = ΑΠΟΘΗΚΕΥΣΗ ΟΛΟΚΛΗΡΩΘΗΚΕ. +Save state name = Όνομα κατάστασης # AI translated Saving = ΑΠΟΘΗΚΕΥΣΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ... SavingFailed = ΑΔΥΝΑΜΙΑ ΑΠΟΘΗΚΕΥΣΗΣ ΔΕΔΟΜΕΝΩΝ. Search = Search diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index bc4eddf054..5269ddb2cf 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -491,6 +491,7 @@ Old savedata detected = Old savedata detected Options = Options Password = Password Remove = Remove +Rename state = שנה שם למצב # AI translated Reset = Reset Resize = Resize Restart = Restart @@ -499,6 +500,7 @@ Retry = Retry Right side = צד ימין # AI translated Save = Save Save completed = .המלשוה הרימש +Save state name = שם המצב # AI translated Saving = ...ןתמה אנא ...רמוש SavingFailed = Unable to save data. Search = Search diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 14ed5ef3fe..98c3ef7080 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -490,6 +490,7 @@ Old savedata detected = Old savedata detected Options = Options Password = Password Remove = Remove +Rename state = בצמל םש הנש # AI translated Reset = Reset Resize = Resize Restart = Restart @@ -498,6 +499,7 @@ Retry = Retry Right side = ןימי דצ # AI translated Save = Save Save completed = .המלשוה הרימש +Save state name = בצמה םש # AI translated Saving = ...ןתמה אנא ...רמוש SavingFailed = Unable to save data. Search = Search diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 9545833719..5297ee2d6b 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -491,6 +491,7 @@ Old savedata detected = Uočena stara savedata Options = Opcije Password = Password Remove = Remove +Rename state = Preimenuj state # AI translated Reset = Reset Resize = Resize Restart = Restart @@ -499,6 +500,7 @@ Retry = Ponovi Right side = Desna strana # AI translated Save = Spremi Save completed = Spremanje dovršeno. +Save state name = Save state name Saving = Spremanje\nPričekajte... SavingFailed = Nije moguće spremiti datu. Search = Search diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index a9667e3090..9362b2ca7a 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -491,6 +491,7 @@ Old savedata detected = Régi mentés észlelve Options = Opciók Password = Password Remove = Remove +Rename state = Állapot átnevezése # AI translated Reset = Visszaállít Resize = Átméretez Restart = Restart @@ -499,6 +500,7 @@ Retry = Újra Right side = Jobb oldal # AI translated Save = Mentés Save completed = Mentve. +Save state name = Állapot neve # AI translated Saving = Mentés\nKérlek várj... SavingFailed = Mentés sikertelen. Search = Keresés diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 8ef957b994..08d5ef8c45 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -491,6 +491,7 @@ Old savedata detected = Simpanan data lama terdeteksi Options = Pilihan Password = Kata sandi Remove = Menghapus +Rename state = Ganti nama savestate # AI translated Reset = Atur ulang Resize = Atur ulang ukuran Restore purchase = Pulihkan pembelian @@ -499,6 +500,7 @@ Restart = Mengulang kembali Right side = Sisi kanan # AI translated Save = Simpan Save completed = Selesai menyimpan. +Save state name = Nama savestate # AI translated Saving = Menyimpan\nMohon tunggu... SavingFailed = Tidak dapat menyimpan data. Search = Cari diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index c858b0a399..5891c0b27a 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -491,6 +491,7 @@ Old savedata detected = Rilevati vecchi dati salvati Options = Opzioni Password = Password Remove = Rimuovi +Rename state = Rinomina stato # AI translated Reset = Reset Resize = Ridimensiona Restart = Riavvia @@ -499,6 +500,7 @@ Retry = Riprova Right side = Lato destro # AI translated Save = Salva Save completed = Salvataggio Completato. +Save state name = Nome dello stato # AI translated Saving = Salvataggio in corso.\nAttendere, prego... SavingFailed = Impossibile salvare i dati. Search = Cerca diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index ad3e7c1e20..634ad6004c 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -491,6 +491,7 @@ Old savedata detected = 古いセーブデータを検出しました Options = オプション Password = パスワード Remove = 削除 +Rename state = ステート名を変更 # AI translated Reset = リセット Resize = リサイズ Restart = PPSSPPを再起動します。 @@ -499,6 +500,7 @@ Retry = リトライ Right side = 右側 # AI translated Save = セーブ Save completed = セーブが完了しました。 +Save state name = ステート名 # AI translated Saving = セーブ中です。\nしばらくお待ちください... SavingFailed = データをセーブできませんでした。 Search = 検索 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 64831eaf12..9c4ae3e943 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -489,6 +489,7 @@ Old savedata detected = Simpenan lawas terdeteksi Options = Opsi Password = Password Remove = Remove +Rename state = Rename state Reset = Ngreset Resize = Ubah Ukuran Restart = Restart @@ -497,6 +498,7 @@ Retry = Jajal Maning Right side = Sisih tengen # AI translated Save = Simpen Save completed = Nyimpen rampung. +Save state name = Save state name Saving = Nyimpen\nMohon nteni... SavingFailed = Ora biso Nyimpen data. Search = Search diff --git a/assets/lang/km_KH.ini b/assets/lang/km_KH.ini index 524d80bed3..2cca3db005 100644 --- a/assets/lang/km_KH.ini +++ b/assets/lang/km_KH.ini @@ -486,6 +486,7 @@ Old savedata detected =បានរកឃើញទិន្នន័យរក្ Options =ជម្រើស Password =ពាក្យសម្ងាត់ Remove =ដកចេញ +Rename state = Rename state Reset =កំណត់ឡើងវិញ Resize =ប្តូរទំហំ Restart =ចាប់ផ្ដើមឡើងវិញ @@ -494,6 +495,7 @@ Retry =ព្យាយាមម្តងទៀត Right side =ផ្នែកខាងស្តាំ Save =រក្សាទុក Save completed =ការរក្សាទុកបានបញ្ចប់។ +Save state name = Save state name Saving =កំពុងរក្សាទុក\nសូមរង់ចាំ... SavingFailed =មិនអាចរក្សាទុកទិន្នន័យបានទេ។ Search =ស្វែងរក diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 4afb063280..63305ac2d1 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -491,6 +491,7 @@ Old savedata detected = 오래된 저장 데이터 감지됨 Options = 옵션 Password = 비밀번호 Remove = 제거 +Rename state = 저장 상태 이름 변경 # AI translated Reset = 재설정 Resize = 크기 조정 Restart = PPSSPP를 다시 시작합니다. @@ -499,6 +500,7 @@ Retry = 재시도 Right side = 오른쪽 # AI translated Save = 저장 Save completed = 저장이 완료되었습니다. +Save state name = 저장 상태 이름 # AI translated Saving = 저장 중\n잠시만 기다려 주세요... SavingFailed = 데이터를 저장할 수 없습니다. Search = 검색 diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index ccd7896b83..78575d72f6 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -503,6 +503,7 @@ Old savedata detected = Old savedata detected Options = Options Password = وشەی نهێنی Remove = لابردن +Rename state = Rename state Reset = Reset Resize = گۆڕینی قەبارە Restart = Restart @@ -511,6 +512,7 @@ Retry = دووبارە هەوڵدانەوە Right side = Awarê rast # AI translated Save = خەزن کردن Save completed = خەزن کرا +Save state name = Save state name Saving = خەزن دەکرێت\nتکایە چاوەڕوان بە... SavingFailed = ناتوانرێت زانیاریەکان خەزن بکرێت Search = گەڕان diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 3a9d300dfd..549348ce40 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -489,6 +489,7 @@ Old savedata detected = ກວດພົບຂໍ້ມູນເຊບເກົ Options = ໂຕເລືອກ Password = Password Remove = Remove +Rename state = Rename state Reset = ຕັ້ງຄ່າໃໝ່ Resize = ປັບຂະໜາດ Restart = Restart @@ -497,6 +498,7 @@ Retry = ລອງໃໝ່ອີກຄັ້ງ Right side = ຂະບວນດີ # AI translated Save = ບັນທຶກ Save completed = ບັນທຶກຂໍ້ມູນສຳເລັດ +Save state name = Save state name Saving = ກຳລັງບັນທຶກ\nກະລຸນາຖ້າ... SavingFailed = ບໍ່ສາມາດບັນທຶກຂໍ້ມູນ. Search = Search diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 9fed762e7f..0ccaeb82a0 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -491,6 +491,7 @@ Old savedata detected = Aptikti seniau išsaugoti duomenys Options = Options Password = Password Remove = Remove +Rename state = Pervadinti statusą # AI translated Reset = Perkrauti Resize = Perkeisti dydį Restart = Restart @@ -499,6 +500,7 @@ Retry = Pabandyti dar kartą Right side = Dešinė pusė # AI translated Save = Išsaugoti Save completed = Išsaugojimas baigtas. +Save state name = Statuso pavadinimas # AI translated Saving = Išsaugoma\nPrašome palaukti... SavingFailed = Neįmanoma išsaugoti duomenų. Search = Search diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 1f2d531651..1ca23a0787 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -491,6 +491,7 @@ Old savedata detected = Data simpanan lama dikesan Options = Pilihan Password = Kata laluan Remove = Buang +Rename state = Namakan semula keadaan # AI translated Reset = Mula semula Resize = Saiz semula Restart = Mula semula @@ -499,6 +500,7 @@ Retry = Cuba semula Right side = Sisi kanan Save = Simpan Save completed = Menyimpan selesai. +Save state name = Nama keadaan simpanan # AI translated Saving = Menyimpan\nSila tunggu... SavingFailed = Tidak dapat menyimpan data. Search = Carian diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index b28f86f4cd..f0d7d271b8 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -491,6 +491,7 @@ Old savedata detected = Oude savedata gedetecteerd Options = Opties Password = Password Remove = Remove +Rename state = State hernoemen # AI translated Reset = Herstellen Resize = Schalen Restart = Restart @@ -499,6 +500,7 @@ Retry = Opnieuw Right side = Rechte zijde # AI translated Save = Opslaan Save completed = Het opslaan is voltooid. +Save state name = Naam van state # AI translated Saving = Bezig met opslaan...\nEen ogenblik geduld. SavingFailed = Kan de data niet opslaan. Search = Search diff --git a/assets/lang/nn_NO.ini b/assets/lang/nn_NO.ini index b0da5f4f8b..fc7614af13 100644 --- a/assets/lang/nn_NO.ini +++ b/assets/lang/nn_NO.ini @@ -515,6 +515,7 @@ Old savedata detected = Gamle lagringsdata oppdaga Options = Val Password = Passord Remove = Fjern +Rename state = Gi tilstanden nytt namn # AI translated Reset = Tilbakestill Resize = Endre storleik Restart = Start på nytt @@ -523,6 +524,7 @@ Retry = Prøv igjen Right side = Høgre side Save = Lagre Save completed = Lagring fullført. +Save state name = Namn på lagringstilstand # AI translated Saving = Lagrar\nVent litt... SavingFailed = Klarte ikkje å lagre data. Search = Søk diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index fe095230c8..091f2d70ce 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -515,6 +515,7 @@ Old savedata detected = Gamle lagringsdata oppdaget Options = Alternativer Password = Passord Remove = Fjern +Rename state = Gi tilstanden nytt navn # AI translated Reset = Tilbakestill Resize = Endre størrelse Restart = Start på nytt @@ -523,6 +524,7 @@ Retry = Prøv igjen Right side = Høyre side # AI translated Save = Lagre Save completed = Ferdig lagret. +Save state name = Navn på lagringstilstand # AI translated Saving = Lagrer\nVent litt... SavingFailed = Kunne ikke lagre data. Search = Søk diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 042b77eba1..73f6151a43 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -491,6 +491,7 @@ Old savedata detected = Wykryto stary zapis gry Options = Opcje Password = Hasło Remove = Usuń +Rename state = Zmień nazwę stanu # AI translated Reset = Resetuj Resize = Przeskaluj Restart = Uruchom ponownie @@ -499,6 +500,7 @@ Retry = Spróbuj ponownie Right side = Prawa strona # AI translated Save = Zapisz Save completed = Zapisywanie zakończone. +Save state name = Nazwa stanu # AI translated Saving = Zapisywanie\nProszę czekać... SavingFailed = Nie można zapisać danych. Search = Szukaj diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index ed55ca5053..cb09b6b924 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -515,6 +515,7 @@ Old savedata detected = Dados antigos do save detectados Options = Opções Password = Senha Remove = Remover +Rename state = Renomear state # AI translated Reset = Resetar Resize = Re-dimensionar Restart = Reiniciar @@ -523,6 +524,7 @@ Retry = Tentar de novo Right side = Lado direito Save = Salvar Save completed = Salvamento completado. +Save state name = Nome do state # AI translated Saving = Salvando\nPor favor espere... SavingFailed = Incapaz de salvar os dados. Search = Busca diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index d92125ad12..e09b759f66 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -515,6 +515,7 @@ Old savedata detected = Dados antigos de salvamento detetados Options = Definições Password = Palavra-passe Remove = Remover +Rename state = Renomear estado # AI translated Reset = Restaurar Resize = Redimensionar Restart = Reiniciar @@ -523,6 +524,7 @@ Retry = Tentar de novo Right side = Lado direito Save = Salvar Save completed = Salvamento completo. +Save state name = Nome do estado # AI translated Saving = A salvar\nPor favor espere... SavingFailed = Não foi possível salvar os dados. Search = Pesquisar diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 47199ab0de..dc59489e46 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -491,6 +491,7 @@ Old savedata detected = Date vechi salvate detectate Options = Options Password = Password Remove = Remove +Rename state = Redenumește starea # AI translated Reset = Resetare Resize = Modificare marime Restart = Restart @@ -499,6 +500,7 @@ Retry = Reîncearcă Right side = Partea dreaptă # AI translated Save = Salvează Save completed = Salvare Completă +Save state name = Numele stării # AI translated Saving = Se Salvează\nAșteptați... SavingFailed = Nu s-au putut salva datele. Search = Search diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 57826b8bb4..97cd3b7dfc 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -491,6 +491,7 @@ Old savedata detected = Старый формат сохранений обна Options = Опции Password = Пароль Remove = Удалить +Rename state = Переименовать состояние # AI translated Reset = Сбросить Resize = Размер Restart = Перезапуск @@ -499,6 +500,7 @@ Retry = Снова Right side = Правая сторона Save = Сохранить Save completed = Сохранение завершено. +Save state name = Название состояния # AI translated Saving = Сохранение\nПожалуйста, подождите... SavingFailed = Не удалось сохранить. Search = Поиск diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 21c6110a4f..5049dfffc5 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -492,6 +492,7 @@ Old savedata detected = Gamla sparade data hittades Options = Inställningar Password = Lösenord Remove = Ta bort +Rename state = Byt namn på tillstånd # AI translated Reset = Återställ Resize = Ändra storlek Restart = Starta om @@ -500,6 +501,7 @@ Retry = Försök igen Right side = Höger sida Save = Spara Save completed = Sparat. +Save state name = Namn på sparat tillstånd # AI translated Saving = Sparar\nVänta... SavingFailed = Kunde inte spara data. Search = Sök diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 6febb8170a..6e563360ad 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -491,6 +491,7 @@ Old savedata detected = Nahanap ang lumang SAVEDATA Options = Mga Opsyon Password = Password Remove = Alisin +Rename state = Palitan ang pangalan # AI translated Reset = I-Reset Resize = I-Resize Restart = I-Restart @@ -499,6 +500,7 @@ Retry = Ulitin Right side = Сӯи рост # AI translated Save = I-Save Save completed = Kumpletong na-i save. +Save state name = Pangalan ng save state # AI translated Saving = Sandali lamang...\nKasalukuyang nagse-save SavingFailed = Hindi ma-i save ang datos. Search = Hanapin diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 7aa46851cc..839d352b60 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -507,6 +507,7 @@ Old savedata detected = ตรวจพบข้อมูลเซฟเก่ Options = ตัวเลือก Password = รหัสผ่าน Remove = ลบออก +Rename state = เปลี่ยนชื่อเซฟสเตท # AI translated Reset = รีเซ็ต Resize = ขนาด Restart = เริ่มต้นใหม่ @@ -515,6 +516,7 @@ Retry = ลองใหม่ Right side = ด้านขวา Save = บันทึก Save completed = บันทึกข้อมูลสำเร็จ +Save state name = ชื่อเซฟสเตท # AI translated Saving = กำลังบันทึก\nโปรดรอ... SavingFailed = ไม่สามารถบันทึกข้อมูลนี้ได้ Search = ค้นหา diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 7c0eda16d5..4d2144e7f8 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -493,6 +493,7 @@ Old savedata detected = Eski kayıt bulundu Options = Ayarlar Password = Şifre Remove = Kaldır +Rename state = Durumu yeniden adlandır # AI translated Reset = Sıfırla Resize = Boyutlandır Restart = Yeniden başlat @@ -501,6 +502,7 @@ Retry = Yeniden dene Right side = Sağ taraf # AI translated Save = Kaydet Save completed = Kaydetme tamamlandı +Save state name = Durum adı # AI translated Saving = Kaydediliyor SavingFailed = Veri kaydedilemiyor. Search = Ara diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 1c87d96b4d..4eb48fc4e9 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -491,6 +491,7 @@ Old savedata detected = Виявлено старий формат збереж Options = Опції: Password = Пароль Remove = Видалити +Rename state = Перейменувати стан # AI translated Reset = Скинути Resize = Розмір Restart = Перезапустіть @@ -499,6 +500,7 @@ Retry = Повторити Right side = Правий бік # AI translated Save = Зберегти Save completed = Збереження завершено. +Save state name = Назва стану # AI translated Saving = Збереження\nБудь ласка, зачекайте... SavingFailed = Неможливо зберегти дані. Search = Пошук diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 1f740807ac..41e19b273b 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -491,6 +491,7 @@ Old savedata detected = Phát hiện dữ liệu cũ Options = Tùy chọn Password = Password Remove = Remove +Rename state = Đổi tên save state # AI translated Reset = Mặc định Resize = Thay đổi kích thước Restart = Restart @@ -499,6 +500,7 @@ Retry = Thử lại Right side = Bên phải # AI translated Save = Lưu Save completed = Đã lưu xong. +Save state name = Tên save state # AI translated Saving = Đang lưu\nXin đợi một lúc... SavingFailed = Không thể lưu dữ liệu này. Search = Search diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 28235154bf..801ac77ad7 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -491,6 +491,7 @@ Old savedata detected = 检测到旧版本的存档数据 Options = 选项 Password = 密码 Remove = 删除 +Rename state = 重命名即时存档 # AI translated Reset = 重置 Resize = 调整大小 Restart = 重启 @@ -499,6 +500,7 @@ Retry = 重试 Right side = 右侧 # AI translated Save = 保存 Save completed = 保存完成。 +Save state name = 即时存档名称 # AI translated Saving = 保存中。\n请稍候… SavingFailed = 无法保存存档。 Search = 搜索 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 91d73f61d2..80975dae34 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -491,6 +491,7 @@ Old savedata detected = 偵測到舊版存檔資料 Options = 選項 Password = 密碼 Remove = 移除 +Rename state = 重新命名存檔 # AI translated Reset = 重設 Resize = 調整大小 Restart = 重新啟動 @@ -499,6 +500,7 @@ Retry = 重試 Right side = 右側 # AI translated Save = 儲存 Save completed = 儲存完成 +Save state name = 存檔名稱 # AI translated Saving = 正在儲存\n請稍候… SavingFailed = 無法儲存資料 Search = 搜尋 diff --git a/docs/translations.md b/docs/translations.md index dfda39a546..2ab7cd5b7c 100644 --- a/docs/translations.md +++ b/docs/translations.md @@ -26,9 +26,9 @@ from `Tools/langtool`: changes the string all the others were just translated from. Diff `en_US.ini` afterwards to check it didn't move. No trailing `# comments` on those lines, they'd end up inside the translation. Placeholders have to - survive verbatim. If you don't know a language well enough, leave it out - a key that's missing from - a language file falls back to the English string at runtime, which is much better than a confident - guess. If a language deliberately keeps the English string (a term like "Vsync" that isn't + survive verbatim. If you don't know a language well enough, leave it out - step 4 gives it the + English string as a placeholder, which is much better than a confident guess. If a language + deliberately keeps the English string (a term like "Vsync" that isn't translated), do include it with the English text - it gets written with a `# same as English` comment, which stops langtool from trying to translate it again on every later run. 3. `cargo run -- import-single
""` writes them all in, including a new @@ -36,10 +36,16 @@ from `Tools/langtool`: were translated from. Note it overwrites existing values for that key, so take care with keys that already have human translations, and that the section has to exist already - langtool won't create one. -4. `cargo run -- validate` at the end, always. It checks that placeholders survived and exits +4. `cargo run -- add-new-key
""` gives every language you skipped the English string + as a placeholder - `Key = Key`, with no `# same as English` marker, so it still reads as + outstanding work - and leaves the translated ones untouched. Always do this: every language file + should end up with the key. A missing key falls back to English at runtime anyway, but in the + files it's indistinguishable from a translated one, so translators can't see what's left. + `copy-missing-lines` does the same job across every key in the repo at once, which is a different + job - it'll bury a two-string change under several hundred lines of unrelated housekeeping. +5. `cargo run -- validate` at the end, always. It checks that placeholders survived and exits non-zero if anything is off. -Optionally follow up with `cargo run -- copy-missing-lines` to give the languages you skipped the -English string as a placeholder. The other mechanical jobs (renaming and moving keys, sorting -sections) are langtool commands too - prefer them over editing the ini files by hand. +The other mechanical jobs (renaming and moving keys, sorting sections) are langtool commands too - +prefer them over editing the ini files by hand.