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 3229154..20d5ae6 100644 Binary files a/data/font_default.frf and b/data/font_default.frf differ 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