Update translations (#162)

* Update translations, add Dutch and Ukrainian

Adds Ґ, ґ, І, і, Ї, and ї to the font for Ukrainian

* Update Chinese translation

* Add RTL support, Hebrew translation

* Update translations
This commit is contained in:
Pk11 2022-04-08 13:39:29 -05:00 committed by GitHub
parent 88758d9ea5
commit 9ada5887e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 1072 additions and 357 deletions

View File

@ -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)

View File

@ -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;

View File

@ -52,31 +52,32 @@ DumpOption dumpMenu(std::vector<DumpOption> 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<DumpOption> 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<DumpOption> 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];

View File

@ -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

View File

@ -82,7 +82,7 @@ bool getDirectoryContents(std::vector<DirEntry>& 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<DirEntry> &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<DirEntry> &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());
}

View File

@ -8,6 +8,8 @@
#include <stdarg.h>
#include <string.h>
#include <nds.h>
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

View File

@ -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;

View File

@ -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 {

View File

@ -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;
}
}

View File

@ -2,12 +2,20 @@
#ifndef LANGUAGE_H
#define LANGUAGE_H
#include "font.h"
#include <string>
#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.

View File

@ -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"})) {

View File

@ -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 {

View File

@ -28,15 +28,18 @@ constexpr std::array<std::string *, 4> startMenuStrings = {
&STR_LANGUAGE
};
constexpr std::array<std::pair<const char *, const char *>, 11> languageList = {{
constexpr std::array<std::pair<const char *, const char *>, 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 {

View File

@ -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);

Binary file not shown.

View File

@ -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.

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=No drives found!
UNTITLED=UNTITLED

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=¡No se encontraron unidades!
UNTITLED=SIN TÍTULO

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=Aucun lecteur trouvé !
UNTITLED=SANS TITRE

View File

@ -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=קוראנית

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=Nem található meghajtó!
UNTITLED=NÉVTELEN

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=Nessuna unità trovata!
UNTITLED=SENZA TITOLO

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=ドライブが見つかりません!
UNTITLED=無題

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=ドライブが みつかりません!
UNTITLED=むだい

View File

@ -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

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=Nu s-au găsit unități!
UNTITLED=FĂRĂ TITLU

View File

@ -1,3 +1,6 @@
[PROPERTIES]
DIR=ltr
[LANGUAGE]
NO_DRIVES_FOUND=No drives found!
UNTITLED=БЕЗ НАЗВАНИЯ

View File

@ -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

View File

@ -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</X -卸载镜像
SCREENSHOTTEXT=\R+\L - 截图
CLEAR_CLIPBOARD=SELECT - 清除剪贴板
RESTORE_CLIPBOARD=SELECT - 恢复剪贴板
DIRECTORY_OPTIONS=\R+\A - 目录选项
COPY_FILE=\Y - 复制文件
COPY_FILES_CREATE_ENTRY=\Y - 复制文件/[+\R] 新建文件夹
PASTE_FILES_CREATE_ENTRY=\Y - 粘贴文件/[+\R] 新建文件夹
SELECT_FILES=\L -选择文件(已选\D个)。
DESELECT_FILES=\L - 放弃选择文件(已选\D个)。
DELETE_RENAME_FILE=\X - 删除/[+\R] 重命名文件
UNMOUNT_SDCARD=\R+\B卸载SD卡
REMOUNT_SDCARD=\R+\B:重挂载SD卡
UNMOUNT_FLASHCARD=\R+\B卸载烧录卡
START_START_MENU=STARTSTART菜单
POWERTEXT_DS=电源键关闭电源
POWERTEXT=电源键:重启/[+长按]关机
POWERTEXT_3DS=电源键:睡眠模式界面
HOMETEXT=HOME键回到主菜单
IMAGETEXT=\R+\X卸载镜像
SCREENSHOTTEXT=\R+\L截图
CLEAR_CLIPBOARD=SELECT清除剪贴板
RESTORE_CLIPBOARD=SELECT恢复剪贴板
DIRECTORY_OPTIONS=\R+\A目录选项
COPY_FILE=\Y复制文件
COPY_FILES_CREATE_ENTRY=\Y复制文件/[+\R] 新建文件夹
PASTE_FILES_CREATE_ENTRY=\Y粘贴文件/[+\R] 新建文件夹
SELECT_FILES=\L:选择文件(使用\D键多选)
DESELECT_FILES=\L:取消选择文件(使用\D键多选)
DELETE_RENAME_FILE=\X删除/[+\R] 重命名文件
START_MENU=START菜单
POWER_OFF=关机
REBOOT=重启
OPEN_TITLE_MANAGER=Title manager...
OPEN_TITLE_MANAGER=软件管理器...
LANGUAGE=语言...
SELECT_LANGUAGE=选择语言
NITROFS_NOT_MOUNTED=NitroFS 无法挂载,请从 TWiLight Menu++ nds-hb-menu加载GodMode9i
NITROFS_UNMOUNTED=另一个标题的NitroFS已挂载请重新加载GodMode9i以改变语言。
TITLE_MANAGER=Title Manager
NITROFS_NOT_MOUNTED=NitroFS无法挂载请从TWiLight Menu++或nds-hb-menu加载GodMode9i
NITROFS_UNMOUNTED=另一个软件的NitroFS已挂载请重新加载GodMode9i以改变语言。
TITLE_MANAGER=软件管理器
BOOT_FILE=启动文件
BOOT_FILE_DIRECT=启动文件(直接)
BOOTSTRAP_FILE=Bootstrap文件
MOUNT_NITROFS=NitroFS 挂载
BOOTSTRAP_FILE=以Bootstrap运行
MOUNT_NITROFS=挂载NitroFS
SHOW_NDS_INFO=显示NDS文件信息
TRIM_NDS=精简NDS文件
RESTORE_SAVE=还原保存数据
RESTORE_SAVE_NDS=还原保存数据 (Slot-1)
RESTORE_SAVE_GBA=还原保存数据 (Slot-2)
TRIM_NDS=NDS文件瘦身
RESTORE_SAVE=还原存档
RESTORE_SAVE_NDS=恢复存档 (Slot-1)
RESTORE_SAVE_GBA=恢复存档 (Slot-2)
MOUNT_FAT_IMG=挂载为FAT镜像
OPEN_HEX=在HEX编辑器中打开
SHOW_DIRECTORY_INFO=显示目录信息
SHOW_FILE_INFO=显示文件信息
COPY_SD_OUT=拷贝到sd:/gm9i/out
COPY_FAT_OUT=拷贝到fat:/gm9i/out
COPY_SD_OUT=复制到sd:/gm9i/out
COPY_FAT_OUT=复制到fat:/gm9i/out
CALC_SHA1=计算SHA1 hash值
LOAD_FONT=加载字体
FILESIZE=文件大小: %s
CREATED=创建时间: %s
FILESIZE=文件大小%s
CREATED=创建时间%s
MODIFIED=上次修改:%s
UP_READONLY=\DU只读
DOWN_SYSTEM=\DD系统
LEFT_HIDDEN=\DL隐藏
RIGHT_ARCHIVE=\DR正常
RIGHT_ARCHIVE=\DR归档
VIRTUAL=虚拟
HEX_EDITOR=十六进制编辑器
JUMP_TO_OFFSET=跳转
JUMP_TO_OFFSET=跳转到偏移值
SEARCH_STRING=搜索字符串
SEARCH_DATA=搜索数据
SEARCH_FOR=搜索:
SEARCH_FOR=搜索
ENTER_VALUE=输入值:
SEARCHING=正在搜索中
PRESS_B_TO_CANCEL=按下\B以取消
EOF_NO_RESULTS=已到达文件末尾,无结果\n
EOF_NO_RESULTS=已到达文件末尾\n无搜索结果
FLASHCARD_WILL_UNMOUNT=烧录卡将被取消挂载。\n确定
DUMP_TO=提取 "%s" 到\n"%s:/gm9i/out"?
DUMP_TO_GBA=将“%s”导入GBA游戏卡内
FLASHCARD_WILL_UNMOUNT=烧录卡将被取消挂载。\n要继续吗
DUMP_TO=要将"%s"导出到\n"%s:/gm9i/out"吗?
DUMP_TO_GBA=要将“%s”导出到GBA游戏卡吗
DUMP_ALL=全部
DUMP_ALL_TRIMMED=全部 (精简过的ROM)
DUMP_ALL_TRIMMED=全部 (已瘦身的ROM)
DUMP_ROM=ROM
DUMP_ROM_TRIMMED=ROM(已精简)
DUMP_SAVE=
DUMP_DS_SAVE=DS保存数据
DUMP_PUBLIC_SAVE=Public save
DUMP_PRIVATE_SAVE=Private save
DUMP_BANNER_SAVE=Banner save
DUMP_TMD=TMD
DUMP_ROM_TRIMMED=ROM(瘦身后)
DUMP_SAVE=
DUMP_DS_SAVE=DS存档
DUMP_PUBLIC_SAVE=公共区存档
DUMP_PRIVATE_SAVE=私有区存档
DUMP_BANNER_SAVE=标题信息存档
DUMP_TMD=TMD文件
DUMP_METADATA=元数据
DO_NOT_REMOVE_CARD=请勿拔出NDS卡。
DO_NOT_REMOVE_CART=请勿拔出GBA卡。
DUMPING_SAVE=正在保存...
DUMPING_SAVE=正在导出...
RESTORING_SAVE=正在还原...
DUMPING_METADATA=正在导出元数据...
FAILED_TO_DUMP_ROM=导出ROM失败。
UNABLE_TO_DUMP_ROM=无法导出ROM。
FAILED_TO_DUMP_SAVE=导出保存数据失败。
UNABLE_TO_DUMP_SAVE=无法导出保存数据
FAILED_TO_RESTORE_SAVE=还原保存数据失败。
UNABLE_TO_RESTORE_SAVE=无法还原保存数据
SAVE_SIZE_MISMATCH_CARD=该存档文件的大小与当前卡带的存档大小不匹配!\n\n写入已停止
SAVE_SIZE_MISMATCH_CART=该存档文件的大小与当前卡带的存档大小不匹配!\n\n写入已停止
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.
FAILED_TO_DUMP_SAVE=导出存档失败。
UNABLE_TO_DUMP_SAVE=无法导出存档
FAILED_TO_RESTORE_SAVE=还原存档失败。
UNABLE_TO_RESTORE_SAVE=无法还原存档
SAVE_SIZE_MISMATCH_CARD=该存档文件的大小与当前已插入游戏卡的存档大小不匹配。\n\n停止写入。
SAVE_SIZE_MISMATCH_CART=该存档文件的大小与当前已插入游戏卡的存档大小不匹配。\n\n停止写入。
RESTORE_SELECTED_SAVE_CARD=要将选择的存档恢复到已插入的游戏卡上吗?
RESTORE_SELECTED_SAVE_CARD_FLASHCARD=要解除挂载烧录卡并将选择的存档恢复到游戏卡中吗?
RESTORE_SELECTED_SAVE_CART=要将选择的存档恢复到已插入的游戏卡上吗?
EJECT_FLASHCARD_INSERT_GAME=请弹出你的烧录卡,并插入你想恢复存档的游戏卡。
PROGRESS=进度:
N_OF_N_BYTES=%d/%d 字节
NDS_IS_DUMPING=%s.nds\n正在导出...
GBA_IS_DUMPING=%s.gba\n正在导出...
COMPRESSING_SAVE=压缩中...
WRITING_SAVE=正在保存...
WRITE_TO_GBA=将 %s 写入到GBA游戏卡(%s 剩余)\n\n请确保先备份你的GBA保存数据!
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=This cart doesn't contain a DS save.
COMPRESSING_SAVE=正在压缩存档...
WRITING_SAVE=正在写入存档...
WRITE_TO_GBA=要将%s写入到GBA卡带吗(%s 剩余)\n\n请确认你的GBA存档已经备份好了
SWITCH_CART=请更换GBA
SWITCH_CART_TO_SECTION=请切换到包含第%d部分的GBA卡带。
SWITCH_CART_TO_SECTION_THIS_WAS=请切换到包含第%d部分的GBA卡带。(此为第%d部分)
WRONG_DS_SAVE=这张卡带所包含的是其他DS游戏的存档文件。
NO_DS_SAVE=这张卡带并不包含DS存档。
A_OK=(\A 确定)
A_YES_B_NO=(\A是, \B 否)
A_CONTINUE=(\A 继续)
B_CANCEL=(\B 取消)
A_SELECT_B_CANCEL=(\A 选择, \B 取消)
A_OK=(\A确定)
A_YES_B_NO=(\A是 \B否)
A_CONTINUE=(\A继续)
B_CANCEL=(\B取消)
A_SELECT_B_CANCEL=(\A 选择 \B 取消)
START_CANCEL=(START键 取消)
UDLR_CHANGE_ATTRIBUTES=(\D 更改属性)
A_APPLY_B_CANCEL=(\A 应用\B 取消)
START_RETURN_B_BACKSPACE=(START Return, \B Backspace)
A_APPLY_B_CANCEL=(\A 应用 \B取消)
START_RETURN_B_BACKSPACE=(START 回车 \B退格)
1_BYTE=1 字节
N_BYTES=%lld 字节

Binary file not shown.

Binary file not shown.

View File

@ -86,8 +86,8 @@
0x0021 0x0022 0x0023 0x0024 0x0025 0x0026 0x0027 0x0028 0x0029 0x002A 0x002B 0x002C 0x002D 0x002E 0x002F 0x0030 0x0031 0x0032 0x0033 0x0034 0x0035 0x0036 0x0037 0x0038 0x0039 0x003A 0x003B 0x003C 0x003D 0x003E 0x003F 0x0040 0x0041 0x0042 0x0043 0x0044 0x0045 0x0046 0x0047 0x0048 0x0049 0x004A 0x004B 0x004C 0x004D 0x004E 0x004F 0x0050 0x0051 0x0052 0x0053 0x0054 0x0055 0x0056 0x0057 0x0058 0x0059 0x005A 0x005B 0x005C 0x005D 0x005E 0x005F 0x0060 0x0061 0x0062 0x0063 0x0064 0x0065 0x0066 0x0067 0x0068 0x0069 0x006A 0x006B 0x006C 0x006D 0x006E 0x006F 0x0070 0x0071 0x0072 0x0073 0x0074 0x0075 0x0076 0x0077 0x0078 0x0079 0x007A 0x007B 0x007C 0x007D 0x007E
0x00A0 0x00A1 0x00A2 0x00A3 0x00A4 0x00A5 0x00A6 0x00A7 0x00A8 0x00A9 0x00AA 0x00AB 0x00AC 0x00AE 0x00B0 0x00B1 0x00B2 0x00B3 0x00B4 0x00B5 0x00B6 0x00B7 0x00BA 0x00BB 0x00BC 0x00BD 0x00BF 0x00C0 0x00C1 0x00C2 0x00C3 0x00C4 0x00C5 0x00C6 0x00C7 0x00C8 0x00C9 0x00CA 0x00CB 0x00CC 0x00CD 0x00CE 0x00CF 0x00D0 0x00D1 0x00D2 0x00D3 0x00D4 0x00D5 0x00D6 0x00D7 0x00D8 0x00D9 0x00DA 0x00DB 0x00DC 0x00DD 0x00DE 0x00DF 0x00E0 0x00E1 0x00E2 0x00E3 0x00E4 0x00E5 0x00E6 0x00E7 0x00E8 0x00E9 0x00EA 0x00EB 0x00EC 0x00ED 0x00EE 0x00EF 0x00F0 0x00F1 0x00F2 0x00F3 0x00F4 0x00F5 0x00F6 0x00F7 0x00F8 0x00F9 0x00FA 0x00FB 0x00FC 0x00FD 0x00FE 0x00FF 0x0102 0x0103 0x0151
0x015E 0x015F 0x0162 0x0163 0x0171 0x0192 0x0218 0x0219 0x021A 0x021B 0x2022 0x203C 0x207F 0x20A7 0x20AC 0x2122 0x2194 0x2195 0x21A8 0x2219 0x221A 0x221E 0x221F 0x2229 0x2248 0x2261 0x2264 0x2265 0x2302 0x2310 0x2320 0x2321 0x2550 0x2551 0x2552 0x2553 0x2554 0x2555 0x2556 0x2557 0x2558 0x2559 0x255A 0x255B 0x255C 0x255D 0x255E 0x255F 0x2560 0x2561 0x2562 0x2563 0x2564 0x2565 0x2566 0x2567 0x2568 0x2569 0x256A 0x256B 0x256C 0x2580 0x2584 0x2588 0x258C 0x2590 0x2591 0x2592 0x2593 0x25A0 0x25A1 0x25AC 0x25B2 0x25B3 0x25BA 0x25BC 0x25BD 0x25C4 0x25C6 0x25C7 0x25CB 0x25CE 0x25CF 0x25D8 0x25D9 0x2605 0x263A 0x263B 0x263C 0x2640 0x2642 0x2660 0x2663 0x2665
0x2666 0x266A 0x266B 0x7B80 0xE000 0xE001 0xE002 0xE003 0xE004 0xE005 0xE006 0xE079 0xE07A 0xE07B 0xE07C 0xE07D 0xE07E 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020
0x0386 0x0388 0x0389 0x038A 0x038C 0x038E 0x038F 0x0390 0x03AA 0x03AB 0x03AC 0x03AD 0x03AE 0x03AF 0x03B0 0x03C2 0x03CA 0x03CB 0x03CC 0x03CD 0x03CE 0x05D0 0x05D1 0x05D2 0x05D3 0x05D4 0x05D5 0x05D6 0x05D7 0x05D8 0x05D9 0x05DA 0x05DB 0x05DC 0x05DD 0x05DE 0x05DF 0x05E0 0x05E1 0x05E2 0x05E3 0x05E4 0x05E5 0x05E6 0x05E7 0x05E8 0x05E9 0x05EA 0x05F0 0x05F1 0x05F2 0x05F3 0x05F4 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020
0x2666 0x266A 0x266B 0x7B80 0xE000 0xE001 0xE002 0xE003 0xE004 0xE005 0xE006 0xE079 0xE07A 0xE07B 0xE07C 0xE07D 0xE07E 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020
0x0386 0x0388 0x0389 0x038A 0x038C 0x038E 0x038F 0x0390 0x03AA 0x03AB 0x03AC 0x03AD 0x03AE 0x03AF 0x03B0 0x03C2 0x03CA 0x03CB 0x03CC 0x03CD 0x03CE 0x0406 0x0407 0x0456 0x0457 0x0490 0x0491 0x05D0 0x05D1 0x05D2 0x05D3 0x05D4 0x05D5 0x05D6 0x05D7 0x05D8 0x05D9 0x05DA 0x05DB 0x05DC 0x05DD 0x05DE 0x05DF 0x05E0 0x05E1 0x05E2 0x05E3 0x05E4 0x05E5 0x05E6 0x05E7 0x05E8 0x05E9 0x05EA 0x05F0 0x05F1 0x05F2 0x05F3 0x05F4 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020
0x0621 0x0622 0x0623 0x0624 0x0625 0x0626 0x0627 0x0628 0x0629 0x062A 0x062B 0x062C 0x062D 0x062E 0x062F 0x0630 0x0631 0x0632 0x0633 0x0634 0x0635 0x0636 0x0637 0x0638 0x0639 0x063A 0x0640 0x0641 0x0642 0x0643 0x0644 0x0645 0x0646 0x0647 0x0648 0x0649 0x064A 0xFBE8 0xFBE9 0xFE82 0xFE84 0xFE86 0xFE88 0xFE8A 0xFE8B 0xFE8C 0xFE8E 0xFE90 0xFE91 0xFE92 0xFE94 0xFE96 0xFE97 0xFE98 0xFE9A 0xFE9B 0xFE9C 0xFE9E 0xFE9F 0xFEA0 0xFEA2 0xFEA3 0xFEA4 0xFEA6 0xFEA7 0xFEA8 0xFEAA 0xFEAC 0xFEAE 0xFEB0 0xFEB2 0xFEB3 0xFEB4 0xFEB6 0xFEB7 0xFEB8 0xFEBA 0xFEBB 0xFEBC 0xFEBE 0xFEBF 0xFEC0 0xFEC2 0xFEC3 0xFEC4 0xFEC6 0xFEC7 0xFEC8 0xFECA 0xFECB 0xFECC 0xFECE 0xFECF 0xFED0
0xFED2 0xFED3 0xFED4 0xFED6 0xFED7 0xFED8 0xFEDA 0xFEDB 0xFEDC 0xFEDE 0xFEDF 0xFEE0 0xFEE2 0xFEE3 0xFEE4 0xFEE6 0xFEE7 0xFEE8 0xFEEA 0xFEEB 0xFEEC 0xFEEE 0xFEF0 0xFEF2 0xFEF3 0xFEF4 0x060C 0x061F 0xFEFB 0xFEFC 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020
0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020 0x0020