blob: eb40a3744179f0da5db950c63a74fb7944a1f808 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2008, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.impl.javaspi;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import com.ibm.icu.impl.ICUResourceBundle;
public class ICULocale {
private static final String SPI_PROP_FILE = "com/ibm/icu/impl/javaspi/ICUProvider.properties";
private static final String SUFFIX_KEY = "com.ibm.icu.impl.javaspi.ICULocale.suffix";
private static final String DEFAULT_SUFFIX = "ICU";
private static final Locale[] SPECIAL_LOCALES = {
new Locale("ja", "JP", "JP"),
};
private static Locale[] LOCALES = null;
private static String SUFFIX = null;
public static Locale[] getAvailableLocales() {
Locale[] all = getLocales();
return Arrays.copyOf(all, all.length);
}
public static Locale canonicalize(Locale locale) {
Locale result = locale;
String variant = locale.getVariant();
String suffix = getIcuSuffix();
if (variant.equals(suffix)) {
result = new Locale(locale.getLanguage(), locale.getCountry());
} else if (variant.endsWith(suffix)
&& variant.charAt(variant.length() - suffix.length() - 1) == '_') {
variant = variant.substring(0, variant.length() - suffix.length() - 1);
result = new Locale(locale.getLanguage(), locale.getCountry(), variant);
}
return result;
}
private static synchronized Locale[] getLocales() {
if (LOCALES == null) {
List<Locale> allLocales = new ArrayList<Locale>();
Locale[] baseLocales = ICUResourceBundle.getAvailableLocales();
for (Locale l : baseLocales) {
addLocale(l, allLocales);
}
for (Locale l : SPECIAL_LOCALES) {
addLocale(l, allLocales);
}
LOCALES = allLocales.toArray(new Locale[0]);
}
return LOCALES;
}
private static void addLocale(Locale loc, List<Locale> locales) {
locales.add(loc);
// Add ICU variant
String language = loc.getLanguage();
String country = loc.getCountry();
String variant = loc.getVariant();
StringBuffer var = new StringBuffer(variant);
if (var.length() != 0) {
var.append("_");
}
var.append(getIcuSuffix());
locales.add(new Locale(language, country, var.toString()));
}
private static synchronized String getIcuSuffix() {
if (SUFFIX == null) {
Properties spiConfigProps = new Properties();
try {
InputStream is = ClassLoader.getSystemResourceAsStream(SPI_PROP_FILE);
spiConfigProps.load(is);
SUFFIX = (String)spiConfigProps.get(SUFFIX_KEY);
} catch (IOException ioe) {
// Any IO errors, ignore
}
if (SUFFIX == null) {
SUFFIX = DEFAULT_SUFFIX;
}
}
return SUFFIX;
}
}