diff --git a/UI/MenuScreens.cpp b/UI/MenuScreens.cpp index ab1d64763a..01ac4c6148 100644 --- a/UI/MenuScreens.cpp +++ b/UI/MenuScreens.cpp @@ -35,6 +35,7 @@ namespace MainWindow { #include "base/timeutil.h" #include "base/NativeApp.h" #include "i18n/i18n.h" +#include "file/vfs.h" #include "gfx_es2/glsl_program.h" #include "gfx_es2/gl_state.h" #include "input/input_state.h" @@ -643,6 +644,15 @@ void GraphicsScreen::render() { UIEnd(); } +SystemScreen::SystemScreen() +{ +#ifdef ANDROID + VFSGetFileListing("assets/lang", &langs_, "ini"); +#else + VFSGetFileListing("lang", &langs_, "ini"); +#endif +} + void SystemScreen::render() { UIShader_Prepare(); UIBegin(UIShader_Get()); @@ -668,20 +678,30 @@ void SystemScreen::render() { UICheckBox(GEN_ID, x, y += stride, s->T("Show Debug Statistics"), ALIGN_TOPLEFT, &g_Config.bShowDebugStats); UICheckBox(GEN_ID, x, y += stride, s->T("Show FPS"), ALIGN_TOPLEFT, &g_Config.bShowFPSCounter); - VLinear vlang(600, 70, 10); + VGrid vlang(550, 100, dp_yres - 50, 10, 10); - // TODO: Make a dynamic language selector that looks for INI files. -#define NUMLANGS 6 - static const char *langs[NUMLANGS] = {"English", "Swedish", "German", "Chinese", "Japanese", "Russian"}; - static const char *langCodes[NUMLANGS] = {"en_US", "sv_SE", "de_DE", "zh_CN", "ja_JA", "ru_RU"}; + for (int i = 0; i < langs_.size(); i++) { + std::string code; + size_t dot = langs_[i].name.find('.'); + if (dot != std::string::npos) + code = langs_[i].name.substr(0, dot); - for (int i = 0; i < 6; i++) { - if (UIButton(GEN_ID_LOOP(i), vlang, LARGE_BUTTON_WIDTH, 0, langs[i], ALIGN_TOPLEFT)) { - g_Config.languageIni = langCodes[i]; - i18nrepo.LoadIni(g_Config.languageIni); - // After this, g and s are no longer valid. Let's return, some flicker is okay. - g = GetI18NCategory("General"); - s = GetI18NCategory("System"); + std::string buttonTitle = langs_[i].name; + if (!code.empty()) + buttonTitle = code; + + if (UIButton(GEN_ID_LOOP(i), vlang, LARGE_BUTTON_WIDTH, 0, buttonTitle.c_str(), ALIGN_TOPLEFT)) { + std::string oldLang = g_Config.languageIni; + g_Config.languageIni = code; + if (i18nrepo.LoadIni(g_Config.languageIni)) { + // Dunno what else to do here. + + // After this, g and s are no longer valid. Let's return, some flicker is okay. + g = GetI18NCategory("General"); + s = GetI18NCategory("System"); + } else { + g_Config.languageIni = oldLang; + } } } UIEnd(); diff --git a/UI/MenuScreens.h b/UI/MenuScreens.h index 78034ce152..e73625b9e2 100644 --- a/UI/MenuScreens.h +++ b/UI/MenuScreens.h @@ -94,8 +94,11 @@ public: class SystemScreen : public Screen { public: + SystemScreen(); void update(InputState &input); void render(); +private: + std::vector langs_; }; class ControlsScreen : public Screen diff --git a/android/ab.cmd b/android/ab.cmd index 36eecad802..1a65efb5f1 100644 --- a/android/ab.cmd +++ b/android/ab.cmd @@ -1,4 +1,5 @@ xcopy ..\flash0 assets\flash0 /s /y +xcopy ..\lang assets\lang /s /y SET NDK=C:\AndroidNDK SET NDK_MODULE_PATH=..;..\native\ext REM Need to force target-platform to android-9 to get access to OpenSL headers. diff --git a/android/ab.sh b/android/ab.sh index cf79aab3bc..98dd7a71bf 100755 --- a/android/ab.sh +++ b/android/ab.sh @@ -1,2 +1,3 @@ cp -r ../flash0 assets +cp -r ../lang assets NDK_MODULE_PATH=..:../native/ext $NDK/ndk-build -j3 TARGET_PLATFORM=android-9 $* diff --git a/android/buildassets.sh b/android/buildassets.sh index 1f8ff6150a..e50158d7ba 100644 --- a/android/buildassets.sh +++ b/android/buildassets.sh @@ -2,6 +2,5 @@ mkdir -p assets cp ../assets/unknown.png assets cp ../assets/ui_atlas.zim assets cp ../assets/ppge_atlas.zim assets -#cp -r source_assets/songs assets -#cp -r source_assets/samples assets -#cp -r ../shaders assets +cp -r ../flash0 assets +cp -r ../lang assets diff --git a/native b/native index 3494d9282d..56f5fcf975 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 3494d9282d1319c7ea982f7d6e4fb7687a151046 +Subproject commit 56f5fcf9755072f5a16ad6e9fcc39b0bde3e82ba