GodMode9i/arm9/source/language.cpp
2021-11-22 21:02:13 -06:00

120 lines
3.4 KiB
C++

#include <nds.h>
#include <stdio.h>
#include <fat.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
#include <string>
#include "config.h"
#include "font.h"
#include "inifile.h"
#define STRING(what, def) std::string STR_##what;
#include "language.inl"
#undef STRING
const char *getLanguageString() {
return "en-US";
}
/**
* Get strings from the ini with special processing
*/
std::string getString(CIniFile &ini, const std::string &item, const std::string &defaultValue) {
std::string out = ini.GetString("LANGUAGE", item, defaultValue);
// Convert "\n" to actual newlines
for(uint i = 0; i < out.length() - 1; i++) {
if(out[i] == '\\') {
switch(out[i + 1]) {
case 'n':
case 'N':
out = out.substr(0, i) + '\n' + out.substr(i + 2);
break;
case 'a':
case 'A':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "<A>") + out.substr(i + 2); // U+E000
break;
case 'b':
case 'B':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "<B>") + out.substr(i + 2); // U+E001
break;
case 'x':
case 'X':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "<X>") + out.substr(i + 2); // U+E002
break;
case 'y':
case 'Y':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "<Y>") + out.substr(i + 2); // U+E003
break;
case 'l':
case 'L':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "<L>") + out.substr(i + 2); // U+E004
break;
case 'r':
case 'R':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "<R>") + out.substr(i + 2); // U+E005
break;
case 'd':
case 'D':
switch(out[i + 2]) {
default:
out = out.substr(0, i) + (font->charExists(u'') ? "" : "←↑↓→") + out.substr(i + 2); // U+E006
break;
case 'u':
case 'U':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 3); // U+E079
break;
case 'd':
case 'D':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 3); // U+E07A
break;
case 'l':
case 'L':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 3); // U+E07B
break;
case 'r':
case 'R':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 3); // U+E07C
break;
case 'v':
case 'V':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "↑↓") + out.substr(i + 3); // U+E07D
break;
case 'h':
case 'H':
out = out.substr(0, i) + (font->charExists(u'') ? "" : "←→") + out.substr(i + 3); // U+E07E
break;
}
default:
break;
}
} else if(out[i] == '&') {
if(out.substr(i + 1, 3) == "lrm") {
out = out.substr(0, i) + "\u200E" + out.substr(i + 4); // Left-to-Right mark
} else if(out.substr(i + 1, 3) == "rlm") {
out = out.substr(0, i) + "\u200F" + out.substr(i + 4); // Right-to-Left mark
}
}
}
return out;
}
/**
* Initialize translations.
* Uses the language ID specified in settings.ui.language.
*/
void langInit(bool reloading) {
// If reloading then don't change if ini not found
if(reloading && access(config->fontPath().c_str(), F_OK) != 0)
return;
CIniFile languageini(config->languageIniPath());
#define STRING(what, def) STR_##what = getString(languageini, ""#what, def);
#include "language.inl"
#undef STRING
}