diff --git a/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java b/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java index 929711f35440af4ecce9336c0c139b1207b99496..71aab6fd2573381a044ef2b9ad4af89001a8181f 100644 --- a/shell/platform/android/io/flutter/plugin/localization/LocalizationPlugin.java +++ b/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/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java b/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java index 28ece52e6f42cb6d7ac1fcb48070ed4b6aac7c6d..08cf4ff91bc98a82cfd8d7efabeda7036497689c 100644 --- a/shell/platform/android/test/io/flutter/plugin/localization/LocalizationPluginTest.java +++ b/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.