diff --git a/engine/src/flutter/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java b/engine/src/flutter/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java index 929711f3544..71aab6fd257 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java @@ -50,9 +50,15 @@ public class LocalizationPlugin { int localeCount = localeList.size(); for (int index = 0; index < localeCount; ++index) { Locale locale = localeList.get(index); - String localeString = locale.toString(); - // This string replacement converts the locale string into the ranges format. - languageRanges.add(new Locale.LanguageRange(localeString.replace("_", "-"))); + // Convert locale string into language range format. + String fullRange = locale.getLanguage(); + if (!locale.getScript().isEmpty()) { + fullRange += "-" + locale.getScript(); + } + if (!locale.getCountry().isEmpty()) { + fullRange += "-" + locale.getCountry(); + } + languageRanges.add(new Locale.LanguageRange(fullRange)); languageRanges.add(new Locale.LanguageRange(locale.getLanguage())); languageRanges.add(new Locale.LanguageRange(locale.getLanguage() + "-*")); } diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java index 28ece52e6f4..08cf4ff91bc 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java @@ -120,6 +120,19 @@ public class LocalizationPluginTest { assertEquals(result[0], "it"); assertEquals(result[1], "IT"); assertEquals(result[2], ""); + + supportedLocales = + new String[] { + "zh", "CN", "Hans", + "zh", "HK", "Hant", + }; + localeList = new LocaleList(new Locale("zh", "CN")); + when(config.getLocales()).thenReturn(localeList); + result = flutterJNI.computePlatformResolvedLocale(supportedLocales); + assertEquals(result.length, 3); + assertEquals(result[0], "zh"); + assertEquals(result[1], "CN"); + assertEquals(result[2], "Hans"); } // This test should be synced with the version for API 26.