Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public Map<String, String> getRegions(String locale){
if (regionMap != null) {
return regionMap;
}
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator();
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator();
while (fallbackLocalesIter.hasNext()) {
String fallbackLocale = fallbackLocalesIter.next().toLanguageTag();
if(fallbackLocale.equalsIgnoreCase(locale))
Expand Down Expand Up @@ -93,7 +93,7 @@ public Map<String, String> getDisplayNames(String locale) {
if(dispMap != null && !dispMap.isEmpty()){
return dispMap;
}
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator();
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator();
while (fallbackLocalesIter.hasNext()) {
String fallbackLocale = fallbackLocalesIter.next().toLanguageTag();
if(fallbackLocale.equalsIgnoreCase(locale))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public JSONObject getPatterns(String locale) {
if (patterns != null) {
return patterns;
}
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator();
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator();
while (fallbackLocalesIter.hasNext()) {
String fallbackLocale = fallbackLocalesIter.next().toLanguageTag();
if(fallbackLocale.equalsIgnoreCase(locale))
Expand Down Expand Up @@ -73,7 +73,7 @@ public JSONObject getPatterns(String language, String region) {
if (patterns != null) {
return patterns;
}
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocales().iterator();
Iterator<Locale> fallbackLocalesIter = LocaleUtility.getL2FallbackLocalesIterator();
while (fallbackLocalesIter.hasNext()) {
String fallbackLocale = fallbackLocalesIter.next().toLanguageTag();
if(fallbackLocale.equalsIgnoreCase(new Locale(language, region).toLanguageTag()))
Expand Down
137 changes: 72 additions & 65 deletions src/main/java/com/vmware/vipclient/i18n/util/LocaleUtility.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Locale> fallbackLocales = new LinkedList<Locale>(Arrays.asList(getDefaultLocale(), Locale.forLanguageTag(ConstantsKeys.SOURCE)));
private static List<Locale> l2FallbackLocales = new LinkedList<Locale>(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<Map<String, Locale>> threadLocal = new InheritableThreadLocal<Map<String, Locale>>() {
@Override
protected Map<String, Locale> initialValue() {
return new HashMap<>();
}

@Override
protected Map<String, Locale> childValue(
Map<String, Locale> parentValue) {
return parentValue.entrySet()
.stream().collect(
Collectors.toMap(
Map.Entry::getKey,
e -> (new Locale.Builder())
.setLocale(
e.getValue())
.build()));
}
};
private static InheritableThreadLocal<Map<String, Locale>> threadLocal = new InheritableThreadLocal<Map<String, Locale>>() {
@Override
protected Map<String, Locale> initialValue() {
return new HashMap<>();
}

@Override
protected Map<String, Locale> childValue(
Map<String, Locale> parentValue) {
return parentValue.entrySet()
.stream().collect(
Collectors.toMap(
Map.Entry::getKey,
e -> (new Locale.Builder())
.setLocale(
e.getValue())
.build()));
}
};

/**
* Set the locale to ThreadLocal
Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
Expand All @@ -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<Locale> locales,
Locale preferredLocale) {
Locale preferredLocale) {
Locale langLocale = null;
preferredLocale = fmtToMappedLocale(preferredLocale);

Expand All @@ -167,7 +162,7 @@ public static Locale pickupLocaleFromList(List<Locale> locales,
if (((preferredScript.equalsIgnoreCase("")) && (configuredScript
.equalsIgnoreCase("")))
|| ((!preferredScript.equalsIgnoreCase("")) && (preferredScript
.equalsIgnoreCase(configuredScript)))) {
.equalsIgnoreCase(configuredScript)))) {
return configuredLocale;
}
langLocale = langLocale == null ? configuredLocale : langLocale;
Expand Down Expand Up @@ -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;
}

}
Expand All @@ -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
*/
Expand All @@ -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<Locale> getFallbackLocales() {
return fallbackLocales;
}
public static List<Locale> getFallbackLocales() {
return fallbackLocales;
}

public static void setFallbackLocales(List<Locale> fallbackLocales) {
LocaleUtility.fallbackLocales = fallbackLocales;
}
public static void setFallbackLocales(List<Locale> fallbackLocales) {
LocaleUtility.fallbackLocales = fallbackLocales;
}

public static List<Locale> getL2FallbackLocales() {
return l2FallbackLocales;
public static Iterator getL2FallbackLocalesIterator() {
return new L2Iterator();
}

public static void setL2FallbackLocales(List<Locale> l2fallbackLocales) {
LocaleUtility.l2FallbackLocales = l2fallbackLocales;
public static class L2Iterator implements Iterator {
Iterator<Locale> 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;
}
}
}