/* ****************************************************************************** * Copyright (C) 1996-2007, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** * ****************************************************************************** */ package com.ibm.icu.impl; import java.util.Locale; /** * A class to hold utility functions missing from java.util.Locale. */ public class LocaleUtility { /** * A helper function to convert a string of the form * aa_BB_CC to a locale object. Why isn't this in Locale? */ public static Locale getLocaleFromName(String name) { String language = ""; String country = ""; String variant = ""; int i1 = name.indexOf('_'); if (i1 < 0) { language = name; } else { language = name.substring(0, i1); ++i1; int i2 = name.indexOf('_', i1); if (i2 < 0) { country = name.substring(i1); } else { country = name.substring(i1, i2); variant = name.substring(i2+1); } } return new Locale(language, country, variant); } /** * Compare two locale strings of the form aa_BB_CC, and * return true if parent is a 'strict' fallback of child, that is, * if child =~ "^parent(_.+)*" (roughly). */ public static boolean isFallbackOf(String parent, String child) { if (!child.startsWith(parent)) { return false; } int i = parent.length(); return (i == child.length() || child.charAt(i) == '_'); } /** * Compare two locales, and return true if the parent is a * 'strict' fallback of the child (parent string is a fallback * of child string). */ public static boolean isFallbackOf(Locale parent, Locale child) { return isFallbackOf(parent.toString(), child.toString()); } /* * Convenience method that calls canonicalLocaleString(String) with * locale.toString(); */ /*public static String canonicalLocaleString(Locale locale) { return canonicalLocaleString(locale.toString()); }*/ /* * You'd think that Locale canonicalizes, since it munges the * renamed languages, but it doesn't quite. It forces the region * to be upper case but doesn't do anything about the language or * variant. Our canonical form is 'lower_UPPER_UPPER'. */ /*public static String canonicalLocaleString(String id) { if (id != null) { int x = id.indexOf("_"); if (x == -1) { id = id.toLowerCase(Locale.ENGLISH); } else { StringBuffer buf = new StringBuffer(); buf.append(id.substring(0, x).toLowerCase(Locale.ENGLISH)); buf.append(id.substring(x).toUpperCase(Locale.ENGLISH)); int len = buf.length(); int n = len; while (--n >= 0 && buf.charAt(n) == '_') { } if (++n != len) { buf.delete(n, len); } id = buf.toString(); } } return id; }*/ /** * Fallback from the given locale name by removing the rightmost _-delimited * element. If there is none, return the root locale ("", "", ""). If this * is the root locale, return null. NOTE: The string "root" is not * recognized; do not use it. * * @return a new Locale that is a fallback from the given locale, or null. */ public static Locale fallback(Locale loc) { // Split the locale into parts and remove the rightmost part String[] parts = new String[] { loc.getLanguage(), loc.getCountry(), loc.getVariant() }; int i; for (i=2; i>=0; --i) { if (parts[i].length() != 0) { parts[i] = ""; break; } } if (i<0) { return null; // All parts were empty } return new Locale(parts[0], parts[1], parts[2]); } }