diff --git a/Source/options.cpp b/Source/options.cpp index 522842e9b..5cd492e90 100644 --- a/Source/options.cpp +++ b/Source/options.cpp @@ -8,6 +8,11 @@ #include #include +#ifdef __ANDROID__ +#include "SDL.h" +#include +#endif + #define SI_SUPPORT_IOSTREAMS #include @@ -261,14 +266,30 @@ void LoadOptions() sgOptions.Controller.bRearTouch = GetIniBool("Controller", "Enable Rear Touchpad", true); #endif +#ifdef __ANDROID__ + JNIEnv *env = (JNIEnv *)SDL_AndroidGetJNIEnv(); + jobject activity = (jobject)SDL_AndroidGetActivity(); + jclass clazz(env->GetObjectClass(activity)); + jmethodID method_id = env->GetMethodID(clazz, "getLocale", "()Ljava/lang/String;"); + jstring jLocale = (jstring)env->CallObjectMethod(activity, method_id); + const char *cLocale = env->GetStringUTFChars(jLocale, nullptr); + std::string locale = cLocale; + env->ReleaseStringUTFChars(jLocale, cLocale); + env->DeleteLocalRef(jLocale); + env->DeleteLocalRef(activity); + env->DeleteLocalRef(clazz); +#else std::string locale = std::locale("").name().substr(0, 5); - SDL_Log("prefered locale %s", locale.c_str()); +#endif + + LogVerbose("Prefered locale: {}", locale); if (!HasTranslation(locale)) { locale = locale.substr(0, 2); if (!HasTranslation(locale)) { locale = "en"; } } + LogVerbose("Best match locale: {}", locale); GetIniValue("Language", "Code", sgOptions.Language.szCode, sizeof(sgOptions.Language.szCode), locale.c_str()); diff --git a/android-project/app/src/main/java/org/diasurgical/devilutionx/DevilutionXSDLActivity.java b/android-project/app/src/main/java/org/diasurgical/devilutionx/DevilutionXSDLActivity.java index fe29ee864..ce9a09136 100644 --- a/android-project/app/src/main/java/org/diasurgical/devilutionx/DevilutionXSDLActivity.java +++ b/android-project/app/src/main/java/org/diasurgical/devilutionx/DevilutionXSDLActivity.java @@ -17,6 +17,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Locale; public class DevilutionXSDLActivity extends SDLActivity { private String externalDir; @@ -127,6 +128,14 @@ public class DevilutionXSDLActivity extends SDLActivity { } } + /** + * This method is called by SDL using JNI. + */ + public String getLocale() + { + return Locale.getDefault().toString(); + } + protected String[] getArguments() { if (BuildConfig.DEBUG) { return new String[]{