#include #include #include #include #include #include #include #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'') ? "" : "") + out.substr(i + 2); // U+E000 break; case 'b': case 'B': out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 2); // U+E001 break; case 'x': case 'X': out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 2); // U+E002 break; case 'y': case 'Y': out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 2); // U+E003 break; case 'l': case 'L': out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + out.substr(i + 2); // U+E004 break; case 'r': case 'R': out = out.substr(0, i) + (font->charExists(u'') ? "" : "") + 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 }