1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-21 05:53:02 +01:00

Fix #13130: Android respects device locale (#19419)

Co-authored-by: Tulio Leao <tupaschoal@gmail.com>
This commit is contained in:
undermark5
2023-04-13 04:30:18 -05:00
committed by GitHub
parent 0a28f6b0b9
commit 78aa02fe8a
3 changed files with 126 additions and 3 deletions

View File

@@ -74,17 +74,74 @@ namespace Platform
uint16_t GetLocaleLanguage()
{
return LANGUAGE_ENGLISH_UK;
JNIEnv* env = static_cast<JNIEnv*>(SDL_AndroidGetJNIEnv());
jobject activity = static_cast<jobject>(SDL_AndroidGetActivity());
jclass activityClass = env->GetObjectClass(activity);
jmethodID getDefaultLocale = env->GetMethodID(
activityClass, "getDefaultLocale", "([Ljava/lang/String;)Ljava/lang/String;");
jobjectArray jLanguageTags = env->NewObjectArray(
LANGUAGE_COUNT, env->FindClass("java/lang/String"), env->NewStringUTF(""));
for (int32_t i = 1; i < LANGUAGE_COUNT; ++i)
{
jstring jTag = env->NewStringUTF(LanguagesDescriptors[i].locale);
env->SetObjectArrayElement(jLanguageTags, i, jTag);
}
jstring jniString = static_cast<jstring>(env->CallObjectMethod(activity, getDefaultLocale, jLanguageTags));
const char* jniChars = env->GetStringUTFChars(jniString, nullptr);
std::string defaultLocale = jniChars;
env->ReleaseStringUTFChars(jniString, jniChars);
for (int32_t i = 0; i < LANGUAGE_COUNT; ++i)
{
jobject strToFree = env->GetObjectArrayElement(jLanguageTags, i);
env->DeleteLocalRef(strToFree);
}
env->DeleteLocalRef(jLanguageTags);
env->DeleteLocalRef(activity);
env->DeleteLocalRef(activityClass);
return LanguageGetIDFromLocale(defaultLocale.c_str());
}
CurrencyType GetLocaleCurrency()
{
return Platform::GetCurrencyValue(NULL);
JNIEnv* env = static_cast<JNIEnv*>(SDL_AndroidGetJNIEnv());
jobject activity = static_cast<jobject>(SDL_AndroidGetActivity());
jclass activityClass = env->GetObjectClass(activity);
jmethodID getDefaultLocale = env->GetMethodID(activityClass, "getLocaleCurrency", "()Ljava/lang/String;");
jstring jniString = static_cast<jstring>(env->CallObjectMethod(activity, getDefaultLocale));
const char* jniChars = env->GetStringUTFChars(jniString, nullptr);
std::string localeCurrencyCode = jniChars;
env->ReleaseStringUTFChars(jniString, jniChars);
env->DeleteLocalRef(activity);
env->DeleteLocalRef(activityClass);
return Platform::GetCurrencyValue(localeCurrencyCode.c_str());
}
MeasurementFormat GetLocaleMeasurementFormat()
{
return MeasurementFormat::Metric;
JNIEnv* env = static_cast<JNIEnv*>(SDL_AndroidGetJNIEnv());
jobject activity = static_cast<jobject>(SDL_AndroidGetActivity());
jclass activityClass = env->GetObjectClass(activity);
jmethodID getIsImperialLocaleMeasurementFormat = env->GetMethodID(
activityClass, "isImperialLocaleMeasurementFormat", "()Z");
jboolean isImperial = env->CallBooleanMethod(activity, getIsImperialLocaleMeasurementFormat);
env->DeleteLocalRef(activity);
env->DeleteLocalRef(activityClass);
return isImperial == JNI_TRUE ? MeasurementFormat::Imperial : MeasurementFormat::Metric;
}
std::string GetSteamPath()