From 9ada5887e222314f1ed0a5fb34246574436f301b Mon Sep 17 00:00:00 2001 From: Pk11 Date: Fri, 8 Apr 2022 13:39:29 -0500 Subject: [PATCH] Update translations (#162) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update translations, add Dutch and Ukrainian Adds Ґ, ґ, І, і, Ї, and ї to the font for Ukrainian * Update Chinese translation * Add RTL support, Hebrew translation * Update translations --- README.md | 4 +- arm9/source/driveMenu.cpp | 100 +++++------ arm9/source/dumpOperations.cpp | 150 +++++++++------- arm9/source/fileOperations.cpp | 48 +++--- arm9/source/file_browse.cpp | 154 +++++++++-------- arm9/source/font.cpp | 41 ++++- arm9/source/font.h | 6 +- arm9/source/keyboard.cpp | 4 +- arm9/source/language.cpp | 21 ++- arm9/source/language.h | 8 + arm9/source/main.cpp | 6 +- arm9/source/ndsInfo.cpp | 10 +- arm9/source/startMenu.cpp | 9 +- arm9/source/titleManager.cpp | 29 ++-- data/font_default.frf | Bin 87988 -> 88060 bytes nitrofiles/languages/de-DE/language.ini | 17 +- nitrofiles/languages/en-US/language.ini | 3 + nitrofiles/languages/es-ES/language.ini | 3 + nitrofiles/languages/fr-FR/language.ini | 3 + nitrofiles/languages/he-IL/language.ini | 200 ++++++++++++++++++++++ nitrofiles/languages/hu-HU/language.ini | 3 + nitrofiles/languages/it-IT/language.ini | 3 + nitrofiles/languages/ja-JP/language.ini | 3 + nitrofiles/languages/ja-KANA/language.ini | 3 + nitrofiles/languages/nl-NL/language.ini | 200 ++++++++++++++++++++++ nitrofiles/languages/ro-RO/language.ini | 3 + nitrofiles/languages/ru-RU/language.ini | 3 + nitrofiles/languages/uk-UA/language.ini | 200 ++++++++++++++++++++++ nitrofiles/languages/zh-CN/language.ini | 191 +++++++++++---------- resources/fonts/default-6x10.frf | Bin 87988 -> 88060 bytes resources/fonts/default-6x10.pbm | Bin 66797 -> 66797 bytes resources/fonts/default-6x10.txt | 4 +- 32 files changed, 1072 insertions(+), 357 deletions(-) create mode 100644 nitrofiles/languages/he-IL/language.ini create mode 100644 nitrofiles/languages/nl-NL/language.ini create mode 100644 nitrofiles/languages/uk-UA/language.ini diff --git a/README.md b/README.md index caa11ef..4db1b2e 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,8 @@ When loading GodMode9i will try to load `/gm9i/font.frf` on your SD card and if * Additional Chinese is from [Angelic47/FontChinese7x7](https://github.com/Angelic47/FontChinese7x7) ### Translators -* Chinese (Simplified): [James-Makoto](https://crowdin.com/profile/vcmod55) +* Chinese (Simplified): [cai_miao](https://crowdin.com/profile/cai_miao), [James-Makoto](https://crowdin.com/profile/vcmod55) +* Dutch: [Minionguyjpro](https://crowdin.com/profile/minionguyjpro) * French: [Benjamin](https://crowdin.com/profile/sombrabsol), [Dhalian.](https://crowdin.com/profile/dhalian3630) * German: [redstonekasi](https://crowdin.com/profile/redstonekasi) * Hungarian: [Viktor Varga](http://github.com/vargaviktor) @@ -79,3 +80,4 @@ When loading GodMode9i will try to load `/gm9i/font.frf` on your SD card and if * Romanian: [Tescu](https://crowdin.com/profile/tescu48) * Russian: [Ckau](https://crowdin.com/profile/ckau) * Spanish: [Allinxter](https://crowdin.com/profile/allinxter), [beta215](https://crowdin.com/profile/beta215) +* Ukrainian: [GriShafir](https://crowdin.com/profile/grishafir) diff --git a/arm9/source/driveMenu.cpp b/arm9/source/driveMenu.cpp index b7383be..8558c8d 100644 --- a/arm9/source/driveMenu.cpp +++ b/arm9/source/driveMenu.cpp @@ -72,52 +72,52 @@ void dm_drawTopScreen(void) { font->clear(true); // Top bar - font->printf(0, 0, true, Alignment::left, Palette::blackGreen, "%*c", 256 / font->width(), ' '); - font->print(0, 0, true, STR_ROOT, Alignment::left, Palette::blackGreen); + font->printf(firstCol, 0, true, alignStart, Palette::blackGreen, "%*c", 256 / font->width(), ' '); + font->print(firstCol, 0, true, STR_ROOT, alignStart, Palette::blackGreen); // Print time - font->print(-1, 0, true, RetTime(), Alignment::right, Palette::blackGreen); + font->print(lastCol, 0, true, RetTime(), alignEnd, Palette::blackGreen); if (dmOperations.size() == 0) { - font->print(0, 1, true, STR_NO_DRIVES_FOUND); + font->print(firstCol, 1, true, STR_NO_DRIVES_FOUND, alignStart); } else for (int i = 0; i < (int)dmOperations.size(); i++) { Palette pal = dmCursorPosition == i ? Palette::white : Palette::gray; switch(dmOperations[i]) { case DriveMenuOperation::sdCard: - font->printf(0, i + 1, true, Alignment::left, pal, STR_SDCARD_LABEL.c_str(), sdLabel[0] == 0 ? STR_UNTITLED.c_str() : sdLabel); + font->printf(firstCol, i + 1, true, alignStart, pal, STR_SDCARD_LABEL.c_str(), sdLabel[0] == 0 ? STR_UNTITLED.c_str() : sdLabel); if(!driveWritable(Drive::sdCard)) - font->print(-1, i + 1, true, "[R]", Alignment::right, pal); + font->print(lastCol, i + 1, true, "[R]", alignEnd, pal); break; case DriveMenuOperation::flashcard: - font->printf(0, i + 1, true, Alignment::left, pal, STR_FLASHCARD_LABEL.c_str(), fatLabel[0] == 0 ? STR_UNTITLED.c_str() : fatLabel); + font->printf(firstCol, i + 1, true, alignStart, pal, STR_FLASHCARD_LABEL.c_str(), fatLabel[0] == 0 ? STR_UNTITLED.c_str() : fatLabel); if(!driveWritable(Drive::flashcard)) - font->print(-1, i + 1, true, "[R]", Alignment::right, pal); + font->print(lastCol, i + 1, true, "[R]", alignEnd, pal); break; case DriveMenuOperation::ramDrive: - font->print(0, i + 1, true, STR_RAMDRIVE_LABEL, Alignment::left, pal); + font->print(firstCol, i + 1, true, STR_RAMDRIVE_LABEL, alignStart, pal); break; case DriveMenuOperation::sysNand: - font->print(0, i + 1, true, STR_SYSNAND_LABEL, Alignment::left, pal); + font->print(firstCol, i + 1, true, STR_SYSNAND_LABEL, alignStart, pal); if(!driveWritable(Drive::nand)) - font->print(-1, i + 1, true, "[R]", Alignment::right, pal); + font->print(lastCol, i + 1, true, "[R]", alignEnd, pal); break; case DriveMenuOperation::nitroFs: - font->print(0, i + 1, true, STR_NITROFS_LABEL, Alignment::left, pal); - font->print(-1, i + 1, true, "[R]", Alignment::right, pal); + font->print(firstCol, i + 1, true, STR_NITROFS_LABEL, alignStart, pal); + font->print(lastCol, i + 1, true, "[R]", alignEnd, pal); break; case DriveMenuOperation::fatImage: - font->printf(0, i + 1, true, Alignment::left, pal, STR_FAT_LABEL.c_str(), imgLabel[0] == 0 ? STR_UNTITLED.c_str() : imgLabel); - font->print(-1, i + 1, true, "[R]", Alignment::right, pal); + font->printf(firstCol, i + 1, true, alignStart, pal, STR_FAT_LABEL.c_str(), imgLabel[0] == 0 ? STR_UNTITLED.c_str() : imgLabel); + font->print(lastCol, i + 1, true, "[R]", alignEnd, pal); break; case DriveMenuOperation::gbaCart: - font->printf(0, i + 1, true, Alignment::left, pal, STR_GBA_GAMECART.c_str(), romTitle[1]); + font->printf(firstCol, i + 1, true, alignStart, pal, STR_GBA_GAMECART.c_str(), romTitle[1]); break; case DriveMenuOperation::ndsCard: if(romTitle[0][0] != 0) - font->printf(0, i + 1, true, Alignment::left, pal, STR_NDS_GAMECARD.c_str(), romTitle[0]); + font->printf(firstCol, i + 1, true, alignStart, pal, STR_NDS_GAMECARD.c_str(), romTitle[0]); else - font->print(0, i + 1, true, STR_NDS_GAMECARD_NO_TITLE, Alignment::left, pal); + font->print(firstCol, i + 1, true, STR_NDS_GAMECARD_NO_TITLE, alignStart, pal); break; case DriveMenuOperation::none: break; @@ -133,70 +133,70 @@ void dm_drawBottomScreen(void) { int row = -1; if (!isDSiMode() && isRegularDS) { - font->print(0, row--, false, STR_POWERTEXT_DS); + font->print(firstCol, row--, false, STR_POWERTEXT_DS, alignStart); } else if (is3DS) { - font->print(0, row--, false, STR_HOMETEXT); - font->print(0, row--, false, STR_POWERTEXT_3DS); + font->print(firstCol, row--, false, STR_HOMETEXT, alignStart); + font->print(firstCol, row--, false, STR_POWERTEXT_3DS, alignStart); } else { - font->print(0, row--, false, STR_POWERTEXT); + font->print(firstCol, row--, false, STR_POWERTEXT, alignStart); } - font->print(0, row--, false, STR_START_START_MENU); + font->print(firstCol, row--, false, STR_START_START_MENU, alignStart); if ((isDSiMode() && memcmp(io_dldi_data->friendlyName, "Default", 7) == 0) || sdMountedDone) { - font->print(0, row--, false, sdMounted ? STR_UNMOUNT_SDCARD : STR_REMOUNT_SDCARD); + font->print(firstCol, row--, false, sdMounted ? STR_UNMOUNT_SDCARD : STR_REMOUNT_SDCARD, alignStart); } else if(flashcardMounted) { - font->print(0, row--, false, STR_UNMOUNT_FLASHCARD); + font->print(firstCol, row--, false, STR_UNMOUNT_FLASHCARD, alignStart); } if ((sdMounted && driveWritable(Drive::sdCard)) || (flashcardMounted && driveWritable(Drive::flashcard))) { - font->print(0, row--, false, STR_SCREENSHOTTEXT); + font->print(firstCol, row--, false, STR_SCREENSHOTTEXT, alignStart); } if(dmOperations[dmCursorPosition] == DriveMenuOperation::nitroFs || dmOperations[dmCursorPosition] == DriveMenuOperation::fatImage) - font->print(0, row--, false, STR_IMAGETEXT); - font->print(0, row--, false, titleName); + font->print(firstCol, row--, false, STR_IMAGETEXT, alignStart); + font->print(firstCol, row--, false, titleName, alignStart); switch(dmOperations[dmCursorPosition]) { case DriveMenuOperation::sdCard: - font->printf(0, 0, false, Alignment::left, Palette::white, STR_SDCARD_LABEL.c_str(), sdLabel[0] == 0 ? STR_UNTITLED.c_str() : sdLabel); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_SD_FAT.c_str(), getBytes(sdSize).c_str()); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::sdCard)).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_SDCARD_LABEL.c_str(), sdLabel[0] == 0 ? STR_UNTITLED.c_str() : sdLabel); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_SD_FAT.c_str(), getBytes(sdSize).c_str()); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::sdCard)).c_str()); break; case DriveMenuOperation::flashcard: - font->printf(0, 0, false, Alignment::left, Palette::white, STR_FLASHCARD_LABEL.c_str(), fatLabel[0] == 0 ? STR_UNTITLED.c_str() : fatLabel); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_SLOT1_FAT.c_str(), getBytes(fatSize).c_str()); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::flashcard)).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_FLASHCARD_LABEL.c_str(), fatLabel[0] == 0 ? STR_UNTITLED.c_str() : fatLabel); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_SLOT1_FAT.c_str(), getBytes(fatSize).c_str()); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::flashcard)).c_str()); break; case DriveMenuOperation::gbaCart: - font->printf(0, 0, false, Alignment::left, Palette::white, STR_GBA_GAMECART.c_str(), romTitle[1]); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_GBA_GAME.c_str(), getBytes(romSize[1]).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_GBA_GAMECART.c_str(), romTitle[1]); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_GBA_GAME.c_str(), getBytes(romSize[1]).c_str()); break; case DriveMenuOperation::nitroFs: - font->print(0, 0, false, STR_NITROFS_LABEL); - font->print(0, 1, false, STR_GAME_VIRTUAL); + font->print(firstCol, 0, false, STR_NITROFS_LABEL, alignStart); + font->print(firstCol, 1, false, STR_GAME_VIRTUAL, alignStart); break; case DriveMenuOperation::ndsCard: if(romTitle[0][0] != 0) { - font->printf(0, 0, false, Alignment::left, Palette::white, STR_NDS_GAMECARD.c_str(), romTitle[0]); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_NDS_GAME.c_str(), getBytes(romSize[0]).c_str(), getBytes(romSizeTrimmed).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_NDS_GAMECARD.c_str(), romTitle[0]); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_NDS_GAME.c_str(), getBytes(romSize[0]).c_str(), getBytes(romSizeTrimmed).c_str()); } else { - font->print(0, 0, false, STR_NDS_GAMECARD_NO_TITLE); + font->print(firstCol, 0, false, STR_NDS_GAMECARD_NO_TITLE, alignStart); } break; case DriveMenuOperation::ramDrive: - font->print(0, 0, false, STR_RAMDRIVE_LABEL); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_RAMDRIVE_FAT.c_str(), getBytes(ramdSize).c_str()); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::ramDrive)).c_str()); + font->print(firstCol, 0, false, STR_RAMDRIVE_LABEL, alignStart); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_RAMDRIVE_FAT.c_str(), getBytes(ramdSize).c_str()); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::ramDrive)).c_str()); break; case DriveMenuOperation::sysNand: - font->print(0, 0, false, STR_SYSNAND_LABEL); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_SYSNAND_FAT.c_str(), getBytes(nandSize).c_str()); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::nand)).c_str()); + font->print(firstCol, 0, false, STR_SYSNAND_LABEL, alignStart); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_SYSNAND_FAT.c_str(), getBytes(nandSize).c_str()); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::nand)).c_str()); break; case DriveMenuOperation::fatImage: - font->printf(0, 0, false, Alignment::left, Palette::white, STR_FAT_LABEL.c_str(), imgLabel[0] == 0 ? STR_UNTITLED.c_str() : imgLabel); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_FAT_IMAGE.c_str(), getBytes(imgSize).c_str()); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::fatImg)).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_FAT_LABEL.c_str(), imgLabel[0] == 0 ? STR_UNTITLED.c_str() : imgLabel); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_FAT_IMAGE.c_str(), getBytes(imgSize).c_str()); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_N_FREE.c_str(), getBytes(driveSizeFree(Drive::fatImg)).c_str()); break; case DriveMenuOperation::none: break; diff --git a/arm9/source/dumpOperations.cpp b/arm9/source/dumpOperations.cpp index a3484a8..96fb0c1 100644 --- a/arm9/source/dumpOperations.cpp +++ b/arm9/source/dumpOperations.cpp @@ -52,31 +52,32 @@ DumpOption dumpMenu(std::vector allowedOptions, const char *dumpName while (true) { font->clear(false); - font->print(0, 0, false, dumpToStr); + font->print(firstCol, 0, false, dumpToStr, alignStart); + int optionsCol = rtl ? -4 : 3; int row = y; for(DumpOption option : allowedOptions) { switch(option) { case DumpOption::all: - font->print(3, row++, false, STR_DUMP_ALL); + font->print(optionsCol, row++, false, STR_DUMP_ALL, alignStart); break; case DumpOption::allTrimmed: - font->print(3, row++, false, STR_DUMP_ALL_TRIMMED); + font->print(optionsCol, row++, false, STR_DUMP_ALL_TRIMMED, alignStart); break; case DumpOption::rom: - font->print(3, row++, false, STR_DUMP_ROM); + font->print(optionsCol, row++, false, STR_DUMP_ROM, alignStart); break; case DumpOption::romTrimmed: - font->print(3, row++, false, STR_DUMP_ROM_TRIMMED); + font->print(optionsCol, row++, false, STR_DUMP_ROM_TRIMMED, alignStart); break; case DumpOption::save: - font->print(3, row++, false, STR_DUMP_SAVE); + font->print(optionsCol, row++, false, STR_DUMP_SAVE, alignStart); break; case DumpOption::ndsSave: - font->print(3, row++, false, STR_DUMP_DS_SAVE); + font->print(optionsCol, row++, false, STR_DUMP_DS_SAVE, alignStart); break; case DumpOption::metadata: - font->print(3, row++, false, STR_DUMP_METADATA); + font->print(optionsCol, row++, false, STR_DUMP_METADATA, alignStart); break; case DumpOption::none: row++; @@ -84,10 +85,10 @@ DumpOption dumpMenu(std::vector allowedOptions, const char *dumpName } } - font->print(3, ++row, false, STR_A_SELECT_B_CANCEL); + font->print(optionsCol, ++row, false, STR_A_SELECT_B_CANCEL, alignStart); // Show cursor - font->print(0, y + optionOffset, false, "->"); + font->print(firstCol, y + optionOffset, false, rtl ? "<-" : "->", alignStart); font->update(false); @@ -127,8 +128,8 @@ DumpOption dumpMenu(std::vector allowedOptions, const char *dumpName void dumpFailMsg(std::string_view msg) { font->clear(false); - font->print(0, 0, false, msg, Alignment::left, Palette::red); - font->print(0, font->calcHeight(msg) + 1, false, STR_A_OK); + font->print(firstCol, 0, false, msg, alignStart, Palette::red); + font->print(firstCol, font->calcHeight(msg) + 1, false, STR_A_OK, alignStart); font->update(false); u16 pressed; @@ -291,7 +292,7 @@ u32 cardNandGetSaveSize(void) { bool writeToGbaSave(const char* fileName, u8* buffer, u32 size) { font->clear(false); - font->print(0, 0, false, STR_COMPRESSING_SAVE); + font->print(firstCol, 0, false, STR_COMPRESSING_SAVE, alignStart); font->update(false); int compressedSize = 0; u8 *compressedBuffer = LZS_Encode(buffer, size, LZS_VFAST, &compressedSize); @@ -300,7 +301,7 @@ bool writeToGbaSave(const char* fileName, u8* buffer, u32 size) { u32 bytesWritten = 0; while((int)bytesWritten < compressedSize) { font->clear(false); - font->print(0, 0, false, STR_LOADING); + font->print(firstCol, 0, false, STR_LOADING, alignStart); font->update(false); saveTypeGBA type = gbaGetSaveType(); u32 gbaSize = gbaGetSaveSize(type); @@ -308,7 +309,7 @@ bool writeToGbaSave(const char* fileName, u8* buffer, u32 size) { u32 writeSize = std::min(gbaSize - 0x30, (u32)(compressedSize - bytesWritten)); font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, (STR_WRITE_TO_GBA + "\n\n" + STR_A_YES_B_NO).c_str(), getBytes(writeSize).c_str(), getBytes(compressedSize - bytesWritten).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, (STR_WRITE_TO_GBA + "\n\n" + STR_A_YES_B_NO).c_str(), getBytes(writeSize).c_str(), getBytes(compressedSize - bytesWritten).c_str(), alignStart); font->update(false); u16 pressed; @@ -320,7 +321,7 @@ bool writeToGbaSave(const char* fileName, u8* buffer, u32 size) { if(pressed & KEY_A) { font->clear(false); - font->print(0, 0, false, STR_WRITING_SAVE); + font->print(firstCol, 0, false, STR_WRITING_SAVE, alignStart); font->update(false); u8* writeBuffer = (u8*)memalign(4, gbaSize); @@ -349,7 +350,7 @@ bool writeToGbaSave(const char* fileName, u8* buffer, u32 size) { if((int)bytesWritten < compressedSize) { font->clear(false); - font->print(0, 0, false, STR_SWITCH_CART); + font->print(firstCol, 0, false, STR_SWITCH_CART, alignStart); font->update(false); // Wait for GBA cart to be removed and reinserted @@ -373,7 +374,7 @@ bool readFromGbaCart() { u32 bytesRead = 0; do { font->clear(false); - font->print(0, 0, false, STR_LOADING); + font->print(firstCol, 0, false, STR_LOADING, alignStart); font->update(false); saveTypeGBA saveType = gbaGetSaveType(); @@ -419,9 +420,9 @@ bool readFromGbaCart() { if(bytesRead < compressedSize) { font->clear(false); if(section != -1) - font->printf(0, 0, false, Alignment::left, Palette::white, (STR_SWITCH_CART_TO_SECTION_THIS_WAS + "\n\n" + STR_B_CANCEL).c_str(), currentSection + 1, section + 1); + font->printf(firstCol, 0, false, alignStart, Palette::white, (STR_SWITCH_CART_TO_SECTION_THIS_WAS + "\n\n" + STR_B_CANCEL).c_str(), currentSection + 1, section + 1, alignStart); else - font->printf(0, 0, false, Alignment::left, Palette::white, (STR_SWITCH_CART_TO_SECTION + "\n\n" + STR_B_CANCEL).c_str(), currentSection + 1); + font->printf(firstCol, 0, false, alignStart, Palette::white, (STR_SWITCH_CART_TO_SECTION + "\n\n" + STR_B_CANCEL).c_str(), currentSection + 1, alignStart); font->update(false); if(*(u8*)(0x080000B2) == 0x96) { @@ -467,8 +468,8 @@ bool readFromGbaCart() { void ndsCardSaveDump(const char* filename) { font->clear(false); - font->print(0, 0, false, STR_DUMPING_SAVE); - font->print(0, 1, false, STR_DO_NOT_REMOVE_CARD); + font->print(firstCol, 0, false, STR_DUMPING_SAVE, alignStart); + font->print(firstCol, 1, false, STR_DO_NOT_REMOVE_CARD, alignStart); font->update(false); int type = cardEepromGetTypeFixed(); @@ -485,12 +486,15 @@ void ndsCardSaveDump(const char* filename) { FILE* destinationFile = fopen(filename, "wb"); if (destinationFile) { - font->print(0, 4, false, STR_PROGRESS); + font->print(firstCol, 4, false, STR_PROGRESS, alignStart); font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for (u32 src = 0; src < saveSize; src += 0x8000) { - font->print((src / (saveSize / (SCREEN_COLS - 2))) + 1, 5, false, "="); - font->printf(0, 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), src, saveSize); + int progressPos = (src / (saveSize / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), src, saveSize); font->update(false); for (u32 i = 0; i < 0x8000; i += 0x200) { @@ -544,7 +548,7 @@ void ndsCardSaveRestore(const char *filename) { bool usingFlashcard = (io_dldi_data->ioInterface.features & FEATURE_SLOT_NDS) && flashcardMounted; font->clear(false); - font->print(0, 0, false, (usingFlashcard ? STR_RESTORE_SELECTED_SAVE_CARD_FLASHCARD : STR_RESTORE_SELECTED_SAVE_CARD) + "\n\n" + STR_A_YES_B_NO); + font->print(firstCol, 0, false, (usingFlashcard ? STR_RESTORE_SELECTED_SAVE_CARD_FLASHCARD : STR_RESTORE_SELECTED_SAVE_CARD) + "\n\n" + STR_A_YES_B_NO, alignStart); font->update(false); // Power saving loop. Only poll the keys once per frame and sleep the CPU if there is nothing else to do @@ -585,12 +589,15 @@ void ndsCardSaveRestore(const char *filename) { u32 currentSize = saveSize; if (in) { - font->print(0, 4, false, STR_PROGRESS); + font->print(firstCol, 4, false, STR_PROGRESS); font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for (u32 dest = 0; dest < saveSize; dest += 0x8000) { - font->print((dest / (saveSize / (SCREEN_COLS - 2))) + 1, 5, false, "="); - font->printf(0, 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), dest, saveSize); + int progressPos = (dest / (saveSize / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), dest, saveSize); font->update(false); fread(copyBuf, 1, 0x8000, in); @@ -624,7 +631,7 @@ void ndsCardSaveRestore(const char *filename) { flashcardUnmount(); font->clear(false); - font->print(0, 0, false, STR_EJECT_FLASHCARD_INSERT_GAME + "\n\n" + STR_A_CONTINUE); + font->print(firstCol, 0, false, STR_EJECT_FLASHCARD_INSERT_GAME + "\n\n" + STR_A_CONTINUE, alignStart); font->update(false); // Power saving loop. Only poll the keys once per frame and sleep the CPU if there is nothing else to do @@ -669,9 +676,9 @@ void ndsCardSaveRestore(const char *filename) { } font->clear(false); - font->print(0, 0, false, STR_RESTORING_SAVE); - font->print(0, 1, false, STR_DO_NOT_REMOVE_CARD); - font->print(0, 4, false, STR_PROGRESS); + font->print(firstCol, 0, false, STR_RESTORING_SAVE, alignStart); + font->print(firstCol, 1, false, STR_DO_NOT_REMOVE_CARD, alignStart); + font->print(firstCol, 4, false, STR_PROGRESS, alignStart); font->update(false); if(type == 3) { @@ -689,8 +696,11 @@ void ndsCardSaveRestore(const char *filename) { font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for(unsigned int i = 0; i < num_blocks; i++) { - font->print((i * (SCREEN_COLS - 2) / num_blocks) + 1, 5, false, "="); - font->printf(0, 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), i * LEN, length); + int progressPos = (i * (SCREEN_COLS - 2) / num_blocks) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), i * LEN, length); font->update(false); if(usingFlashcard) { @@ -708,8 +718,11 @@ void ndsCardSaveRestore(const char *filename) { font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for(unsigned int i = 0; i < 32; i++) { - font->print((i * (SCREEN_COLS - 2) / 32) + 1, 5, false, "="); - font->printf(0, 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), written, size); + int progressPos = (i * (SCREEN_COLS - 2) / 32) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), written, size); font->update(false); if(usingFlashcard) { @@ -738,8 +751,8 @@ void ndsCardDump(void) { font->clear(false); if ((io_dldi_data->ioInterface.features & FEATURE_SLOT_NDS) && flashcardMounted) { - font->print(0, 0, false, STR_FLASHCARD_WILL_UNMOUNT); - font->print(0, 3, false, STR_A_YES_B_NO); + font->print(firstCol, 0, false, STR_FLASHCARD_WILL_UNMOUNT, alignStart); + font->print(firstCol, 3, false, STR_A_YES_B_NO, alignStart); font->update(false); while (true) { @@ -760,7 +773,7 @@ void ndsCardDump(void) { } } - font->print(0, 0, false, STR_LOADING); + font->print(firstCol, 0, false, STR_LOADING, alignStart); font->update(false); std::vector allowedOptions = {DumpOption::all}; @@ -829,13 +842,13 @@ void ndsCardDump(void) { sprintf(folderPath[1], "%s:/gm9i/out", (sdMounted ? "sd" : "fat")); if (access(folderPath[0], F_OK) != 0) { font->clear(false); - font->print(0, 0, false, STR_CREATING_DIRECTORY); + font->print(firstCol, 0, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir(folderPath[0], 0777); } if (access(folderPath[1], F_OK) != 0) { font->clear(false); - font->print(0, 0, false, STR_CREATING_DIRECTORY); + font->print(firstCol, 0, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir(folderPath[1], 0777); } @@ -844,8 +857,8 @@ void ndsCardDump(void) { // Dump ROM if((dumpOption & allowedBitfield) & (DumpOption::rom | DumpOption::romTrimmed)) { font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, STR_NDS_IS_DUMPING.c_str(), fileName); - font->print(0, 2, false, STR_DO_NOT_REMOVE_CARD); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_NDS_IS_DUMPING.c_str(), fileName); + font->print(firstCol, 2, false, STR_DO_NOT_REMOVE_CARD, alignStart); font->update(false); // Determine ROM size @@ -863,12 +876,15 @@ void ndsCardDump(void) { u32 currentSize = romSize; FILE* destinationFile = fopen(destPath, "wb"); if (destinationFile) { - font->print(0, 4, false, STR_PROGRESS); + font->print(firstCol, 4, false, STR_PROGRESS, alignStart); font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for (u32 src = 0; src < romSize; src += 0x8000) { - font->print((src / (romSize / (SCREEN_COLS - 2))) + 1, 5, false, "="); - font->printf(0, 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), src, romSize); + int progressPos = (src / (romSize / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), src, romSize); font->update(false); for (u32 i = 0; i < 0x8000; i += 0x200) { @@ -896,7 +912,7 @@ void ndsCardDump(void) { // Dump metadata if ((dumpOption & allowedBitfield) & DumpOption::metadata) { font->clear(false); - font->print(0, 0, false, STR_DUMPING_METADATA); + font->print(firstCol, 0, false, STR_DUMPING_METADATA, alignStart); font->update(false); char destPath[256]; @@ -933,8 +949,8 @@ void ndsCardDump(void) { void gbaCartSaveDump(const char *filename) { font->clear(false); - font->print(0, 0, false, STR_DUMPING_SAVE); - font->print(0, 1, false, STR_DO_NOT_REMOVE_CART); + font->print(firstCol, 0, false, STR_DUMPING_SAVE, alignStart); + font->print(firstCol, 1, false, STR_DO_NOT_REMOVE_CART, alignStart); font->update(false); saveTypeGBA type = gbaGetSaveType(); @@ -953,7 +969,7 @@ void gbaCartSaveDump(const char *filename) { void gbaCartSaveRestore(const char *filename) { font->clear(false); - font->print(0, 0, false, STR_RESTORE_SELECTED_SAVE_CART + "\n\n" + STR_A_YES_B_NO); + font->print(firstCol, 0, false, STR_RESTORE_SELECTED_SAVE_CART + "\n\n" + STR_A_YES_B_NO, alignStart); font->update(false); // Power saving loop. Only poll the keys once per frame and sleep the CPU if there is nothing else to do @@ -996,8 +1012,8 @@ void gbaCartSaveRestore(const char *filename) { } font->clear(false); - font->print(0, 0, false, STR_RESTORING_SAVE); - font->print(0, 1, false, STR_DO_NOT_REMOVE_CART); + font->print(firstCol, 0, false, STR_RESTORING_SAVE, alignStart); + font->print(firstCol, 1, false, STR_DO_NOT_REMOVE_CART, alignStart); font->update(false); gbaFormatSave(type); @@ -1028,7 +1044,7 @@ void gbaCartDump(void) { #endif font->clear(false); - font->print(0, 0, false, STR_LOADING); + font->print(firstCol, 0, false, STR_LOADING, alignStart); font->update(false); std::vector allowedOptions = {DumpOption::all, DumpOption::rom}; @@ -1089,13 +1105,13 @@ void gbaCartDump(void) { sprintf(folderPath[1], "%s:/gm9i/out", (sdMounted ? "sd" : "fat")); if (access(folderPath[0], F_OK) != 0) { font->clear(false); - font->print(0, 0, false, STR_CREATING_DIRECTORY); + font->print(firstCol, 0, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir(folderPath[0], 0777); } if (access(folderPath[1], F_OK) != 0) { font->clear(false); - font->print(0, 0, false, STR_CREATING_DIRECTORY); + font->print(firstCol, 0, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir(folderPath[1], 0777); } @@ -1104,8 +1120,8 @@ void gbaCartDump(void) { // Dump ROM if ((dumpOption & allowedBitfield) & DumpOption::rom) { font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, STR_GBA_IS_DUMPING.c_str(), fileName); - font->print(0, 2, false, STR_DO_NOT_REMOVE_CART); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_GBA_IS_DUMPING.c_str(), fileName); + font->print(firstCol, 2, false, STR_DO_NOT_REMOVE_CART, alignStart); font->update(false); // Determine ROM size @@ -1139,12 +1155,15 @@ void gbaCartDump(void) { if (destinationFile) { bool failed = false; - font->print(0, 4, false, STR_PROGRESS); + font->print(firstCol, 4, false, STR_PROGRESS, alignStart); font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for (u32 src = 0; src < romSize; src += 0x8000) { - font->print((src / (romSize / (SCREEN_COLS - 2))) + 1, 5, false, "="); - font->printf(0, 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), src, romSize); + int progressPos = (src / (romSize / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), src, romSize); font->update(false); if (fwrite(GBAROM + src / sizeof(u16), 1, 0x8000, destinationFile) != 0x8000) { @@ -1171,8 +1190,11 @@ void gbaCartDump(void) { font->print(0, 5, false, "["); font->print(-1, 5, false, "]"); for (size_t i = 0x02000000; i < 0x04000000; i += 0x1000) { - font->print((i / (0x04000000 / (SCREEN_COLS - 2))) + 1, 5, false, "="); - font->printf(0, 7, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), i - 0x02000000, 0x04000000 - 0x02000000); + int progressPos = (i / (0x04000000 / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 5, false, "="); + font->printf(firstCol, 7, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), i - 0x02000000, 0x04000000 - 0x02000000); font->update(false); cmd[1] = i, @@ -1206,7 +1228,7 @@ void gbaCartDump(void) { // Dump metadata if ((dumpOption & allowedBitfield) & DumpOption::metadata) { font->clear(false); - font->print(0, 0, false, STR_DUMPING_METADATA); + font->print(firstCol, 0, false, STR_DUMPING_METADATA, alignStart); font->update(false); char destPath[256]; diff --git a/arm9/source/fileOperations.cpp b/arm9/source/fileOperations.cpp index 06a42fe..fe3c2a2 100644 --- a/arm9/source/fileOperations.cpp +++ b/arm9/source/fileOperations.cpp @@ -70,7 +70,7 @@ bool calculateSHA1(const char *fileName, u8 *sha1) { u8 *buf = (u8*) malloc(shaChunkSize); if (!buf) { font->clear(false); - font->print(0, 0, false, STR_COULD_NOT_ALLOCATE_BUFFER); + font->print(firstCol, 0, false, STR_COULD_NOT_ALLOCATE_BUFFER, alignStart); font->update(false); for(int i = 0; i < 60 * 2; i++) swiWaitForVBlank(); @@ -79,7 +79,7 @@ bool calculateSHA1(const char *fileName, u8 *sha1) { FILE* fp = fopen(fileName, "rb"); if (!fp) { font->clear(false); - font->print(0, 0, false, STR_COULD_NOT_OPEN_FILE_READING); + font->print(firstCol, 0, false, STR_COULD_NOT_OPEN_FILE_READING, alignStart); font->update(false); for(int i = 0; i < 60 * 2; i++) swiWaitForVBlank(); @@ -92,12 +92,12 @@ bool calculateSHA1(const char *fileName, u8 *sha1) { swiSHA1Init(&ctx); font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, STR_CALCULATING_SHA1.c_str(), fileName); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_CALCULATING_SHA1.c_str(), fileName); int nameHeight = font->calcHeight(fileName); - font->print(0, nameHeight + 2, false, STR_START_CANCEL); + font->print(firstCol, nameHeight + 2, false, STR_START_CANCEL, alignStart); - font->print(0, nameHeight + 4, false, STR_PROGRESS); + font->print(firstCol, nameHeight + 4, false, STR_PROGRESS, alignStart); font->print(0, nameHeight + 5, false, "["); font->print(-1, nameHeight + 5, false, "]"); @@ -113,8 +113,11 @@ bool calculateSHA1(const char *fileName, u8 *sha1) { return false; } - font->print((ftell(fp) / (fsize / (SCREEN_COLS - 2))) + 1, nameHeight + 5, false, "="); - font->printf(0, nameHeight + 6, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES_PROCESSED.c_str(), ftell(fp), fsize); + int progressPos = (ftell(fp) / (fsize / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, nameHeight + 5, false, "="); + font->printf(firstCol, nameHeight + 6, false, alignStart, Palette::white, STR_N_OF_N_BYTES_PROCESSED.c_str(), ftell(fp), fsize); font->update(false); } swiSHA1Final(sha1, &ctx); @@ -140,7 +143,7 @@ int trimNds(const char *fileName) { if(fileSize == romSize) { font->clear(false); - font->print(0, 0, false, STR_FILE_ALREADY_TRIMMED + "\n\n" + STR_A_OK); + font->print(firstCol, 0, false, STR_FILE_ALREADY_TRIMMED + "\n\n" + STR_A_OK, alignStart); font->update(false); do { @@ -149,7 +152,7 @@ int trimNds(const char *fileName) { } while(!(keysDown() & KEY_A)); } else { font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, (STR_TRIM_TO_N_BYTES + "\n\n" + STR_A_YES_B_NO).c_str(), getBytes(romSize).c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, (STR_TRIM_TO_N_BYTES + "\n\n" + STR_A_YES_B_NO).c_str(), getBytes(romSize).c_str()); font->update(false); u16 pressed; @@ -274,7 +277,7 @@ bool fcopy(const char *sourcePath, const char *destinationPath) { } font->clear(false); - font->print(0, 0, false, STR_PROGRESS); + font->print(firstCol, 0, false, STR_PROGRESS, alignStart); font->print(0, 1, false, "["); font->print(-1, 1, false, "]"); @@ -289,8 +292,11 @@ bool fcopy(const char *sourcePath, const char *destinationPath) { return false; } - font->print((offset / (fsize / (SCREEN_COLS - 2))) + 1, 1, false, "="); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_N_OF_N_BYTES.c_str(), (int)offset, (int)fsize); + int progressPos = (offset / (fsize / (SCREEN_COLS - 2))) + 1; + if(rtl) + progressPos = (progressPos + 1) * -1; + font->print(progressPos, 1, false, "="); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_N_OF_N_BYTES.c_str(), (int)offset, (int)fsize); font->update(false); // Copy file to destination path @@ -326,21 +332,21 @@ void changeFileAttribs(const DirEntry *entry) { while (1) { font->clear(false); - font->print(0, 0, false, entry->name); + font->print(firstCol, 0, false, entry->name, alignStart); if (!entry->isDirectory) { - font->printf(0, cursorScreenPos + 1, false, Alignment::left, Palette::white, STR_FILESIZE.c_str(), getBytes(entry->size).c_str()); + font->printf(firstCol, cursorScreenPos + 1, false, alignStart, Palette::white, STR_FILESIZE.c_str(), getBytes(entry->size).c_str()); char str[32]; strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S", localtime(&st.st_ctime)); - font->printf(0, cursorScreenPos + 2, false, Alignment::left, Palette::white, STR_CREATED.c_str(), str); + font->printf(firstCol, cursorScreenPos + 2, false, alignStart, Palette::white, STR_CREATED.c_str(), str); strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S", localtime(&st.st_mtime)); - font->printf(0, cursorScreenPos + 3, false, Alignment::left, Palette::white, STR_MODIFIED.c_str(), str); + font->printf(firstCol, cursorScreenPos + 3, false, alignStart, Palette::white, STR_MODIFIED.c_str(), str); } - font->printf(0, cursorScreenPos + 5, false, Alignment::left, Palette::white, "[%c]%-13s[%c]%s", (newAttribs & ATTR_READONLY) ? 'X' : ' ', STR_UP_READONLY.c_str(), (newAttribs & ATTR_HIDDEN) ? 'X' : ' ', STR_LEFT_HIDDEN.c_str()); - font->printf(0, cursorScreenPos + 6, false, Alignment::left, Palette::white, "[%c]%-13s[%c]%s", (newAttribs & ATTR_SYSTEM) ? 'X' : ' ', STR_DOWN_SYSTEM.c_str(), (newAttribs & ATTR_ARCHIVE) ? 'X' : ' ', STR_RIGHT_ARCHIVE.c_str()); - font->printf(0, cursorScreenPos + 7, false, Alignment::left, Palette::white, "[%c] %s", (newAttribs & ATTR_VOLUME) ? 'X' : ' ', STR_VIRTUAL.c_str()); - font->printf(0, cursorScreenPos + 8, false, Alignment::left, Palette::white, STR_UDLR_CHANGE_ATTRIBUTES.c_str()); - font->print(0, cursorScreenPos + 10, false, (currentAttribs == newAttribs) ? STR_A_CONTINUE : STR_A_APPLY_B_CANCEL); + font->printf(firstCol, cursorScreenPos + 5, false, alignStart, Palette::white, "[%c]%-13s[%c]%s", (newAttribs & ATTR_READONLY) ? 'X' : ' ', STR_UP_READONLY.c_str(), (newAttribs & ATTR_HIDDEN) ? 'X' : ' ', STR_LEFT_HIDDEN.c_str()); + font->printf(firstCol, cursorScreenPos + 6, false, alignStart, Palette::white, "[%c]%-13s[%c]%s", (newAttribs & ATTR_SYSTEM) ? 'X' : ' ', STR_DOWN_SYSTEM.c_str(), (newAttribs & ATTR_ARCHIVE) ? 'X' : ' ', STR_RIGHT_ARCHIVE.c_str()); + font->printf(firstCol, cursorScreenPos + 7, false, alignStart, Palette::white, "[%c] %s", (newAttribs & ATTR_VOLUME) ? 'X' : ' ', STR_VIRTUAL.c_str()); + font->printf(firstCol, cursorScreenPos + 8, false, alignStart, Palette::white, STR_UDLR_CHANGE_ATTRIBUTES.c_str()); + font->print(firstCol, cursorScreenPos + 10, false, (currentAttribs == newAttribs) ? STR_A_CONTINUE : STR_A_APPLY_B_CANCEL, alignStart); font->update(false); // Power saving loop. Only poll the keys once per frame and sleep the CPU if there is nothing else to do diff --git a/arm9/source/file_browse.cpp b/arm9/source/file_browse.cpp index ab72ef1..7898959 100644 --- a/arm9/source/file_browse.cpp +++ b/arm9/source/file_browse.cpp @@ -82,7 +82,7 @@ bool getDirectoryContents(std::vector& dirContents) { DIR *pdir = opendir ("."); if (pdir == nullptr) { - font->print(0, 0, true, STR_UNABLE_TO_OPEN_DIRECTORY); + font->print(firstCol, 0, true, STR_UNABLE_TO_OPEN_DIRECTORY, alignStart); font->update(true); return false; } else { @@ -120,16 +120,16 @@ void showDirectoryContents(std::vector &dirContents, int fileOffset, i font->clear(true); // Top bar - font->printf(0, 0, true, Alignment::left, Palette::blackGreen, "%*c", 256 / font->width(), ' '); - - // Print time - font->print(-1, 0, true, RetTime(), Alignment::right, Palette::blackGreen); + font->printf(firstCol, 0, true, alignStart, Palette::blackGreen, "%*c", 256 / font->width(), ' '); // Print the path if(font->calcWidth(path) > SCREEN_COLS - 6) - font->print(-6 - 1, 0, true, path, Alignment::right, Palette::blackGreen); + font->print(rtl ? -1 : -6, 0, true, path, Alignment::right, Palette::blackGreen, true); else - font->print(0, 0, true, path, Alignment::left, Palette::blackGreen); + font->print(firstCol, 0, true, path, alignStart, Palette::blackGreen); + + // Print time + font->print(lastCol, 0, true, RetTime(), alignEnd, Palette::blackGreen); // Print directory listing for (int i = 0; i < ((int)dirContents.size() - startRow) && i < ENTRIES_PER_SCREEN; i++) { @@ -156,13 +156,13 @@ void showDirectoryContents(std::vector &dirContents, int fileOffset, i i++; } - font->print(0, i + 1, true, entry->name.substr(0, nameSize), Alignment::left, pal); + font->print(firstCol, i + 1, true, entry->name.substr(0, nameSize), alignStart, pal); if (entry->name == "..") { - font->print(-1, i + 1, true, "(..)", Alignment::right, pal); + font->print(lastCol, i + 1, true, "(..)", alignEnd, pal); } else if (entry->isDirectory) { - font->print(-1, i + 1, true, " " + STR_DIR, Alignment::right, pal); + font->print(lastCol, i + 1, true, " " + STR_DIR, alignEnd, pal); } else { - font->printf(-1, i + 1, true, Alignment::right, pal, " (%s)", getBytes(entry->size).c_str()); + font->printf(lastCol, i + 1, true, alignEnd, pal, " (%s)", getBytes(entry->size).c_str()); } } @@ -229,55 +229,56 @@ FileOperation fileBrowse_A(DirEntry* entry, char path[PATH_MAX]) { while (true) { font->clear(false); - font->print(0, 0, false, fullPath); + font->print(firstCol, 0, false, fullPath, alignStart); + int optionsCol = rtl ? -4 : 3; int row = y; for(FileOperation operation : operations) { switch(operation) { case FileOperation::bootFile: - font->print(3, row++, false, extension(entry->name, {"firm"}) ? STR_BOOT_FILE : STR_BOOT_FILE_DIRECT); + font->print(optionsCol, row++, false, extension(entry->name, {"firm"}) ? STR_BOOT_FILE : STR_BOOT_FILE_DIRECT, alignStart); break; case FileOperation::bootstrapFile: - font->print(3, row++, false, STR_BOOTSTRAP_FILE); + font->print(optionsCol, row++, false, STR_BOOTSTRAP_FILE, alignStart); break; case FileOperation::mountNitroFS: - font->print(3, row++, false, STR_MOUNT_NITROFS); + font->print(optionsCol, row++, false, STR_MOUNT_NITROFS, alignStart); break; case FileOperation::ndsInfo: - font->print(3, row++, false, STR_SHOW_NDS_INFO); + font->print(optionsCol, row++, false, STR_SHOW_NDS_INFO, alignStart); break; case FileOperation::trimNds: - font->print(3, row++, false, STR_TRIM_NDS); + font->print(optionsCol, row++, false, STR_TRIM_NDS, alignStart); break; case FileOperation::restoreSaveNds: if(!isRegularDS) - font->print(3, row++, false, STR_RESTORE_SAVE); + font->print(optionsCol, row++, false, STR_RESTORE_SAVE, alignStart); else - font->print(3, row++, false, STR_RESTORE_SAVE_NDS); + font->print(optionsCol, row++, false, STR_RESTORE_SAVE_NDS, alignStart); break; case FileOperation::restoreSaveGba: - font->print(3, row++, false, STR_RESTORE_SAVE_GBA); + font->print(optionsCol, row++, false, STR_RESTORE_SAVE_GBA, alignStart); break; case FileOperation::mountImg: - font->print(3, row++, false, STR_MOUNT_FAT_IMG); + font->print(optionsCol, row++, false, STR_MOUNT_FAT_IMG, alignStart); break; case FileOperation::hexEdit: - font->print(3, row++, false, STR_OPEN_HEX); + font->print(optionsCol, row++, false, STR_OPEN_HEX, alignStart); break; case FileOperation::showInfo: - font->print(3, row++, false, entry->isDirectory ? STR_SHOW_DIRECTORY_INFO : STR_SHOW_FILE_INFO); + font->print(optionsCol, row++, false, entry->isDirectory ? STR_SHOW_DIRECTORY_INFO : STR_SHOW_FILE_INFO, alignStart); break; case FileOperation::copySdOut: - font->print(3, row++, false, STR_COPY_SD_OUT); + font->print(optionsCol, row++, false, STR_COPY_SD_OUT, alignStart); break; case FileOperation::copyFatOut: - font->print(3, row++, false, STR_COPY_FAT_OUT); + font->print(optionsCol, row++, false, STR_COPY_FAT_OUT, alignStart); break; case FileOperation::calculateSHA1: - font->print(3, row++, false, STR_CALC_SHA1); + font->print(optionsCol, row++, false, STR_CALC_SHA1, alignStart); break; case FileOperation::loadFont: - font->print(3, row++, false, STR_LOAD_FONT); + font->print(optionsCol, row++, false, STR_LOAD_FONT, alignStart); break; case FileOperation::none: row++; @@ -285,10 +286,10 @@ FileOperation fileBrowse_A(DirEntry* entry, char path[PATH_MAX]) { } } - font->print(3, ++row, false, STR_A_SELECT_B_CANCEL); + font->print(optionsCol, ++row, false, STR_A_SELECT_B_CANCEL, alignStart); // Show cursor - font->print(0, y + optionOffset, false, "->"); + font->print(firstCol, y + optionOffset, false, rtl ? "<-" : "->", alignStart); font->update(false); @@ -320,7 +321,7 @@ FileOperation fileBrowse_A(DirEntry* entry, char path[PATH_MAX]) { switch(operations[optionOffset]) { case FileOperation::bootFile: { applaunch = true; - font->print(3, optionOffset + y, false, STR_LOADING); + font->print(optionsCol, optionOffset + y, false, STR_LOADING, alignStart); font->update(false); break; } case FileOperation::bootstrapFile: { @@ -349,18 +350,18 @@ FileOperation fileBrowse_A(DirEntry* entry, char path[PATH_MAX]) { break; } case FileOperation::copySdOut: { if (access("sd:/gm9i", F_OK) != 0) { - font->print(3, optionOffset + y, false, STR_CREATING_DIRECTORY); + font->print(optionsCol, optionOffset + y, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir("sd:/gm9i", 0777); } if (access("sd:/gm9i/out", F_OK) != 0) { - font->print(3, optionOffset + y, false, STR_CREATING_DIRECTORY); + font->print(optionsCol, optionOffset + y, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir("sd:/gm9i/out", 0777); } char destPath[256]; snprintf(destPath, sizeof(destPath), "sd:/gm9i/out/%s", entry->name.c_str()); - font->print(3, optionOffset + y, false, STR_COPYING); + font->print(optionsCol, optionOffset + y, false, STR_COPYING, alignStart); font->update(false); remove(destPath); char sourceFolder[PATH_MAX]; @@ -372,18 +373,18 @@ FileOperation fileBrowse_A(DirEntry* entry, char path[PATH_MAX]) { break; } case FileOperation::copyFatOut: { if (access("fat:/gm9i", F_OK) != 0) { - font->print(3, optionOffset + y, false, STR_CREATING_DIRECTORY); + font->print(optionsCol, optionOffset + y, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir("fat:/gm9i", 0777); } if (access("fat:/gm9i/out", F_OK) != 0) { - font->print(3, optionOffset + y, false, STR_CREATING_DIRECTORY); + font->print(optionsCol, optionOffset + y, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir("fat:/gm9i/out", 0777); } char destPath[256]; snprintf(destPath, sizeof(destPath), "fat:/gm9i/out/%s", entry->name.c_str()); - font->print(3, (optionOffset + y), false, STR_COPYING); + font->print(optionsCol, (optionOffset + y), false, STR_COPYING, alignStart); font->update(false); remove(destPath); char sourceFolder[PATH_MAX]; @@ -442,12 +443,12 @@ FileOperation fileBrowse_A(DirEntry* entry, char path[PATH_MAX]) { break; font->clear(false); - font->print(0, 0, false, STR_SHA1_HASH_IS); + font->print(firstCol, 0, false, STR_SHA1_HASH_IS, alignStart); char sha1Str[41]; for (int i = 0; i < 20; ++i) sniprintf(sha1Str + i * 2, 3, "%02X", sha1[i]); - font->print(0, 1, false, sha1Str); - font->print(0, font->calcHeight(sha1Str) + 2, false, STR_A_CONTINUE); + font->print(firstCol, 1, false, sha1Str, alignStart); + font->print(firstCol, font->calcHeight(sha1Str) + 2, false, STR_A_CONTINUE, alignStart); font->update(false); // Power saving loop. Only poll the keys once per frame and sleep the CPU if there is nothing else to do @@ -495,21 +496,22 @@ bool fileBrowse_paste(char dest[256]) { while (true) { font->clear(false); - font->print(0, 0, false, STR_PASTE_CLIPBOARD_HERE); + font->print(firstCol, 0, false, STR_PASTE_CLIPBOARD_HERE, alignStart); + int optionsCol = rtl ? -4 : 3; int row = OPTIONS_ENTRIES_START_ROW, maxCursors = 0; - font->print(3, row++, false, STR_COPY_FILES); + font->print(optionsCol, row++, false, STR_COPY_FILES, alignStart); for (auto &file : clipboard) { if (!driveWritable(file.drive)) continue; maxCursors++; - font->print(3, row++, false, STR_MOVE_FILES); + font->print(optionsCol, row++, false, STR_MOVE_FILES, alignStart); break; } - font->print(3, ++row, false, STR_A_SELECT_B_CANCEL); + font->print(optionsCol, ++row, false, STR_A_SELECT_B_CANCEL, alignStart); // Show cursor - font->print(0, optionOffset + OPTIONS_ENTRIES_START_ROW, false, "->"); + font->print(firstCol, optionOffset + OPTIONS_ENTRIES_START_ROW, false, rtl ? "<-" : "->", alignStart); font->update(false); @@ -527,7 +529,7 @@ bool fileBrowse_paste(char dest[256]) { if (optionOffset > maxCursors) optionOffset = 0; // Wrap around to top of list if (pressed & KEY_A) { - font->print(3, optionOffset + OPTIONS_ENTRIES_START_ROW, false, optionOffset ? STR_MOVING : STR_COPYING); + font->print(optionsCol, optionOffset + OPTIONS_ENTRIES_START_ROW, false, optionOffset ? STR_MOVING : STR_COPYING, alignStart); for (auto &file : clipboard) { std::string destPath = dest + file.name; if (file.path == destPath) @@ -582,50 +584,50 @@ void fileBrowse_drawBottomScreen(DirEntry* entry) { int row = -1; if (!isDSiMode() && isRegularDS) { - font->print(0, row--, false, STR_POWERTEXT_DS); + font->print(firstCol, row--, false, STR_POWERTEXT_DS, alignStart); } else if (is3DS) { - font->print(0, row--, false, STR_HOMETEXT); - font->print(0, row--, false, STR_POWERTEXT_3DS); + font->print(firstCol, row--, false, STR_HOMETEXT, alignStart); + font->print(firstCol, row--, false, STR_POWERTEXT_3DS, alignStart); } else { - font->print(0, row--, false, STR_POWERTEXT); + font->print(firstCol, row--, false, STR_POWERTEXT, alignStart); } - font->print(0, row--, false, STR_START_START_MENU); - font->print(0, row--, false, clipboardOn ? STR_CLEAR_CLIPBOARD : STR_RESTORE_CLIPBOARD); + font->print(firstCol, row--, false, STR_START_START_MENU, alignStart); + font->print(firstCol, row--, false, clipboardOn ? STR_CLEAR_CLIPBOARD : STR_RESTORE_CLIPBOARD, alignStart); if ((sdMounted && driveWritable(Drive::sdCard)) || (flashcardMounted && driveWritable(Drive::flashcard))) { - font->print(0, row--, false, STR_SCREENSHOTTEXT); + font->print(firstCol, row--, false, STR_SCREENSHOTTEXT, alignStart); } - font->print(0, row--, false, STR_DIRECTORY_OPTIONS); + font->print(firstCol, row--, false, STR_DIRECTORY_OPTIONS, alignStart); if(driveWritable(currentDrive)) - font->print(0, row--, false, clipboardOn ? STR_PASTE_FILES_CREATE_ENTRY : STR_COPY_FILES_CREATE_ENTRY); + font->print(firstCol, row--, false, clipboardOn ? STR_PASTE_FILES_CREATE_ENTRY : STR_COPY_FILES_CREATE_ENTRY, alignStart); else if(!clipboardOn) - font->print(0, row--, false, STR_COPY_FILE); - font->print(0, row--, false, entry->selected ? STR_DESELECT_FILES : STR_SELECT_FILES); + font->print(firstCol, row--, false, STR_COPY_FILE, alignStart); + font->print(firstCol, row--, false, entry->selected ? STR_DESELECT_FILES : STR_SELECT_FILES, alignStart); if(driveWritable(currentDrive)) - font->print(0, row--, false, STR_DELETE_RENAME_FILE); - font->print(0, row--, false, titleName); + font->print(firstCol, row--, false, STR_DELETE_RENAME_FILE, alignStart); + font->print(firstCol, row--, false, titleName, alignStart); // Load size if not loaded yet if(entry->size == -1) entry->size = getFileSize(entry->name.c_str()); Palette pal = entry->selected ? Palette::yellow : (entry->isDirectory ? Palette::blue : Palette::gray); - font->print(0, 0, false, entry->name, Alignment::left, pal); + font->print(firstCol, 0, false, entry->name, alignStart, pal); if (entry->name != "..") { if (entry->isDirectory) { - font->print(0, font->calcHeight(entry->name), false, STR_DIR, Alignment::left, pal); + font->print(firstCol, font->calcHeight(entry->name), false, STR_DIR, alignStart, pal); } else if (entry->size == 1) { - font->print(0, font->calcHeight(entry->name), false, STR_1_BYTE, Alignment::left, pal); + font->print(firstCol, font->calcHeight(entry->name), false, STR_1_BYTE, alignStart, pal); } else { - font->printf(0, font->calcHeight(entry->name), false, Alignment::left, pal, STR_N_BYTES.c_str(), entry->size); + font->printf(firstCol, font->calcHeight(entry->name), false, alignStart, pal, STR_N_BYTES.c_str(), entry->size); } } if (clipboardOn) { - font->print(0, 4, false, STR_CLIPBOARD); + font->print(firstCol, 4, false, STR_CLIPBOARD, alignStart); for (size_t i = 0; i < clipboard.size(); ++i) { if (i < 4) { - font->print(0, 5 + i, false, clipboard[i].name, Alignment::left, clipboard[i].folder ? Palette::blue : Palette::gray); + font->print(firstCol, 5 + i, false, clipboard[i].name, alignStart, clipboard[i].folder ? Palette::blue : Palette::gray); } else { - font->printf(0, 5 + i, false, Alignment::left, Palette::gray, clipboard.size() - 4 == 1 ? STR_1_MORE_FILE.c_str() : STR_N_MORE_FILES.c_str(), clipboard.size() - 4); + font->printf(firstCol, 5 + i, false, alignStart, Palette::gray, clipboard.size() - 4 == 1 ? STR_1_MORE_FILE.c_str() : STR_N_MORE_FILES.c_str(), clipboard.size() - 4); break; } } @@ -698,7 +700,7 @@ std::string browseForFile (void) { screenMode = 0; return "null"; } else if (entry->isDirectory) { - font->printf(0, fileOffset - screenOffset + ENTRIES_START_ROW, true, Alignment::left, Palette::white, "%-*s", SCREEN_COLS - 5, STR_ENTERING_DIRECTORY.c_str()); + font->printf(firstCol, fileOffset - screenOffset + ENTRIES_START_ROW, true, alignStart, Palette::white, "%-*s", SCREEN_COLS - 5, STR_ENTERING_DIRECTORY.c_str(), alignStart); font->update(true); // Enter selected directory chdir (entry->name.c_str()); @@ -773,19 +775,19 @@ std::string browseForFile (void) { font->clear(false); int selections = std::count_if(dirContents.begin(), dirContents.end(), [](const DirEntry &x){ return x.selected; }); if (entry->selected && selections > 1) { - font->printf(0, 0, false, Alignment::left, Palette::white, STR_DELETE_N_PATHS.c_str(), selections); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_DELETE_N_PATHS.c_str(), selections); for (uint i = 0, printed = 0; i < dirContents.size() && printed < 5; i++) { if (dirContents[i].selected) { - font->printf(0, printed + 2, false, Alignment::left, Palette::red, "- %s", dirContents[i].name.c_str()); + font->printf(firstCol, printed + 2, false, alignStart, Palette::red, "- %s", dirContents[i].name.c_str()); printed++; } } if(selections > 5) - font->printf(0, 7, false, Alignment::left, Palette::red, selections - 5 == 1 ? STR_AND_1_MORE.c_str() : STR_AND_N_MORE.c_str(), selections - 5); + font->printf(firstCol, 7, false, alignStart, Palette::red, selections - 5 == 1 ? STR_AND_1_MORE.c_str() : STR_AND_N_MORE.c_str(), selections - 5); } else { - font->printf(0, 0, false, Alignment::left, Palette::white, STR_DELETE_X.c_str(), entry->name.c_str()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_DELETE_X.c_str(), entry->name.c_str()); } - font->print(0, (!entry->selected || selections == 1) ? 2 : (selections > 5 ? 9 : selections + 3), false, STR_A_YES_B_NO); + font->print(firstCol, (!entry->selected || selections == 1) ? 2 : (selections > 5 ? 9 : selections + 3), false, STR_A_YES_B_NO, alignStart); font->update(false); while (true) { @@ -795,7 +797,7 @@ std::string browseForFile (void) { if (pressed & KEY_A) { if (entry->selected) { font->clear(false); - font->print(0, 0, false, STR_DELETING_FILES); + font->print(firstCol, 0, false, STR_DELETING_FILES, alignStart); font->update(false); struct stat st; for (auto &item : dirContents) { @@ -812,8 +814,8 @@ std::string browseForFile (void) { fileOffset = 0; } else if (FAT_getAttr(entry->name.c_str()) & ATTR_READONLY) { font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, STR_FAILED_DELETING.c_str(), entry->name.c_str()); - font->print(0, 3, false, STR_A_CONTINUE); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_FAILED_DELETING.c_str(), entry->name.c_str()); + font->print(firstCol, 3, false, STR_A_CONTINUE, alignStart); pressed = 0; while (!(pressed & KEY_A)) { @@ -825,12 +827,12 @@ std::string browseForFile (void) { } else { if (entry->isDirectory) { font->clear(false); - font->print(0, 0, false, STR_DELETING_FOLDER); + font->print(firstCol, 0, false, STR_DELETING_FOLDER, alignStart); font->update(false); recRemove(entry->name.c_str(), dirContents); } else { font->clear(false); - font->print(0, 0, false, STR_DELETING_FILES); + font->print(firstCol, 0, false, STR_DELETING_FILES, alignStart); font->update(false); remove(entry->name.c_str()); } diff --git a/arm9/source/font.cpp b/arm9/source/font.cpp index 931803f..3134c4e 100644 --- a/arm9/source/font.cpp +++ b/arm9/source/font.cpp @@ -8,6 +8,8 @@ #include #include +#include + u8 Font::textBuf[2][256 * 192]; bool Font::mainScreen = false; @@ -250,7 +252,7 @@ void Font::printf(int xPos, int yPos, bool top, Alignment align, Palette palette print(xPos, yPos, top, str, align, palette); } -ITCM_CODE void Font::print(int xPos, int yPos, bool top, std::u16string_view text, Alignment align, Palette palette, bool rtl) { +ITCM_CODE void Font::print(int xPos, int yPos, bool top, std::u16string_view text, Alignment align, Palette palette, bool noWrap, bool rtl) { int x = xPos * tileWidth, y = yPos * tileHeight; if(x < 0 && align != Alignment::center) x += 256; @@ -285,13 +287,28 @@ ITCM_CODE void Font::print(int xPos, int yPos, bool top, std::u16string_view tex x = ((256 - (text.length() * tileWidth)) / 2) + x; break; } case Alignment::right: { - size_t newline = text.find('\n'); - while(newline != text.npos) { - print(xPos, yPos, top, text.substr(0, newline), Alignment::left, palette, rtl); - text = text.substr(newline + 1); - newline = text.find('\n'); - yPos++; - y += tileHeight; + if(!noWrap) { + int cols = SCREEN_COLS; + for(auto it = text.begin(); it < text.end(); ++it) { + int idx = std::distance(text.begin(), it); + std::u16string_view substr; + // Wrap at edge + if(idx >= cols) { + substr = text.substr(0, idx); + text = text.substr(idx); + + // or line break on newline or last space within 10 chars of edge + } else if(*it == '\n' || (*it == ' ' && (cols - idx) < 10 && std::distance(it, text.end()) > (cols - idx) && *std::find(it + 1, std::min(it + (cols - idx) , text.end()), ' ') != ' ')) { + substr = text.substr(0, idx); + text = text.substr(idx + ((*it == ' ' || *it == '\n') ? 1 : 0)); + } else { + continue; + } + + print(xPos - substr.length() + 1, yPos, top, substr, Alignment::left, palette, rtl); + yPos++; + y += tileHeight; + } } break; } @@ -384,7 +401,10 @@ ITCM_CODE void Font::print(int xPos, int yPos, bool top, std::u16string_view tex x = xStart; y += tileHeight; - continue; + if(noWrap) + break; + else + continue; } // Wrap at edge if left aligning @@ -395,6 +415,9 @@ ITCM_CODE void Font::print(int xPos, int yPos, bool top, std::u16string_view tex // Skip to next char if a space if(*it == ' ') it++; + + if(noWrap) + break; } // Brackets are flipped in RTL diff --git a/arm9/source/font.h b/arm9/source/font.h index 7da8f6b..aec32a8 100644 --- a/arm9/source/font.h +++ b/arm9/source/font.h @@ -138,9 +138,9 @@ public: void printf(int xPos, int yPos, bool top, Alignment align, Palette palette, const char *format, ...); - void print(int xPos, int yPos, bool top, int value, Alignment align = Alignment::left, Palette palette = Palette::white) { print(xPos, yPos, top, std::to_string(value), align, palette); } - void print(int xPos, int yPos, bool top, std::string_view text, Alignment align = Alignment::left, Palette palette = Palette::white) { print(xPos, yPos, top, utf8to16(text), align, palette); } - void print(int xPos, int yPos, bool top, std::u16string_view text, Alignment align = Alignment::left, Palette palette = Palette::white, bool rtl = false); + void print(int xPos, int yPos, bool top, int value, Alignment align = Alignment::left, Palette palette = Palette::white, bool noWrap = false) { print(xPos, yPos, top, std::to_string(value), align, palette, noWrap); } + void print(int xPos, int yPos, bool top, std::string_view text, Alignment align = Alignment::left, Palette palette = Palette::white, bool noWrap = false) { print(xPos, yPos, top, utf8to16(text), align, palette, noWrap); } + void print(int xPos, int yPos, bool top, std::u16string_view text, Alignment align = Alignment::left, Palette palette = Palette::white, bool noWrap = false, bool rtl = false); }; extern Font *font; diff --git a/arm9/source/keyboard.cpp b/arm9/source/keyboard.cpp index 864d2ef..6602e4d 100644 --- a/arm9/source/keyboard.cpp +++ b/arm9/source/keyboard.cpp @@ -35,7 +35,7 @@ std::string kbdGetString(std::string label, int maxSize, std::string oldStr) { bool done = false; while(!done) { font->clear(false); - font->print(0, 0, false, label); + font->print(firstCol, 0, false, label, alignStart); int strSize = 0; for(int i = 0; strSize < (int)output.size() && (i < SCREEN_COLS - 3 || (output[scrollPosition + strSize] & 0xC0) == 0x80); strSize++) { @@ -59,7 +59,7 @@ std::string kbdGetString(std::string label, int maxSize, std::string oldStr) { } font->printf(2 + cursorPosition, labelHeight, false, Alignment::left, Palette::blackWhite, "%s", stringPosition < (int)output.size() ? output.substr(stringPosition, charLen).c_str() : " "); - font->print(0, labelHeight + 2, false, STR_START_RETURN_B_BACKSPACE); + font->print(firstCol, labelHeight + 2, false, STR_START_RETURN_B_BACKSPACE, alignStart); font->update(false); do { diff --git a/arm9/source/language.cpp b/arm9/source/language.cpp index 18a55f2..831e7aa 100644 --- a/arm9/source/language.cpp +++ b/arm9/source/language.cpp @@ -14,9 +14,11 @@ #include "language.inl" #undef STRING -const char *getLanguageString() { - return "en-US"; -} +bool rtl = false; +int firstCol =0; +int lastCol = -1; +Alignment alignStart = Alignment::left; +Alignment alignEnd = Alignment::right; /** * Get strings from the ini with special processing @@ -116,4 +118,17 @@ void langInit(bool reloading) { #define STRING(what, def) STR_##what = getString(languageini, ""#what, def); #include "language.inl" #undef STRING + + rtl = languageini.GetString("PROPERTIES", "DIR", "ltr") == "rtl"; + if(rtl) { + firstCol = -1; + lastCol = 0; + alignStart = Alignment::right; + alignEnd = Alignment::left; + } else { + firstCol = 0; + lastCol = -1; + alignStart = Alignment::left; + alignEnd = Alignment::right; + } } diff --git a/arm9/source/language.h b/arm9/source/language.h index 955f370..7fe10ac 100644 --- a/arm9/source/language.h +++ b/arm9/source/language.h @@ -2,12 +2,20 @@ #ifndef LANGUAGE_H #define LANGUAGE_H +#include "font.h" + #include #define STRING(what, def) extern std::string STR_##what; #include "language.inl" #undef STRING +extern bool rtl; +extern int firstCol; +extern int lastCol; +extern Alignment alignStart; +extern Alignment alignEnd; + /** * Initialize translations. * Uses the language ID specified in settings.ui.language. diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index b2cea84..fa4a96b 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -92,7 +92,7 @@ void vblankHandler (void) { if(time != prevTime) { prevTime = time; if(font) { - font->print(-1, 0, true, time, Alignment::right, Palette::blackGreen); + font->print(lastCol, 0, true, time, alignEnd, Palette::blackGreen); font->update(true); } } @@ -322,9 +322,9 @@ int main(int argc, char **argv) { free(argarray[0]); argarray[0] = filePath; font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, STR_RUNNING_X_WITH_N_PARAMETERS.c_str(), argarray[0], argarray.size()); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_RUNNING_X_WITH_N_PARAMETERS.c_str(), argarray[0], argarray.size()); int err = runNdsFile(argarray[0], argarray.size(), (const char **)&argarray[0]); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_START_FAILED_ERROR_N.c_str(), err); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_START_FAILED_ERROR_N.c_str(), err); } if (extension(filename, {"firm"})) { diff --git a/arm9/source/ndsInfo.cpp b/arm9/source/ndsInfo.cpp index fb7b07e..0ac0352 100644 --- a/arm9/source/ndsInfo.cpp +++ b/arm9/source/ndsInfo.cpp @@ -100,7 +100,7 @@ void ndsInfo(const char *path) { oamInit(&oamSub, SpriteMapping_Bmp_1D_128, false); u16 *iconGfx = oamAllocateGfx(&oamSub, SpriteSize_32x32, SpriteColorFormat_16Color); - oamSet(&oamSub, 0, 256 - 36, 4, 0, 0, SpriteSize_32x32, SpriteColorFormat_16Color, iconGfx, -1, false, false, false, false, false); + oamSet(&oamSub, 0, rtl ? 4 : 256 - 36, 4, 0, 0, SpriteSize_32x32, SpriteColorFormat_16Color, iconGfx, -1, false, false, false, false, false); if(version == 0x0103) { tonccpy(iconGfx, iconBitmap + ((iconAnimation[0] >> 8) & 7) * 0x200, 0x200); @@ -117,10 +117,10 @@ void ndsInfo(const char *path) { int animationFrame = 0, frameDelay = 0, lang = 1; while(1) { font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::white, STR_HEADER_TITLE.c_str(), headerTitle); - font->printf(0, 1, false, Alignment::left, Palette::white, STR_TITLE_ID.c_str(), tid); - font->printf(0, 2, false, Alignment::left, Palette::white, STR_TITLE_IN_LANGUAGE.c_str(), langNames[lang]->c_str()); - font->print(2, 3, false, titles + lang * 0x80); + font->printf(firstCol, 0, false, alignStart, Palette::white, STR_HEADER_TITLE.c_str(), headerTitle); + font->printf(firstCol, 1, false, alignStart, Palette::white, STR_TITLE_ID.c_str(), tid); + font->printf(firstCol, 2, false, alignStart, Palette::white, STR_TITLE_IN_LANGUAGE.c_str(), langNames[lang]->c_str()); + font->print(rtl ? -3 : 2, 3, false, titles + lang * 0x80, alignStart); font->update(false); do { diff --git a/arm9/source/startMenu.cpp b/arm9/source/startMenu.cpp index ddbb9bb..96bb217 100644 --- a/arm9/source/startMenu.cpp +++ b/arm9/source/startMenu.cpp @@ -28,15 +28,18 @@ constexpr std::array startMenuStrings = { &STR_LANGUAGE }; -constexpr std::array, 11> languageList = {{ +constexpr std::array, 14> languageList = {{ {"de-DE", "Deutsch"}, {"en-US", "English"}, {"es-ES", "Español"}, {"fr-FR", "Français"}, {"it-IT", "Italiano"}, {"hu-HU", "Magyar"}, + {"nl-NL", "Nederlands"}, {"ro-RO", "Română"}, {"ru-RU", "Русский"}, + {"uk-UA", "Українська"}, + {"he-IL", "עברית"}, {"zh-CN", "中文 (简体)"}, {"ja-JP", "日本語"}, {"ja-KANA", "にほんご"} @@ -115,8 +118,8 @@ void startMenu() { void languageMenu() { if(ownNitroFSMounted != 0) { font->clear(false); - font->print(0, 0, false, ownNitroFSMounted == 1 ? STR_NITROFS_NOT_MOUNTED : STR_NITROFS_UNMOUNTED); - font->print(0, font->calcHeight(ownNitroFSMounted == 1 ? STR_NITROFS_NOT_MOUNTED : STR_NITROFS_UNMOUNTED) + 1, false, STR_A_CONTINUE); + font->print(firstCol, 0, false, ownNitroFSMounted == 1 ? STR_NITROFS_NOT_MOUNTED : STR_NITROFS_UNMOUNTED, alignStart); + font->print(firstCol, font->calcHeight(ownNitroFSMounted == 1 ? STR_NITROFS_NOT_MOUNTED : STR_NITROFS_UNMOUNTED) + 1, false, STR_A_CONTINUE, alignStart); font->update(false); do { diff --git a/arm9/source/titleManager.cpp b/arm9/source/titleManager.cpp index 79bbffc..16d7698 100644 --- a/arm9/source/titleManager.cpp +++ b/arm9/source/titleManager.cpp @@ -68,28 +68,29 @@ void dumpTitle(TitleInfo &title) { while (true) { font->clear(false); - font->print(0, 0, false, dumpToStr); + font->print(firstCol, 0, false, dumpToStr, alignStart); + int optionsCol = rtl ? -4 : 3; int row = y; for(TitleDumpOption option : allowedOptions) { switch(option) { case TitleDumpOption::all: - font->print(3, row++, false, STR_DUMP_ALL); + font->print(optionsCol, row++, false, STR_DUMP_ALL, alignStart); break; case TitleDumpOption::rom: - font->print(3, row++, false, STR_DUMP_ROM); + font->print(optionsCol, row++, false, STR_DUMP_ROM, alignStart); break; case TitleDumpOption::publicSave: - font->print(3, row++, false, STR_DUMP_PUBLIC_SAVE); + font->print(optionsCol, row++, false, STR_DUMP_PUBLIC_SAVE, alignStart); break; case TitleDumpOption::privateSave: - font->print(3, row++, false, STR_DUMP_PRIVATE_SAVE); + font->print(optionsCol, row++, false, STR_DUMP_PRIVATE_SAVE, alignStart); break; case TitleDumpOption::bannerSave: - font->print(3, row++, false, STR_DUMP_BANNER_SAVE); + font->print(optionsCol, row++, false, STR_DUMP_BANNER_SAVE, alignStart); break; case TitleDumpOption::tmd: - font->print(3, row++, false, STR_DUMP_TMD); + font->print(optionsCol, row++, false, STR_DUMP_TMD, alignStart); break; case TitleDumpOption::none: row++; @@ -97,10 +98,10 @@ void dumpTitle(TitleInfo &title) { } } - font->print(3, ++row, false, STR_A_SELECT_B_CANCEL); + font->print(optionsCol, ++row, false, STR_A_SELECT_B_CANCEL, alignStart); // Show cursor - font->print(0, y + optionOffset, false, "->"); + font->print(firstCol, y + optionOffset, false, rtl ? "<-" : "->", alignStart); font->update(false); @@ -135,14 +136,14 @@ void dumpTitle(TitleInfo &title) { sprintf(folderPath, "%s:/gm9i", (sdMounted ? "sd" : "fat")); if (access(folderPath, F_OK) != 0) { font->clear(false); - font->print(0, 0, false, STR_CREATING_DIRECTORY); + font->print(firstCol, 0, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir(folderPath, 0777); } sprintf(folderPath, "%s:/gm9i/out", (sdMounted ? "sd" : "fat")); if (access(folderPath, F_OK) != 0) { font->clear(false); - font->print(0, 0, false, STR_CREATING_DIRECTORY); + font->print(firstCol, 0, false, STR_CREATING_DIRECTORY, alignStart); font->update(false); mkdir(folderPath, 0777); } @@ -283,14 +284,14 @@ void titleManager() { int cursorPosition = 0, scrollOffset = 0; while(1) { font->clear(false); - font->printf(0, 0, false, Alignment::left, Palette::blackGreen, "%*c", SCREEN_COLS, ' '); + font->printf(firstCol, 0, false, alignStart, Palette::blackGreen, "%*c", SCREEN_COLS, ' '); font->print(0, 0, false, STR_TITLE_MANAGER, Alignment::center, Palette::blackGreen); for(int i = 0; i < ((int)titles.size() - scrollOffset) && i < ENTRIES_PER_SCREEN; i++) { const TitleInfo &title = titles[scrollOffset + i]; Palette pal = scrollOffset + i == cursorPosition ? Palette::white : Palette::gray; - font->print(0, 1 + i, false, title.bannerTitle.substr(0, title.bannerTitle.find(u'\n')), Alignment::left, pal); - font->printf(-1, 1 + i, false, Alignment::right, pal, " (%s)", title.gameCode); + font->print(firstCol, 1 + i, false, title.bannerTitle.substr(0, title.bannerTitle.find(u'\n')), alignStart, pal); + font->printf(lastCol, 1 + i, false, alignEnd, pal, rtl ? "(%s) " : " (%s)", title.gameCode); } font->update(false); diff --git a/data/font_default.frf b/data/font_default.frf index 3229154e19e7d176d864f73724e75cb8ba4460cd..20d5ae61bac2139c31fc061d0f85f1c55aa7dcc2 100644 GIT binary patch delta 295 zcmdn8p7qaqR>>ewH@7e0j10c6A&x8z3=C{s%VnHh978%bN}gn&{D$3)gTsQMKtMo% zXR-mur^z~;HXs2PAh4L6#<_-rfx*JX!NG!KvJ{u+T;L7Rcm|df z5e^X>kUj>ewH@7w6j10c6A&x8z3=C{s3uT;L97B9IN}gor0t!IE2>^uS< zE*1FOrYi_A2mqC_q=;~c*f4CrCdGJ(nbBqYN;yVZrs<~?7@M|-C^D`v F0|2*WFi`*i diff --git a/nitrofiles/languages/de-DE/language.ini b/nitrofiles/languages/de-DE/language.ini index 7d642dd..81a4cb6 100644 --- a/nitrofiles/languages/de-DE/language.ini +++ b/nitrofiles/languages/de-DE/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=Keine Laufwerke gefunden! UNTITLED=UNBENANNT @@ -30,8 +33,8 @@ COULD_NOT_ALLOCATE_BUFFER=Puffer konnte nicht angelegt werden COULD_NOT_OPEN_FILE_READING=Konnte Datei nicht für Schreibzugriff öffnen CALCULATING_SHA1=Berechne SHA1 hash von:\n%s N_OF_N_BYTES_PROCESSED=%d/%d Bytes verarbeitet -FILE_ALREADY_TRIMMED=This file is already trimmed. -TRIM_TO_N_BYTES=Trim file to %s? +FILE_ALREADY_TRIMMED=Diese Datei ist bereits gekürzt. +TRIM_TO_N_BYTES=Datei zu %s kürzen? RUNNING_X_WITH_N_PARAMETERS=%s wird mit den Parametern %d ausgeführt START_FAILED_ERROR_N=Start fehlgeschlagen. Fehler %d HEADER_TITLE=Header Titel: %s @@ -81,12 +84,12 @@ DELETE_RENAME_FILE=\X - Datei löschen/[+\R] umbenennen START_MENU=START Menü POWER_OFF=Herunterfahren REBOOT=Neustart -OPEN_TITLE_MANAGER=Title manager... +OPEN_TITLE_MANAGER=Titel verwalten... LANGUAGE=Sprache... SELECT_LANGUAGE=Sprache auswählen NITROFS_NOT_MOUNTED=NitroFS konnte nicht eingehangen werden, bitte lade GodMode9i aus TWiLight Menu++ oder nds-hb-menu. NITROFS_UNMOUNTED=Das NitroFS eines anderen Titels wurde eingehangen, bitte lade GodMode9i neu, um die Sprache zu ändern. -TITLE_MANAGER=Title Manager +TITLE_MANAGER=Titelverwalter BOOT_FILE=Datei ausführen BOOT_FILE_DIRECT=Datei ausführen (Direkt) @@ -134,9 +137,9 @@ DUMP_ROM=ROM DUMP_ROM_TRIMMED=ROM (gekürzt) DUMP_SAVE=Spielstand DUMP_DS_SAVE=DS Spielstand -DUMP_PUBLIC_SAVE=Public save -DUMP_PRIVATE_SAVE=Private save -DUMP_BANNER_SAVE=Banner save +DUMP_PUBLIC_SAVE=Öffentlicher Spielstand +DUMP_PRIVATE_SAVE=Privater Spielstand +DUMP_BANNER_SAVE=Banner Spielstand DUMP_TMD=TMD DUMP_METADATA=Metadaten DO_NOT_REMOVE_CARD=Entferne nicht die NDS-Karte. diff --git a/nitrofiles/languages/en-US/language.ini b/nitrofiles/languages/en-US/language.ini index 0173ae9..b5d7d48 100644 --- a/nitrofiles/languages/en-US/language.ini +++ b/nitrofiles/languages/en-US/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=No drives found! UNTITLED=UNTITLED diff --git a/nitrofiles/languages/es-ES/language.ini b/nitrofiles/languages/es-ES/language.ini index 45de35e..4e14cb3 100644 --- a/nitrofiles/languages/es-ES/language.ini +++ b/nitrofiles/languages/es-ES/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=¡No se encontraron unidades! UNTITLED=SIN TÍTULO diff --git a/nitrofiles/languages/fr-FR/language.ini b/nitrofiles/languages/fr-FR/language.ini index 85cf0ff..3b7372d 100644 --- a/nitrofiles/languages/fr-FR/language.ini +++ b/nitrofiles/languages/fr-FR/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=Aucun lecteur trouvé ! UNTITLED=SANS TITRE diff --git a/nitrofiles/languages/he-IL/language.ini b/nitrofiles/languages/he-IL/language.ini new file mode 100644 index 0000000..874254d --- /dev/null +++ b/nitrofiles/languages/he-IL/language.ini @@ -0,0 +1,200 @@ +[PROPERTIES] +DIR=rtl + +[LANGUAGE] +NO_DRIVES_FOUND=לא נמצאו כוננים! +UNTITLED=UNTITLED +ROOT=[root] +DIR=(ספריה) +TIME_FORMAT=%k:%M +LOADING=טוען... +CREATING_DIRECTORY=יוצר ספריה... +ENTERING_DIRECTORY=נכנס לספריה... +COPYING=מעתיק... +MOVING=מעביר... +UNABLE_TO_OPEN_DIRECTORY=לא ניתן לפתוח את הספריה. +SHA1_HASH_IS=SHA1 hash is: +CLIPBOARD=[CLIPBOARD] +1_MORE_FILE=%d more file... +N_MORE_FILES=%d more files... +PASTE_CLIPBOARD_HERE=Paste clipboard here? +COPY_FILES=העתק קבצים +MOVE_FILES=העבר קבצים +RENAME_TO=Rename to: +NAME_FOR_NEW_FOLDER=Name for new folder: +DELETE_N_PATHS=Delete %d paths? +AND_1_MORE=- and %d more... +AND_N_MORE=- and %d more... +DELETE_X=Delete "%s"? +DELETING_FILES=Deleting files, please wait... +DELETING_FOLDER=Deleting folder, please wait... +FAILED_DELETING=Failed deleting:\n%s +COULD_NOT_ALLOCATE_BUFFER=Could not allocate buffer +COULD_NOT_OPEN_FILE_READING=Could not open file for reading +CALCULATING_SHA1=Calculating SHA1 hash of:\n%s +N_OF_N_BYTES_PROCESSED=%d/%d bytes processed +FILE_ALREADY_TRIMMED=This file is already trimmed. +TRIM_TO_N_BYTES=Trim file to %s? +RUNNING_X_WITH_N_PARAMETERS=Running %s with %d parameters +START_FAILED_ERROR_N=Start failed. Error %d +HEADER_TITLE=Header Title: %s +TITLE_ID=Title ID: %s +TITLE_IN_LANGUAGE=Title: (\DV %s) + +SDCARD_LABEL=[sd:] SDCARD (%s) +FLASHCARD_LABEL=[fat:] FLASHCARD (%s) +RAMDRIVE_LABEL=[ram:] RAMDRIVE +SYSNAND_LABEL=[nand:] SYSNAND +NITROFS_LABEL=[nitro:] NDS GAME IMAGE +FAT_LABEL=[img:] FAT IMAGE (%s) +GBA_GAMECART=GBA GAMECART (%s) +NDS_GAMECARD=NDS GAMECARD (%s) +NDS_GAMECARD_NO_TITLE=NDS GAMECARD + +SD_FAT=(SD FAT, %s) +N_FREE=%s free +SLOT1_FAT=(Slot-1 SD FAT, %s) +GBA_GAME=(GBA Game, %s) +NDS_GAME=(NDS Game, %s (%s trimmed)) +GAME_VIRTUAL=(Game Virtual) +RAMDRIVE_FAT=(RAMdrive FAT, %s) +SYSNAND_FAT=(SysNAND FAT, %s) +FAT_IMAGE=(Image FAT, %s) + +UNMOUNT_SDCARD=\R+\B - Unmount SD card +REMOUNT_SDCARD=\R+\B - Remount SD card +UNMOUNT_FLASHCARD=\R+\B - Unmount Flashcard +START_START_MENU=START - START menu +POWERTEXT_DS=POWER - Poweroff +POWERTEXT=POWER - Reboot/[+held] Poweroff +POWERTEXT_3DS=POWER - Sleep Mode screen +HOMETEXT=HOME - HOME Menu prompt +IMAGETEXT=\R+\X - Unmount image +SCREENSHOTTEXT=\R+\L - Make a screenshot +CLEAR_CLIPBOARD=SELECT - Clear clipboard +RESTORE_CLIPBOARD=SELECT - Restore clipboard +DIRECTORY_OPTIONS=\R+\A - Directory options +COPY_FILE=\Y - COPY file +COPY_FILES_CREATE_ENTRY=\Y - COPY file/[+\R] CREATE entry +PASTE_FILES_CREATE_ENTRY=\Y - PASTE file/[+\R] CREATE entry +SELECT_FILES=\L - SELECT files (with \D) +DESELECT_FILES=\L - DESELECT files (with \D) +DELETE_RENAME_FILE=\X - DELETE/[+\R] RENAME file + +START_MENU=START Menu +POWER_OFF=כיבוי +REBOOT=הפעלה מחדש +OPEN_TITLE_MANAGER=Title manager... +LANGUAGE=שפה... +SELECT_LANGUAGE=בחירת שפה +NITROFS_NOT_MOUNTED=NitroFS could not be mounted, please load GodMode9i from TWiLight Menu++ or nds-hb-menu. +NITROFS_UNMOUNTED=Another title's NitroFS has been mounted, please reload GodMode9i to change the language. +TITLE_MANAGER=Title Manager + +BOOT_FILE=קובץ אתחול +BOOT_FILE_DIRECT=Boot file (Direct) +BOOTSTRAP_FILE=קובץ Bootstrap +MOUNT_NITROFS=Mount NitroFS +SHOW_NDS_INFO=Show NDS file info +TRIM_NDS=Trim NDS file +RESTORE_SAVE=שחזר שמירה +RESTORE_SAVE_NDS=שחזר שמירה (Slot-1) +RESTORE_SAVE_GBA=שחזר שמירה (Slot-2) +MOUNT_FAT_IMG=Mount as FAT image +OPEN_HEX=Open in hex editor +SHOW_DIRECTORY_INFO=Show directory info +SHOW_FILE_INFO=Show file info +COPY_SD_OUT=Copy to sd:/gm9i/out +COPY_FAT_OUT=Copy to fat:/gm9i/out +CALC_SHA1=Calculate SHA1 hash +LOAD_FONT=טען גופן + +FILESIZE=filesize: %s +CREATED=created: %s +MODIFIED=modified: %s +UP_READONLY=\DUread-only +DOWN_SYSTEM=\DDsystem +LEFT_HIDDEN=\DLhidden +RIGHT_ARCHIVE=\DRarchive +VIRTUAL=וירטואלי + +HEX_EDITOR=Hex Editor +JUMP_TO_OFFSET=Jump to Offset +SEARCH_STRING=Search for String +SEARCH_DATA=Search for Data +SEARCH_FOR=Search for: +ENTER_VALUE=Enter value: +SEARCHING=Searching +PRESS_B_TO_CANCEL=Press \B to cancel +EOF_NO_RESULTS=Reached end of file\nwith no results + +FLASHCARD_WILL_UNMOUNT=Flashcard will be unmounted.\nIs this okay? +DUMP_TO=Dump "%s" to\n"%s:/gm9i/out"? +DUMP_TO_GBA=Dump "%s" to GBA cart? +DUMP_ALL=הכל +DUMP_ALL_TRIMMED=All (Trimmed ROM) +DUMP_ROM=ROM +DUMP_ROM_TRIMMED=ROM (Trimmed) +DUMP_SAVE=שמור +DUMP_DS_SAVE=שמירת DS +DUMP_PUBLIC_SAVE=שמירה פומבית +DUMP_PRIVATE_SAVE=שמירה פרטית +DUMP_BANNER_SAVE=Banner save +DUMP_TMD=TMD +DUMP_METADATA=Metadata +DO_NOT_REMOVE_CARD=Do not remove the NDS card. +DO_NOT_REMOVE_CART=Do not remove the GBA cart. +DUMPING_SAVE=Dumping save... +RESTORING_SAVE=Restoring save... +DUMPING_METADATA=Dumping metadata... +FAILED_TO_DUMP_ROM=Failed to dump the ROM. +UNABLE_TO_DUMP_ROM=Unable to dump the ROM. +FAILED_TO_DUMP_SAVE=Failed to dump the save. +UNABLE_TO_DUMP_SAVE=Unable to dump the save. +FAILED_TO_RESTORE_SAVE=Failed to restore the save. +UNABLE_TO_RESTORE_SAVE=Unable to restore the save. +SAVE_SIZE_MISMATCH_CARD=The size of this save doesn't match the size of the inserted game card.\n\nWrite cancelled! +SAVE_SIZE_MISMATCH_CART=The size of this save doesn't match the size of the inserted game pak.\n\nWrite cancelled! +RESTORE_SELECTED_SAVE_CARD=Restore the selected save to the inserted game card? +RESTORE_SELECTED_SAVE_CARD_FLASHCARD=Unmount the flashcard and restore the selected save to a game card? +RESTORE_SELECTED_SAVE_CART=Restore the selected save to the inserted game pak? +EJECT_FLASHCARD_INSERT_GAME=Eject your flashcard and insert the game card to restore to. +PROGRESS=התקדמות: +N_OF_N_BYTES=%d/%d בתים +NDS_IS_DUMPING=%s.nds\nis dumping... +GBA_IS_DUMPING=%s.gba\nis dumping... +COMPRESSING_SAVE=Compressing save... +WRITING_SAVE=כותב שמירה... +WRITE_TO_GBA=Write %s to GBA cart? (%s remaining)\n\nMake sure to back up your GBA save first! +SWITCH_CART=אנא החליפו לקלטת GBA אחרת. +SWITCH_CART_TO_SECTION=Please switch to the GBA cart containing section %d. +SWITCH_CART_TO_SECTION_THIS_WAS=Please switch to the GBA cart containing section %d. (This was section %d) +WRONG_DS_SAVE=This cart contains a save file from a different DS game. +NO_DS_SAVE=קלטת זו לא מכילה שמירת DS. + +A_OK=(\A אישור) +A_YES_B_NO=(\A yes, \B no) +A_CONTINUE=(\A continue) +B_CANCEL=(\B cancel) +A_SELECT_B_CANCEL=(\A select, \B cancel) +START_CANCEL=(START cancel) +UDLR_CHANGE_ATTRIBUTES=(\D change attributes) +A_APPLY_B_CANCEL=(\A apply, \B cancel) +START_RETURN_B_BACKSPACE=(START Return, \B Backspace) + +1_BYTE=בית 1 +N_BYTES=%lld בתים +N_KB=%lld ק"ב +N_MB=%lld מ"ב +N_GB_FLOAT=%.1f ג"ב +N_TB_FLOAT=%.1f ט"ב + +JAPANESE=יפנית +ENGLISH=אנגלית +FRENCH=צרפתית +GERMAN=גרמנית +ITALIAN=איטלקית +SPANISH=ספרדית +CHINESE=סינית +KOREAN=קוראנית + diff --git a/nitrofiles/languages/hu-HU/language.ini b/nitrofiles/languages/hu-HU/language.ini index 1894331..3646cf7 100644 --- a/nitrofiles/languages/hu-HU/language.ini +++ b/nitrofiles/languages/hu-HU/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=Nem található meghajtó! UNTITLED=NÉVTELEN diff --git a/nitrofiles/languages/it-IT/language.ini b/nitrofiles/languages/it-IT/language.ini index eb246f0..418602b 100644 --- a/nitrofiles/languages/it-IT/language.ini +++ b/nitrofiles/languages/it-IT/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=Nessuna unità trovata! UNTITLED=SENZA TITOLO diff --git a/nitrofiles/languages/ja-JP/language.ini b/nitrofiles/languages/ja-JP/language.ini index 5444708..152b7da 100644 --- a/nitrofiles/languages/ja-JP/language.ini +++ b/nitrofiles/languages/ja-JP/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=ドライブが見つかりません! UNTITLED=無題 diff --git a/nitrofiles/languages/ja-KANA/language.ini b/nitrofiles/languages/ja-KANA/language.ini index bda20a6..e66242b 100644 --- a/nitrofiles/languages/ja-KANA/language.ini +++ b/nitrofiles/languages/ja-KANA/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=ドライブが みつかりません! UNTITLED=むだい diff --git a/nitrofiles/languages/nl-NL/language.ini b/nitrofiles/languages/nl-NL/language.ini new file mode 100644 index 0000000..0a6fffa --- /dev/null +++ b/nitrofiles/languages/nl-NL/language.ini @@ -0,0 +1,200 @@ +[PROPERTIES] +DIR=ltr + +[LANGUAGE] +NO_DRIVES_FOUND=Geen schijven gevonden! +UNTITLED=Naamloos +ROOT=[root] +DIR=(map) +TIME_FORMAT=%k:%M +LOADING=Laden... +CREATING_DIRECTORY=Map aanmaken... +ENTERING_DIRECTORY=Map ingaan... +COPYING=Kopiëren... +MOVING=Verplaatsen... +UNABLE_TO_OPEN_DIRECTORY=Kan de map niet openen. +SHA1_HASH_IS=SHA1 hash is: +CLIPBOARD=[KLEMBORD] +1_MORE_FILE=Nog %d bestand... +N_MORE_FILES=Nog %d bestanden... +PASTE_CLIPBOARD_HERE=Plak het klembord hier? +COPY_FILES=Kopieer bestanden +MOVE_FILES=Verplaats bestanden +RENAME_TO=Hernoemen naar: +NAME_FOR_NEW_FOLDER=Naam voor nieuwe map: +DELETE_N_PATHS=%d paden verwijderen? +AND_1_MORE=- en nog %d... +AND_N_MORE=- en nog %d... +DELETE_X=Verwijder "%s"? +DELETING_FILES=Bestanden verwijderen, even geduld... +DELETING_FOLDER=Map verwijderen, even geduld... +FAILED_DELETING=Verwijderen mislukt:\n%s +COULD_NOT_ALLOCATE_BUFFER=Kon buffer niet toewijzen +COULD_NOT_OPEN_FILE_READING=Kon het bestand niet openen om te lezen +CALCULATING_SHA1=Berekenen van SHA1 hash van:\n%s +N_OF_N_BYTES_PROCESSED=%d/%d bytes verwerkt +FILE_ALREADY_TRIMMED=Dit bestand is al getrimd. +TRIM_TO_N_BYTES=Trim bestand naar %s? +RUNNING_X_WITH_N_PARAMETERS=%s met %d parameters uitvoeren +START_FAILED_ERROR_N=Starten mislukt. Fout %d +HEADER_TITLE=Koptitel: %s +TITLE_ID=Titel ID: %s +TITLE_IN_LANGUAGE=Titel: (\DV %s) + +SDCARD_LABEL=[sd:] SDKAART (%s) +FLASHCARD_LABEL=[fat:] GEHEUGENKAART (%s) +RAMDRIVE_LABEL=[ram:] RAMSCHIJF +SYSNAND_LABEL=[nand:] SYSNAND +NITROFS_LABEL=[nitro:] NDS SPEL KOPIE +FAT_LABEL=[img:] FAT SCHIJFKOPIE (%s) +GBA_GAMECART=GBA SPELKAART (%s) +NDS_GAMECARD=NDS SPELKAART (%s) +NDS_GAMECARD_NO_TITLE=NDS SPELKAART + +SD_FAT=(SD FAT, %s) +N_FREE=%s vrij +SLOT1_FAT=(Slot-1 SD FAT, %s) +GBA_GAME=(GBA Spel, %s) +NDS_GAME=(NDS Spel, %s (%s getrimd)) +GAME_VIRTUAL=(Game Virtual) +RAMDRIVE_FAT=(RAM-schijf FAT, %s) +SYSNAND_FAT=(SysNAND FAT, %s) +FAT_IMAGE=(Schijfkopie FAT, %s) + +UNMOUNT_SDCARD=\R+\B - Ontkoppel SD-kaart +REMOUNT_SDCARD=\R+\B - Herplaats SD-kaart +UNMOUNT_FLASHCARD=\R+\B - Ontkoppel Geheugenkaart +START_START_MENU=START - START menu +POWERTEXT_DS=POWER - Uitschakelen +POWERTEXT=POWER - Herstarten/[+held] Uitschakelen +POWERTEXT_3DS=POWER - Slaapstand scherm +HOMETEXT=HOME - HOME Menu prompt +IMAGETEXT=\R+\X - Ontkoppel schijfkopie +SCREENSHOTTEXT=\R+\L - Maak een schermafbeelding +CLEAR_CLIPBOARD=SELECT - Wis klembord +RESTORE_CLIPBOARD=SELECT - Herstel klembord +DIRECTORY_OPTIONS=\R+\A - Map opties +COPY_FILE=\Y - KOPIEER bestand +COPY_FILES_CREATE_ENTRY=\Y - KOPIEER bestand/[+\R] CREËER invoer +PASTE_FILES_CREATE_ENTRY=\Y - PLAK bestand/[+\R] CREËER invoer +SELECT_FILES=\L - SELECTEER bestanden (met \D) +DESELECT_FILES=\L - DESELECTEER bestanden (met \D) +DELETE_RENAME_FILE=\X - VERWIJDER/[+\R] HERNOEM bestand + +START_MENU=START menu +POWER_OFF=Uitschakelen +REBOOT=Herstarten +OPEN_TITLE_MANAGER=Titel manager... +LANGUAGE=Taal... +SELECT_LANGUAGE=Selecteer Taal +NITROFS_NOT_MOUNTED=NitroFS kon niet worden gekoppeld. Laad GodMode9i van TWiLight Menu++ of nds-hb-menu. +NITROFS_UNMOUNTED=Een andere titel's NitroFS is gekoppeld, herlaad GodMode9i om de taal te veranderen. +TITLE_MANAGER=Titel Manager + +BOOT_FILE=Start bestand op +BOOT_FILE_DIRECT=Start bestand op (Direct) +BOOTSTRAP_FILE=Bootstrap bestand +MOUNT_NITROFS=Koppel NitroFS +SHOW_NDS_INFO=Toon NDS bestandsinformatie +TRIM_NDS=Trim NDS bestand +RESTORE_SAVE=Herstel opslagbestand +RESTORE_SAVE_NDS=Herstel opslagbestand (Slot-1) +RESTORE_SAVE_GBA=Herstel opslagbestand (Slot-2) +MOUNT_FAT_IMG=Koppel als FAT schijfkopie +OPEN_HEX=Openen in hex editor +SHOW_DIRECTORY_INFO=Toon mapinformatie +SHOW_FILE_INFO=Toon bestandsinformatie +COPY_SD_OUT=Kopiëren naar sd:/gm9i/out +COPY_FAT_OUT=Kopiëren naar fat:/gm9i/out +CALC_SHA1=Bereken SHA1 hash +LOAD_FONT=Laad lettertype + +FILESIZE=bestandsgrootte: %s +CREATED=gemaakt: %s +MODIFIED=gewijzigd: %s +UP_READONLY=\DUread-only +DOWN_SYSTEM=\DDsysteem +LEFT_HIDDEN=\DLverborgen +RIGHT_ARCHIVE=\DRarchief +VIRTUAL=virtueel + +HEX_EDITOR=Hex Editor +JUMP_TO_OFFSET=Ga naar Offset +SEARCH_STRING=Zoeken naar Tekenreeks +SEARCH_DATA=Zoeken naar Gegevens +SEARCH_FOR=Zoeken naar: +ENTER_VALUE=Voer waarde in: +SEARCHING=Zoeken +PRESS_B_TO_CANCEL=Druk op \B om te annuleren +EOF_NO_RESULTS=Einde van bestand bereikt\nzonder resultaat + +FLASHCARD_WILL_UNMOUNT=Geheugenkaart zal ontkoppeld worden.\nIs dit ok? +DUMP_TO=Dump "%s" naar\n"%s:/gm9i/out"? +DUMP_TO_GBA=Dump "%s" naar GBA kaart? +DUMP_ALL=Alles +DUMP_ALL_TRIMMED=Alles (Getrimde ROM) +DUMP_ROM=ROM +DUMP_ROM_TRIMMED=ROM (Getrimd) +DUMP_SAVE=Opslaan +DUMP_DS_SAVE=DS opslagbestand +DUMP_PUBLIC_SAVE=Openbaar opslagbestand +DUMP_PRIVATE_SAVE=Privé opslagbestand +DUMP_BANNER_SAVE=Banner opslaan +DUMP_TMD=TMD +DUMP_METADATA=Metagegevens +DO_NOT_REMOVE_CARD=Verwijder de NDS kaart niet. +DO_NOT_REMOVE_CART=Verwijder de GBA kaart niet. +DUMPING_SAVE=Dumpen opslagbestand... +RESTORING_SAVE=Herstellen opslagbestand... +DUMPING_METADATA=Dumpen metagegevens... +FAILED_TO_DUMP_ROM=Mislukt om de ROM te dumpen. +UNABLE_TO_DUMP_ROM=Kan de ROM niet dumpen. +FAILED_TO_DUMP_SAVE=Mislukt om het opslagbestand te dumpen. +UNABLE_TO_DUMP_SAVE=Kan het opslagbestand niet dumpen. +FAILED_TO_RESTORE_SAVE=Mislukt om het opslagbestand te herstellen. +UNABLE_TO_RESTORE_SAVE=Kan het opslagbestand niet herstellen. +SAVE_SIZE_MISMATCH_CARD=De grootte van dit opslagbestand komt niet overeen met grootte van de geplaatste spel kaart.\n\nSchrijven geannuleerd! +SAVE_SIZE_MISMATCH_CART=De grootte van dit opslagbestand komt niet overeen met grootte van de geplaatste game pak.\n\nSchrijven geannuleerd! +RESTORE_SELECTED_SAVE_CARD=Herstel het geselecteerde opslagbestand naar de geplaatste spel kaart? +RESTORE_SELECTED_SAVE_CARD_FLASHCARD=Ontkoppel de geheugenkaart en herstel het geselecteerde opslagbestand naar een spelkaart? +RESTORE_SELECTED_SAVE_CART=Herstel het geselecteerde opslagbestand naar de geplaatste game pak? +EJECT_FLASHCARD_INSERT_GAME=Werp je geheugenkaart uit en plaats de spelkaart om te herstellen. +PROGRESS=Voortgang: +N_OF_N_BYTES=%d/%d Bytes +NDS_IS_DUMPING=%s.nds\nis aan het dumpen... +GBA_IS_DUMPING=%s.gba\nis aan het dumpen... +COMPRESSING_SAVE=Comprimeren opslagbestand... +WRITING_SAVE=Schrijven opslagbestand... +WRITE_TO_GBA=Schrijf %s naar GBA kaart? (%s resterend)\n\nZorg ervoor dat je eerst een back-up maakt van je opslagbestand! +SWITCH_CART=Schakel alsjeblieft over naar een andere GBA kaart. +SWITCH_CART_TO_SECTION=Schakel alsjeblieft over naar de GBA kaart die de sectie %d bevat. +SWITCH_CART_TO_SECTION_THIS_WAS=Schakel alsjeblieft over naar de GBA kaart die de sectie %d bevat. (Dit was sectie %d) +WRONG_DS_SAVE=Deze kaart bevat een opslagbestand van een ander DS spel. +NO_DS_SAVE=Deze kaart bevat geen DS opslagbestand. + +A_OK=(\A OK) +A_YES_B_NO=(\A ja, \B nee) +A_CONTINUE=(\A doorgaan) +B_CANCEL=(\B annuleren) +A_SELECT_B_CANCEL=(\A selecteren, \B annuleren) +START_CANCEL=(START annuleren) +UDLR_CHANGE_ATTRIBUTES=(\D wijzig attributen) +A_APPLY_B_CANCEL=(\A toepassen, \B annuleren) +START_RETURN_B_BACKSPACE=(START Terug, \B Backspace) + +1_BYTE=1 Byte +N_BYTES=%lld Bytes +N_KB=%lld KB +N_MB=%lld MB +N_GB_FLOAT=%.1f GiB +N_TB_FLOAT=%.1f TiB + +JAPANESE=Japans +ENGLISH=Engels +FRENCH=Frans +GERMAN=Duits +ITALIAN=Italiaans +SPANISH=Spaans +CHINESE=Chinees +KOREAN=Koreaans + diff --git a/nitrofiles/languages/ro-RO/language.ini b/nitrofiles/languages/ro-RO/language.ini index 2007cd3..085213f 100644 --- a/nitrofiles/languages/ro-RO/language.ini +++ b/nitrofiles/languages/ro-RO/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=Nu s-au găsit unități! UNTITLED=FĂRĂ TITLU diff --git a/nitrofiles/languages/ru-RU/language.ini b/nitrofiles/languages/ru-RU/language.ini index 43cd01c..200ea14 100644 --- a/nitrofiles/languages/ru-RU/language.ini +++ b/nitrofiles/languages/ru-RU/language.ini @@ -1,3 +1,6 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] NO_DRIVES_FOUND=No drives found! UNTITLED=БЕЗ НАЗВАНИЯ diff --git a/nitrofiles/languages/uk-UA/language.ini b/nitrofiles/languages/uk-UA/language.ini new file mode 100644 index 0000000..8cc3e94 --- /dev/null +++ b/nitrofiles/languages/uk-UA/language.ini @@ -0,0 +1,200 @@ +[PROPERTIES] +DIR=ltr + +[LANGUAGE] +NO_DRIVES_FOUND=Не вдалося знайти диски! +UNTITLED=НЕ НАЗВАНО +ROOT=[корінь] +DIR=(папка) +TIME_FORMAT=%k:%M +LOADING=Завантаження... +CREATING_DIRECTORY=Створення папки... +ENTERING_DIRECTORY=Вхід у папку... +COPYING=Копіювання... +MOVING=Переміщення... +UNABLE_TO_OPEN_DIRECTORY=Неможливо відкрити папку. +SHA1_HASH_IS=Хеш SHA1: +CLIPBOARD=[БУФЕР ОБМІНУ] +1_MORE_FILE=Ще 1 файл... +N_MORE_FILES=Ще 2 файли.../Ще 3 файли.../Ще 4 файли.../Ще %d файлів... +PASTE_CLIPBOARD_HERE=Копіювати скопійовані файли сюди? +COPY_FILES=Копіювати файли +MOVE_FILES=Перемістити файли +RENAME_TO=Перейменувати у: +NAME_FOR_NEW_FOLDER=Назва нової папки: +DELETE_N_PATHS=Видалити %d шляхів? +AND_1_MORE=- і ще 1... +AND_N_MORE=- і ще %d... +DELETE_X=Видалити "%s"? +DELETING_FILES=Видалення файлів, зачекайте, будь ласка... +DELETING_FOLDER=Видалення папки, зачекайте, будь ласка... +FAILED_DELETING=Неможливо видалити:\n%s +COULD_NOT_ALLOCATE_BUFFER=Не вдалося виділити буфер +COULD_NOT_OPEN_FILE_READING=Не вдалося відкрити файл для читання +CALCULATING_SHA1=Обчислення хешу SHA1:\n%s +N_OF_N_BYTES_PROCESSED=Оброблено %d/%d байтів +FILE_ALREADY_TRIMMED=Цей файл вже обрізаний. +TRIM_TO_N_BYTES=Обрізати файл до %s? +RUNNING_X_WITH_N_PARAMETERS=Запуск %s з %d параметрами +START_FAILED_ERROR_N=Не вдалося запустити. Помилка %d +HEADER_TITLE=Заголовок: %s +TITLE_ID=ID титлу: %s +TITLE_IN_LANGUAGE=Назва: (\DV %s) + +SDCARD_LABEL=[sd:] SD КАРТОЧКА (%s) +FLASHCARD_LABEL=[fat:] ФЛЕШКАРТА (%s) +RAMDRIVE_LABEL=[ram:] ОЗП ДИСК +SYSNAND_LABEL=[nand:] Системний NAND +NITROFS_LABEL=[nitro:] IMAGE NDS гри +FAT_LABEL=[img:] FAT IMAGE (%s) +GBA_GAMECART=ІГРОВИЙ КАРТРИДЖ ДЛЯ GBA (%s) +NDS_GAMECARD=ІГРОВИЙ КАРТРИДЖ ДЛЯ NDS (%s) +NDS_GAMECARD_NO_TITLE=ІГРОВИЙ КАРТРИДЖ ДЛЯ NDS + +SD_FAT=(SD FAT, %s) +N_FREE=%s вільно +SLOT1_FAT=(Slot-1 SD FAT, %s) +GBA_GAME=(Гра GBA, %s) +NDS_GAME=(Гра NDS, %s (%s обрізано)) +GAME_VIRTUAL=(Віртуально) +RAMDRIVE_FAT=(RAMdrive FAT, %s) +SYSNAND_FAT=(SysNAND FAT, %s) +FAT_IMAGE=(Image FAT, %s) + +UNMOUNT_SDCARD=\R+\B - Відключити SD карточку +REMOUNT_SDCARD=\R+\B - перемонтувати SD карточку +UNMOUNT_FLASHCARD=\R+\B - Unmount Flashcard +START_START_MENU=START - START menu +POWERTEXT_DS=POWER - Poweroff +POWERTEXT=POWER - Reboot/[+held] Poweroff +POWERTEXT_3DS=POWER - Sleep Mode screen +HOMETEXT=HOME - HOME Menu prompt +IMAGETEXT=\R+\X - Unmount image +SCREENSHOTTEXT=\R+\L - Make a screenshot +CLEAR_CLIPBOARD=SELECT - Clear clipboard +RESTORE_CLIPBOARD=SELECT - Restore clipboard +DIRECTORY_OPTIONS=\R+\A - Directory options +COPY_FILE=\Y - COPY file +COPY_FILES_CREATE_ENTRY=\Y - COPY file/[+\R] CREATE entry +PASTE_FILES_CREATE_ENTRY=\Y - PASTE file/[+\R] CREATE entry +SELECT_FILES=\L - SELECT files (with \D) +DESELECT_FILES=\L - DESELECT files (with \D) +DELETE_RENAME_FILE=\X - DELETE/[+\R] RENAME file + +START_MENU=START Menu +POWER_OFF=Power off +REBOOT=Reboot +OPEN_TITLE_MANAGER=Title manager... +LANGUAGE=Language... +SELECT_LANGUAGE=Select Language +NITROFS_NOT_MOUNTED=NitroFS could not be mounted, please load GodMode9i from TWiLight Menu++ or nds-hb-menu. +NITROFS_UNMOUNTED=Another title's NitroFS has been mounted, please reload GodMode9i to change the language. +TITLE_MANAGER=Title Manager + +BOOT_FILE=Boot file +BOOT_FILE_DIRECT=Boot file (Direct) +BOOTSTRAP_FILE=Bootstrap file +MOUNT_NITROFS=Mount NitroFS +SHOW_NDS_INFO=Show NDS file info +TRIM_NDS=Trim NDS file +RESTORE_SAVE=Restore save +RESTORE_SAVE_NDS=Restore save (Slot-1) +RESTORE_SAVE_GBA=Restore save (Slot-2) +MOUNT_FAT_IMG=Mount as FAT image +OPEN_HEX=Open in hex editor +SHOW_DIRECTORY_INFO=Show directory info +SHOW_FILE_INFO=Show file info +COPY_SD_OUT=Copy to sd:/gm9i/out +COPY_FAT_OUT=Copy to fat:/gm9i/out +CALC_SHA1=Calculate SHA1 hash +LOAD_FONT=Load font + +FILESIZE=filesize: %s +CREATED=created: %s +MODIFIED=modified: %s +UP_READONLY=\DUread-only +DOWN_SYSTEM=\DDsystem +LEFT_HIDDEN=\DLhidden +RIGHT_ARCHIVE=\DRarchive +VIRTUAL=virtual + +HEX_EDITOR=Hex Editor +JUMP_TO_OFFSET=Jump to Offset +SEARCH_STRING=Search for String +SEARCH_DATA=Search for Data +SEARCH_FOR=Search for: +ENTER_VALUE=Enter value: +SEARCHING=Searching +PRESS_B_TO_CANCEL=Press \B to cancel +EOF_NO_RESULTS=Reached end of file\nwith no results + +FLASHCARD_WILL_UNMOUNT=Flashcard will be unmounted.\nIs this okay? +DUMP_TO=Dump "%s" to\n"%s:/gm9i/out"? +DUMP_TO_GBA=Dump "%s" to GBA cart? +DUMP_ALL=All +DUMP_ALL_TRIMMED=All (Trimmed ROM) +DUMP_ROM=ROM +DUMP_ROM_TRIMMED=ROM (Trimmed) +DUMP_SAVE=Save +DUMP_DS_SAVE=DS save +DUMP_PUBLIC_SAVE=Public save +DUMP_PRIVATE_SAVE=Private save +DUMP_BANNER_SAVE=Banner save +DUMP_TMD=TMD +DUMP_METADATA=Metadata +DO_NOT_REMOVE_CARD=Do not remove the NDS card. +DO_NOT_REMOVE_CART=Do not remove the GBA cart. +DUMPING_SAVE=Dumping save... +RESTORING_SAVE=Restoring save... +DUMPING_METADATA=Dumping metadata... +FAILED_TO_DUMP_ROM=Failed to dump the ROM. +UNABLE_TO_DUMP_ROM=Unable to dump the ROM. +FAILED_TO_DUMP_SAVE=Failed to dump the save. +UNABLE_TO_DUMP_SAVE=Unable to dump the save. +FAILED_TO_RESTORE_SAVE=Failed to restore the save. +UNABLE_TO_RESTORE_SAVE=Unable to restore the save. +SAVE_SIZE_MISMATCH_CARD=The size of this save doesn't match the size of the inserted game card.\n\nWrite cancelled! +SAVE_SIZE_MISMATCH_CART=The size of this save doesn't match the size of the inserted game pak.\n\nWrite cancelled! +RESTORE_SELECTED_SAVE_CARD=Restore the selected save to the inserted game card? +RESTORE_SELECTED_SAVE_CARD_FLASHCARD=Unmount the flashcard and restore the selected save to a game card? +RESTORE_SELECTED_SAVE_CART=Restore the selected save to the inserted game pak? +EJECT_FLASHCARD_INSERT_GAME=Eject your flashcard and insert the game card to restore to. +PROGRESS=Progress: +N_OF_N_BYTES=%d/%d Bytes +NDS_IS_DUMPING=%s.nds\nis dumping... +GBA_IS_DUMPING=%s.gba\nis dumping... +COMPRESSING_SAVE=Compressing save... +WRITING_SAVE=Writing save... +WRITE_TO_GBA=Write %s to GBA cart? (%s remaining)\n\nMake sure to back up your GBA save first! +SWITCH_CART=Please switch to a different GBA cart. +SWITCH_CART_TO_SECTION=Please switch to the GBA cart containing section %d. +SWITCH_CART_TO_SECTION_THIS_WAS=Please switch to the GBA cart containing section %d. (This was section %d) +WRONG_DS_SAVE=This cart contains a save file from a different DS game. +NO_DS_SAVE=This cart doesn't contain a DS save. + +A_OK=(\A OK) +A_YES_B_NO=(\A yes, \B no) +A_CONTINUE=(\A continue) +B_CANCEL=(\B cancel) +A_SELECT_B_CANCEL=(\A select, \B cancel) +START_CANCEL=(START cancel) +UDLR_CHANGE_ATTRIBUTES=(\D change attributes) +A_APPLY_B_CANCEL=(\A apply, \B cancel) +START_RETURN_B_BACKSPACE=(START Return, \B Backspace) + +1_BYTE=1 Byte +N_BYTES=%lld Bytes +N_KB=%lld KB +N_MB=%lld MB +N_GB_FLOAT=%.1f GB +N_TB_FLOAT=%.1f TB + +JAPANESE=Japanese +ENGLISH=English +FRENCH=French +GERMAN=German +ITALIAN=Italian +SPANISH=Spanish +CHINESE=Chinese +KOREAN=Korean + diff --git a/nitrofiles/languages/zh-CN/language.ini b/nitrofiles/languages/zh-CN/language.ini index 98ddc2f..132635a 100644 --- a/nitrofiles/languages/zh-CN/language.ini +++ b/nitrofiles/languages/zh-CN/language.ini @@ -1,6 +1,9 @@ +[PROPERTIES] +DIR=ltr + [LANGUAGE] -NO_DRIVES_FOUND=找不到存储! -UNTITLED=UNTITLED +NO_DRIVES_FOUND=没有找到存储设备! +UNTITLED=无标题 ROOT=[根目录] DIR=(目录) TIME_FORMAT=%k:%M @@ -10,37 +13,37 @@ ENTERING_DIRECTORY=正在进入目录... COPYING=正在复制... MOVING=正在移动... UNABLE_TO_OPEN_DIRECTORY=无法打开该目录。 -SHA1_HASH_IS=SHA1 hash值: +SHA1_HASH_IS=SHA1 hash值: CLIPBOARD=[剪贴板] -1_MORE_FILE=以及%d个文件... -N_MORE_FILES=以及%d个文件... -PASTE_CLIPBOARD_HERE=粘贴在这里? +1_MORE_FILE=以及%d个未列出文件 +N_MORE_FILES=以及%d个未列出文件 +PASTE_CLIPBOARD_HERE=要将剪贴板内容粘贴到此处吗? COPY_FILES=复制文件 MOVE_FILES=移动文件 -RENAME_TO=重命名为: +RENAME_TO=重命名为: NAME_FOR_NEW_FOLDER=新文件夹名称: -DELETE_N_PATHS=删除 %d 个路径? -AND_1_MORE=- 以及%d个... -AND_N_MORE=- 以及%d个... +DELETE_N_PATHS=删除以下 %d 个路径? +AND_1_MORE=- 以及%d个未列出文件 +AND_N_MORE=- 以及%d个未列出文件 DELETE_X=删除“%s”? DELETING_FILES=正在删除文件,请稍候… DELETING_FOLDER=正在删除文件夹,请稍候... FAILED_DELETING=删除 \n%s 失败 COULD_NOT_ALLOCATE_BUFFER=无法分配缓冲区 -COULD_NOT_OPEN_FILE_READING=无法读取文件。 +COULD_NOT_OPEN_FILE_READING=无法打开并读取文件 CALCULATING_SHA1=正在计算SHA1 hash值:\n%s N_OF_N_BYTES_PROCESSED=%d/%d 字节已处理 -FILE_ALREADY_TRIMMED=This file is already trimmed. -TRIM_TO_N_BYTES=Trim file to %s? +FILE_ALREADY_TRIMMED=该文件已经瘦身过了。 +TRIM_TO_N_BYTES=要将文件瘦身至%s吗? RUNNING_X_WITH_N_PARAMETERS=正在运行 %s 和 %d 参数 START_FAILED_ERROR_N=启动失败。错误 %d -HEADER_TITLE=头文件标题:%s -TITLE_ID=标题ID: %s -TITLE_IN_LANGUAGE=标题: (\DV %s) +HEADER_TITLE=文件头标题:%s +TITLE_ID=Title ID: %s +TITLE_IN_LANGUAGE=标题语言: (\DV %s) SDCARD_LABEL=[sd:] SD卡 (%s) FLASHCARD_LABEL=[fat:] 烧录卡 (%s) -RAMDRIVE_LABEL=[ram:] 内存 +RAMDRIVE_LABEL=[ram:] 内存盘 SYSNAND_LABEL=[nand:] SYSNAND NITROFS_LABEL=[nitro:] NDS游戏镜像 FAT_LABEL=[img:] FAT镜像(%s) @@ -49,135 +52,135 @@ NDS_GAMECARD=NDS游戏卡 (%s) NDS_GAMECARD_NO_TITLE=NDS游戏卡 SD_FAT=(SD FAT, %s) -N_FREE=剩余空间%s +N_FREE=剩余空间:%s SLOT1_FAT=(Slot-1 SD FAT, %s) GBA_GAME=(GBA游戏, %s) -NDS_GAME=(NDS游戏, %s (精简后%s)) -GAME_VIRTUAL=(游戏虚拟挂载) +NDS_GAME=(NDS游戏, %s (瘦身后%s)) +GAME_VIRTUAL=(游戏虚拟盘) RAMDRIVE_FAT=(RAMdrive FAT, %s) SYSNAND_FAT=(SysNAND FAT, %s) FAT_IMAGE=(镜像 FAT, %s) -UNMOUNT_SDCARD=\R+\B - 卸载SD卡 -REMOUNT_SDCARD=\R+\B - 重载SD卡 -UNMOUNT_FLASHCARD=\R+\B - 卸载烧录卡 -START_START_MENU=START - START菜单 -POWERTEXT_DS=电源键 - 关闭电源 -POWERTEXT=电源键 - 重启/[+held] 关机 -POWERTEXT_3DS=电源键 - 睡眠模式 -HOMETEXT=HOME键 - 回到主菜单 -IMAGETEXT=\R>ewH@7e0j10c6A&x8z3=C{s%VnHh978%bN}gn&{D$3)gTsQMKtMo% zXR-mur^z~;HXs2PAh4L6#<_-rfx*JX!NG!KvJ{u+T;L7Rcm|df z5e^X>kUj>ewH@7w6j10c6A&x8z3=C{s3uT;L97B9IN}gor0t!IE2>^uS< zE*1FOrYi_A2mqC_q=;~c*f4CrCdGJ(nbBqYN;yVZrs<~?7@M|-C^D`v F0|2*WFi`*i diff --git a/resources/fonts/default-6x10.pbm b/resources/fonts/default-6x10.pbm index f55dce6c41854f2ad2a49a19ff1e40667a186d62..4c92ae8d5e230076e6132c4355c1a9e7fc60fa27 100644 GIT binary patch delta 331 zcmaFc$?~?7WrO^87N!OUfr*aBlf%9X@I7GB{J;PMKvB)fbH5A7IyW#fIKV|=3^1+a zFws#;*TvCEB`8Kv*e~)(V4?6t4M!eB_KO9_?}QNScnK)}&;B9p5~pvnZtkV&2@E)76qwL!)zxd^!QxVQue ziUfv$H1KgKOcZbdYY=2|ndB*v;+O)|Fws$F^3EUp(qJ`090ou&K@0*;u0S;l90gPw zJtjF$bd;U+lV4inai1lNV9f=f3LggXp4vh_%L8$OUl|L9fGX4`2mIulJfDq~Q-Fbi d5$Hn)fysr>w2?(Y-Uf?0P7Ki8Ec@#M7XULSTI~P; delta 273 zcmaFc$?~?7WrO_piH_!z!@dhJGcYhrZsb#$7$7itE}SdO#H2FOQC`Ev(McsJMo`!< z@L&QDO4V zAN=B>3e6yS1x6MXpu880Ad`nkr;5NtN5x4$`NcKG&jMv#4lq_6zb^224(mht0C7Q( qtk&d!pM0E*Kwk+kFt9LAW_+VKF@PT~2o#41P7Yx8+bsL*0v7-iWKJpo diff --git a/resources/fonts/default-6x10.txt b/resources/fonts/default-6x10.txt index 7291154..550799b 100644 --- a/resources/fonts/default-6x10.txt +++ b/resources/fonts/default-6x10.txt @@ -86,8 +86,8 @@ 0x0021 0x0022 0x0023 0x0024 0x0025 0x0026 0x0027 0x0028 0x0029 0x002A 0x002B 0x002C 0x002D 0x002E 0x002F 0x0030 0x0031 0x0032 0x0033 0x0034 0x0035 0x0036 0x0037 0x0038 0x0039 0x003A 0x003B 0x003C 0x003D 0x003E 0x003F 0x0040 0x0041 0x0042 0x0043 0x0044 0x0045 0x0046 0x0047 0x0048 0x0049 0x004A 0x004B 0x004C 0x004D 0x004E 0x004F 0x0050 0x0051 0x0052 0x0053 0x0054 0x0055 0x0056 0x0057 0x0058 0x0059 0x005A 0x005B 0x005C 0x005D 0x005E 0x005F 0x0060 0x0061 0x0062 0x0063 0x0064 0x0065 0x0066 0x0067 0x0068 0x0069 0x006A 0x006B 0x006C 0x006D 0x006E 0x006F 0x0070 0x0071 0x0072 0x0073 0x0074 0x0075 0x0076 0x0077 0x0078 0x0079 0x007A 0x007B 0x007C 0x007D 0x007E 0x00A0 0x00A1 0x00A2 0x00A3 0x00A4 0x00A5 0x00A6 0x00A7 0x00A8 0x00A9 0x00AA 0x00AB 0x00AC 0x00AE 0x00B0 0x00B1 0x00B2 0x00B3 0x00B4 0x00B5 0x00B6 0x00B7 0x00BA 0x00BB 0x00BC 0x00BD 0x00BF 0x00C0 0x00C1 0x00C2 0x00C3 0x00C4 0x00C5 0x00C6 0x00C7 0x00C8 0x00C9 0x00CA 0x00CB 0x00CC 0x00CD 0x00CE 0x00CF 0x00D0 0x00D1 0x00D2 0x00D3 0x00D4 0x00D5 0x00D6 0x00D7 0x00D8 0x00D9 0x00DA 0x00DB 0x00DC 0x00DD 0x00DE 0x00DF 0x00E0 0x00E1 0x00E2 0x00E3 0x00E4 0x00E5 0x00E6 0x00E7 0x00E8 0x00E9 0x00EA 0x00EB 0x00EC 0x00ED 0x00EE 0x00EF 0x00F0 0x00F1 0x00F2 0x00F3 0x00F4 0x00F5 0x00F6 0x00F7 0x00F8 0x00F9 0x00FA 0x00FB 0x00FC 0x00FD 0x00FE 0x00FF 0x0102 0x0103 0x0151 0x015E 0x015F 0x0162 0x0163 0x0171 0x0192 0x0218 0x0219 0x021A 0x021B 0x2022 0x203C 0x207F 0x20A7 0x20AC 0x2122 0x2194 0x2195 0x21A8 0x2219 0x221A 0x221E 0x221F 0x2229 0x2248 0x2261 0x2264 0x2265 0x2302 0x2310 0x2320 0x2321 0x2550 0x2551 0x2552 0x2553 0x2554 0x2555 0x2556 0x2557 0x2558 0x2559 0x255A 0x255B 0x255C 0x255D 0x255E 0x255F 0x2560 0x2561 0x2562 0x2563 0x2564 0x2565 0x2566 0x2567 0x2568 0x2569 0x256A 0x256B 0x256C 0x2580 0x2584 0x2588 0x258C 0x2590 0x2591 0x2592 0x2593 0x25A0 0x25A1 0x25AC 0x25B2 0x25B3 0x25BA 0x25BC 0x25BD 0x25C4 0x25C6 0x25C7 0x25CB 0x25CE 0x25CF 0x25D8 0x25D9 0x2605 0x263A 0x263B 0x263C 0x2640 0x2642 0x2660 0x2663 0x2665 -0x2666 0x266A 0x266B 0x7B80 0xE000 0xE001 0xE002 0xE003 0xE004 0xE005 0xE006 0xE079 0xE07A 0xE07B 0xE07C 0xE07D 0xE07E 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 -0x0386 0x0388 0x0389 0x038A 0x038C 0x038E 0x038F 0x0390 0x03AA 0x03AB 0x03AC 0x03AD 0x03AE 0x03AF 0x03B0 0x03C2 0x03CA 0x03CB 0x03CC 0x03CD 0x03CE 0x05D0 0x05D1 0x05D2 0x05D3 0x05D4 0x05D5 0x05D6 0x05D7 0x05D8 0x05D9 0x05DA 0x05DB 0x05DC 0x05DD 0x05DE 0x05DF 0x05E0 0x05E1 0x05E2 0x05E3 0x05E4 0x05E5 0x05E6 0x05E7 0x05E8 0x05E9 0x05EA 0x05F0 0x05F1 0x05F2 0x05F3 0x05F4 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 +0x2666 0x266A 0x266B 0x7B80 0xE000 0xE001 0xE002 0xE003 0xE004 0xE005 0xE006 0xE079 0xE07A 0xE07B 0xE07C 0xE07D 0xE07E 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 +0x0386 0x0388 0x0389 0x038A 0x038C 0x038E 0x038F 0x0390 0x03AA 0x03AB 0x03AC 0x03AD 0x03AE 0x03AF 0x03B0 0x03C2 0x03CA 0x03CB 0x03CC 0x03CD 0x03CE 0x0406 0x0407 0x0456 0x0457 0x0490 0x0491 0x05D0 0x05D1 0x05D2 0x05D3 0x05D4 0x05D5 0x05D6 0x05D7 0x05D8 0x05D9 0x05DA 0x05DB 0x05DC 0x05DD 0x05DE 0x05DF 0x05E0 0x05E1 0x05E2 0x05E3 0x05E4 0x05E5 0x05E6 0x05E7 0x05E8 0x05E9 0x05EA 0x05F0 0x05F1 0x05F2 0x05F3 0x05F4 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0621 0x0622 0x0623 0x0624 0x0625 0x0626 0x0627 0x0628 0x0629 0x062A 0x062B 0x062C 0x062D 0x062E 0x062F 0x0630 0x0631 0x0632 0x0633 0x0634 0x0635 0x0636 0x0637 0x0638 0x0639 0x063A 0x0640 0x0641 0x0642 0x0643 0x0644 0x0645 0x0646 0x0647 0x0648 0x0649 0x064A 0xFBE8 0xFBE9 0xFE82 0xFE84 0xFE86 0xFE88 0xFE8A 0xFE8B 0xFE8C 0xFE8E 0xFE90 0xFE91 0xFE92 0xFE94 0xFE96 0xFE97 0xFE98 0xFE9A 0xFE9B 0xFE9C 0xFE9E 0xFE9F 0xFEA0 0xFEA2 0xFEA3 0xFEA4 0xFEA6 0xFEA7 0xFEA8 0xFEAA 0xFEAC 0xFEAE 0xFEB0 0xFEB2 0xFEB3 0xFEB4 0xFEB6 0xFEB7 0xFEB8 0xFEBA 0xFEBB 0xFEBC 0xFEBE 0xFEBF 0xFEC0 0xFEC2 0xFEC3 0xFEC4 0xFEC6 0xFEC7 0xFEC8 0xFECA 0xFECB 0xFECC 0xFECE 0xFECF 0xFED0 0xFED2 0xFED3 0xFED4 0xFED6 0xFED7 0xFED8 0xFEDA 0xFEDB 0xFEDC 0xFEDE 0xFEDF 0xFEE0 0xFEE2 0xFEE3 0xFEE4 0xFEE6 0xFEE7 0xFEE8 0xFEEA 0xFEEB 0xFEEC 0xFEEE 0xFEF0 0xFEF2 0xFEF3 0xFEF4 0x060C 0x061F 0xFEFB 0xFEFC 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020