diff --git a/src/main/java/com/vmware/vipclient/i18n/messages/service/LocaleService.java b/src/main/java/com/vmware/vipclient/i18n/messages/service/LocaleService.java index 6dc0f479f..a96c3b82e 100644 --- a/src/main/java/com/vmware/vipclient/i18n/messages/service/LocaleService.java +++ b/src/main/java/com/vmware/vipclient/i18n/messages/service/LocaleService.java @@ -35,7 +35,7 @@ public Map getRegions(String locale){ if (regionMap != null) { return regionMap; } - Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator(); + Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator(); while (fallbackLocalesIter.hasNext()) { String fallbackLocale = fallbackLocalesIter.next().toLanguageTag(); if(fallbackLocale.equalsIgnoreCase(locale)) @@ -93,7 +93,7 @@ public Map getDisplayNames(String locale) { if(dispMap != null && !dispMap.isEmpty()){ return dispMap; } - Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator(); + Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator(); while (fallbackLocalesIter.hasNext()) { String fallbackLocale = fallbackLocalesIter.next().toLanguageTag(); if(fallbackLocale.equalsIgnoreCase(locale)) diff --git a/src/main/java/com/vmware/vipclient/i18n/messages/service/PatternService.java b/src/main/java/com/vmware/vipclient/i18n/messages/service/PatternService.java index 88c81ef75..68db4fa66 100644 --- a/src/main/java/com/vmware/vipclient/i18n/messages/service/PatternService.java +++ b/src/main/java/com/vmware/vipclient/i18n/messages/service/PatternService.java @@ -31,7 +31,7 @@ public JSONObject getPatterns(String locale) { if (patterns != null) { return patterns; } - Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator(); + Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator(); while (fallbackLocalesIter.hasNext()) { String fallbackLocale = fallbackLocalesIter.next().toLanguageTag(); if(fallbackLocale.equalsIgnoreCase(locale)) @@ -73,7 +73,7 @@ public JSONObject getPatterns(String language, String region) { if (patterns != null) { return patterns; } - Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator(); + Iterator fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator(); while (fallbackLocalesIter.hasNext()) { String fallbackLocale = fallbackLocalesIter.next().toLanguageTag(); if(fallbackLocale.equalsIgnoreCase(new Locale(language, region).toLanguageTag())) diff --git a/src/main/java/com/vmware/vipclient/i18n/util/LocaleUtility.java b/src/main/java/com/vmware/vipclient/i18n/util/LocaleUtility.java index cd31b6704..4b5e123d9 100644 --- a/src/main/java/com/vmware/vipclient/i18n/util/LocaleUtility.java +++ b/src/main/java/com/vmware/vipclient/i18n/util/LocaleUtility.java @@ -4,44 +4,39 @@ */ package com.vmware.vipclient.i18n.util; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; public class LocaleUtility { private static Locale defaultLocale; private static Locale sourceLocale = Locale.ENGLISH; - + // A locale fallback priority queue. For now, it only contains the default locale and the source messages (from "messages_source.json"). private static List fallbackLocales = new LinkedList(Arrays.asList(getDefaultLocale(), Locale.forLanguageTag(ConstantsKeys.SOURCE))); - private static List l2FallbackLocales = new LinkedList(Arrays.asList(getDefaultLocale(), Locale.ENGLISH)); + ; // Use ThreadLocal to combine the locale with local thread so that the // locale can be used by any code places. - private static InheritableThreadLocal> threadLocal = new InheritableThreadLocal>() { - @Override - protected Map initialValue() { - return new HashMap<>(); - } - - @Override - protected Map childValue( - Map parentValue) { - return parentValue.entrySet() - .stream().collect( - Collectors.toMap( - Map.Entry::getKey, - e -> (new Locale.Builder()) - .setLocale( - e.getValue()) - .build())); - } - }; + private static InheritableThreadLocal> threadLocal = new InheritableThreadLocal>() { + @Override + protected Map initialValue() { + return new HashMap<>(); + } + + @Override + protected Map childValue( + Map parentValue) { + return parentValue.entrySet() + .stream().collect( + Collectors.toMap( + Map.Entry::getKey, + e -> (new Locale.Builder()) + .setLocale( + e.getValue()) + .build())); + } + }; /** * Set the locale to ThreadLocal @@ -110,9 +105,9 @@ public static boolean isDefaultLocale(Locale locale) { * Check if a language tag matches the default locale that is from the config file */ public static boolean isDefaultLocale(String languageTag) { - languageTag = languageTag.replaceAll("_", "-"); + languageTag = languageTag.replaceAll("_", "-"); Locale match = Locale.lookup(Arrays.asList(new Locale.LanguageRange(languageTag)), - Arrays.asList(getDefaultLocale())); + Arrays.asList(getDefaultLocale())); return match != null; } @@ -129,11 +124,11 @@ public static Locale fmtToMappedLocale(String zhLocale) { public static Locale fmtToMappedLocale(Locale zhLocale) { if (zhLocale.toLanguageTag().equalsIgnoreCase("zh-CN") || zhLocale.toLanguageTag().equalsIgnoreCase( - "zh-Hans-CN")) { + "zh-Hans-CN")) { return Locale.forLanguageTag("zh-Hans"); } else if (zhLocale.toLanguageTag().equalsIgnoreCase("zh-TW") || zhLocale.toLanguageTag().equalsIgnoreCase( - "zh-Hant-TW")) { + "zh-Hant-TW")) { return Locale.forLanguageTag("zh-HANT"); } return zhLocale; @@ -149,7 +144,7 @@ public static boolean isSameLocale(String locale1, String locale2) { * pick up the matched locale from a locale list */ public static Locale pickupLocaleFromList(List locales, - Locale preferredLocale) { + Locale preferredLocale) { Locale langLocale = null; preferredLocale = fmtToMappedLocale(preferredLocale); @@ -167,7 +162,7 @@ public static Locale pickupLocaleFromList(List locales, if (((preferredScript.equalsIgnoreCase("")) && (configuredScript .equalsIgnoreCase(""))) || ((!preferredScript.equalsIgnoreCase("")) && (preferredScript - .equalsIgnoreCase(configuredScript)))) { + .equalsIgnoreCase(configuredScript)))) { return configuredLocale; } langLocale = langLocale == null ? configuredLocale : langLocale; @@ -201,15 +196,15 @@ public static String normalizeToLanguageTag(String localeStr) { String[] os = localeStr.split("_"); for (int i = 0; i < os.length; i++) { switch (i) { - case 0: - language = os[0]; - continue; - case 1: - country = "".equalsIgnoreCase(os[1]) ? "" : "-" + os[1]; - continue; - case 2: - script = "".equalsIgnoreCase(os[2]) ? "" : "-" + os[2].replace("#", ""); - continue; + case 0: + language = os[0]; + continue; + case 1: + country = "".equalsIgnoreCase(os[1]) ? "" : "-" + os[1]; + continue; + case 2: + script = "".equalsIgnoreCase(os[2]) ? "" : "-" + os[2].replace("#", ""); + continue; } } @@ -219,7 +214,7 @@ public static String normalizeToLanguageTag(String localeStr) { /** * validate that an argument is a well-formed BCP 47 tag - * + * * @param languageTag * @return true if the format is fine */ @@ -230,35 +225,47 @@ public static boolean isLanguageTag(String languageTag) { return languageTag.contains("-"); } - public static Locale getDefaultLocale() { - return defaultLocale == null ? getSourceLocale() : defaultLocale; - } + public static Locale getDefaultLocale() { + return defaultLocale == null ? getSourceLocale() : defaultLocale; + } - public static void setDefaultLocale(Locale defaultLocale) { - LocaleUtility.defaultLocale = defaultLocale; - } + public static void setDefaultLocale(Locale defaultLocale) { + LocaleUtility.defaultLocale = defaultLocale; + } - public static Locale getSourceLocale() { - return sourceLocale; - } + public static Locale getSourceLocale() { + return sourceLocale; + } - public static void setSourceLocale(Locale sourceLocale) { - LocaleUtility.sourceLocale = sourceLocale; - } + public static void setSourceLocale(Locale sourceLocale) { + LocaleUtility.sourceLocale = sourceLocale; + } - public static List getFallbackLocales() { - return fallbackLocales; - } + public static List getFallbackLocales() { + return fallbackLocales; + } - public static void setFallbackLocales(List fallbackLocales) { - LocaleUtility.fallbackLocales = fallbackLocales; - } + public static void setFallbackLocales(List fallbackLocales) { + LocaleUtility.fallbackLocales = fallbackLocales; + } - public static List getL2FallbackLocales() { - return l2FallbackLocales; + public static Iterator getL2FallbackLocalesIterator() { + return new L2Iterator(); } - public static void setL2FallbackLocales(List l2fallbackLocales) { - LocaleUtility.l2FallbackLocales = l2fallbackLocales; + public static class L2Iterator implements Iterator { + Iterator iterator = getFallbackLocales().iterator(); + + public boolean hasNext() { + return iterator.hasNext(); + } + + public Locale next() { + Locale locale = iterator.next(); + if (locale.toLanguageTag().equals(ConstantsKeys.SOURCE)) + return getDefaultLocale(); + + return locale; + } } }