OpenJDK / jdk / jdk
changeset 14009:21856a20cc1d
7069824: Support for BCP47 locale matching
Reviewed-by: naoto, okutsu
author | peytoia |
---|---|
date | Fri, 28 Sep 2012 14:14:26 +0900 |
parents | b572c1f3a7ad |
children | 24f9f29d5532 |
files | jdk/src/share/classes/java/util/Locale.java jdk/src/share/classes/sun/util/locale/LocaleEquivalentMaps.java jdk/src/share/classes/sun/util/locale/LocaleMatcher.java jdk/test/java/util/Locale/Bug7069824.java jdk/test/java/util/Locale/tools/EquivMapsGenerator.java jdk/test/java/util/Locale/tools/language-subtag-registry.txt |
diffstat | 6 files changed, 48575 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/jdk/src/share/classes/java/util/Locale.java Fri Sep 28 04:39:02 2012 +0100 +++ b/jdk/src/share/classes/java/util/Locale.java Fri Sep 28 14:14:26 2012 +0900 @@ -55,6 +55,7 @@ import sun.util.locale.InternalLocaleBuilder; import sun.util.locale.LanguageTag; import sun.util.locale.LocaleExtensions; +import sun.util.locale.LocaleMatcher; import sun.util.locale.LocaleObjectCache; import sun.util.locale.LocaleSyntaxException; import sun.util.locale.LocaleUtils; @@ -71,10 +72,11 @@ * according to the customs and conventions of the user's native country, * region, or culture. * - * <p> The <code>Locale</code> class implements identifiers - * interchangeable with BCP 47 (IETF BCP 47, "Tags for Identifying - * Languages"), with support for the LDML (UTS#35, "Unicode Locale - * Data Markup Language") BCP 47-compatible extensions for locale data + * <p> The {@code Locale} class implements IETF BCP 47 which is composed of + * <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 "Matching of Language + * Tags"</a> and <a href="http://tools.ietf.org/html/rfc5646">RFC 5646 "Tags + * for Identifying Languages"</a> with support for the LDML (UTS#35, "Unicode + * Locale Data Markup Language") BCP 47-compatible extensions for locale data * exchange. * * <p> A <code>Locale</code> object logically consists of the fields @@ -267,6 +269,77 @@ * </pre> * </blockquote> * + * <h4><a name="LocaleMatching">Locale Matching</a></h4> + * + * <p>If an application or a system is internationalized and provides localized + * resources for multiple locales, it sometimes needs to find one or more + * locales (or language tags) which meet each user's specific preferences. Note + * that a term "language tag" is used interchangeably with "locale" in this + * locale matching documentation. + * + * <p>In order to do matching a user's preferred locales to a set of language + * tags, <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 Matching of + * Language Tags</a> defines two mechanisms: filtering and lookup. + * <em>Filtering</em> is used to get all matching locales, whereas + * <em>lookup</em> is to choose the best matching locale. + * Matching is done case-insensitively. These matching mechanisms are described + * in the following sections. + * + * <p>A user's preference is called a <em>Language Priority List</em> and is + * expressed as a list of language ranges. There are syntactically two types of + * language ranges: basic and extended. See + * {@link Locale.LanguageRange Locale.LanguageRange} for details. + * + * <h5>Filtering</h5> + * + * <p>The filtering operation returns all matching language tags. It is defined + * in RFC 4647 as follows: + * "In filtering, each language range represents the least specific language + * tag (that is, the language tag with fewest number of subtags) that is an + * acceptable match. All of the language tags in the matching set of tags will + * have an equal or greater number of subtags than the language range. Every + * non-wildcard subtag in the language range will appear in every one of the + * matching language tags." + * + * <p>There are two types of filtering: filtering for basic language ranges + * (called "basic filtering") and filtering for extended language ranges + * (called "extended filtering"). They may return different results by what + * kind of language ranges are included in the given Language Priority List. + * {@link Locale.FilteringMode} is a parameter to specify how filtering should + * be done. + * + * <h5>Lookup</h5> + * + * <p>The lookup operation returns the best matching language tags. It is + * defined in RFC 4647 as follows: + * "By contrast with filtering, each language range represents the most + * specific tag that is an acceptable match. The first matching tag found, + * according to the user's priority, is considered the closest match and is the + * item returned." + * + * <p>For example, if a Language Priority List consists of two language ranges, + * {@code "zh-Hant-TW"} and {@code "en-US"}, in prioritized order, lookup + * method progressively searches the language tags below in order to find the + * best matching language tag. + * <blockquote> + * <pre> + * 1. zh-Hant-TW + * 2. zh-Hant + * 3. zh + * 4. en-US + * 5. en + * </pre> + * </blockquote> + * If there is a language tag which matches completely to a language range + * above, the language tag is returned. + * + * <p>{@code "*"} is the special language range, and it is ignored in lookup. + * + * <p>If multiple language tags match as a result of the subtag {@code '*'} + * included in a language range, the first matching language tag returned by + * an {@link Iterator} over a {@link Collection} of language tags is treated as + * the best matching one. + * * <h4>Use of Locale</h4> * * <p>Once you've created a <code>Locale</code> you can query it for information @@ -2574,4 +2647,611 @@ return Locale.getInstance(baseloc, extensions); } } + + /** + * This enum provides constants to select a filtering mode for locale + * matching. Refer to <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 + * Matching of Language Tags</a> for details. + * + * <p>As an example, think of two Language Priority Lists each of which + * includes only one language range and a set of following language tags: + * + * <pre> + * de (German) + * de-DE (German, Germany) + * de-Deva (German, in Devanagari script) + * de-Deva-DE (German, in Devanagari script, Germany) + * de-DE-1996 (German, Germany, orthography of 1996) + * de-Latn-DE (German, in Latin script, Germany) + * de-Latn-DE-1996 (German, in Latin script, Germany, orthography of 1996) + * </pre> + * + * The filtering method will behave as follows: + * + * <table cellpadding=2> + * <tr> + * <th>Filtering Mode</th> + * <th>Language Priority List: {@code "de-DE"}</th> + * <th>Language Priority List: {@code "de-*-DE"}</th> + * </tr> + * <tr> + * <td valign=top> + * {@link FilteringMode#AUTOSELECT_FILTERING AUTOSELECT_FILTERING} + * </td> + * <td valign=top> + * Performs <em>basic</em> filtering and returns {@code "de-DE"} and + * {@code "de-DE-1996"}. + * </td> + * <td valign=top> + * Performs <em>extended</em> filtering and returns {@code "de-DE"}, + * {@code "de-Deva-DE"}, {@code "de-DE-1996"}, {@code "de-Latn-DE"}, and + * {@code "de-Latn-DE-1996"}. + * </td> + * </tr> + * <tr> + * <td valign=top> + * {@link FilteringMode#EXTENDED_FILTERING EXTENDED_FILTERING} + * </td> + * <td valign=top> + * Performs <em>extended</em> filtering and returns {@code "de-DE"}, + * {@code "de-Deva-DE"}, {@code "de-DE-1996"}, {@code "de-Latn-DE"}, and + * {@code "de-Latn-DE-1996"}. + * </td> + * <td valign=top>Same as above.</td> + * </tr> + * <tr> + * <td valign=top> + * {@link FilteringMode#IGNORE_EXTENDED_RANGES IGNORE_EXTENDED_RANGES} + * </td> + * <td valign=top> + * Performs <em>basic</em> filtering and returns {@code "de-DE"} and + * {@code "de-DE-1996"}. + * </td> + * <td valign=top> + * Performs <em>basic</em> filtering and returns {@code null} because + * nothing matches. + * </td> + * </tr> + * <tr> + * <td valign=top> + * {@link FilteringMode#MAP_EXTENDED_RANGES MAP_EXTENDED_RANGES} + * </td> + * <td valign=top>Same as above.</td> + * <td valign=top> + * Performs <em>basic</em> filtering and returns {@code "de-DE"} and + * {@code "de-DE-1996"} because {@code "de-*-DE"} is mapped to + * {@code "de-DE"}. + * </td> + * </tr> + * <tr> + * <td valign=top> + * {@link FilteringMode#REJECT_EXTENDED_RANGES REJECT_EXTENDED_RANGES} + * </td> + * <td valign=top>Same as above.</td> + * <td valign=top> + * Throws {@link IllegalArgumentException} because {@code "de-*-DE"} is + * not a valid basic language range. + * </td> + * </tr> + * </table> + * + * @see #filter(List, Collection, FilteringMode) + * @see #filterTags(List, Collection, FilteringMode) + * + * @since 1.8 + */ + public static enum FilteringMode { + /** + * Specifies automatic filtering mode based on the given Language + * Priority List consisting of language ranges. If all of the ranges + * are basic, basic filtering is selected. Otherwise, extended + * filtering is selected. + */ + AUTOSELECT_FILTERING, + + /** + * Specifies extended filtering. + */ + EXTENDED_FILTERING, + + /** + * Specifies basic filtering: Note that any extended language ranges + * included in the given Language Priority List are ignored. + */ + IGNORE_EXTENDED_RANGES, + + /** + * Specifies basic filtering: If any extended language ranges are + * included in the given Language Priority List, they are mapped to the + * basic language range. Specifically, a language range starting with a + * subtag {@code "*"} is treated as a language range {@code "*"}. For + * example, {@code "*-US"} is treated as {@code "*"}. If {@code "*"} is + * not the first subtag, {@code "*"} and extra {@code "-"} are removed. + * For example, {@code "ja-*-JP"} is mapped to {@code "ja-JP"}. + */ + MAP_EXTENDED_RANGES, + + /** + * Specifies basic filtering: If any extended language ranges are + * included in the given Language Priority List, the list is rejected + * and the filtering method throws {@link IllegalArgumentException}. + */ + REJECT_EXTENDED_RANGES + }; + + /** + * This class expresses a <em>Language Range</em> defined in + * <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 Matching of + * Language Tags</a>. A language range is an identifier which is used to + * select language tag(s) meeting specific requirements by using the + * mechanisms described in <a href="Locale.html#LocaleMatching">Locale + * Matching</a>. A list which represents a user's preferences and consists + * of language ranges is called a <em>Language Priority List</em>. + * + * <p>There are two types of language ranges: basic and extended. In RFC + * 4647, the syntax of language ranges is expressed in + * <a href="http://tools.ietf.org/html/rfc4234">ABNF</a> as follows: + * <blockquote> + * <pre> + * basic-language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*" + * extended-language-range = (1*8ALPHA / "*") + * *("-" (1*8alphanum / "*")) + * alphanum = ALPHA / DIGIT + * </pre> + * </blockquote> + * For example, {@code "en"} (English), {@code "ja-JP"} (Japanese, Japan), + * {@code "*"} (special language range which matches any language tag) are + * basic language ranges, whereas {@code "*-CH"} (any languages, + * Switzerland), {@code "es-*"} (Spanish, any regions), and + * {@code "zh-Hant-*"} (Traditional Chinese, any regions) are extended + * language ranges. + * + * @see #filter + * @see #filterTags + * @see #lookup + * @see #lookupTag + * + * @since 1.8 + */ + public static final class LanguageRange { + + /** + * A constant holding the maximum value of weight, 1.0, which indicates + * that the language range is a good fit for the user. + */ + public static final double MAX_WEIGHT = 1.0; + + /** + * A constant holding the minimum value of weight, 0.0, which indicates + * that the language range is not a good fit for the user. + */ + public static final double MIN_WEIGHT = 0.0; + + private final String range; + private final double weight; + + private volatile int hash = 0; + + /** + * Constructs a {@code LanguageRange} using the given {@code range}. + * Note that no validation is done against the IANA Language Subtag + * Registry at time of construction. + * + * <p>This is equivalent to {@code LanguageRange(range, MAX_WEIGHT)}. + * + * @param range a language range + * @throws NullPointerException if the given {@code range} is + * {@code null} + */ + public LanguageRange(String range) { + this(range, MAX_WEIGHT); + } + + /** + * Constructs a {@code LanguageRange} using the given {@code range} and + * {@code weight}. Note that no validation is done against the IANA + * Language Subtag Registry at time of construction. + * + * @param range a language range + * @param weight a weight value between {@code MIN_WEIGHT} and + * {@code MAX_WEIGHT} + * @throws NullPointerException if the given {@code range} is + * {@code null} + * @throws IllegalArgumentException if the given {@code weight} is less + * than {@code MIN_WEIGHT} or greater than {@code MAX_WEIGHT} + */ + public LanguageRange(String range, double weight) { + if (range == null) { + throw new NullPointerException(); + } + if (weight < MIN_WEIGHT || weight > MAX_WEIGHT) { + throw new IllegalArgumentException("weight=" + weight); + } + + range = range.toLowerCase(); + + // Do syntax check. + boolean isIllFormed = false; + String[] subtags = range.split("-"); + if (isSubtagIllFormed(subtags[0], true) + || range.endsWith("-")) { + isIllFormed = true; + } else { + for (int i = 1; i < subtags.length; i++) { + if (isSubtagIllFormed(subtags[i], false)) { + isIllFormed = true; + } + break; + } + } + if (isIllFormed) { + throw new IllegalArgumentException("range=" + range); + } + + this.range = range; + this.weight = weight; + } + + private static boolean isSubtagIllFormed(String subtag, + boolean isFirstSubtag) { + if (subtag.equals("") || subtag.length() > 8) { + return true; + } else if (subtag.equals("*")) { + return false; + } + char[] charArray = subtag.toCharArray(); + if (isFirstSubtag) { // ALPHA + for (char c : charArray) { + if (c < 'a' || c > 'z') { + return true; + } + } + } else { // ALPHA / DIGIT + for (char c : charArray) { + if (c < '0' || (c > '9' && c < 'a') || c > 'z') { + return true; + } + } + } + return false; + } + + /** + * Returns the language range of this {@code LanguageRange}. + * + * @return the language range. + */ + public String getRange() { + return range; + } + + /** + * Returns the weight of this {@code LanguageRange}. + * + * @return the weight value. + */ + public double getWeight() { + return weight; + } + + /** + * Parses the given {@code ranges} to generate a Language Priority List. + * + * <p>This method performs a syntactic check for each language range in + * the given {@code ranges} but doesn't do validation using the IANA + * Language Subtag Registry. + * + * <p>The {@code ranges} to be given can take one of the following + * forms: + * + * <pre> + * "Accept-Language: ja,en;q=0.4" (weighted list with Accept-Language prefix) + * "ja,en;q=0.4" (weighted list) + * "ja,en" (prioritized list) + * </pre> + * + * In a weighted list, each language range is given a weight value. + * The weight value is identical to the "quality value" in + * <a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>, and it + * expresses how much the user prefers the language. A weight value is + * specified after a corresponding language range followed by + * {@code ";q="}, and the default weight value is {@code MAX_WEIGHT} + * when it is omitted. + * + * <p>Unlike a weighted list, language ranges in a prioritized list + * are sorted in the descending order based on its priority. The first + * language range has the highest priority and meets the user's + * preference most. + * + * <p>In either case, language ranges are sorted in descending order in + * the Language Priority List based on priority or weight. If a + * language range appears in the given {@code ranges} more than once, + * only the first one is included on the Language Priority List. + * + * <p>The returned list consists of language ranges from the given + * {@code ranges} and their equivalents found in the IANA Language + * Subtag Registry. For example, if the given {@code ranges} is + * {@code "Accept-Language: iw,en-us;q=0.7,en;q=0.3"}, the elements in + * the list to be returned are: + * + * <pre> + * <b>Range</b> <b>Weight</b> + * "iw" (older tag for Hebrew) 1.0 + * "he" (new preferred code for Hebrew) 1.0 + * "en-us" (English, United States) 0.7 + * "en" (English) 0.3 + * </pre> + * + * Two language ranges, {@code "iw"} and {@code "he"}, have the same + * highest priority in the list. By adding {@code "he"} to the user's + * Language Priority List, locale-matching method can find Hebrew as a + * matching locale (or language tag) even if the application or system + * offers only {@code "he"} as a supported locale (or language tag). + * + * @param ranges a list of comma-separated language ranges or a list of + * language ranges in the form of the "Accept-Language" header + * defined in <a href="http://tools.ietf.org/html/rfc2616">RFC + * 2616</a> + * @return a Language Priority List consisting of language ranges + * included in the given {@code ranges} and their equivalent + * language ranges if available. The list is modifiable. + * @throws NullPointerException if {@code ranges} is null + * @throws IllegalArgumentException if a language range or a weight + * found in the given {@code ranges} is ill-formed + */ + public static List<LanguageRange> parse(String ranges) { + return LocaleMatcher.parse(ranges); + } + + /** + * Parses the given {@code ranges} to generate a Language Priority + * List, and then customizes the list using the given {@code map}. + * This method is equivalent to + * {@code mapEquivalents(parse(ranges), map)}. + * + * @param ranges a list of comma-separated language ranges or a list + * of language ranges in the form of the "Accept-Language" header + * defined in <a href="http://tools.ietf.org/html/rfc2616">RFC + * 2616</a> + * @param map a map containing information to customize language ranges + * @return a Language Priority List with customization. The list is + * @throws NullPointerException if {@code ranges} is null + * @throws IllegalArgumentException if a language range or a weight + * found in the given {@code ranges} is ill-formed + * @see #parse(String) + * @see #mapEquivalents + */ + public static List<LanguageRange> parse(String ranges, + Map<String, List<String>> map) { + return mapEquivalents(parse(ranges), map); + } + + /** + * Generates a new customized Language Priority List using the given + * {@code priorityList} and {@code map}. If the given {@code map} is + * empty, this method returns a copy of the given {@code priorityList}. + * + * <p>In the map, a key represents a language range whereas a value is + * a list of equivalents of it. {@code '*'} cannot be used in the map. + * Each equivalent language range has the same weight value as its + * original language range. + * + * <pre> + * An example of map: + * <b>Key</b> <b>Value</b> + * "zh" (Chinese) "zh", + * "zh-Hans"(Simplified Chinese) + * "zh-HK" (Chinese, Hong Kong) "zh-HK" + * "zh-TW" (Chinese, Taiwan) "zh-TW" + * </pre> + * + * The customization is performed after modification using the IANA + * Language Subtag Registry. + * + * <p>For example, if a user's Language Priority List consists of five + * language ranges ({@code "zh"}, {@code "zh-CN"}, {@code "en"}, + * {@code "zh-TW"}, and {@code "zh-HK"}), the newly generated Language + * Priority List which is customized using the above map example will + * consists of {@code "zh"}, {@code "zh-Hans"}, {@code "zh-CN"}, + * {@code "zh-Hans-CN"}, {@code "en"}, {@code "zh-TW"}, and + * {@code "zh-HK"}. + * + * <p>{@code "zh-HK"} and {@code "zh-TW"} aren't converted to + * {@code "zh-Hans-HK"} nor {@code "zh-Hans-TW"} even if they are + * included in the Language Priority List. In this example, mapping + * is used to clearly distinguish Simplified Chinese and Traditional + * Chinese. + * + * <p>If the {@code "zh"}-to-{@code "zh"} mapping isn't included in the + * map, a simple replacement will be performed and the customized list + * won't include {@code "zh"} and {@code "zh-CN"}. + * + * @param priorityList user's Language Priority List + * @param map a map containing information to customize language ranges + * @return a new Language Priority List with customization. The list is + * modifiable. + * @throws NullPointerException if {@code priorityList} is {@code null} + * @see #parse(String, Map) + */ + public static List<LanguageRange> mapEquivalents( + List<LanguageRange>priorityList, + Map<String, List<String>> map) { + return LocaleMatcher.mapEquivalents(priorityList, map); + } + + /** + * Returns a hash code value for the object. + * + * @return a hash code value for this object. + */ + @Override + public int hashCode() { + if (hash == 0) { + int result = 17; + result = 37*result + range.hashCode(); + long bitsWeight = Double.doubleToLongBits(weight); + result = 37*result + (int)(bitsWeight ^ (bitsWeight >>> 32)); + hash = result; + } + return hash; + } + + /** + * Compares this object to the specified object. The result is true if + * and only if the argument is not {@code null} and is a + * {@code LanguageRange} object that contains the same {@code range} + * and {@code weight} values as this object. + * + * @param obj the object to compare with + * @return {@code true} if this object's {@code range} and + * {@code weight} are the same as the {@code obj}'s; {@code false} + * otherwise. + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof LanguageRange)) { + return false; + } + LanguageRange other = (LanguageRange)obj; + return hash == other.hash + && range.equals(other.range) + && weight == other.weight; + } + } + + /** + * Returns a list of matching {@code Locale} instances using the filtering + * mechanism defined in RFC 4647. + * + * @param priorityList user's Language Priority List in which each language + * tag is sorted in descending order based on priority or weight + * @param locales {@code Locale} instances used for matching + * @param mode filtering mode + * @return a list of {@code Locale} instances for matching language tags + * sorted in descending order based on priority or weight, or an empty + * list if nothing matches. The list is modifiable. + * @throws NullPointerException if {@code priorityList} or {@code locales} + * is {@code null} + * @throws IllegalArgumentException if one or more extended language ranges + * are included in the given list when + * {@link FilteringMode#REJECT_EXTENDED_RANGES} is specified + * + * @since 1.8 + */ + public static List<Locale> filter(List<LanguageRange> priorityList, + Collection<Locale> locales, + FilteringMode mode) { + return LocaleMatcher.filter(priorityList, locales, mode); + } + + /** + * Returns a list of matching {@code Locale} instances using the filtering + * mechanism defined in RFC 4647. This is equivalent to + * {@link #filter(List, Collection, FilteringMode)} when {@code mode} is + * {@link FilteringMode#AUTOSELECT_FILTERING}. + * + * @param priorityList user's Language Priority List in which each language + * tag is sorted in descending order based on priority or weight + * @param locales {@code Locale} instances used for matching + * @return a list of {@code Locale} instances for matching language tags + * sorted in descending order based on priority or weight, or an empty + * list if nothing matches. The list is modifiable. + * @throws NullPointerException if {@code priorityList} or {@code locales} + * is {@code null} + * + * @since 1.8 + */ + public static List<Locale> filter(List<LanguageRange> priorityList, + Collection<Locale> locales) { + return filter(priorityList, locales, FilteringMode.AUTOSELECT_FILTERING); + } + + /** + * Returns a list of matching languages tags using the basic filtering + * mechanism defined in RFC 4647. + * + * @param priorityList user's Language Priority List in which each language + * tag is sorted in descending order based on priority or weight + * @param tags language tags + * @param mode filtering mode + * @return a list of matching language tags sorted in descending order + * based on priority or weight, or an empty list if nothing matches. + * The list is modifiable. + * @throws NullPointerException if {@code priorityList} or {@code tags} is + * {@code null} + * @throws IllegalArgumentException if one or more extended language ranges + * are included in the given list when + * {@link FilteringMode#REJECT_EXTENDED_RANGES} is specified + * + * @since 1.8 + */ + public static List<String> filterTags(List<LanguageRange> priorityList, + Collection<String> tags, + FilteringMode mode) { + return LocaleMatcher.filterTags(priorityList, tags, mode); + } + + /** + * Returns a list of matching languages tags using the basic filtering + * mechanism defined in RFC 4647. This is equivalent to + * {@link #filterTags(List, Collection, FilteringMode)} when {@code mode} + * is {@link FilteringMode#AUTOSELECT_FILTERING}. + * + * @param priorityList user's Language Priority List in which each language + * tag is sorted in descending order based on priority or weight + * @param tags language tags + * @return a list of matching language tags sorted in descending order + * based on priority or weight, or an empty list if nothing matches. + * The list is modifiable. + * @throws NullPointerException if {@code priorityList} or {@code tags} is + * {@code null} + * + * @since 1.8 + */ + public static List<String> filterTags(List<LanguageRange> priorityList, + Collection<String> tags) { + return filterTags(priorityList, tags, FilteringMode.AUTOSELECT_FILTERING); + } + + /** + * Returns a {@code Locale} instance for the best-matching language + * tag using the lookup mechanism defined in RFC 4647. + * + * @param priorityList user's Language Priority List in which each language + * tag is sorted in descending order based on priority or weight + * @param locales {@code Locale} instances used for matching + * @return the best matching <code>Locale</code> instance chosen based on + * priority or weight, or {@code null} if nothing matches. + * @throws NullPointerException if {@code priorityList} or {@code tags} is + * {@code null} + * + * @since 1.8 + */ + public static Locale lookup(List<LanguageRange> priorityList, + Collection<Locale> locales) { + return LocaleMatcher.lookup(priorityList, locales); + } + + /** + * Returns the best-matching language tag using the lookup mechanism + * defined in RFC 4647. + * + * @param priorityList user's Language Priority List in which each language + * tag is sorted in descending order based on priority or weight + * @param tags language tangs used for matching + * @return the best matching language tag chosen based on priority or + * weight, or {@code null} if nothing matches. + * @throws NullPointerException if {@code priorityList} or {@code tags} is + * {@code null} + * + * @since 1.8 + */ + public static String lookupTag(List<LanguageRange> priorityList, + Collection<String> tags) { + return LocaleMatcher.lookupTag(priorityList, tags); + } + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/util/locale/LocaleEquivalentMaps.java Fri Sep 28 14:14:26 2012 +0900 @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.util.locale; + +import java.util.HashMap; +import java.util.Map; + +/** + * Locale equivalent map for BCP47 Locale matching + */ +final class LocaleEquivalentMaps { + + static final Map<String, String> singleEquivMap; + static final Map<String, String[]> multiEquivsMap; + static final Map<String, String> regionVariantEquivMap; + + static { + singleEquivMap = new HashMap<>(); + multiEquivsMap = new HashMap<>(); + regionVariantEquivMap = new HashMap<>(); + + // This is an auto-generated file and should not be manually edited. + // LSR Revision: 2012-09-04 + singleEquivMap.put("ami", "i-ami"); + singleEquivMap.put("art-lojban", "jbo"); + singleEquivMap.put("ase", "sgn-us"); + singleEquivMap.put("ayx", "nun"); + singleEquivMap.put("bfi", "sgn-gb"); + singleEquivMap.put("bjd", "drl"); + singleEquivMap.put("bnn", "i-bnn"); + singleEquivMap.put("bzs", "sgn-br"); + singleEquivMap.put("cjr", "mom"); + singleEquivMap.put("cka", "cmr"); + singleEquivMap.put("cmk", "xch"); + singleEquivMap.put("cmn-hans", "zh-cmn-hans"); + singleEquivMap.put("cmn-hant", "zh-cmn-hant"); + singleEquivMap.put("cmr", "cka"); + singleEquivMap.put("csn", "sgn-co"); + singleEquivMap.put("dev", "gav"); + singleEquivMap.put("drh", "khk"); + singleEquivMap.put("drl", "bjd"); + singleEquivMap.put("dse", "sgn-nl"); + singleEquivMap.put("dsl", "sgn-dk"); + singleEquivMap.put("fsl", "sgn-fr"); + singleEquivMap.put("gan", "zh-gan"); + singleEquivMap.put("gav", "dev"); + singleEquivMap.put("gsg", "sgn-de"); + singleEquivMap.put("gss", "sgn-gr"); + singleEquivMap.put("he", "iw"); + singleEquivMap.put("hle", "sca"); + singleEquivMap.put("hrr", "jal"); + singleEquivMap.put("hsn", "zh-xiang"); + singleEquivMap.put("i-ami", "ami"); + singleEquivMap.put("i-bnn", "bnn"); + singleEquivMap.put("i-klingon", "tlh"); + singleEquivMap.put("i-lux", "lb"); + singleEquivMap.put("i-navajo", "nv"); + singleEquivMap.put("i-pwn", "pwn"); + singleEquivMap.put("i-tao", "tao"); + singleEquivMap.put("i-tay", "tay"); + singleEquivMap.put("i-tsu", "tsu"); + singleEquivMap.put("ibi", "opa"); + singleEquivMap.put("id", "in"); + singleEquivMap.put("in", "id"); + singleEquivMap.put("ise", "sgn-it"); + singleEquivMap.put("isg", "sgn-ie"); + singleEquivMap.put("iw", "he"); + singleEquivMap.put("jal", "hrr"); + singleEquivMap.put("jbo", "art-lojban"); + singleEquivMap.put("ji", "yi"); + singleEquivMap.put("jsl", "sgn-jp"); + singleEquivMap.put("jv", "jw"); + singleEquivMap.put("jw", "jv"); + singleEquivMap.put("kgh", "kml"); + singleEquivMap.put("khk", "drh"); + singleEquivMap.put("kml", "kgh"); + singleEquivMap.put("lb", "i-lux"); + singleEquivMap.put("lcq", "ppr"); + singleEquivMap.put("lrr", "yma"); + singleEquivMap.put("mfs", "sgn-mx"); + singleEquivMap.put("mo", "ro"); + singleEquivMap.put("mom", "cjr"); + singleEquivMap.put("nan", "zh-min-nan"); + singleEquivMap.put("nb", "no-bok"); + singleEquivMap.put("ncs", "sgn-ni"); + singleEquivMap.put("nn", "no-nyn"); + singleEquivMap.put("no-bok", "nb"); + singleEquivMap.put("no-nyn", "nn"); + singleEquivMap.put("nsl", "sgn-no"); + singleEquivMap.put("nun", "ayx"); + singleEquivMap.put("nv", "i-navajo"); + singleEquivMap.put("opa", "ibi"); + singleEquivMap.put("ppr", "lcq"); + singleEquivMap.put("psr", "sgn-pt"); + singleEquivMap.put("pwn", "i-pwn"); + singleEquivMap.put("ras", "tie"); + singleEquivMap.put("ro", "mo"); + singleEquivMap.put("sca", "hle"); + singleEquivMap.put("sfb", "sgn-be-fr"); + singleEquivMap.put("sfs", "sgn-za"); + singleEquivMap.put("sgg", "sgn-ch-de"); + singleEquivMap.put("sgn-be-fr", "sfb"); + singleEquivMap.put("sgn-be-nl", "vgt"); + singleEquivMap.put("sgn-br", "bzs"); + singleEquivMap.put("sgn-ch-de", "sgg"); + singleEquivMap.put("sgn-co", "csn"); + singleEquivMap.put("sgn-de", "gsg"); + singleEquivMap.put("sgn-dk", "dsl"); + singleEquivMap.put("sgn-es", "ssp"); + singleEquivMap.put("sgn-fr", "fsl"); + singleEquivMap.put("sgn-gb", "bfi"); + singleEquivMap.put("sgn-gr", "gss"); + singleEquivMap.put("sgn-ie", "isg"); + singleEquivMap.put("sgn-it", "ise"); + singleEquivMap.put("sgn-jp", "jsl"); + singleEquivMap.put("sgn-mx", "mfs"); + singleEquivMap.put("sgn-ni", "ncs"); + singleEquivMap.put("sgn-nl", "dse"); + singleEquivMap.put("sgn-no", "nsl"); + singleEquivMap.put("sgn-pt", "psr"); + singleEquivMap.put("sgn-se", "swl"); + singleEquivMap.put("sgn-us", "ase"); + singleEquivMap.put("sgn-za", "sfs"); + singleEquivMap.put("ssp", "sgn-es"); + singleEquivMap.put("swl", "sgn-se"); + singleEquivMap.put("tao", "i-tao"); + singleEquivMap.put("tay", "i-tay"); + singleEquivMap.put("tie", "ras"); + singleEquivMap.put("tkk", "twm"); + singleEquivMap.put("tlh", "i-klingon"); + singleEquivMap.put("tlw", "weo"); + singleEquivMap.put("tsu", "i-tsu"); + singleEquivMap.put("twm", "tkk"); + singleEquivMap.put("vgt", "sgn-be-nl"); + singleEquivMap.put("weo", "tlw"); + singleEquivMap.put("wuu", "zh-wuu"); + singleEquivMap.put("xch", "cmk"); + singleEquivMap.put("yi", "ji"); + singleEquivMap.put("yma", "lrr"); + singleEquivMap.put("yue", "zh-yue"); + singleEquivMap.put("zh-cmn-hans", "cmn-hans"); + singleEquivMap.put("zh-cmn-hant", "cmn-hant"); + singleEquivMap.put("zh-gan", "gan"); + singleEquivMap.put("zh-min-nan", "nan"); + singleEquivMap.put("zh-wuu", "wuu"); + singleEquivMap.put("zh-xiang", "hsn"); + singleEquivMap.put("zh-yue", "yue"); + + multiEquivsMap.put("ccq", new String[] {"rki", "ybd"}); + multiEquivsMap.put("cmn", new String[] {"zh-guoyu", "zh-cmn"}); + multiEquivsMap.put("drw", new String[] {"prs", "tnf"}); + multiEquivsMap.put("hak", new String[] {"i-hak", "zh-hakka"}); + multiEquivsMap.put("i-hak", new String[] {"hak", "zh-hakka"}); + multiEquivsMap.put("mry", new String[] {"mst", "myt"}); + multiEquivsMap.put("mst", new String[] {"mry", "myt"}); + multiEquivsMap.put("myt", new String[] {"mry", "mst"}); + multiEquivsMap.put("prs", new String[] {"drw", "tnf"}); + multiEquivsMap.put("rki", new String[] {"ccq", "ybd"}); + multiEquivsMap.put("tnf", new String[] {"prs", "drw"}); + multiEquivsMap.put("ybd", new String[] {"rki", "ccq"}); + multiEquivsMap.put("zh-cmn", new String[] {"cmn", "zh-guoyu"}); + multiEquivsMap.put("zh-guoyu", new String[] {"cmn", "zh-cmn"}); + multiEquivsMap.put("zh-hakka", new String[] {"hak", "i-hak"}); + + regionVariantEquivMap.put("-alalc97", "-heploc"); + regionVariantEquivMap.put("-bu", "-mm"); + regionVariantEquivMap.put("-cd", "-zr"); + regionVariantEquivMap.put("-dd", "-de"); + regionVariantEquivMap.put("-de", "-dd"); + regionVariantEquivMap.put("-fr", "-fx"); + regionVariantEquivMap.put("-fx", "-fr"); + regionVariantEquivMap.put("-heploc", "-alalc97"); + regionVariantEquivMap.put("-mm", "-bu"); + regionVariantEquivMap.put("-tl", "-tp"); + regionVariantEquivMap.put("-tp", "-tl"); + regionVariantEquivMap.put("-yd", "-ye"); + regionVariantEquivMap.put("-ye", "-yd"); + regionVariantEquivMap.put("-zr", "-cd"); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/util/locale/LocaleMatcher.java Fri Sep 28 14:14:26 2012 +0900 @@ -0,0 +1,455 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.util.locale; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Locale.*; +import static java.util.Locale.FilteringMode.*; +import static java.util.Locale.LanguageRange.*; +import java.util.Map; +import java.util.Set; + +/** + * Implementation for BCP47 Locale matching + * + */ +public final class LocaleMatcher { + + public static List<Locale> filter(List<LanguageRange> priorityList, + Collection<Locale> locales, + FilteringMode mode) { + if (priorityList.isEmpty() || locales.isEmpty()) { + return new ArrayList<>(); // need to return a empty mutable List + } + + // Create a list of language tags to be matched. + List<String> tags = new ArrayList<>(); + for (Locale locale : locales) { + tags.add(locale.toLanguageTag()); + } + + // Filter language tags. + List<String> filteredTags = filterTags(priorityList, tags, mode); + + // Create a list of matching locales. + List<Locale> filteredLocales = new ArrayList<>(filteredTags.size()); + for (String tag : filteredTags) { + filteredLocales.add(Locale.forLanguageTag(tag)); + } + + return filteredLocales; + } + + public static List<String> filterTags(List<LanguageRange> priorityList, + Collection<String> tags, + FilteringMode mode) { + if (priorityList.isEmpty() || tags.isEmpty()) { + return new ArrayList<>(); // need to return a empty mutable List + } + + ArrayList<LanguageRange> list; + if (mode == EXTENDED_FILTERING) { + return filterExtended(priorityList, tags); + } else { + list = new ArrayList<>(); + for (LanguageRange lr : priorityList) { + String range = lr.getRange(); + if (range.startsWith("*-") + || range.indexOf("-*") != -1) { // Extended range + if (mode == AUTOSELECT_FILTERING) { + return filterExtended(priorityList, tags); + } else if (mode == MAP_EXTENDED_RANGES) { + if (range.charAt(0) == '*') { + range = "*"; + } else { + range = range.replaceAll("-[*]", ""); + } + list.add(new LanguageRange(range, lr.getWeight())); + } else if (mode == REJECT_EXTENDED_RANGES) { + throw new IllegalArgumentException("An extended range \"" + + range + + "\" found in REJECT_EXTENDED_RANGES mode."); + } + } else { // Basic range + list.add(lr); + } + } + + return filterBasic(list, tags); + } + } + + private static List<String> filterBasic(List<LanguageRange> priorityList, + Collection<String> tags) { + List<String> list = new ArrayList<>(); + for (LanguageRange lr : priorityList) { + String range = lr.getRange(); + if (range.equals("*")) { + return new ArrayList<String>(tags); + } else { + for (String tag : tags) { + tag = tag.toLowerCase(); + if (tag.startsWith(range)) { + int len = range.length(); + if ((tag.length() == len || tag.charAt(len) == '-') + && !list.contains(tag)) { + list.add(tag); + } + } + } + } + } + + return list; + } + + private static List<String> filterExtended(List<LanguageRange> priorityList, + Collection<String> tags) { + List<String> list = new ArrayList<>(); + for (LanguageRange lr : priorityList) { + String range = lr.getRange(); + if (range.equals("*")) { + return new ArrayList<String>(tags); + } + String[] rangeSubtags = range.split("-"); + for (String tag : tags) { + tag = tag.toLowerCase(); + String[] tagSubtags = tag.split("-"); + if (!rangeSubtags[0].equals(tagSubtags[0]) + && !rangeSubtags[0].equals("*")) { + continue; + } + + int rangeIndex = 1; + int tagIndex = 1; + + while (rangeIndex < rangeSubtags.length + && tagIndex < tagSubtags.length) { + if (rangeSubtags[rangeIndex].equals("*")) { + rangeIndex++; + } else if (rangeSubtags[rangeIndex].equals(tagSubtags[tagIndex])) { + rangeIndex++; + tagIndex++; + } else if (tagSubtags[tagIndex].length() == 1 + && !tagSubtags[tagIndex].equals("*")) { + break; + } else { + tagIndex++; + } + } + + if (rangeSubtags.length == rangeIndex && !list.contains(tag)) { + list.add(tag); + } + } + } + + return list; + } + + public static Locale lookup(List<LanguageRange> priorityList, + Collection<Locale> locales) { + if (priorityList.isEmpty() || locales.isEmpty()) { + return null; + } + + // Create a list of language tags to be matched. + List<String> tags = new ArrayList<>(); + for (Locale locale : locales) { + tags.add(locale.toLanguageTag()); + } + + // Look up a language tags. + String lookedUpTag = lookupTag(priorityList, tags); + + if (lookedUpTag == null) { + return null; + } else { + return Locale.forLanguageTag(lookedUpTag); + } + } + + public static String lookupTag(List<LanguageRange> priorityList, + Collection<String> tags) { + if (priorityList.isEmpty() || tags.isEmpty()) { + return null; + } + + for (LanguageRange lr : priorityList) { + String range = lr.getRange(); + + // Special language range ("*") is ignored in lookup. + if (range.equals("*")) { + continue; + } + + String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*"); + while (rangeForRegex.length() > 0) { + for (String tag : tags) { + tag = tag.toLowerCase(); + if (tag.matches(rangeForRegex)) { + return tag; + } + } + + // Truncate from the end.... + int index = rangeForRegex.lastIndexOf('-'); + if (index >= 0) { + rangeForRegex = rangeForRegex.substring(0, index); + + // if range ends with an extension key, truncate it. + if (rangeForRegex.lastIndexOf('-') == rangeForRegex.length()-2) { + rangeForRegex = + rangeForRegex.substring(0, rangeForRegex.length()-2); + } + } else { + rangeForRegex = ""; + } + } + } + + return null; + } + + public static List<LanguageRange> parse(String ranges) { + ranges = ranges.replaceAll(" ", "").toLowerCase(); + if (ranges.startsWith("accept-language:")) { + ranges = ranges.substring(16); // delete unnecessary prefix + } + + String[] langRanges = ranges.split(","); + List<LanguageRange> list = new ArrayList<>(langRanges.length); + List<String> tempList = new ArrayList<>(); + int numOfRanges = 0; + + for (String range : langRanges) { + int index; + String r; + double w; + + if ((index = range.indexOf(";q=")) == -1) { + r = range; + w = MAX_WEIGHT; + } else { + r = range.substring(0, index); + index += 3; + try { + w = Double.parseDouble(range.substring(index)); + } + catch (Exception e) { + throw new IllegalArgumentException("weight=\"" + + range.substring(index) + + "\" for language range \"" + r + "\""); + } + + if (w < MIN_WEIGHT || w > MAX_WEIGHT) { + throw new IllegalArgumentException("weight=" + w + + " for language range \"" + r + + "\". It must be between " + MIN_WEIGHT + + " and " + MAX_WEIGHT + "."); + } + } + + if (!tempList.contains(r)) { + LanguageRange lr = new LanguageRange(r, w); + index = numOfRanges; + for (int j = 0; j < numOfRanges; j++) { + if (list.get(j).getWeight() < w) { + index = j; + break; + } + } + list.add(index, lr); + numOfRanges++; + tempList.add(r); + + // Check if the range has an equivalent using IANA LSR data. + // If yes, add it to the User's Language Priority List as well. + + // aa-XX -> aa-YY + String equivalent; + if ((equivalent = getEquivalentForRegionAndVariant(r)) != null + && !tempList.contains(equivalent)) { + list.add(index+1, new LanguageRange(equivalent, w)); + numOfRanges++; + tempList.add(equivalent); + } + + String[] equivalents; + if ((equivalents = getEquivalentsForLanguage(r)) != null) { + for (String equiv: equivalents) { + // aa-XX -> bb-XX(, cc-XX) + if (!tempList.contains(equiv)) { + list.add(index+1, new LanguageRange(equiv, w)); + numOfRanges++; + tempList.add(equiv); + } + + // bb-XX -> bb-YY(, cc-YY) + equivalent = getEquivalentForRegionAndVariant(equiv); + if (equivalent != null + && !tempList.contains(equivalent)) { + list.add(index+1, new LanguageRange(equivalent, w)); + numOfRanges++; + tempList.add(equivalent); + } + } + } + } + } + + return list; + } + + private static String[] getEquivalentsForLanguage(String range) { + String r = range; + + while (r.length() > 0) { + if (LocaleEquivalentMaps.singleEquivMap.containsKey(r)) { + String equiv = LocaleEquivalentMaps.singleEquivMap.get(r); + // Return immediately for performance if the first matching + // subtag is found. + return new String[] {range.replaceFirst(r, equiv)}; + } else if (LocaleEquivalentMaps.multiEquivsMap.containsKey(r)) { + String[] equivs = LocaleEquivalentMaps.multiEquivsMap.get(r); + for (int i = 0; i < equivs.length; i++) { + equivs[i] = range.replaceFirst(r, equivs[i]); + } + return equivs; + } + + // Truncate the last subtag simply. + int index = r.lastIndexOf('-'); + if (index == -1) { + break; + } + r = r.substring(0, index); + } + + return null; + } + + private static String getEquivalentForRegionAndVariant(String range) { + int extensionKeyIndex = getExtentionKeyIndex(range); + + for (String subtag : LocaleEquivalentMaps.regionVariantEquivMap.keySet()) { + int index; + if ((index = range.indexOf(subtag)) != -1) { + // Check if the matching text is a valid region or variant. + if (extensionKeyIndex != Integer.MIN_VALUE + && index > extensionKeyIndex) { + continue; + } + + int len = index + subtag.length(); + if (range.length() == len || range.charAt(len) == '-') { + return range.replaceFirst(subtag, LocaleEquivalentMaps.regionVariantEquivMap.get(subtag)); + } + } + } + + return null; + } + + private static int getExtentionKeyIndex(String s) { + char[] c = s.toCharArray(); + int index = Integer.MIN_VALUE; + for (int i = 1; i < c.length; i++) { + if (c[i] == '-') { + if (i - index == 2) { + return index; + } else { + index = i; + } + } + } + return Integer.MIN_VALUE; + } + + public static List<LanguageRange> mapEquivalents( + List<LanguageRange>priorityList, + Map<String, List<String>> map) { + if (priorityList.isEmpty()) { + return new ArrayList<>(); // need to return a empty mutable List + } + if (map == null || map.isEmpty()) { + return new ArrayList<LanguageRange>(priorityList); + } + + // Create a map, key=originalKey.toLowerCaes(), value=originalKey + Map<String, String> keyMap = new HashMap<>(); + for (String key : map.keySet()) { + keyMap.put(key.toLowerCase(), key); + } + + List<LanguageRange> list = new ArrayList<>(); + for (LanguageRange lr : priorityList) { + String range = lr.getRange(); + String r = range; + boolean hasEquivalent = false; + + while (r.length() > 0) { + if (keyMap.containsKey(r)) { + hasEquivalent = true; + List<String> equivalents = map.get(keyMap.get(r)); + if (equivalents != null) { + int len = r.length(); + for (String equivalent : equivalents) { + list.add(new LanguageRange(equivalent.toLowerCase() + + range.substring(len), + lr.getWeight())); + } + } + // Return immediately if the first matching subtag is found. + break; + } + + // Truncate the last subtag simply. + int index = r.lastIndexOf('-'); + if (index == -1) { + break; + } + r = r.substring(0, index); + } + + if (!hasEquivalent) { + list.add(lr); + } + } + + return list; + } + + private LocaleMatcher() {} + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Locale/Bug7069824.java Fri Sep 28 14:14:26 2012 +0900 @@ -0,0 +1,1006 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7069824 + * @summary Verify implementation for Locale matching. + * @run main Bug7069824 + */ + +import java.util.*; +import java.util.Locale.*; +import static java.util.Locale.FilteringMode.*; +import static java.util.Locale.LanguageRange.*; + +public class Bug7069824 { + + static boolean err = false; + + public static void main(String[] args) { + testLanguageRange(); + testLocale(); + + if (err) { + throw new RuntimeException("Failed."); + } + } + + private static void testLanguageRange() { + System.out.println("Test LanguageRange class..."); + testConstants(); + testConstructors(); + testMethods(); + } + + private static void testLocale() { + System.out.println("Test Locale class..."); + test_filter(); + test_filterTags(); + test_lookup(); + test_lookupTag(); + } + + private static void testConstants() { + boolean error = false; + + if (MIN_WEIGHT != 0.0) { + error = true; + System.err.println(" MIN_WEIGHT should be 0.0 but got " + + MIN_WEIGHT); + } + + if (MAX_WEIGHT != 1.0) { + error = true; + System.err.println(" MAX_WEIGHT should be 1.0 but got " + + MAX_WEIGHT); + } + + if (error) { + err = true; + System.err.println(" testConstants() failed."); + } else { + System.out.println(" testConstants() passed."); + } + } + + private static void testConstructors() { + boolean error = false; + + LanguageRange lr; + String range; + double weight; + + range = null; + try { + lr = new LanguageRange(range); + error = true; + System.err.println(" NPE should be thrown for LanguageRange(" + + range + ")."); + } + catch (NullPointerException ex) { + } + + range = null; + weight = 0.8; + try { + lr = new LanguageRange(range, weight); + error = true; + System.err.println(" NPE should be thrown for LanguageRange(" + + range + ", " + weight + ")."); + } + catch (NullPointerException ex) { + } + + range = "elvish"; + try { + lr = new LanguageRange(range); + } + catch (Exception ex) { + error = true; + System.err.println(" " + ex + + " should not be thrown for LanguageRange(" + range + ")."); + } + + range = "de-DE"; + try { + lr = new LanguageRange(range); + } + catch (Exception ex) { + error = true; + System.err.println(" " + ex + + " should not be thrown for LanguageRange(" + range + ")."); + } + + range = "ar"; + weight = 0.8; + try { + lr = new LanguageRange(range, weight); + } + catch (Exception ex) { + error = true; + System.err.println(" " + ex + + " should not be thrown for LanguageRange(" + range + ", " + + weight + ")."); + } + + range = "ja"; + weight = -0.8; + try { + lr = new LanguageRange(range, weight); + error = true; + System.err.println(" IAE should be thrown for LanguageRange(" + + range + ", " + weight + ")."); + } + catch (IllegalArgumentException ex) { + } + + range = "Elvish"; + weight = 3.0; + try { + lr = new LanguageRange(range, weight); + error = true; + System.err.println(" IAE should be thrown for LanguageRange(" + + range + ", " + weight + ")."); + } + catch (IllegalArgumentException ex) { + } + + String[] illformedRanges = {"-ja", "ja--JP", "en-US-", "a4r", "ar*", + "ar-*EG", "", "abcdefghijklmn", "ja-J=", "ja-opqrstuvwxyz"}; + for (String r : illformedRanges) { + try { + lr = new LanguageRange(r); + error = true; + System.err.println(" IAE should be thrown for LanguageRange(" + + r + ")."); + } + catch (IllegalArgumentException ex) { + } + } + + + if (error) { + err = true; + System.err.println(" testConstructors() failed."); + } else { + System.out.println(" testConstructors() passed."); + } + } + + private static void testMethods() { + test_getRange(); + test_getWeight(); + test_equals(); + test_parse(); + test_mapEquivalents(); + } + + private static void test_getRange() { + boolean error = false; + + String range = "ja"; + double weight = 0.5; + LanguageRange lr = new LanguageRange(range, weight); + if (!lr.getRange().equals(range)) { + error = true; + System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: " + + range + ", got: " + lr.getRange()); + } + + range = "en-US"; + weight = 0.5; + lr = new LanguageRange(range, weight); + if (!lr.getRange().equals(range.toLowerCase())) { + error = true; + System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: " + + range + ", got: " + lr.getRange()); + } + + if (error) { + err = true; + System.err.println(" test_getRange() failed."); + } else { + System.out.println(" test_getRange() passed."); + } + } + + private static void test_getWeight() { + boolean error = false; + + String range = "ja"; + double weight = 0.5; + LanguageRange lr = new LanguageRange(range, weight); + if (lr.getWeight() != weight) { + error = true; + System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: " + + weight + ", got: " + lr.getWeight()); + } + + range = "ja"; + weight = MAX_WEIGHT; // default + lr = new LanguageRange(range); + if (!lr.getRange().equals(range) || lr.getWeight() != MAX_WEIGHT) { + error = true; + System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: " + + weight + ", got: " + lr.getWeight()); + } + + if (error) { + err = true; + System.err.println(" test_getWeight() failed."); + } else { + System.out.println(" test_getWeight() passed."); + } + } + + private static void test_equals() { + boolean error = false; + + LanguageRange lr1 = new LanguageRange("ja", 1.0); + LanguageRange lr2 = new LanguageRange("ja"); + LanguageRange lr3 = new LanguageRange("ja", 0.1); + LanguageRange lr4 = new LanguageRange("en", 1.0); + + if (!lr1.equals(lr2)) { + error = true; + System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja)) should return true."); + } + + if (lr1.equals(lr3)) { + error = true; + System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja, 0.1)) should return false."); + } + + if (lr1.equals(lr4)) { + error = true; + System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(en, 1.0)) should return false."); + } + + if (lr1.equals(null)) { + error = true; + System.err.println(" LanguageRange(LR(ja, 1.0)).equals(null) should return false."); + } + + if (lr1.equals("")) { + error = true; + System.err.println(" LanguageRange(LR(ja, 1.0)).equals(\"\") should return false."); + + } + + if (error) { + err = true; + System.err.println(" test_equals() failed."); + } else { + System.out.println(" test_equals() passed."); + } + } + + private static void test_parse() { + boolean error = false; + + List<LanguageRange> list; + String str = null; + try { + list = LanguageRange.parse(str); + error = true; + System.err.println(" NPE should be thrown for parse(" + + str + ")."); + } + catch (NullPointerException ex) { + } + + str = ""; + try { + list = LanguageRange.parse(""); + error = true; + System.err.println(" IAE should be thrown for parse(" + + str + ")."); + } + catch (IllegalArgumentException ex) { + } + + str = "ja;q=3"; + try { + list = LanguageRange.parse(str); + error = true; + System.err.println("IAE should be thrown for parse(" + + str + ")."); + } + catch (IllegalArgumentException ex) { + } + + str = "Accept-Language: fr-FX,de-DE;q=0.5, fr-tp-x-FOO;q=0.1," + + "en-X-tp;q=0.6,en-FR;q=.7,de-de;q=0.8, iw;q=0.4, " + + "he;q=0.4, de-de;q=0.5,ja, in-tpp, in-tp;q=0.2"; + ArrayList<LanguageRange> expected = new ArrayList<>(); + expected.add(new LanguageRange("fr-fx", 1.0)); + expected.add(new LanguageRange("fr-fr", 1.0)); + expected.add(new LanguageRange("ja", 1.0)); + expected.add(new LanguageRange("in-tpp", 1.0)); + expected.add(new LanguageRange("id-tpp", 1.0)); + expected.add(new LanguageRange("en-fr", 0.7)); + expected.add(new LanguageRange("en-fx", 0.7)); + expected.add(new LanguageRange("en-x-tp", 0.6)); + expected.add(new LanguageRange("de-de", 0.5)); + expected.add(new LanguageRange("de-dd", 0.5)); + expected.add(new LanguageRange("iw", 0.4)); + expected.add(new LanguageRange("he", 0.4)); + expected.add(new LanguageRange("in-tp", 0.2)); + expected.add(new LanguageRange("id-tl", 0.2)); + expected.add(new LanguageRange("id-tp", 0.2)); + expected.add(new LanguageRange("in-tl", 0.2)); + expected.add(new LanguageRange("fr-tp-x-foo", 0.1)); + expected.add(new LanguageRange("fr-tl-x-foo", 0.1)); + List<LanguageRange> got = LanguageRange.parse(str); + if (!areEqual(expected, got)) { + error = true; + System.err.println(" #1 parse() test failed."); + } + + str = "Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1"; + expected = new ArrayList<>(); + expected.add(new LanguageRange("no-nyn", 1.0)); + expected.add(new LanguageRange("nn", 1.0)); + expected.add(new LanguageRange("no-bok-no", 0.9)); + expected.add(new LanguageRange("nb-no", 0.9)); + expected.add(new LanguageRange("hak-CN", 0.8)); + expected.add(new LanguageRange("zh-hakka-CN", 0.8)); + expected.add(new LanguageRange("i-hak-CN", 0.8)); + expected.add(new LanguageRange("cmn-CN", 0.1)); + expected.add(new LanguageRange("zh-cmn-CN", 0.1)); + expected.add(new LanguageRange("zh-guoyu-CN", 0.1)); + got = LanguageRange.parse(str); + if (!areEqual(expected, got)) { + error = true; + System.err.println(" #2 parse() test failed."); + } + + str = "Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5"; + expected = new ArrayList<>(); + expected.add(new LanguageRange("no-bok-no", 0.9)); + expected.add(new LanguageRange("nb-no", 0.9)); + expected.add(new LanguageRange("rki", 0.4)); + expected.add(new LanguageRange("ybd", 0.4)); + expected.add(new LanguageRange("ccq", 0.4)); + got = LanguageRange.parse(str); + if (!areEqual(expected, got)) { + error = true; + System.err.println(" #3 parse() test failed."); + } + + if (error) { + err = true; + System.err.println(" test_parse() failed."); + } else { + System.out.println(" test_parse() passed."); + } + } + + private static boolean areEqual(List<LanguageRange> expected, + List<LanguageRange> got) { + boolean error = false; + + int expectedSize = expected.size(); + int actualSize = got.size(); + + if (expectedSize != actualSize) { + error = true; + + System.err.println(" Expected size=" + expectedSize); + for (LanguageRange lr : expected) { + System.err.println(" range=" + lr.getRange() + + ", weight=" + lr.getWeight()); + } + + System.out.println(" Actual size=" + actualSize); + for (LanguageRange lr : got) { + System.err.println(" range=" + lr.getRange() + + ", weight=" + lr.getWeight()); + } + } else { + for (int i = 0; i < expectedSize; i++) { + LanguageRange lr1 = expected.get(i); + LanguageRange lr2 = got.get(i); + + if (!lr1.getRange().equals(lr2.getRange()) + || lr1.getWeight() != lr2.getWeight()) { + error = true; + System.err.println(" " + i + ": Expected: range=" + lr1.getRange() + + ", weight=" + lr1.getWeight()); + System.err.println(" " + i + ": Actual: range=" + lr2.getRange() + + ", weight=" + lr2.getWeight()); + } + } + } + + return !error; + } + + private static void test_mapEquivalents() { + boolean error = false; + + String ranges = "zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"; + List<LanguageRange> priorityList = LanguageRange.parse(ranges); + HashMap<String, List<String>> map = null; + + try { + List<LanguageRange> list = + LanguageRange.mapEquivalents(priorityList, null); + } + catch (Exception ex) { + error = true; + System.err.println(ex + + " should not be thrown for mapEquivalents(priorityList, null)."); + } + + map = new HashMap<>(); + try { + List<LanguageRange> list = + LanguageRange.mapEquivalents(priorityList, map); + } + catch (Exception ex) { + error = true; + System.err.println(ex + + " should not be thrown for mapEquivalents(priorityList, empty map)."); + } + + ArrayList<String> equivalentList = new ArrayList<>(); + equivalentList.add("ja"); + equivalentList.add("ja-Hira"); + map.put("ja", equivalentList); + try { + List<LanguageRange> list = LanguageRange.mapEquivalents(null, map); + error = true; + System.err.println("NPE should be thrown for mapEquivalents(null, map)."); + } + catch (NullPointerException ex) { + } + + map = new LinkedHashMap<>(); + ArrayList<String> equivalentList1 = new ArrayList<>(); + equivalentList1.add("ja"); + equivalentList1.add("ja-Hira"); + map.put("ja", equivalentList1); + ArrayList<String> equivalentList2 = new ArrayList<>(); + equivalentList2.add("zh-Hans"); + equivalentList2.add("zh-Hans-CN"); + equivalentList2.add("zh-CN"); + map.put("zh", equivalentList2); + ArrayList<String> equivalentList3 = new ArrayList<>(); + equivalentList3.add("zh-TW"); + equivalentList3.add("zh-Hant"); + map.put("zh-TW", equivalentList3); + map.put("es", null); + ArrayList<String> equivalentList4 = new ArrayList<>(); + map.put("en", equivalentList4); + ArrayList<String> equivalentList5 = new ArrayList<>(); + equivalentList5.add("de"); + map.put("zh-HK", equivalentList5); + + ArrayList<LanguageRange> expected = new ArrayList<>(); + expected.add(new LanguageRange("zh-hans", 1.0)); + expected.add(new LanguageRange("zh-hans-cn", 1.0)); + expected.add(new LanguageRange("zh-cn", 1.0)); + expected.add(new LanguageRange("de", 1.0)); + expected.add(new LanguageRange("ar", 0.9)); + expected.add(new LanguageRange("zh-tw", 0.8)); + expected.add(new LanguageRange("zh-hant", 0.8)); + expected.add(new LanguageRange("ja-jp", 0.2)); + expected.add(new LanguageRange("ja-hira-jp", 0.2)); + List<LanguageRange> got = + LanguageRange.mapEquivalents(priorityList, map); + + if (!areEqual(expected, got)) { + error = true; + } + + if (error) { + err = true; + System.err.println(" test_mapEquivalents() failed."); + } else { + System.out.println(" test_mapEquivalents() passed."); + } + } + + private static void test_filter() { + boolean error = false; + + String ranges = "ja-JP, fr-FR"; + String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + FilteringMode mode = EXTENDED_FILTERING; + + List<LanguageRange> priorityList = LanguageRange.parse(ranges); + List<Locale> tagList = generateLocales(tags); + String actualLocales = + showLocales(Locale.filter(priorityList, tagList, mode)); + String expectedLocales = "ja-JP-hepburn, ja-Latn-JP"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#1 filter(" + mode + ")", + ranges, tags, expectedLocales, actualLocales); + } + + + ranges = "ja-*-JP, fr-FR"; + tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + mode = EXTENDED_FILTERING; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); + expectedLocales = "ja-JP-hepburn, ja-Latn-JP"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#2 filter(" + mode + ")", + ranges, tags, expectedLocales, actualLocales); + } + + + ranges = "ja-*-JP, fr-FR, de-de;q=0.2"; + tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP"; + mode = AUTOSELECT_FILTERING; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); + expectedLocales = "ja-JP-hepburn, ja-Latn-JP, de-DE"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#3 filter(" + mode + ")", + ranges, tags,expectedLocales, actualLocales); + } + + ranges = "ja-JP, fr-FR, de-de;q=0.2"; + tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP"; + mode = AUTOSELECT_FILTERING; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); + expectedLocales = "ja-JP-hepburn, de-DE"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#4 filter(" + mode + ")", + ranges, tags, expectedLocales, actualLocales); + } + + + ranges = "en;q=0.2, ja-*-JP, fr-JP"; + tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + mode = IGNORE_EXTENDED_RANGES; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); + expectedLocales = "en"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#5 filter(" + mode + ")", + ranges, tags, expectedLocales, actualLocales); + } + + + ranges = "en;q=0.2, ja-*-JP, fr-JP"; + tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + mode = MAP_EXTENDED_RANGES; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); + expectedLocales = "ja-JP-hepburn, en"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#6 filter(" + mode + ")", + ranges, tags, expectedLocales, actualLocales); + } + + + ranges = "en;q=0.2, ja-JP, fr-JP"; + tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + mode = REJECT_EXTENDED_RANGES; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); + expectedLocales = "ja-JP-hepburn, en"; + + if (!expectedLocales.equals(actualLocales)) { + error = true; + showErrorMessage("#7 filter(" + mode + ")", + ranges, tags, expectedLocales, actualLocales); + } + + + ranges = "en;q=0.2, ja-*-JP, fr-JP"; + tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + mode = REJECT_EXTENDED_RANGES; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + try { + actualLocales = + showLocales(Locale.filter(priorityList, tagList, mode)); + error = true; + System.out.println("IAE should be thrown for filter(" + + mode + ")."); + } + catch (IllegalArgumentException ex) { + } + + + ranges = "en;q=0.2, ja-*-JP, fr-JP"; + tags = null; + mode = REJECT_EXTENDED_RANGES; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + try { + actualLocales = + showLocales(Locale.filter(priorityList, tagList, mode)); + error = true; + System.out.println("NPE should be thrown for filter(tags=null)."); + } + catch (NullPointerException ex) { + } + + + ranges = null; + tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP"; + mode = REJECT_EXTENDED_RANGES; + + try { + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + actualLocales = + showLocales(Locale.filter(priorityList, tagList, mode)); + error = true; + System.out.println("NPE should be thrown for filter(ranges=null)."); + } + catch (NullPointerException ex) { + } + + + ranges = "en;q=0.2, ja-*-JP, fr-JP"; + tags = ""; + mode = REJECT_EXTENDED_RANGES; + + priorityList = LanguageRange.parse(ranges); + tagList = generateLocales(tags); + try { + actualLocales = + showLocales(Locale.filter(priorityList, tagList, mode)); + } + catch (Exception ex) { + error = true; + System.out.println(ex + + " should not be thrown for filter(" + ranges + ", \"\")."); + } + + + if (error) { + err = true; + System.out.println(" test_filter() failed."); + } else { + System.out.println(" test_filter() passed."); + } + } + + private static void test_filterTags() { + boolean error = false; + + String ranges = "en;q=0.2, *;q=0.6, ja"; + String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he"; + + List<LanguageRange> priorityList = LanguageRange.parse(ranges); + List<String> tagList = generateLanguageTags(tags); + String actualTags = + showLanguageTags(Locale.filterTags(priorityList, tagList)); + String expectedTags = tags; + + if (!expectedTags.equals(actualTags)) { + error = true; + showErrorMessage("#1 filterTags()", + ranges, tags, expectedTags, actualTags); + } + + + ranges = "en;q=0.2, ja-JP, fr-JP"; + tags = "de-DE, en, ja-JP-hepburn, fr, he"; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList)); + expectedTags = "ja-jp-hepburn, en"; + + if (!expectedTags.equals(actualTags)) { + error = true; + showErrorMessage("#2 filterTags()", + ranges, tags, expectedTags, actualTags); + } + + + ranges = "de-DE"; + tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, " + + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva"; + FilteringMode mode = MAP_EXTENDED_RANGES; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode)); + expectedTags = "de-de, de-de-x-goethe"; + + if (!expectedTags.equals(actualTags)) { + error = true; + showErrorMessage("#3 filterTags(" + mode + ")", + ranges, tags, expectedTags, actualTags); + } + + + ranges = "de-DE"; + tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, " + + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva"; + mode = EXTENDED_FILTERING; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode)); + expectedTags = "de-de, de-latn-de, de-latf-de, de-de-x-goethe, " + + "de-latn-de-1996, de-deva-de"; + + if (!expectedTags.equals(actualTags)) { + error = true; + showErrorMessage("#4 filterTags(" + mode + ")", + ranges, tags, expectedTags, actualTags); + } + + + ranges = "de-*-DE"; + tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, " + + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva"; + mode = EXTENDED_FILTERING; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode)); + expectedTags = "de-de, de-latn-de, de-latf-de, de-de-x-goethe, " + + "de-latn-de-1996, de-deva-de"; + + if (!expectedTags.equals(actualTags)) { + error = true; + showErrorMessage("#5 filterTags(" + mode + ")", + ranges, tags, expectedTags, actualTags); + } + + if (error) { + err = true; + System.out.println(" test_filterTags() failed."); + } else { + System.out.println(" test_filterTags() passed."); + } + } + + private static void test_lookup() { + boolean error = false; + + String ranges = "en;q=0.2, *-JP;q=0.6, iw"; + String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he"; + List<LanguageRange> priorityList = LanguageRange.parse(ranges); + List<Locale> localeList = generateLocales(tags); + String actualLocale = + Locale.lookup(priorityList, localeList).toLanguageTag(); + String expectedLocale ="he"; + + if (!expectedLocale.equals(actualLocale)) { + error = true; + showErrorMessage("#1 lookup()", ranges, tags, expectedLocale, actualLocale); + } + + + ranges = "en;q=0.2, *-JP;q=0.6, iw"; + tags = "de-DE, he-IL, en, iw"; + priorityList = LanguageRange.parse(ranges); + localeList = generateLocales(tags); + actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag(); + expectedLocale = "he"; + + if (!expectedLocale.equals(actualLocale)) { + error = true; + showErrorMessage("#2 lookup()", ranges, tags, expectedLocale, actualLocale); + } + + + ranges = "en;q=0.2, ja-*-JP-x-foo;q=0.6, iw"; + tags = "de-DE, fr, en, ja-Latn-JP"; + priorityList = LanguageRange.parse(ranges); + localeList = generateLocales(tags); + actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag(); + expectedLocale = "ja-Latn-JP"; + + if (!expectedLocale.equals(actualLocale)) { + error = true; + showErrorMessage("#3 lookup()", ranges, tags, expectedLocale, actualLocale); + } + + if (error) { + err = true; + System.out.println(" test_lookup() failed."); + } else { + System.out.println(" test_lookup() passed."); + } + } + + private static void test_lookupTag() { + boolean error = false; + + String ranges = "en, *"; + String tags = "es, de, ja-JP"; + List<LanguageRange> priorityList = LanguageRange.parse(ranges); + List<String> tagList = generateLanguageTags(tags); + String actualTag = Locale.lookupTag(priorityList, tagList); + String expectedTag = null; + + if (actualTag != null) { + error = true; + showErrorMessage("#1 lookupTag()", ranges, tags, expectedTag, actualTag); + } + + + ranges= "en;q=0.2, *-JP"; + tags = "de-DE, en, ja-JP-hepburn, fr-JP, en-JP"; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTag = Locale.lookupTag(priorityList, tagList); + expectedTag = "fr-jp"; + + if (!expectedTag.equals(actualTag)) { + error = true; + showErrorMessage("#2 lookupTag()", ranges, tags, expectedTag, actualTag); + } + + + ranges = "en;q=0.2, ar-MO, iw"; + tags = "de-DE, he, fr-JP"; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTag = Locale.lookupTag(priorityList, tagList); + expectedTag = "he"; + + if (!expectedTag.equals(actualTag)) { + error = true; + showErrorMessage("#3 lookupTag()", ranges, tags, expectedTag, actualTag); + } + + + ranges = "en;q=0.2, ar-MO, he"; + tags = "de-DE, iw, fr-JP"; + priorityList = LanguageRange.parse(ranges); + tagList = generateLanguageTags(tags); + actualTag = Locale.lookupTag(priorityList, tagList); + expectedTag = "iw"; + + if (!expectedTag.equals(actualTag)) { + error = true; + showErrorMessage("#4 lookupTag()", ranges, tags, expectedTag, actualTag); + } + + if (error) { + err = true; + System.out.println(" test_lookupTag() failed."); + } else { + System.out.println(" test_lookupTag() passed."); + } + } + + private static List<Locale> generateLocales(String tags) { + if (tags == null) { + return null; + } + + List<Locale> localeList = new ArrayList<>(); + if (tags.equals("")) { + return localeList; + } + String[] t = tags.split(", "); + for (String tag : t) { + localeList.add(Locale.forLanguageTag(tag)); + } + return localeList; + } + + private static List<String> generateLanguageTags(String tags) { + List<String> tagList = new ArrayList<>(); + String[] t = tags.split(", "); + for (String tag : t) { + tagList.add(tag); + } + return tagList; + } + + private static String showPriorityList(List<LanguageRange> priorityList) { + StringBuilder sb = new StringBuilder(); + + Iterator<LanguageRange> itr = priorityList.iterator(); + LanguageRange lr; + if (itr.hasNext()) { + lr = itr.next(); + sb.append(lr.getRange()); + sb.append(";q="); + sb.append(lr.getWeight()); + } + while (itr.hasNext()) { + sb.append(", "); + lr = itr.next(); + sb.append(lr.getRange()); + sb.append(";q="); + sb.append(lr.getWeight()); + } + + return sb.toString(); + } + + private static String showLanguageTags(List<String> tags) { + StringBuilder sb = new StringBuilder(); + + Iterator<String> itr = tags.iterator(); + if (itr.hasNext()) { + sb.append(itr.next()); + } + while (itr.hasNext()) { + sb.append(", "); + sb.append(itr.next()); + } + + return sb.toString().trim(); + } + + private static String showLocales(List<Locale> locales) { + StringBuilder sb = new StringBuilder(); + + Iterator<Locale> itr = locales.iterator(); + if (itr.hasNext()) { + sb.append(itr.next().toLanguageTag()); + } + while (itr.hasNext()) { + sb.append(", "); + sb.append(itr.next().toLanguageTag()); + } + + return sb.toString().trim(); + } + + private static void showErrorMessage(String methodName, + String priorityList, + String tags, + String expectedTags, + String actualTags) { + System.out.println("\nIncorrect " + methodName + " result."); + System.out.println(" Priority list : " + priorityList); + System.out.println(" Language tags : " + tags); + System.out.println(" Expected value : " + expectedTags); + System.out.println(" Actual value : " + actualTags); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Locale/tools/EquivMapsGenerator.java Fri Sep 28 14:14:26 2012 +0900 @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.*; +import java.nio.charset.*; +import java.nio.file.*; +import java.util.*; + +public class EquivMapsGenerator { + + /* + * IANA Language Subtag Registry file downloaded from + * http://www.iana.org/assignments/language-subtag-registry + */ + private static final String DEFAULT_LSR_FILE = + "language-subtag-registry.txt"; + + private static boolean verbose = false; + + public static void main(String[] args) throws Exception { + String fileLSR = DEFAULT_LSR_FILE; + + for (int i = 0; i < args.length; i++) { + String s = args[i]; + if (s.equals("-lsr")) { + fileLSR = args[++i]; + } else if (s.equals("-verbose")) { + verbose = true; + } + } + + readLSRfile(fileLSR); + generateEquivalentMap(); + generateSourceCode(); + } + + private static String LSRrevisionDate; + private static Map<String, StringBuilder> initialLanguageMap = + new TreeMap<>(); + private static Map<String, StringBuilder> initialRegionVariantMap = + new TreeMap<>(); + + private static Map<String, String> sortedLanguageMap1 = new TreeMap<>(); + private static Map<String, String[]> sortedLanguageMap2 = new TreeMap<>(); + private static Map<String, String> sortedRegionVariantMap = + new TreeMap<>(); + + private static void readLSRfile(String filename) throws Exception { + String type = null; + String tag = null; + String preferred = null; + int mappingNum = 0; + + for (String line : Files.readAllLines(Paths.get(filename), + Charset.forName("UTF-8"))) { + line = line.toLowerCase(); + int index = line.indexOf(' ')+1; + if (line.startsWith("file-date:")) { + LSRrevisionDate = line.substring(index); + if (verbose) { + System.out.println("LSR revision date=" + LSRrevisionDate); + } + } else if (line.startsWith("type:")) { + type = line.substring(index); + } else if (line.startsWith("tag:") || line.startsWith("subtag:")) { + tag = line.substring(index); + } else if (line.startsWith("preferred-value:") + && !type.equals("extlang")) { + preferred = line.substring(index); + mappingNum++; + processDeprecatedData(type, tag, preferred); + } else if (line.equals("%%")) { + type = null; + tag = null; + preferred = null; + } + } + + if (verbose) { + System.out.println("readLSRfile(" + filename + ")"); + System.out.println(" Total number of mapping=" + mappingNum); + System.out.println("\n Map for language. Size=" + + initialLanguageMap.size()); + + for (String key : initialLanguageMap.keySet()) { + System.out.println(" " + key + ": \"" + + initialLanguageMap.get(key) + "\""); + } + + System.out.println("\n Map for region and variant. Size=" + + initialRegionVariantMap.size()); + + for (String key : initialRegionVariantMap.keySet()) { + System.out.println(" " + key + ": \"" + + initialRegionVariantMap.get(key) + "\""); + } + } + } + + private static void processDeprecatedData(String type, + String tag, + String preferred) { + StringBuilder sb; + if (type.equals("region") || type.equals("variant")) { + if (!initialRegionVariantMap.containsKey(preferred)) { + sb = new StringBuilder("-"); + sb.append(preferred); + sb.append(",-"); + sb.append(tag); + initialRegionVariantMap.put("-"+preferred, sb); + } else { + throw new RuntimeException("New case, need implementation." + + " A region/variant subtag \"" + preferred + + "\" is registered for more than one subtags."); + } + } else { // language, grandfahered, and redundant + if (!initialLanguageMap.containsKey(preferred)) { + sb = new StringBuilder(preferred); + sb.append(','); + sb.append(tag); + initialLanguageMap.put(preferred, sb); + } else { + sb = initialLanguageMap.get(preferred); + sb.append(','); + sb.append(tag); + initialLanguageMap.put(preferred, sb); + } + } + } + + private static void generateEquivalentMap() { + String[] subtags; + for (String preferred : initialLanguageMap.keySet()) { + subtags = initialLanguageMap.get(preferred).toString().split(","); + + if (subtags.length == 2) { + sortedLanguageMap1.put(subtags[0], subtags[1]); + sortedLanguageMap1.put(subtags[1], subtags[0]); + } else if (subtags.length == 3) { + sortedLanguageMap2.put(subtags[0], + new String[]{subtags[1], subtags[2]}); + sortedLanguageMap2.put(subtags[1], + new String[]{subtags[0], subtags[2]}); + sortedLanguageMap2.put(subtags[2], + new String[]{subtags[0], subtags[1]}); + } else { + throw new RuntimeException("New case, need implementation." + + " A language subtag \"" + preferred + + "\" is registered for more than two subtags. "); + } + } + + for (String preferred : initialRegionVariantMap.keySet()) { + subtags = + initialRegionVariantMap.get(preferred).toString().split(","); + + sortedRegionVariantMap.put(subtags[0], subtags[1]); + sortedRegionVariantMap.put(subtags[1], subtags[0]); + } + + if (verbose) { + System.out.println("generateEquivalentMap()"); + System.out.println(" \nSorted map for language subtags which have only one equivalent. Size=" + + sortedLanguageMap1.size()); + for (String key : sortedLanguageMap1.keySet()) { + System.out.println(" " + key + ": \"" + + sortedLanguageMap1.get(key) + "\""); + } + + System.out.println("\n Sorted map for language subtags which have multiple equivalents. Size=" + + sortedLanguageMap2.size()); + for (String key : sortedLanguageMap2.keySet()) { + String[] s = sortedLanguageMap2.get(key); + System.out.println(" " + key + ": \"" + + s[0] + "\", \"" + s[1] + "\""); + } + + System.out.println("\n Sorted map for region and variant subtags. Size=" + + sortedRegionVariantMap.size()); + for (String key : sortedRegionVariantMap.keySet()) { + System.out.println(" " + key + ": \"" + + sortedRegionVariantMap.get(key) + "\""); + } + } + System.out.println(); + } + + private final static String headerText = + "final class LocaleEquivalentMaps {\n\n" + + " static final Map<String, String> singleEquivMap;\n" + + " static final Map<String, String[]> multiEquivsMap;\n" + + " static final Map<String, String> regionVariantEquivMap;\n\n" + + " static {\n" + + " singleEquivMap = new HashMap<>();\n" + + " multiEquivsMap = new HashMap<>();\n" + + " regionVariantEquivMap = new HashMap<>();\n\n" + + " // This is an auto-generated file and should not be manually edited.\n"; + + private final static String footerText = + " }\n\n" + + "}"; + + private static void generateSourceCode() { + System.out.println(headerText + + " // LSR Revision: " + LSRrevisionDate); + + for (String key : sortedLanguageMap1.keySet()) { + String value = sortedLanguageMap1.get(key); + System.out.println(" singleEquivMap.put(\"" + + key + "\", \"" + value + "\");"); + } + System.out.println(); + for (String key : sortedLanguageMap2.keySet()) { + String[] values = sortedLanguageMap2.get(key); + System.out.println(" multiEquivsMap.put(\"" + + key + "\", new String[] {\"" + values[0] + "\", \"" + + values[1] + "\"});"); + } + System.out.println(); + for (String key : sortedRegionVariantMap.keySet()) { + String value = sortedRegionVariantMap.get(key); + System.out.println(" regionVariantEquivMap.put(\"" + + key + "\", \"" + value + "\");"); + } + + System.out.println(footerText); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Locale/tools/language-subtag-registry.txt Fri Sep 28 14:14:26 2012 +0900 @@ -0,0 +1,45975 @@ +File-Date: 2012-09-04 +%% +Type: language +Subtag: aa +Description: Afar +Added: 2005-10-16 +%% +Type: language +Subtag: ab +Description: Abkhazian +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: ae +Description: Avestan +Added: 2005-10-16 +%% +Type: language +Subtag: af +Description: Afrikaans +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ak +Description: Akan +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: am +Description: Amharic +Added: 2005-10-16 +Suppress-Script: Ethi +%% +Type: language +Subtag: an +Description: Aragonese +Added: 2005-10-16 +%% +Type: language +Subtag: ar +Description: Arabic +Added: 2005-10-16 +Suppress-Script: Arab +Scope: macrolanguage +%% +Type: language +Subtag: as +Description: Assamese +Added: 2005-10-16 +Suppress-Script: Beng +%% +Type: language +Subtag: av +Description: Avaric +Added: 2005-10-16 +%% +Type: language +Subtag: ay +Description: Aymara +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: az +Description: Azerbaijani +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: ba +Description: Bashkir +Added: 2005-10-16 +%% +Type: language +Subtag: be +Description: Belarusian +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: bg +Description: Bulgarian +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: bh +Description: Bihari languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: bi +Description: Bislama +Added: 2005-10-16 +%% +Type: language +Subtag: bm +Description: Bambara +Added: 2005-10-16 +%% +Type: language +Subtag: bn +Description: Bengali +Added: 2005-10-16 +Suppress-Script: Beng +%% +Type: language +Subtag: bo +Description: Tibetan +Added: 2005-10-16 +%% +Type: language +Subtag: br +Description: Breton +Added: 2005-10-16 +%% +Type: language +Subtag: bs +Description: Bosnian +Added: 2005-10-16 +Suppress-Script: Latn +Macrolanguage: sh +%% +Type: language +Subtag: ca +Description: Catalan +Description: Valencian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ce +Description: Chechen +Added: 2005-10-16 +%% +Type: language +Subtag: ch +Description: Chamorro +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: co +Description: Corsican +Added: 2005-10-16 +%% +Type: language +Subtag: cr +Description: Cree +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: cs +Description: Czech +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: cu +Description: Church Slavic +Description: Church Slavonic +Description: Old Bulgarian +Description: Old Church Slavonic +Description: Old Slavonic +Added: 2005-10-16 +%% +Type: language +Subtag: cv +Description: Chuvash +Added: 2005-10-16 +%% +Type: language +Subtag: cy +Description: Welsh +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: da +Description: Danish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: de +Description: German +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: dv +Description: Dhivehi +Description: Divehi +Description: Maldivian +Added: 2005-10-16 +Suppress-Script: Thaa +%% +Type: language +Subtag: dz +Description: Dzongkha +Added: 2005-10-16 +Suppress-Script: Tibt +%% +Type: language +Subtag: ee +Description: Ewe +Added: 2005-10-16 +%% +Type: language +Subtag: el +Description: Modern Greek (1453-) +Added: 2005-10-16 +Suppress-Script: Grek +%% +Type: language +Subtag: en +Description: English +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: eo +Description: Esperanto +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: es +Description: Spanish +Description: Castilian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: et +Description: Estonian +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: eu +Description: Basque +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: fa +Description: Persian +Added: 2005-10-16 +Suppress-Script: Arab +Scope: macrolanguage +%% +Type: language +Subtag: ff +Description: Fulah +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: fi +Description: Finnish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: fj +Description: Fijian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: fo +Description: Faroese +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: fr +Description: French +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: fy +Description: Western Frisian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ga +Description: Irish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: gd +Description: Scottish Gaelic +Description: Gaelic +Added: 2005-10-16 +%% +Type: language +Subtag: gl +Description: Galician +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: gn +Description: Guarani +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: gu +Description: Gujarati +Added: 2005-10-16 +Suppress-Script: Gujr +%% +Type: language +Subtag: gv +Description: Manx +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ha +Description: Hausa +Added: 2005-10-16 +%% +Type: language +Subtag: he +Description: Hebrew +Added: 2005-10-16 +Suppress-Script: Hebr +%% +Type: language +Subtag: hi +Description: Hindi +Added: 2005-10-16 +Suppress-Script: Deva +%% +Type: language +Subtag: ho +Description: Hiri Motu +Added: 2005-10-16 +%% +Type: language +Subtag: hr +Description: Croatian +Added: 2005-10-16 +Suppress-Script: Latn +Macrolanguage: sh +%% +Type: language +Subtag: ht +Description: Haitian +Description: Haitian Creole +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: hu +Description: Hungarian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: hy +Description: Armenian +Added: 2005-10-16 +Suppress-Script: Armn +%% +Type: language +Subtag: hz +Description: Herero +Added: 2005-10-16 +%% +Type: language +Subtag: ia +Description: Interlingua (International Auxiliary Language + Association) +Added: 2005-10-16 +%% +Type: language +Subtag: id +Description: Indonesian +Added: 2005-10-16 +Suppress-Script: Latn +Macrolanguage: ms +%% +Type: language +Subtag: ie +Description: Interlingue +Description: Occidental +Added: 2005-10-16 +%% +Type: language +Subtag: ig +Description: Igbo +Added: 2005-10-16 +%% +Type: language +Subtag: ii +Description: Sichuan Yi +Description: Nuosu +Added: 2005-10-16 +%% +Type: language +Subtag: ik +Description: Inupiaq +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: in +Description: Indonesian +Added: 2005-10-16 +Deprecated: 1989-01-01 +Preferred-Value: id +Suppress-Script: Latn +Macrolanguage: ms +%% +Type: language +Subtag: io +Description: Ido +Added: 2005-10-16 +%% +Type: language +Subtag: is +Description: Icelandic +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: it +Description: Italian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: iu +Description: Inuktitut +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: iw +Description: Hebrew +Added: 2005-10-16 +Deprecated: 1989-01-01 +Preferred-Value: he +Suppress-Script: Hebr +%% +Type: language +Subtag: ja +Description: Japanese +Added: 2005-10-16 +Suppress-Script: Jpan +%% +Type: language +Subtag: ji +Description: Yiddish +Added: 2005-10-16 +Deprecated: 1989-01-01 +Preferred-Value: yi +%% +Type: language +Subtag: jv +Description: Javanese +Added: 2005-10-16 +%% +Type: language +Subtag: jw +Description: Javanese +Added: 2005-10-16 +Deprecated: 2001-08-13 +Preferred-Value: jv +Comments: published by error in Table 1 of ISO 639:1988 +%% +Type: language +Subtag: ka +Description: Georgian +Added: 2005-10-16 +Suppress-Script: Geor +%% +Type: language +Subtag: kg +Description: Kongo +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: ki +Description: Kikuyu +Description: Gikuyu +Added: 2005-10-16 +%% +Type: language +Subtag: kj +Description: Kuanyama +Description: Kwanyama +Added: 2005-10-16 +%% +Type: language +Subtag: kk +Description: Kazakh +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: kl +Description: Kalaallisut +Description: Greenlandic +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: km +Description: Central Khmer +Added: 2005-10-16 +Suppress-Script: Khmr +%% +Type: language +Subtag: kn +Description: Kannada +Added: 2005-10-16 +Suppress-Script: Knda +%% +Type: language +Subtag: ko +Description: Korean +Added: 2005-10-16 +Suppress-Script: Kore +%% +Type: language +Subtag: kr +Description: Kanuri +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: ks +Description: Kashmiri +Added: 2005-10-16 +%% +Type: language +Subtag: ku +Description: Kurdish +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: kv +Description: Komi +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: kw +Description: Cornish +Added: 2005-10-16 +%% +Type: language +Subtag: ky +Description: Kirghiz +Description: Kyrgyz +Added: 2005-10-16 +%% +Type: language +Subtag: la +Description: Latin +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: lb +Description: Luxembourgish +Description: Letzeburgesch +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: lg +Description: Ganda +Added: 2005-10-16 +%% +Type: language +Subtag: li +Description: Limburgan +Description: Limburger +Description: Limburgish +Added: 2005-10-16 +%% +Type: language +Subtag: ln +Description: Lingala +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: lo +Description: Lao +Added: 2005-10-16 +Suppress-Script: Laoo +%% +Type: language +Subtag: lt +Description: Lithuanian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: lu +Description: Luba-Katanga +Added: 2005-10-16 +%% +Type: language +Subtag: lv +Description: Latvian +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: mg +Description: Malagasy +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: mh +Description: Marshallese +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: mi +Description: Maori +Added: 2005-10-16 +%% +Type: language +Subtag: mk +Description: Macedonian +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: ml +Description: Malayalam +Added: 2005-10-16 +Suppress-Script: Mlym +%% +Type: language +Subtag: mn +Description: Mongolian +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: mo +Description: Moldavian +Description: Moldovan +Added: 2005-10-16 +Deprecated: 2008-11-22 +Preferred-Value: ro +Suppress-Script: Latn +%% +Type: language +Subtag: mr +Description: Marathi +Added: 2005-10-16 +Suppress-Script: Deva +%% +Type: language +Subtag: ms +Description: Malay (macrolanguage) +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: mt +Description: Maltese +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: my +Description: Burmese +Added: 2005-10-16 +Suppress-Script: Mymr +%% +Type: language +Subtag: na +Description: Nauru +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: nb +Description: Norwegian Bokmål +Added: 2005-10-16 +Suppress-Script: Latn +Macrolanguage: no +%% +Type: language +Subtag: nd +Description: North Ndebele +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ne +Description: Nepali (macrolanguage) +Added: 2005-10-16 +Suppress-Script: Deva +Scope: macrolanguage +%% +Type: language +Subtag: ng +Description: Ndonga +Added: 2005-10-16 +%% +Type: language +Subtag: nl +Description: Dutch +Description: Flemish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: nn +Description: Norwegian Nynorsk +Added: 2005-10-16 +Suppress-Script: Latn +Macrolanguage: no +%% +Type: language +Subtag: no +Description: Norwegian +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: nr +Description: South Ndebele +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: nv +Description: Navajo +Description: Navaho +Added: 2005-10-16 +%% +Type: language +Subtag: ny +Description: Nyanja +Description: Chewa +Description: Chichewa +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: oc +Description: Occitan (post 1500) +Added: 2005-10-16 +%% +Type: language +Subtag: oj +Description: Ojibwa +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: om +Description: Oromo +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: or +Description: Oriya (macrolanguage) +Added: 2005-10-16 +Suppress-Script: Orya +Scope: macrolanguage +%% +Type: language +Subtag: os +Description: Ossetian +Description: Ossetic +Added: 2005-10-16 +%% +Type: language +Subtag: pa +Description: Panjabi +Description: Punjabi +Added: 2005-10-16 +Suppress-Script: Guru +%% +Type: language +Subtag: pi +Description: Pali +Added: 2005-10-16 +%% +Type: language +Subtag: pl +Description: Polish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ps +Description: Pushto +Description: Pashto +Added: 2005-10-16 +Suppress-Script: Arab +Scope: macrolanguage +%% +Type: language +Subtag: pt +Description: Portuguese +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: qu +Description: Quechua +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: rm +Description: Romansh +Suppress-Script: Latn +Added: 2005-10-16 +%% +Type: language +Subtag: rn +Description: Rundi +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ro +Description: Romanian +Description: Moldavian +Description: Moldovan +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ru +Description: Russian +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: rw +Description: Kinyarwanda +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sa +Description: Sanskrit +Added: 2005-10-16 +%% +Type: language +Subtag: sc +Description: Sardinian +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: sd +Description: Sindhi +Added: 2005-10-16 +%% +Type: language +Subtag: se +Description: Northern Sami +Added: 2005-10-16 +%% +Type: language +Subtag: sg +Description: Sango +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sh +Description: Serbo-Croatian +Added: 2005-10-16 +Scope: macrolanguage +Comments: sr, hr, bs are preferred for most modern uses +%% +Type: language +Subtag: si +Description: Sinhala +Description: Sinhalese +Added: 2005-10-16 +Suppress-Script: Sinh +%% +Type: language +Subtag: sk +Description: Slovak +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sl +Description: Slovenian +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sm +Description: Samoan +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sn +Description: Shona +Added: 2005-10-16 +%% +Type: language +Subtag: so +Description: Somali +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sq +Description: Albanian +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: sr +Description: Serbian +Added: 2005-10-16 +Macrolanguage: sh +%% +Type: language +Subtag: ss +Description: Swati +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: st +Description: Southern Sotho +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: su +Description: Sundanese +Added: 2005-10-16 +%% +Type: language +Subtag: sv +Description: Swedish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: sw +Description: Swahili (macrolanguage) +Added: 2005-10-16 +Suppress-Script: Latn +Scope: macrolanguage +%% +Type: language +Subtag: ta +Description: Tamil +Added: 2005-10-16 +Suppress-Script: Taml +%% +Type: language +Subtag: te +Description: Telugu +Added: 2005-10-16 +Suppress-Script: Telu +%% +Type: language +Subtag: tg +Description: Tajik +Added: 2005-10-16 +%% +Type: language +Subtag: th +Description: Thai +Added: 2005-10-16 +Suppress-Script: Thai +%% +Type: language +Subtag: ti +Description: Tigrinya +Added: 2005-10-16 +Suppress-Script: Ethi +%% +Type: language +Subtag: tk +Description: Turkmen +Added: 2005-10-16 +%% +Type: language +Subtag: tl +Description: Tagalog +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: tn +Description: Tswana +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: to +Description: Tonga (Tonga Islands) +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: tr +Description: Turkish +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: ts +Description: Tsonga +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: tt +Description: Tatar +Added: 2005-10-16 +%% +Type: language +Subtag: tw +Description: Twi +Added: 2005-10-16 +Macrolanguage: ak +%% +Type: language +Subtag: ty +Description: Tahitian +Added: 2005-10-16 +%% +Type: language +Subtag: ug +Description: Uighur +Description: Uyghur +Added: 2005-10-16 +%% +Type: language +Subtag: uk +Description: Ukrainian +Added: 2005-10-16 +Suppress-Script: Cyrl +%% +Type: language +Subtag: ur +Description: Urdu +Added: 2005-10-16 +Suppress-Script: Arab +%% +Type: language +Subtag: uz +Description: Uzbek +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: ve +Description: Venda +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: vi +Description: Vietnamese +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: vo +Description: Volapük +Added: 2005-10-16 +%% +Type: language +Subtag: wa +Description: Walloon +Added: 2005-10-16 +%% +Type: language +Subtag: wo +Description: Wolof +Added: 2005-10-16 +%% +Type: language +Subtag: xh +Description: Xhosa +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: yi +Description: Yiddish +Added: 2005-10-16 +Suppress-Script: Hebr +Scope: macrolanguage +%% +Type: language +Subtag: yo +Description: Yoruba +Added: 2005-10-16 +%% +Type: language +Subtag: za +Description: Zhuang +Description: Chuang +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: zh +Description: Chinese +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: zu +Description: Zulu +Added: 2005-10-16 +Suppress-Script: Latn +%% +Type: language +Subtag: aaa +Description: Ghotuo +Added: 2009-07-29 +%% +Type: language +Subtag: aab +Description: Alumu-Tesu +Added: 2009-07-29 +%% +Type: language +Subtag: aac +Description: Ari +Added: 2009-07-29 +%% +Type: language +Subtag: aad +Description: Amal +Added: 2009-07-29 +%% +Type: language +Subtag: aae +Description: Arbëreshë Albanian +Added: 2009-07-29 +Macrolanguage: sq +%% +Type: language +Subtag: aaf +Description: Aranadan +Added: 2009-07-29 +%% +Type: language +Subtag: aag +Description: Ambrak +Added: 2009-07-29 +%% +Type: language +Subtag: aah +Description: Abu' Arapesh +Added: 2009-07-29 +%% +Type: language +Subtag: aai +Description: Arifama-Miniafia +Added: 2009-07-29 +%% +Type: language +Subtag: aak +Description: Ankave +Added: 2009-07-29 +%% +Type: language +Subtag: aal +Description: Afade +Added: 2009-07-29 +%% +Type: language +Subtag: aam +Description: Aramanik +Added: 2009-07-29 +%% +Type: language +Subtag: aan +Description: Anambé +Added: 2009-07-29 +%% +Type: language +Subtag: aao +Description: Algerian Saharan Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: aap +Description: Pará Arára +Added: 2009-07-29 +%% +Type: language +Subtag: aaq +Description: Eastern Abnaki +Added: 2009-07-29 +%% +Type: language +Subtag: aas +Description: Aasáx +Added: 2009-07-29 +%% +Type: language +Subtag: aat +Description: Arvanitika Albanian +Added: 2009-07-29 +Macrolanguage: sq +%% +Type: language +Subtag: aau +Description: Abau +Added: 2009-07-29 +%% +Type: language +Subtag: aav +Description: Austro-Asiatic languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: aaw +Description: Solong +Added: 2009-07-29 +%% +Type: language +Subtag: aax +Description: Mandobo Atas +Added: 2009-07-29 +%% +Type: language +Subtag: aaz +Description: Amarasi +Added: 2009-07-29 +%% +Type: language +Subtag: aba +Description: Abé +Added: 2009-07-29 +%% +Type: language +Subtag: abb +Description: Bankon +Added: 2009-07-29 +%% +Type: language +Subtag: abc +Description: Ambala Ayta +Added: 2009-07-29 +%% +Type: language +Subtag: abd +Description: Manide +Added: 2009-07-29 +%% +Type: language +Subtag: abe +Description: Western Abnaki +Added: 2009-07-29 +%% +Type: language +Subtag: abf +Description: Abai Sungai +Added: 2009-07-29 +%% +Type: language +Subtag: abg +Description: Abaga +Added: 2009-07-29 +%% +Type: language +Subtag: abh +Description: Tajiki Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: abi +Description: Abidji +Added: 2009-07-29 +%% +Type: language +Subtag: abj +Description: Aka-Bea +Added: 2009-07-29 +%% +Type: language +Subtag: abl +Description: Lampung Nyo +Added: 2009-07-29 +%% +Type: language +Subtag: abm +Description: Abanyom +Added: 2009-07-29 +%% +Type: language +Subtag: abn +Description: Abua +Added: 2009-07-29 +%% +Type: language +Subtag: abo +Description: Abon +Added: 2009-07-29 +%% +Type: language +Subtag: abp +Description: Abellen Ayta +Added: 2009-07-29 +%% +Type: language +Subtag: abq +Description: Abaza +Added: 2009-07-29 +%% +Type: language +Subtag: abr +Description: Abron +Added: 2009-07-29 +%% +Type: language +Subtag: abs +Description: Ambonese Malay +Added: 2009-07-29 +%% +Type: language +Subtag: abt +Description: Ambulas +Added: 2009-07-29 +%% +Type: language +Subtag: abu +Description: Abure +Added: 2009-07-29 +%% +Type: language +Subtag: abv +Description: Baharna Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: abw +Description: Pal +Added: 2009-07-29 +%% +Type: language +Subtag: abx +Description: Inabaknon +Added: 2009-07-29 +%% +Type: language +Subtag: aby +Description: Aneme Wake +Added: 2009-07-29 +%% +Type: language +Subtag: abz +Description: Abui +Added: 2009-07-29 +%% +Type: language +Subtag: aca +Description: Achagua +Added: 2009-07-29 +%% +Type: language +Subtag: acb +Description: Áncá +Added: 2009-07-29 +%% +Type: language +Subtag: acd +Description: Gikyode +Added: 2009-07-29 +%% +Type: language +Subtag: ace +Description: Achinese +Added: 2005-10-16 +%% +Type: language +Subtag: acf +Description: Saint Lucian Creole French +Added: 2009-07-29 +%% +Type: language +Subtag: ach +Description: Acoli +Added: 2005-10-16 +%% +Type: language +Subtag: aci +Description: Aka-Cari +Added: 2009-07-29 +%% +Type: language +Subtag: ack +Description: Aka-Kora +Added: 2009-07-29 +%% +Type: language +Subtag: acl +Description: Akar-Bale +Added: 2009-07-29 +%% +Type: language +Subtag: acm +Description: Mesopotamian Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: acn +Description: Achang +Added: 2009-07-29 +%% +Type: language +Subtag: acp +Description: Eastern Acipa +Added: 2009-07-29 +%% +Type: language +Subtag: acq +Description: Ta'izzi-Adeni Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: acr +Description: Achi +Added: 2009-07-29 +%% +Type: language +Subtag: acs +Description: Acroá +Added: 2009-07-29 +%% +Type: language +Subtag: act +Description: Achterhoeks +Added: 2009-07-29 +%% +Type: language +Subtag: acu +Description: Achuar-Shiwiar +Added: 2009-07-29 +%% +Type: language +Subtag: acv +Description: Achumawi +Added: 2009-07-29 +%% +Type: language +Subtag: acw +Description: Hijazi Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: acx +Description: Omani Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: acy +Description: Cypriot Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: acz +Description: Acheron +Added: 2009-07-29 +%% +Type: language +Subtag: ada +Description: Adangme +Added: 2005-10-16 +%% +Type: language +Subtag: adb +Description: Adabe +Added: 2009-07-29 +%% +Type: language +Subtag: add +Description: Dzodinka +Added: 2009-07-29 +%% +Type: language +Subtag: ade +Description: Adele +Added: 2009-07-29 +%% +Type: language +Subtag: adf +Description: Dhofari Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: adg +Description: Andegerebinha +Added: 2009-07-29 +%% +Type: language +Subtag: adh +Description: Adhola +Added: 2009-07-29 +%% +Type: language +Subtag: adi +Description: Adi +Added: 2009-07-29 +%% +Type: language +Subtag: adj +Description: Adioukrou +Added: 2009-07-29 +%% +Type: language +Subtag: adl +Description: Galo +Added: 2009-07-29 +%% +Type: language +Subtag: adn +Description: Adang +Added: 2009-07-29 +%% +Type: language +Subtag: ado +Description: Abu +Added: 2009-07-29 +%% +Type: language +Subtag: adp +Description: Adap +Added: 2009-07-29 +%% +Type: language +Subtag: adq +Description: Adangbe +Added: 2009-07-29 +%% +Type: language +Subtag: adr +Description: Adonara +Added: 2009-07-29 +%% +Type: language +Subtag: ads +Description: Adamorobe Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: adt +Description: Adnyamathanha +Added: 2009-07-29 +%% +Type: language +Subtag: adu +Description: Aduge +Added: 2009-07-29 +%% +Type: language +Subtag: adw +Description: Amundava +Added: 2009-07-29 +%% +Type: language +Subtag: adx +Description: Amdo Tibetan +Added: 2009-07-29 +%% +Type: language +Subtag: ady +Description: Adyghe +Description: Adygei +Added: 2005-10-16 +%% +Type: language +Subtag: adz +Description: Adzera +Added: 2009-07-29 +%% +Type: language +Subtag: aea +Description: Areba +Added: 2009-07-29 +%% +Type: language +Subtag: aeb +Description: Tunisian Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: aec +Description: Saidi Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: aed +Description: Argentine Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: aee +Description: Northeast Pashayi +Added: 2009-07-29 +%% +Type: language +Subtag: aek +Description: Haeke +Added: 2009-07-29 +%% +Type: language +Subtag: ael +Description: Ambele +Added: 2009-07-29 +%% +Type: language +Subtag: aem +Description: Arem +Added: 2009-07-29 +%% +Type: language +Subtag: aen +Description: Armenian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: aeq +Description: Aer +Added: 2009-07-29 +%% +Type: language +Subtag: aer +Description: Eastern Arrernte +Added: 2009-07-29 +%% +Type: language +Subtag: aes +Description: Alsea +Added: 2009-07-29 +%% +Type: language +Subtag: aeu +Description: Akeu +Added: 2009-07-29 +%% +Type: language +Subtag: aew +Description: Ambakich +Added: 2009-07-29 +%% +Type: language +Subtag: aey +Description: Amele +Added: 2009-07-29 +%% +Type: language +Subtag: aez +Description: Aeka +Added: 2009-07-29 +%% +Type: language +Subtag: afa +Description: Afro-Asiatic languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: afb +Description: Gulf Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: afd +Description: Andai +Added: 2009-07-29 +%% +Type: language +Subtag: afe +Description: Putukwam +Added: 2009-07-29 +%% +Type: language +Subtag: afg +Description: Afghan Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: afh +Description: Afrihili +Added: 2005-10-16 +%% +Type: language +Subtag: afi +Description: Akrukay +Added: 2009-07-29 +%% +Type: language +Subtag: afk +Description: Nanubae +Added: 2009-07-29 +%% +Type: language +Subtag: afn +Description: Defaka +Added: 2009-07-29 +%% +Type: language +Subtag: afo +Description: Eloyi +Added: 2009-07-29 +%% +Type: language +Subtag: afp +Description: Tapei +Added: 2009-07-29 +%% +Type: language +Subtag: afs +Description: Afro-Seminole Creole +Added: 2009-07-29 +%% +Type: language +Subtag: aft +Description: Afitti +Added: 2009-07-29 +%% +Type: language +Subtag: afu +Description: Awutu +Added: 2009-07-29 +%% +Type: language +Subtag: afz +Description: Obokuitai +Added: 2009-07-29 +%% +Type: language +Subtag: aga +Description: Aguano +Added: 2009-07-29 +%% +Type: language +Subtag: agb +Description: Legbo +Added: 2009-07-29 +%% +Type: language +Subtag: agc +Description: Agatu +Added: 2009-07-29 +%% +Type: language +Subtag: agd +Description: Agarabi +Added: 2009-07-29 +%% +Type: language +Subtag: age +Description: Angal +Added: 2009-07-29 +%% +Type: language +Subtag: agf +Description: Arguni +Added: 2009-07-29 +%% +Type: language +Subtag: agg +Description: Angor +Added: 2009-07-29 +%% +Type: language +Subtag: agh +Description: Ngelima +Added: 2009-07-29 +%% +Type: language +Subtag: agi +Description: Agariya +Added: 2009-07-29 +%% +Type: language +Subtag: agj +Description: Argobba +Added: 2009-07-29 +%% +Type: language +Subtag: agk +Description: Isarog Agta +Added: 2009-07-29 +%% +Type: language +Subtag: agl +Description: Fembe +Added: 2009-07-29 +%% +Type: language +Subtag: agm +Description: Angaataha +Added: 2009-07-29 +%% +Type: language +Subtag: agn +Description: Agutaynen +Added: 2009-07-29 +%% +Type: language +Subtag: ago +Description: Tainae +Added: 2009-07-29 +%% +Type: language +Subtag: agp +Description: Paranan +Added: 2009-07-29 +Deprecated: 2010-03-11 +Comments: see apf, prf +%% +Type: language +Subtag: agq +Description: Aghem +Added: 2009-07-29 +%% +Type: language +Subtag: agr +Description: Aguaruna +Added: 2009-07-29 +%% +Type: language +Subtag: ags +Description: Esimbi +Added: 2009-07-29 +%% +Type: language +Subtag: agt +Description: Central Cagayan Agta +Added: 2009-07-29 +%% +Type: language +Subtag: agu +Description: Aguacateco +Added: 2009-07-29 +%% +Type: language +Subtag: agv +Description: Remontado Dumagat +Added: 2009-07-29 +%% +Type: language +Subtag: agw +Description: Kahua +Added: 2009-07-29 +%% +Type: language +Subtag: agx +Description: Aghul +Added: 2009-07-29 +%% +Type: language +Subtag: agy +Description: Southern Alta +Added: 2009-07-29 +%% +Type: language +Subtag: agz +Description: Mt. Iriga Agta +Added: 2009-07-29 +%% +Type: language +Subtag: aha +Description: Ahanta +Added: 2009-07-29 +%% +Type: language +Subtag: ahb +Description: Axamb +Added: 2009-07-29 +%% +Type: language +Subtag: ahg +Description: Qimant +Added: 2009-07-29 +%% +Type: language +Subtag: ahh +Description: Aghu +Added: 2009-07-29 +%% +Type: language +Subtag: ahi +Description: Tiagbamrin Aizi +Added: 2009-07-29 +%% +Type: language +Subtag: ahk +Description: Akha +Added: 2009-07-29 +%% +Type: language +Subtag: ahl +Description: Igo +Added: 2009-07-29 +%% +Type: language +Subtag: ahm +Description: Mobumrin Aizi +Added: 2009-07-29 +%% +Type: language +Subtag: ahn +Description: Àhàn +Added: 2009-07-29 +%% +Type: language +Subtag: aho +Description: Ahom +Added: 2009-07-29 +%% +Type: language +Subtag: ahp +Description: Aproumu Aizi +Added: 2009-07-29 +%% +Type: language +Subtag: ahr +Description: Ahirani +Added: 2009-07-29 +%% +Type: language +Subtag: ahs +Description: Ashe +Added: 2009-07-29 +%% +Type: language +Subtag: aht +Description: Ahtena +Added: 2009-07-29 +%% +Type: language +Subtag: aia +Description: Arosi +Added: 2009-07-29 +%% +Type: language +Subtag: aib +Description: Ainu (China) +Added: 2009-07-29 +%% +Type: language +Subtag: aic +Description: Ainbai +Added: 2009-07-29 +%% +Type: language +Subtag: aid +Description: Alngith +Added: 2009-07-29 +%% +Type: language +Subtag: aie +Description: Amara +Added: 2009-07-29 +%% +Type: language +Subtag: aif +Description: Agi +Added: 2009-07-29 +%% +Type: language +Subtag: aig +Description: Antigua and Barbuda Creole English +Added: 2009-07-29 +%% +Type: language +Subtag: aih +Description: Ai-Cham +Added: 2009-07-29 +%% +Type: language +Subtag: aii +Description: Assyrian Neo-Aramaic +Added: 2009-07-29 +Macrolanguage: syr +%% +Type: language +Subtag: aij +Description: Lishanid Noshan +Added: 2009-07-29 +%% +Type: language +Subtag: aik +Description: Ake +Added: 2009-07-29 +%% +Type: language +Subtag: ail +Description: Aimele +Added: 2009-07-29 +%% +Type: language +Subtag: aim +Description: Aimol +Added: 2009-07-29 +%% +Type: language +Subtag: ain +Description: Ainu (Japan) +Added: 2005-10-16 +%% +Type: language +Subtag: aio +Description: Aiton +Added: 2009-07-29 +%% +Type: language +Subtag: aip +Description: Burumakok +Added: 2009-07-29 +%% +Type: language +Subtag: aiq +Description: Aimaq +Added: 2009-07-29 +%% +Type: language +Subtag: air +Description: Airoran +Added: 2009-07-29 +%% +Type: language +Subtag: ais +Description: Nataoran Amis +Added: 2009-07-29 +%% +Type: language +Subtag: ait +Description: Arikem +Added: 2009-07-29 +%% +Type: language +Subtag: aiw +Description: Aari +Added: 2009-07-29 +%% +Type: language +Subtag: aix +Description: Aighon +Added: 2009-07-29 +%% +Type: language +Subtag: aiy +Description: Ali +Added: 2009-07-29 +%% +Type: language +Subtag: aja +Description: Aja (Sudan) +Added: 2009-07-29 +%% +Type: language +Subtag: ajg +Description: Aja (Benin) +Added: 2009-07-29 +%% +Type: language +Subtag: aji +Description: Ajië +Added: 2009-07-29 +%% +Type: language +Subtag: ajn +Description: Andajin +Added: 2012-08-12 +%% +Type: language +Subtag: ajp +Description: South Levantine Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: ajt +Description: Judeo-Tunisian Arabic +Added: 2009-07-29 +Macrolanguage: jrb +%% +Type: language +Subtag: aju +Description: Judeo-Moroccan Arabic +Added: 2009-07-29 +Macrolanguage: jrb +%% +Type: language +Subtag: ajw +Description: Ajawa +Added: 2009-07-29 +%% +Type: language +Subtag: ajz +Description: Amri Karbi +Added: 2009-07-29 +%% +Type: language +Subtag: akb +Description: Batak Angkola +Added: 2009-07-29 +%% +Type: language +Subtag: akc +Description: Mpur +Added: 2009-07-29 +%% +Type: language +Subtag: akd +Description: Ukpet-Ehom +Added: 2009-07-29 +%% +Type: language +Subtag: ake +Description: Akawaio +Added: 2009-07-29 +%% +Type: language +Subtag: akf +Description: Akpa +Added: 2009-07-29 +%% +Type: language +Subtag: akg +Description: Anakalangu +Added: 2009-07-29 +%% +Type: language +Subtag: akh +Description: Angal Heneng +Added: 2009-07-29 +%% +Type: language +Subtag: aki +Description: Aiome +Added: 2009-07-29 +%% +Type: language +Subtag: akj +Description: Aka-Jeru +Added: 2009-07-29 +%% +Type: language +Subtag: akk +Description: Akkadian +Added: 2005-10-16 +%% +Type: language +Subtag: akl +Description: Aklanon +Added: 2009-07-29 +%% +Type: language +Subtag: akm +Description: Aka-Bo +Added: 2009-07-29 +%% +Type: language +Subtag: ako +Description: Akurio +Added: 2009-07-29 +%% +Type: language +Subtag: akp +Description: Siwu +Added: 2009-07-29 +%% +Type: language +Subtag: akq +Description: Ak +Added: 2009-07-29 +%% +Type: language +Subtag: akr +Description: Araki +Added: 2009-07-29 +%% +Type: language +Subtag: aks +Description: Akaselem +Added: 2009-07-29 +%% +Type: language +Subtag: akt +Description: Akolet +Added: 2009-07-29 +%% +Type: language +Subtag: aku +Description: Akum +Added: 2009-07-29 +%% +Type: language +Subtag: akv +Description: Akhvakh +Added: 2009-07-29 +%% +Type: language +Subtag: akw +Description: Akwa +Added: 2009-07-29 +%% +Type: language +Subtag: akx +Description: Aka-Kede +Added: 2009-07-29 +%% +Type: language +Subtag: aky +Description: Aka-Kol +Added: 2009-07-29 +%% +Type: language +Subtag: akz +Description: Alabama +Added: 2009-07-29 +%% +Type: language +Subtag: ala +Description: Alago +Added: 2009-07-29 +%% +Type: language +Subtag: alc +Description: Qawasqar +Added: 2009-07-29 +%% +Type: language +Subtag: ald +Description: Alladian +Added: 2009-07-29 +%% +Type: language +Subtag: ale +Description: Aleut +Added: 2005-10-16 +%% +Type: language +Subtag: alf +Description: Alege +Added: 2009-07-29 +%% +Type: language +Subtag: alg +Description: Algonquian languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: alh +Description: Alawa +Added: 2009-07-29 +%% +Type: language +Subtag: ali +Description: Amaimon +Added: 2009-07-29 +%% +Type: language +Subtag: alj +Description: Alangan +Added: 2009-07-29 +%% +Type: language +Subtag: alk +Description: Alak +Added: 2009-07-29 +%% +Type: language +Subtag: all +Description: Allar +Added: 2009-07-29 +%% +Type: language +Subtag: alm +Description: Amblong +Added: 2009-07-29 +%% +Type: language +Subtag: aln +Description: Gheg Albanian +Added: 2009-07-29 +Macrolanguage: sq +%% +Type: language +Subtag: alo +Description: Larike-Wakasihu +Added: 2009-07-29 +%% +Type: language +Subtag: alp +Description: Alune +Added: 2009-07-29 +%% +Type: language +Subtag: alq +Description: Algonquin +Added: 2009-07-29 +%% +Type: language +Subtag: alr +Description: Alutor +Added: 2009-07-29 +%% +Type: language +Subtag: als +Description: Tosk Albanian +Added: 2009-07-29 +Macrolanguage: sq +%% +Type: language +Subtag: alt +Description: Southern Altai +Added: 2005-10-16 +%% +Type: language +Subtag: alu +Description: 'Are'are +Added: 2009-07-29 +%% +Type: language +Subtag: alv +Description: Atlantic-Congo languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: alw +Description: Alaba-K’abeena +Description: Wanbasana +Added: 2009-07-29 +%% +Type: language +Subtag: alx +Description: Amol +Added: 2009-07-29 +%% +Type: language +Subtag: aly +Description: Alyawarr +Added: 2009-07-29 +%% +Type: language +Subtag: alz +Description: Alur +Added: 2009-07-29 +%% +Type: language +Subtag: ama +Description: Amanayé +Added: 2009-07-29 +%% +Type: language +Subtag: amb +Description: Ambo +Added: 2009-07-29 +%% +Type: language +Subtag: amc +Description: Amahuaca +Added: 2009-07-29 +%% +Type: language +Subtag: ame +Description: Yanesha' +Added: 2009-07-29 +%% +Type: language +Subtag: amf +Description: Hamer-Banna +Added: 2009-07-29 +%% +Type: language +Subtag: amg +Description: Amurdak +Added: 2009-07-29 +%% +Type: language +Subtag: ami +Description: Amis +Added: 2009-07-29 +%% +Type: language +Subtag: amj +Description: Amdang +Added: 2009-07-29 +%% +Type: language +Subtag: amk +Description: Ambai +Added: 2009-07-29 +%% +Type: language +Subtag: aml +Description: War-Jaintia +Added: 2009-07-29 +%% +Type: language +Subtag: amm +Description: Ama (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: amn +Description: Amanab +Added: 2009-07-29 +%% +Type: language +Subtag: amo +Description: Amo +Added: 2009-07-29 +%% +Type: language +Subtag: amp +Description: Alamblak +Added: 2009-07-29 +%% +Type: language +Subtag: amq +Description: Amahai +Added: 2009-07-29 +%% +Type: language +Subtag: amr +Description: Amarakaeri +Added: 2009-07-29 +%% +Type: language +Subtag: ams +Description: Southern Amami-Oshima +Added: 2009-07-29 +%% +Type: language +Subtag: amt +Description: Amto +Added: 2009-07-29 +%% +Type: language +Subtag: amu +Description: Guerrero Amuzgo +Added: 2009-07-29 +%% +Type: language +Subtag: amv +Description: Ambelau +Added: 2009-07-29 +%% +Type: language +Subtag: amw +Description: Western Neo-Aramaic +Added: 2009-07-29 +%% +Type: language +Subtag: amx +Description: Anmatyerre +Added: 2009-07-29 +%% +Type: language +Subtag: amy +Description: Ami +Added: 2009-07-29 +%% +Type: language +Subtag: amz +Description: Atampaya +Added: 2009-07-29 +%% +Type: language +Subtag: ana +Description: Andaqui +Added: 2009-07-29 +%% +Type: language +Subtag: anb +Description: Andoa +Added: 2009-07-29 +%% +Type: language +Subtag: anc +Description: Ngas +Added: 2009-07-29 +%% +Type: language +Subtag: and +Description: Ansus +Added: 2009-07-29 +%% +Type: language +Subtag: ane +Description: Xârâcùù +Added: 2009-07-29 +%% +Type: language +Subtag: anf +Description: Animere +Added: 2009-07-29 +%% +Type: language +Subtag: ang +Description: Old English (ca. 450-1100) +Added: 2005-10-16 +%% +Type: language +Subtag: anh +Description: Nend +Added: 2009-07-29 +%% +Type: language +Subtag: ani +Description: Andi +Added: 2009-07-29 +%% +Type: language +Subtag: anj +Description: Anor +Added: 2009-07-29 +%% +Type: language +Subtag: ank +Description: Goemai +Added: 2009-07-29 +%% +Type: language +Subtag: anl +Description: Anu-Hkongso Chin +Added: 2009-07-29 +%% +Type: language +Subtag: anm +Description: Anal +Added: 2009-07-29 +%% +Type: language +Subtag: ann +Description: Obolo +Added: 2009-07-29 +%% +Type: language +Subtag: ano +Description: Andoque +Added: 2009-07-29 +%% +Type: language +Subtag: anp +Description: Angika +Added: 2006-03-08 +%% +Type: language +Subtag: anq +Description: Jarawa (India) +Added: 2009-07-29 +%% +Type: language +Subtag: anr +Description: Andh +Added: 2009-07-29 +%% +Type: language +Subtag: ans +Description: Anserma +Added: 2009-07-29 +%% +Type: language +Subtag: ant +Description: Antakarinya +Added: 2009-07-29 +%% +Type: language +Subtag: anu +Description: Anuak +Added: 2009-07-29 +%% +Type: language +Subtag: anv +Description: Denya +Added: 2009-07-29 +%% +Type: language +Subtag: anw +Description: Anaang +Added: 2009-07-29 +%% +Type: language +Subtag: anx +Description: Andra-Hus +Added: 2009-07-29 +%% +Type: language +Subtag: any +Description: Anyin +Added: 2009-07-29 +%% +Type: language +Subtag: anz +Description: Anem +Added: 2009-07-29 +%% +Type: language +Subtag: aoa +Description: Angolar +Added: 2009-07-29 +%% +Type: language +Subtag: aob +Description: Abom +Added: 2009-07-29 +%% +Type: language +Subtag: aoc +Description: Pemon +Added: 2009-07-29 +%% +Type: language +Subtag: aod +Description: Andarum +Added: 2009-07-29 +%% +Type: language +Subtag: aoe +Description: Angal Enen +Added: 2009-07-29 +%% +Type: language +Subtag: aof +Description: Bragat +Added: 2009-07-29 +%% +Type: language +Subtag: aog +Description: Angoram +Added: 2009-07-29 +%% +Type: language +Subtag: aoh +Description: Arma +Added: 2009-07-29 +%% +Type: language +Subtag: aoi +Description: Anindilyakwa +Added: 2009-07-29 +%% +Type: language +Subtag: aoj +Description: Mufian +Added: 2009-07-29 +%% +Type: language +Subtag: aok +Description: Arhö +Added: 2009-07-29 +%% +Type: language +Subtag: aol +Description: Alor +Added: 2009-07-29 +%% +Type: language +Subtag: aom +Description: Ömie +Added: 2009-07-29 +%% +Type: language +Subtag: aon +Description: Bumbita Arapesh +Added: 2009-07-29 +%% +Type: language +Subtag: aor +Description: Aore +Added: 2009-07-29 +%% +Type: language +Subtag: aos +Description: Taikat +Added: 2009-07-29 +%% +Type: language +Subtag: aot +Description: A'tong +Added: 2009-07-29 +%% +Type: language +Subtag: aou +Description: A'ou +Added: 2012-08-12 +%% +Type: language +Subtag: aox +Description: Atorada +Added: 2009-07-29 +%% +Type: language +Subtag: aoz +Description: Uab Meto +Added: 2009-07-29 +%% +Type: language +Subtag: apa +Description: Apache languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: apb +Description: Sa'a +Added: 2009-07-29 +%% +Type: language +Subtag: apc +Description: North Levantine Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: apd +Description: Sudanese Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: ape +Description: Bukiyip +Added: 2009-07-29 +%% +Type: language +Subtag: apf +Description: Pahanan Agta +Added: 2010-03-11 +%% +Type: language +Subtag: apg +Description: Ampanang +Added: 2009-07-29 +%% +Type: language +Subtag: aph +Description: Athpariya +Added: 2009-07-29 +%% +Type: language +Subtag: api +Description: Apiaká +Added: 2009-07-29 +%% +Type: language +Subtag: apj +Description: Jicarilla Apache +Added: 2009-07-29 +%% +Type: language +Subtag: apk +Description: Kiowa Apache +Added: 2009-07-29 +%% +Type: language +Subtag: apl +Description: Lipan Apache +Added: 2009-07-29 +%% +Type: language +Subtag: apm +Description: Mescalero-Chiricahua Apache +Added: 2009-07-29 +%% +Type: language +Subtag: apn +Description: Apinayé +Added: 2009-07-29 +%% +Type: language +Subtag: apo +Description: Ambul +Added: 2009-07-29 +%% +Type: language +Subtag: app +Description: Apma +Added: 2009-07-29 +%% +Type: language +Subtag: apq +Description: A-Pucikwar +Added: 2009-07-29 +%% +Type: language +Subtag: apr +Description: Arop-Lokep +Added: 2009-07-29 +%% +Type: language +Subtag: aps +Description: Arop-Sissano +Added: 2009-07-29 +%% +Type: language +Subtag: apt +Description: Apatani +Added: 2009-07-29 +%% +Type: language +Subtag: apu +Description: Apurinã +Added: 2009-07-29 +%% +Type: language +Subtag: apv +Description: Alapmunte +Added: 2009-07-29 +%% +Type: language +Subtag: apw +Description: Western Apache +Added: 2009-07-29 +%% +Type: language +Subtag: apx +Description: Aputai +Added: 2009-07-29 +%% +Type: language +Subtag: apy +Description: Apalaí +Added: 2009-07-29 +%% +Type: language +Subtag: apz +Description: Safeyoka +Added: 2009-07-29 +%% +Type: language +Subtag: aqa +Description: Alacalufan languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: aqc +Description: Archi +Added: 2009-07-29 +%% +Type: language +Subtag: aqd +Description: Ampari Dogon +Added: 2011-08-16 +%% +Type: language +Subtag: aqg +Description: Arigidi +Added: 2009-07-29 +%% +Type: language +Subtag: aql +Description: Algic languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: aqm +Description: Atohwaim +Added: 2009-07-29 +%% +Type: language +Subtag: aqn +Description: Northern Alta +Added: 2009-07-29 +%% +Type: language +Subtag: aqp +Description: Atakapa +Added: 2009-07-29 +%% +Type: language +Subtag: aqr +Description: Arhâ +Added: 2009-07-29 +%% +Type: language +Subtag: aqz +Description: Akuntsu +Added: 2010-03-11 +%% +Type: language +Subtag: arb +Description: Standard Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: arc +Description: Official Aramaic (700-300 BCE) +Description: Imperial Aramaic (700-300 BCE) +Added: 2005-10-16 +%% +Type: language +Subtag: ard +Description: Arabana +Added: 2009-07-29 +%% +Type: language +Subtag: are +Description: Western Arrarnta +Added: 2009-07-29 +%% +Type: language +Subtag: arh +Description: Arhuaco +Added: 2009-07-29 +%% +Type: language +Subtag: ari +Description: Arikara +Added: 2009-07-29 +%% +Type: language +Subtag: arj +Description: Arapaso +Added: 2009-07-29 +%% +Type: language +Subtag: ark +Description: Arikapú +Added: 2009-07-29 +%% +Type: language +Subtag: arl +Description: Arabela +Added: 2009-07-29 +%% +Type: language +Subtag: arn +Description: Mapudungun +Description: Mapuche +Added: 2005-10-16 +%% +Type: language +Subtag: aro +Description: Araona +Added: 2009-07-29 +%% +Type: language +Subtag: arp +Description: Arapaho +Added: 2005-10-16 +%% +Type: language +Subtag: arq +Description: Algerian Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: arr +Description: Karo (Brazil) +Added: 2009-07-29 +%% +Type: language +Subtag: ars +Description: Najdi Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: art +Description: Artificial languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: aru +Description: Aruá (Amazonas State) +Description: Arawá +Added: 2009-07-29 +%% +Type: language +Subtag: arv +Description: Arbore +Added: 2009-07-29 +%% +Type: language +Subtag: arw +Description: Arawak +Added: 2005-10-16 +%% +Type: language +Subtag: arx +Description: Aruá (Rodonia State) +Added: 2009-07-29 +%% +Type: language +Subtag: ary +Description: Moroccan Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: arz +Description: Egyptian Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: asa +Description: Asu (Tanzania) +Added: 2009-07-29 +%% +Type: language +Subtag: asb +Description: Assiniboine +Added: 2009-07-29 +%% +Type: language +Subtag: asc +Description: Casuarina Coast Asmat +Added: 2009-07-29 +%% +Type: language +Subtag: asd +Description: Asas +Added: 2009-07-29 +%% +Type: language +Subtag: ase +Description: American Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: asf +Description: Australian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: asg +Description: Cishingini +Added: 2009-07-29 +%% +Type: language +Subtag: ash +Description: Abishira +Added: 2009-07-29 +%% +Type: language +Subtag: asi +Description: Buruwai +Added: 2009-07-29 +%% +Type: language +Subtag: asj +Description: Nsari +Added: 2009-07-29 +%% +Type: language +Subtag: ask +Description: Ashkun +Added: 2009-07-29 +%% +Type: language +Subtag: asl +Description: Asilulu +Added: 2009-07-29 +%% +Type: language +Subtag: asn +Description: Xingú Asuriní +Added: 2009-07-29 +%% +Type: language +Subtag: aso +Description: Dano +Added: 2009-07-29 +%% +Type: language +Subtag: asp +Description: Algerian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: asq +Description: Austrian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: asr +Description: Asuri +Added: 2009-07-29 +%% +Type: language +Subtag: ass +Description: Ipulo +Added: 2009-07-29 +%% +Type: language +Subtag: ast +Description: Asturian +Description: Asturleonese +Description: Bable +Description: Leonese +Added: 2005-10-16 +%% +Type: language +Subtag: asu +Description: Tocantins Asurini +Added: 2009-07-29 +%% +Type: language +Subtag: asv +Description: Asoa +Added: 2009-07-29 +%% +Type: language +Subtag: asw +Description: Australian Aborigines Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: asx +Description: Muratayak +Added: 2009-07-29 +%% +Type: language +Subtag: asy +Description: Yaosakor Asmat +Added: 2009-07-29 +%% +Type: language +Subtag: asz +Description: As +Added: 2009-07-29 +%% +Type: language +Subtag: ata +Description: Pele-Ata +Added: 2009-07-29 +%% +Type: language +Subtag: atb +Description: Zaiwa +Added: 2009-07-29 +%% +Type: language +Subtag: atc +Description: Atsahuaca +Added: 2009-07-29 +%% +Type: language +Subtag: atd +Description: Ata Manobo +Added: 2009-07-29 +%% +Type: language +Subtag: ate +Description: Atemble +Added: 2009-07-29 +%% +Type: language +Subtag: atg +Description: Ivbie North-Okpela-Arhe +Added: 2009-07-29 +%% +Type: language +Subtag: ath +Description: Athapascan languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: ati +Description: Attié +Added: 2009-07-29 +%% +Type: language +Subtag: atj +Description: Atikamekw +Added: 2009-07-29 +%% +Type: language +Subtag: atk +Description: Ati +Added: 2009-07-29 +%% +Type: language +Subtag: atl +Description: Mt. Iraya Agta +Added: 2009-07-29 +%% +Type: language +Subtag: atm +Description: Ata +Added: 2009-07-29 +%% +Type: language +Subtag: atn +Description: Ashtiani +Added: 2009-07-29 +%% +Type: language +Subtag: ato +Description: Atong +Added: 2009-07-29 +%% +Type: language +Subtag: atp +Description: Pudtol Atta +Added: 2009-07-29 +%% +Type: language +Subtag: atq +Description: Aralle-Tabulahan +Added: 2009-07-29 +%% +Type: language +Subtag: atr +Description: Waimiri-Atroari +Added: 2009-07-29 +%% +Type: language +Subtag: ats +Description: Gros Ventre +Added: 2009-07-29 +%% +Type: language +Subtag: att +Description: Pamplona Atta +Added: 2009-07-29 +%% +Type: language +Subtag: atu +Description: Reel +Added: 2009-07-29 +%% +Type: language +Subtag: atv +Description: Northern Altai +Added: 2009-07-29 +%% +Type: language +Subtag: atw +Description: Atsugewi +Added: 2009-07-29 +%% +Type: language +Subtag: atx +Description: Arutani +Added: 2009-07-29 +%% +Type: language +Subtag: aty +Description: Aneityum +Added: 2009-07-29 +%% +Type: language +Subtag: atz +Description: Arta +Added: 2009-07-29 +%% +Type: language +Subtag: aua +Description: Asumboa +Added: 2009-07-29 +%% +Type: language +Subtag: aub +Description: Alugu +Added: 2009-07-29 +%% +Type: language +Subtag: auc +Description: Waorani +Added: 2009-07-29 +%% +Type: language +Subtag: aud +Description: Anuta +Added: 2009-07-29 +%% +Type: language +Subtag: aue +Description: =/Kx'au//'ein +Added: 2009-07-29 +%% +Type: language +Subtag: auf +Description: Arauan languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: aug +Description: Aguna +Added: 2009-07-29 +%% +Type: language +Subtag: auh +Description: Aushi +Added: 2009-07-29 +%% +Type: language +Subtag: aui +Description: Anuki +Added: 2009-07-29 +%% +Type: language +Subtag: auj +Description: Awjilah +Added: 2009-07-29 +%% +Type: language +Subtag: auk +Description: Heyo +Added: 2009-07-29 +%% +Type: language +Subtag: aul +Description: Aulua +Added: 2009-07-29 +%% +Type: language +Subtag: aum +Description: Asu (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: aun +Description: Molmo One +Added: 2009-07-29 +%% +Type: language +Subtag: auo +Description: Auyokawa +Added: 2009-07-29 +%% +Type: language +Subtag: aup +Description: Makayam +Added: 2009-07-29 +%% +Type: language +Subtag: auq +Description: Anus +Description: Korur +Added: 2009-07-29 +%% +Type: language +Subtag: aur +Description: Aruek +Added: 2009-07-29 +%% +Type: language +Subtag: aus +Description: Australian languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: aut +Description: Austral +Added: 2009-07-29 +%% +Type: language +Subtag: auu +Description: Auye +Added: 2009-07-29 +%% +Type: language +Subtag: auw +Description: Awyi +Added: 2009-07-29 +%% +Type: language +Subtag: aux +Description: Aurá +Added: 2009-07-29 +%% +Type: language +Subtag: auy +Description: Awiyaana +Added: 2009-07-29 +%% +Type: language +Subtag: auz +Description: Uzbeki Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: avb +Description: Avau +Added: 2009-07-29 +%% +Type: language +Subtag: avd +Description: Alviri-Vidari +Added: 2009-07-29 +%% +Type: language +Subtag: avi +Description: Avikam +Added: 2009-07-29 +%% +Type: language +Subtag: avk +Description: Kotava +Added: 2009-07-29 +%% +Type: language +Subtag: avl +Description: Eastern Egyptian Bedawi Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: avm +Description: Angkamuthi +Added: 2012-08-12 +%% +Type: language +Subtag: avn +Description: Avatime +Added: 2009-07-29 +%% +Type: language +Subtag: avo +Description: Agavotaguerra +Added: 2009-07-29 +%% +Type: language +Subtag: avs +Description: Aushiri +Added: 2009-07-29 +%% +Type: language +Subtag: avt +Description: Au +Added: 2009-07-29 +%% +Type: language +Subtag: avu +Description: Avokaya +Added: 2009-07-29 +%% +Type: language +Subtag: avv +Description: Avá-Canoeiro +Added: 2009-07-29 +%% +Type: language +Subtag: awa +Description: Awadhi +Added: 2005-10-16 +%% +Type: language +Subtag: awb +Description: Awa (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: awc +Description: Cicipu +Added: 2009-07-29 +%% +Type: language +Subtag: awd +Description: Arawakan languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: awe +Description: Awetí +Added: 2009-07-29 +%% +Type: language +Subtag: awg +Description: Anguthimri +Added: 2012-08-12 +%% +Type: language +Subtag: awh +Description: Awbono +Added: 2009-07-29 +%% +Type: language +Subtag: awi +Description: Aekyom +Added: 2009-07-29 +%% +Type: language +Subtag: awk +Description: Awabakal +Added: 2009-07-29 +%% +Type: language +Subtag: awm +Description: Arawum +Added: 2009-07-29 +%% +Type: language +Subtag: awn +Description: Awngi +Added: 2009-07-29 +%% +Type: language +Subtag: awo +Description: Awak +Added: 2009-07-29 +%% +Type: language +Subtag: awr +Description: Awera +Added: 2009-07-29 +%% +Type: language +Subtag: aws +Description: South Awyu +Added: 2009-07-29 +%% +Type: language +Subtag: awt +Description: Araweté +Added: 2009-07-29 +%% +Type: language +Subtag: awu +Description: Central Awyu +Added: 2009-07-29 +%% +Type: language +Subtag: awv +Description: Jair Awyu +Added: 2009-07-29 +%% +Type: language +Subtag: aww +Description: Awun +Added: 2009-07-29 +%% +Type: language +Subtag: awx +Description: Awara +Added: 2009-07-29 +%% +Type: language +Subtag: awy +Description: Edera Awyu +Added: 2009-07-29 +%% +Type: language +Subtag: axb +Description: Abipon +Added: 2009-07-29 +%% +Type: language +Subtag: axe +Description: Ayerrerenge +Added: 2012-08-12 +%% +Type: language +Subtag: axg +Description: Mato Grosso Arára +Added: 2009-07-29 +%% +Type: language +Subtag: axk +Description: Yaka (Central African Republic) +Added: 2009-07-29 +%% +Type: language +Subtag: axm +Description: Middle Armenian +Added: 2009-07-29 +%% +Type: language +Subtag: axx +Description: Xaragure +Added: 2009-07-29 +%% +Type: language +Subtag: aya +Description: Awar +Added: 2009-07-29 +%% +Type: language +Subtag: ayb +Description: Ayizo Gbe +Added: 2009-07-29 +%% +Type: language +Subtag: ayc +Description: Southern Aymara +Added: 2009-07-29 +Macrolanguage: ay +%% +Type: language +Subtag: ayd +Description: Ayabadhu +Added: 2009-07-29 +%% +Type: language +Subtag: aye +Description: Ayere +Added: 2009-07-29 +%% +Type: language +Subtag: ayg +Description: Ginyanga +Added: 2009-07-29 +%% +Type: language +Subtag: ayh +Description: Hadrami Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: ayi +Description: Leyigha +Added: 2009-07-29 +%% +Type: language +Subtag: ayk +Description: Akuku +Added: 2009-07-29 +%% +Type: language +Subtag: ayl +Description: Libyan Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: ayn +Description: Sanaani Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: ayo +Description: Ayoreo +Added: 2009-07-29 +%% +Type: language +Subtag: ayp +Description: North Mesopotamian Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: ayq +Description: Ayi (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: ayr +Description: Central Aymara +Added: 2009-07-29 +Macrolanguage: ay +%% +Type: language +Subtag: ays +Description: Sorsogon Ayta +Added: 2009-07-29 +%% +Type: language +Subtag: ayt +Description: Magbukun Ayta +Added: 2009-07-29 +%% +Type: language +Subtag: ayu +Description: Ayu +Added: 2009-07-29 +%% +Type: language +Subtag: ayx +Description: Ayi (China) +Added: 2009-07-29 +Deprecated: 2011-08-16 +Preferred-Value: nun +%% +Type: language +Subtag: ayy +Description: Tayabas Ayta +Added: 2009-07-29 +%% +Type: language +Subtag: ayz +Description: Mai Brat +Added: 2009-07-29 +%% +Type: language +Subtag: aza +Description: Azha +Added: 2009-07-29 +%% +Type: language +Subtag: azb +Description: South Azerbaijani +Added: 2009-07-29 +Macrolanguage: az +%% +Type: language +Subtag: azc +Description: Uto-Aztecan languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: azd +Description: Eastern Durango Nahuatl +Added: 2012-08-12 +%% +Type: language +Subtag: azg +Description: San Pedro Amuzgos Amuzgo +Added: 2009-07-29 +%% +Type: language +Subtag: azj +Description: North Azerbaijani +Added: 2009-07-29 +Macrolanguage: az +%% +Type: language +Subtag: azm +Description: Ipalapa Amuzgo +Added: 2009-07-29 +%% +Type: language +Subtag: azn +Description: Western Durango Nahuatl +Added: 2012-08-12 +%% +Type: language +Subtag: azo +Description: Awing +Added: 2009-07-29 +%% +Type: language +Subtag: azt +Description: Faire Atta +Added: 2009-07-29 +%% +Type: language +Subtag: azz +Description: Highland Puebla Nahuatl +Added: 2009-07-29 +%% +Type: language +Subtag: baa +Description: Babatana +Added: 2009-07-29 +%% +Type: language +Subtag: bab +Description: Bainouk-Gunyuño +Added: 2009-07-29 +%% +Type: language +Subtag: bac +Description: Badui +Added: 2009-07-29 +%% +Type: language +Subtag: bad +Description: Banda languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: bae +Description: Baré +Added: 2009-07-29 +%% +Type: language +Subtag: baf +Description: Nubaca +Added: 2009-07-29 +%% +Type: language +Subtag: bag +Description: Tuki +Added: 2009-07-29 +%% +Type: language +Subtag: bah +Description: Bahamas Creole English +Added: 2009-07-29 +%% +Type: language +Subtag: bai +Description: Bamileke languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: baj +Description: Barakai +Added: 2009-07-29 +%% +Type: language +Subtag: bal +Description: Baluchi +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: ban +Description: Balinese +Added: 2005-10-16 +%% +Type: language +Subtag: bao +Description: Waimaha +Added: 2009-07-29 +%% +Type: language +Subtag: bap +Description: Bantawa +Added: 2009-07-29 +%% +Type: language +Subtag: bar +Description: Bavarian +Added: 2009-07-29 +%% +Type: language +Subtag: bas +Description: Basa (Cameroon) +Added: 2005-10-16 +%% +Type: language +Subtag: bat +Description: Baltic languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: bau +Description: Bada (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: bav +Description: Vengo +Added: 2009-07-29 +%% +Type: language +Subtag: baw +Description: Bambili-Bambui +Added: 2009-07-29 +%% +Type: language +Subtag: bax +Description: Bamun +Added: 2009-07-29 +%% +Type: language +Subtag: bay +Description: Batuley +Added: 2009-07-29 +%% +Type: language +Subtag: baz +Description: Tunen +Added: 2009-07-29 +Deprecated: 2012-08-12 +Comments: see nvo, tvu +%% +Type: language +Subtag: bba +Description: Baatonum +Added: 2009-07-29 +%% +Type: language +Subtag: bbb +Description: Barai +Added: 2009-07-29 +%% +Type: language +Subtag: bbc +Description: Batak Toba +Added: 2009-07-29 +%% +Type: language +Subtag: bbd +Description: Bau +Added: 2009-07-29 +%% +Type: language +Subtag: bbe +Description: Bangba +Added: 2009-07-29 +%% +Type: language +Subtag: bbf +Description: Baibai +Added: 2009-07-29 +%% +Type: language +Subtag: bbg +Description: Barama +Added: 2009-07-29 +%% +Type: language +Subtag: bbh +Description: Bugan +Added: 2009-07-29 +%% +Type: language +Subtag: bbi +Description: Barombi +Added: 2009-07-29 +%% +Type: language +Subtag: bbj +Description: Ghomálá' +Added: 2009-07-29 +%% +Type: language +Subtag: bbk +Description: Babanki +Added: 2009-07-29 +%% +Type: language +Subtag: bbl +Description: Bats +Added: 2009-07-29 +%% +Type: language +Subtag: bbm +Description: Babango +Added: 2009-07-29 +%% +Type: language +Subtag: bbn +Description: Uneapa +Added: 2009-07-29 +%% +Type: language +Subtag: bbo +Description: Northern Bobo Madaré +Description: Konabéré +Added: 2009-07-29 +%% +Type: language +Subtag: bbp +Description: West Central Banda +Added: 2009-07-29 +%% +Type: language +Subtag: bbq +Description: Bamali +Added: 2009-07-29 +%% +Type: language +Subtag: bbr +Description: Girawa +Added: 2009-07-29 +%% +Type: language +Subtag: bbs +Description: Bakpinka +Added: 2009-07-29 +%% +Type: language +Subtag: bbt +Description: Mburku +Added: 2009-07-29 +%% +Type: language +Subtag: bbu +Description: Kulung (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: bbv +Description: Karnai +Added: 2009-07-29 +%% +Type: language +Subtag: bbw +Description: Baba +Added: 2009-07-29 +%% +Type: language +Subtag: bbx +Description: Bubia +Added: 2009-07-29 +%% +Type: language +Subtag: bby +Description: Befang +Added: 2009-07-29 +%% +Type: language +Subtag: bbz +Description: Babalia Creole Arabic +Added: 2009-07-29 +Macrolanguage: ar +%% +Type: language +Subtag: bca +Description: Central Bai +Added: 2009-07-29 +%% +Type: language +Subtag: bcb +Description: Bainouk-Samik +Added: 2009-07-29 +%% +Type: language +Subtag: bcc +Description: Southern Balochi +Added: 2009-07-29 +Macrolanguage: bal +%% +Type: language +Subtag: bcd +Description: North Babar +Added: 2009-07-29 +%% +Type: language +Subtag: bce +Description: Bamenyam +Added: 2009-07-29 +%% +Type: language +Subtag: bcf +Description: Bamu +Added: 2009-07-29 +%% +Type: language +Subtag: bcg +Description: Baga Binari +Added: 2009-07-29 +%% +Type: language +Subtag: bch +Description: Bariai +Added: 2009-07-29 +%% +Type: language +Subtag: bci +Description: Baoulé +Added: 2009-07-29 +%% +Type: language +Subtag: bcj +Description: Bardi +Added: 2009-07-29 +%% +Type: language +Subtag: bck +Description: Bunaba +Added: 2009-07-29 +%% +Type: language +Subtag: bcl +Description: Central Bikol +Added: 2009-07-29 +Macrolanguage: bik +%% +Type: language +Subtag: bcm +Description: Bannoni +Added: 2009-07-29 +%% +Type: language +Subtag: bcn +Description: Bali (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: bco +Description: Kaluli +Added: 2009-07-29 +%% +Type: language +Subtag: bcp +Description: Bali (Democratic Republic of Congo) +Added: 2009-07-29 +%% +Type: language +Subtag: bcq +Description: Bench +Added: 2009-07-29 +%% +Type: language +Subtag: bcr +Description: Babine +Added: 2009-07-29 +%% +Type: language +Subtag: bcs +Description: Kohumono +Added: 2009-07-29 +%% +Type: language +Subtag: bct +Description: Bendi +Added: 2009-07-29 +%% +Type: language +Subtag: bcu +Description: Awad Bing +Added: 2009-07-29 +%% +Type: language +Subtag: bcv +Description: Shoo-Minda-Nye +Added: 2009-07-29 +%% +Type: language +Subtag: bcw +Description: Bana +Added: 2009-07-29 +%% +Type: language +Subtag: bcy +Description: Bacama +Added: 2009-07-29 +%% +Type: language +Subtag: bcz +Description: Bainouk-Gunyaamolo +Added: 2009-07-29 +%% +Type: language +Subtag: bda +Description: Bayot +Added: 2009-07-29 +%% +Type: language +Subtag: bdb +Description: Basap +Added: 2009-07-29 +%% +Type: language +Subtag: bdc +Description: Emberá-Baudó +Added: 2009-07-29 +%% +Type: language +Subtag: bdd +Description: Bunama +Added: 2009-07-29 +%% +Type: language +Subtag: bde +Description: Bade +Added: 2009-07-29 +%% +Type: language +Subtag: bdf +Description: Biage +Added: 2010-03-11 +%% +Type: language +Subtag: bdg +Description: Bonggi +Added: 2009-07-29 +%% +Type: language +Subtag: bdh +Description: Baka (Sudan) +Added: 2009-07-29 +%% +Type: language +Subtag: bdi +Description: Burun +Added: 2009-07-29 +%% +Type: language +Subtag: bdj +Description: Bai +Added: 2009-07-29 +%% +Type: language +Subtag: bdk +Description: Budukh +Added: 2009-07-29 +%% +Type: language +Subtag: bdl +Description: Indonesian Bajau +Added: 2009-07-29 +%% +Type: language +Subtag: bdm +Description: Buduma +Added: 2009-07-29 +%% +Type: language +Subtag: bdn +Description: Baldemu +Added: 2009-07-29 +%% +Type: language +Subtag: bdo +Description: Morom +Added: 2009-07-29 +%% +Type: language +Subtag: bdp +Description: Bende +Added: 2009-07-29 +%% +Type: language +Subtag: bdq +Description: Bahnar +Added: 2009-07-29 +%% +Type: language +Subtag: bdr +Description: West Coast Bajau +Added: 2009-07-29 +%% +Type: language +Subtag: bds +Description: Burunge +Added: 2009-07-29 +%% +Type: language +Subtag: bdt +Description: Bokoto +Added: 2009-07-29 +Macrolanguage: gba +%% +Type: language +Subtag: bdu +Description: Oroko +Added: 2009-07-29 +%% +Type: language +Subtag: bdv +Description: Bodo Parja +Added: 2009-07-29 +%% +Type: language +Subtag: bdw +Description: Baham +Added: 2009-07-29 +%% +Type: language +Subtag: bdx +Description: Budong-Budong +Added: 2009-07-29 +%% +Type: language +Subtag: bdy +Description: Bandjalang +Added: 2009-07-29 +%% +Type: language +Subtag: bdz +Description: Badeshi +Added: 2009-07-29 +%% +Type: language +Subtag: bea +Description: Beaver +Added: 2009-07-29 +%% +Type: language +Subtag: beb +Description: Bebele +Added: 2009-07-29 +%% +Type: language +Subtag: bec +Description: Iceve-Maci +Added: 2009-07-29 +%% +Type: language +Subtag: bed +Description: Bedoanas +Added: 2009-07-29 +%% +Type: language +Subtag: bee +Description: Byangsi +Added: 2009-07-29 +%% +Type: language +Subtag: bef +Description: Benabena +Added: 2009-07-29 +%% +Type: language +Subtag: beg +Description: Belait +Added: 2009-07-29 +%% +Type: language +Subtag: beh +Description: Biali +Added: 2009-07-29 +%% +Type: language +Subtag: bei +Description: Bekati' +Added: 2009-07-29 +%% +Type: language +Subtag: bej +Description: Beja +Description: Bedawiyet +Added: 2005-10-16 +%% +Type: language +Subtag: bek +Description: Bebeli +Added: 2009-07-29 +%% +Type: language +Subtag: bem +Description: Bemba (Zambia) +Added: 2005-10-16 +%% +Type: language +Subtag: beo +Description: Beami +Added: 2009-07-29 +%% +Type: language +Subtag: bep +Description: Besoa +Added: 2009-07-29 +%% +Type: language +Subtag: beq +Description: Beembe +Added: 2009-07-29 +%% +Type: language +Subtag: ber +Description: Berber languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: bes +Description: Besme +Added: 2009-07-29 +%% +Type: language +Subtag: bet +Description: Guiberoua Béte +Added: 2009-07-29 +%% +Type: language +Subtag: beu +Description: Blagar +Added: 2009-07-29 +%% +Type: language +Subtag: bev +Description: Daloa Bété +Added: 2009-07-29 +%% +Type: language +Subtag: bew +Description: Betawi +Added: 2009-07-29 +%% +Type: language +Subtag: bex +Description: Jur Modo +Added: 2009-07-29 +%% +Type: language +Subtag: bey +Description: Beli (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: bez +Description: Bena (Tanzania) +Added: 2009-07-29 +%% +Type: language +Subtag: bfa +Description: Bari +Added: 2009-07-29 +%% +Type: language +Subtag: bfb +Description: Pauri Bareli +Added: 2009-07-29 +%% +Type: language +Subtag: bfc +Description: Northern Bai +Added: 2009-07-29 +%% +Type: language +Subtag: bfd +Description: Bafut +Added: 2009-07-29 +%% +Type: language +Subtag: bfe +Description: Betaf +Description: Tena +Added: 2009-07-29 +%% +Type: language +Subtag: bff +Description: Bofi +Added: 2009-07-29 +%% +Type: language +Subtag: bfg +Description: Busang Kayan +Added: 2009-07-29 +%% +Type: language +Subtag: bfh +Description: Blafe +Added: 2009-07-29 +%% +Type: language +Subtag: bfi +Description: British Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: bfj +Description: Bafanji +Added: 2009-07-29 +%% +Type: language +Subtag: bfk +Description: Ban Khor Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: bfl +Description: Banda-Ndélé +Added: 2009-07-29 +%% +Type: language +Subtag: bfm +Description: Mmen +Added: 2009-07-29 +%% +Type: language +Subtag: bfn +Description: Bunak +Added: 2009-07-29 +%% +Type: language +Subtag: bfo +Description: Malba Birifor +Added: 2009-07-29 +%% +Type: language +Subtag: bfp +Description: Beba +Added: 2009-07-29 +%% +Type: language +Subtag: bfq +Description: Badaga +Added: 2009-07-29 +%% +Type: language +Subtag: bfr +Description: Bazigar +Added: 2009-07-29 +%% +Type: language +Subtag: bfs +Description: Southern Bai +Added: 2009-07-29 +%% +Type: language +Subtag: bft +Description: Balti +Added: 2009-07-29 +%% +Type: language +Subtag: bfu +Description: Gahri +Added: 2009-07-29 +%% +Type: language +Subtag: bfw +Description: Bondo +Added: 2009-07-29 +%% +Type: language +Subtag: bfx +Description: Bantayanon +Added: 2010-03-11 +%% +Type: language +Subtag: bfy +Description: Bagheli +Added: 2009-07-29 +%% +Type: language +Subtag: bfz +Description: Mahasu Pahari +Added: 2009-07-29 +%% +Type: language +Subtag: bga +Description: Gwamhi-Wuri +Added: 2009-07-29 +%% +Type: language +Subtag: bgb +Description: Bobongko +Added: 2009-07-29 +%% +Type: language +Subtag: bgc +Description: Haryanvi +Added: 2009-07-29 +%% +Type: language +Subtag: bgd +Description: Rathwi Bareli +Added: 2009-07-29 +%% +Type: language +Subtag: bge +Description: Bauria +Added: 2009-07-29 +%% +Type: language +Subtag: bgf +Description: Bangandu +Added: 2009-07-29 +%% +Type: language +Subtag: bgg +Description: Bugun +Added: 2009-07-29 +%% +Type: language +Subtag: bgi +Description: Giangan +Added: 2009-07-29 +%% +Type: language +Subtag: bgj +Description: Bangolan +Added: 2009-07-29 +%% +Type: language +Subtag: bgk +Description: Bit +Description: Buxinhua +Added: 2009-07-29 +%% +Type: language +Subtag: bgl +Description: Bo (Laos) +Added: 2009-07-29 +%% +Type: language +Subtag: bgm +Description: Baga Mboteni +Added: 2009-07-29 +%% +Type: language +Subtag: bgn +Description: Western Balochi +Added: 2009-07-29 +Macrolanguage: bal +%% +Type: language +Subtag: bgo +Description: Baga Koga +Added: 2009-07-29 +%% +Type: language +Subtag: bgp +Description: Eastern Balochi +Added: 2009-07-29 +Macrolanguage: bal +%% +Type: language +Subtag: bgq +Description: Bagri +Added: 2009-07-29 +Macrolanguage: raj +%% +Type: language +Subtag: bgr +Description: Bawm Chin +Added: 2009-07-29 +%% +Type: language +Subtag: bgs +Description: Tagabawa +Added: 2009-07-29 +%% +Type: language +Subtag: bgt +Description: Bughotu +Added: 2009-07-29 +%% +Type: language +Subtag: bgu +Description: Mbongno +Added: 2009-07-29 +%% +Type: language +Subtag: bgv +Description: Warkay-Bipim +Added: 2009-07-29 +%% +Type: language +Subtag: bgw +Description: Bhatri +Added: 2009-07-29 +%% +Type: language +Subtag: bgx +Description: Balkan Gagauz Turkish +Added: 2009-07-29 +%% +Type: language +Subtag: bgy +Description: Benggoi +Added: 2009-07-29 +%% +Type: language +Subtag: bgz +Description: Banggai +Added: 2009-07-29 +%% +Type: language +Subtag: bha +Description: Bharia +Added: 2009-07-29 +%% +Type: language +Subtag: bhb +Description: Bhili +Added: 2009-07-29 +%% +Type: language +Subtag: bhc +Description: Biga +Added: 2009-07-29 +%% +Type: language +Subtag: bhd +Description: Bhadrawahi +Added: 2009-07-29 +%% +Type: language +Subtag: bhe +Description: Bhaya +Added: 2009-07-29 +%% +Type: language +Subtag: bhf +Description: Odiai +Added: 2009-07-29 +%% +Type: language +Subtag: bhg +Description: Binandere +Added: 2009-07-29 +%% +Type: language +Subtag: bhh +Description: Bukharic +Added: 2009-07-29 +%% +Type: language +Subtag: bhi +Description: Bhilali +Added: 2009-07-29 +%% +Type: language +Subtag: bhj +Description: Bahing +Added: 2009-07-29 +%% +Type: language +Subtag: bhk +Description: Albay Bicolano +Added: 2009-07-29 +Deprecated: 2010-03-11 +Macrolanguage: bik +Comments: see fbl, lbl, rbl, ubl +%% +Type: language +Subtag: bhl +Description: Bimin +Added: 2009-07-29 +%% +Type: language +Subtag: bhm +Description: Bathari +Added: 2009-07-29 +%% +Type: language +Subtag: bhn +Description: Bohtan Neo-Aramaic +Added: 2009-07-29 +%% +Type: language +Subtag: bho +Description: Bhojpuri +Added: 2005-10-16 +%% +Type: language +Subtag: bhp +Description: Bima +Added: 2009-07-29 +%% +Type: language +Subtag: bhq +Description: Tukang Besi South +Added: 2009-07-29 +%% +Type: language +Subtag: bhr +Description: Bara Malagasy +Added: 2009-07-29 +Macrolanguage: mg +%% +Type: language +Subtag: bhs +Description: Buwal +Added: 2009-07-29 +%% +Type: language +Subtag: bht +Description: Bhattiyali +Added: 2009-07-29 +%% +Type: language +Subtag: bhu +Description: Bhunjia +Added: 2009-07-29 +%% +Type: language +Subtag: bhv +Description: Bahau +Added: 2009-07-29 +%% +Type: language +Subtag: bhw +Description: Biak +Added: 2009-07-29 +%% +Type: language +Subtag: bhx +Description: Bhalay +Added: 2009-07-29 +%% +Type: language +Subtag: bhy +Description: Bhele +Added: 2009-07-29 +%% +Type: language +Subtag: bhz +Description: Bada (Indonesia) +Added: 2009-07-29 +%% +Type: language +Subtag: bia +Description: Badimaya +Added: 2009-07-29 +%% +Type: language +Subtag: bib +Description: Bissa +Description: Bisa +Added: 2009-07-29 +%% +Type: language +Subtag: bic +Description: Bikaru +Added: 2009-07-29 +%% +Type: language +Subtag: bid +Description: Bidiyo +Added: 2009-07-29 +%% +Type: language +Subtag: bie +Description: Bepour +Added: 2009-07-29 +%% +Type: language +Subtag: bif +Description: Biafada +Added: 2009-07-29 +%% +Type: language +Subtag: big +Description: Biangai +Added: 2009-07-29 +%% +Type: language +Subtag: bij +Description: Vaghat-Ya-Bijim-Legeri +Added: 2009-07-29 +%% +Type: language +Subtag: bik +Description: Bikol +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: bil +Description: Bile +Added: 2009-07-29 +%% +Type: language +Subtag: bim +Description: Bimoba +Added: 2009-07-29 +%% +Type: language +Subtag: bin +Description: Bini +Description: Edo +Added: 2005-10-16 +%% +Type: language +Subtag: bio +Description: Nai +Added: 2009-07-29 +%% +Type: language +Subtag: bip +Description: Bila +Added: 2009-07-29 +%% +Type: language +Subtag: biq +Description: Bipi +Added: 2009-07-29 +%% +Type: language +Subtag: bir +Description: Bisorio +Added: 2009-07-29 +%% +Type: language +Subtag: bit +Description: Berinomo +Added: 2009-07-29 +%% +Type: language +Subtag: biu +Description: Biete +Added: 2009-07-29 +%% +Type: language +Subtag: biv +Description: Southern Birifor +Added: 2009-07-29 +%% +Type: language +Subtag: biw +Description: Kol (Cameroon) +Added: 2009-07-29 +%% +Type: language +Subtag: bix +Description: Bijori +Added: 2009-07-29 +%% +Type: language +Subtag: biy +Description: Birhor +Added: 2009-07-29 +%% +Type: language +Subtag: biz +Description: Baloi +Added: 2009-07-29 +%% +Type: language +Subtag: bja +Description: Budza +Added: 2009-07-29 +%% +Type: language +Subtag: bjb +Description: Banggarla +Added: 2009-07-29 +%% +Type: language +Subtag: bjc +Description: Bariji +Added: 2009-07-29 +%% +Type: language +Subtag: bjd +Description: Bandjigali +Added: 2009-07-29 +Deprecated: 2012-08-12 +Preferred-Value: drl +%% +Type: language +Subtag: bje +Description: Biao-Jiao Mien +Added: 2009-07-29 +%% +Type: language +Subtag: bjf +Description: Barzani Jewish Neo-Aramaic +Added: 2009-07-29 +%% +Type: language +Subtag: bjg +Description: Bidyogo +Added: 2009-07-29 +%% +Type: language +Subtag: bjh +Description: Bahinemo +Added: 2009-07-29 +%% +Type: language +Subtag: bji +Description: Burji +Added: 2009-07-29 +%% +Type: language +Subtag: bjj +Description: Kanauji +Added: 2009-07-29 +%% +Type: language +Subtag: bjk +Description: Barok +Added: 2009-07-29 +%% +Type: language +Subtag: bjl +Description: Bulu (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: bjm +Description: Bajelani +Added: 2009-07-29 +%% +Type: language +Subtag: bjn +Description: Banjar +Added: 2009-07-29 +Macrolanguage: ms +%% +Type: language +Subtag: bjo +Description: Mid-Southern Banda +Added: 2009-07-29 +%% +Type: language +Subtag: bjq +Description: Southern Betsimisaraka Malagasy +Added: 2009-07-29 +Deprecated: 2011-08-16 +Macrolanguage: mg +Comments: see bzc, tkg +%% +Type: language +Subtag: bjr +Description: Binumarien +Added: 2009-07-29 +%% +Type: language +Subtag: bjs +Description: Bajan +Added: 2009-07-29 +%% +Type: language +Subtag: bjt +Description: Balanta-Ganja +Added: 2009-07-29 +%% +Type: language +Subtag: bju +Description: Busuu +Added: 2009-07-29 +%% +Type: language +Subtag: bjv +Description: Bedjond +Added: 2009-07-29 +%% +Type: language +Subtag: bjw +Description: Bakwé +Added: 2009-07-29 +%% +Type: language +Subtag: bjx +Description: Banao Itneg +Added: 2009-07-29 +%% +Type: language +Subtag: bjy +Description: Bayali +Added: 2009-07-29 +%% +Type: language +Subtag: bjz +Description: Baruga +Added: 2009-07-29 +%% +Type: language +Subtag: bka +Description: Kyak +Added: 2009-07-29 +%% +Type: language +Subtag: bkb +Description: Finallig +Added: 2009-07-29 +Deprecated: 2010-03-11 +Comments: see ebk, obk +%% +Type: language +Subtag: bkc +Description: Baka (Cameroon) +Added: 2009-07-29 +%% +Type: language +Subtag: bkd +Description: Binukid +Description: Talaandig +Added: 2009-07-29 +%% +Type: language +Subtag: bkf +Description: Beeke +Added: 2009-07-29 +%% +Type: language +Subtag: bkg +Description: Buraka +Added: 2009-07-29 +%% +Type: language +Subtag: bkh +Description: Bakoko +Added: 2009-07-29 +%% +Type: language +Subtag: bki +Description: Baki +Added: 2009-07-29 +%% +Type: language +Subtag: bkj +Description: Pande +Added: 2009-07-29 +%% +Type: language +Subtag: bkk +Description: Brokskat +Added: 2009-07-29 +%% +Type: language +Subtag: bkl +Description: Berik +Added: 2009-07-29 +%% +Type: language +Subtag: bkm +Description: Kom (Cameroon) +Added: 2009-07-29 +%% +Type: language +Subtag: bkn +Description: Bukitan +Added: 2009-07-29 +%% +Type: language +Subtag: bko +Description: Kwa' +Added: 2009-07-29 +%% +Type: language +Subtag: bkp +Description: Boko (Democratic Republic of Congo) +Added: 2009-07-29 +%% +Type: language +Subtag: bkq +Description: Bakairí +Added: 2009-07-29 +%% +Type: language +Subtag: bkr +Description: Bakumpai +Added: 2009-07-29 +%% +Type: language +Subtag: bks +Description: Northern Sorsoganon +Added: 2009-07-29 +%% +Type: language +Subtag: bkt +Description: Boloki +Added: 2009-07-29 +%% +Type: language +Subtag: bku +Description: Buhid +Added: 2009-07-29 +%% +Type: language +Subtag: bkv +Description: Bekwarra +Added: 2009-07-29 +%% +Type: language +Subtag: bkw +Description: Bekwel +Added: 2009-07-29 +%% +Type: language +Subtag: bkx +Description: Baikeno +Added: 2009-07-29 +%% +Type: language +Subtag: bky +Description: Bokyi +Added: 2009-07-29 +%% +Type: language +Subtag: bkz +Description: Bungku +Added: 2009-07-29 +%% +Type: language +Subtag: bla +Description: Siksika +Added: 2005-10-16 +%% +Type: language +Subtag: blb +Description: Bilua +Added: 2009-07-29 +%% +Type: language +Subtag: blc +Description: Bella Coola +Added: 2009-07-29 +%% +Type: language +Subtag: bld +Description: Bolango +Added: 2009-07-29 +%% +Type: language +Subtag: ble +Description: Balanta-Kentohe +Added: 2009-07-29 +%% +Type: language +Subtag: blf +Description: Buol +Added: 2009-07-29 +%% +Type: language +Subtag: blg +Description: Balau +Added: 2009-07-29 +%% +Type: language +Subtag: blh +Description: Kuwaa +Added: 2009-07-29 +%% +Type: language +Subtag: bli +Description: Bolia +Added: 2009-07-29 +%% +Type: language +Subtag: blj +Description: Bolongan +Added: 2009-07-29 +%% +Type: language +Subtag: blk +Description: Pa'o Karen +Description: Pa'O +Added: 2009-07-29 +%% +Type: language +Subtag: bll +Description: Biloxi +Added: 2009-07-29 +%% +Type: language +Subtag: blm +Description: Beli (Sudan) +Added: 2009-07-29 +%% +Type: language +Subtag: bln +Description: Southern Catanduanes Bikol +Added: 2009-07-29 +Macrolanguage: bik +%% +Type: language +Subtag: blo +Description: Anii +Added: 2009-07-29 +%% +Type: language +Subtag: blp +Description: Blablanga +Added: 2009-07-29 +%% +Type: language +Subtag: blq +Description: Baluan-Pam +Added: 2009-07-29 +%% +Type: language +Subtag: blr +Description: Blang +Added: 2009-07-29 +%% +Type: language +Subtag: bls +Description: Balaesang +Added: 2009-07-29 +%% +Type: language +Subtag: blt +Description: Tai Dam +Added: 2009-07-29 +%% +Type: language +Subtag: blv +Description: Bolo +Added: 2009-07-29 +%% +Type: language +Subtag: blw +Description: Balangao +Added: 2009-07-29 +%% +Type: language +Subtag: blx +Description: Mag-Indi Ayta +Added: 2009-07-29 +%% +Type: language +Subtag: bly +Description: Notre +Added: 2009-07-29 +%% +Type: language +Subtag: blz +Description: Balantak +Added: 2009-07-29 +%% +Type: language +Subtag: bma +Description: Lame +Added: 2009-07-29 +%% +Type: language +Subtag: bmb +Description: Bembe +Added: 2009-07-29 +%% +Type: language +Subtag: bmc +Description: Biem +Added: 2009-07-29 +%% +Type: language +Subtag: bmd +Description: Baga Manduri +Added: 2009-07-29 +%% +Type: language +Subtag: bme +Description: Limassa +Added: 2009-07-29 +%% +Type: language +Subtag: bmf +Description: Bom +Added: 2009-07-29 +%% +Type: language +Subtag: bmg +Description: Bamwe +Added: 2009-07-29 +%% +Type: language +Subtag: bmh +Description: Kein +Added: 2009-07-29 +%% +Type: language +Subtag: bmi +Description: Bagirmi +Added: 2009-07-29 +%% +Type: language +Subtag: bmj +Description: Bote-Majhi +Added: 2009-07-29 +%% +Type: language +Subtag: bmk +Description: Ghayavi +Added: 2009-07-29 +%% +Type: language +Subtag: bml +Description: Bomboli +Added: 2009-07-29 +%% +Type: language +Subtag: bmm +Description: Northern Betsimisaraka Malagasy +Added: 2009-07-29 +Macrolanguage: mg +%% +Type: language +Subtag: bmn +Description: Bina (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: bmo +Description: Bambalang +Added: 2009-07-29 +%% +Type: language +Subtag: bmp +Description: Bulgebi +Added: 2009-07-29 +%% +Type: language +Subtag: bmq +Description: Bomu +Added: 2009-07-29 +%% +Type: language +Subtag: bmr +Description: Muinane +Added: 2009-07-29 +%% +Type: language +Subtag: bms +Description: Bilma Kanuri +Added: 2009-07-29 +%% +Type: language +Subtag: bmt +Description: Biao Mon +Added: 2009-07-29 +%% +Type: language +Subtag: bmu +Description: Somba-Siawari +Added: 2009-07-29 +%% +Type: language +Subtag: bmv +Description: Bum +Added: 2009-07-29 +%% +Type: language +Subtag: bmw +Description: Bomwali +Added: 2009-07-29 +%% +Type: language +Subtag: bmx +Description: Baimak +Added: 2009-07-29 +%% +Type: language +Subtag: bmy +Description: Bemba (Democratic Republic of Congo) +Added: 2009-07-29 +%% +Type: language +Subtag: bmz +Description: Baramu +Added: 2009-07-29 +%% +Type: language +Subtag: bna +Description: Bonerate +Added: 2009-07-29 +%% +Type: language +Subtag: bnb +Description: Bookan +Added: 2009-07-29 +%% +Type: language +Subtag: bnc +Description: Bontok +Added: 2009-07-29 +Scope: macrolanguage +%% +Type: language +Subtag: bnd +Description: Banda (Indonesia) +Added: 2009-07-29 +%% +Type: language +Subtag: bne +Description: Bintauna +Added: 2009-07-29 +%% +Type: language +Subtag: bnf +Description: Masiwang +Added: 2009-07-29 +%% +Type: language +Subtag: bng +Description: Benga +Added: 2009-07-29 +%% +Type: language +Subtag: bni +Description: Bangi +Added: 2009-07-29 +%% +Type: language +Subtag: bnj +Description: Eastern Tawbuid +Added: 2009-07-29 +%% +Type: language +Subtag: bnk +Description: Bierebo +Added: 2009-07-29 +%% +Type: language +Subtag: bnl +Description: Boon +Added: 2009-07-29 +%% +Type: language +Subtag: bnm +Description: Batanga +Added: 2009-07-29 +%% +Type: language +Subtag: bnn +Description: Bunun +Added: 2009-07-29 +%% +Type: language +Subtag: bno +Description: Bantoanon +Added: 2009-07-29 +%% +Type: language +Subtag: bnp +Description: Bola +Added: 2009-07-29 +%% +Type: language +Subtag: bnq +Description: Bantik +Added: 2009-07-29 +%% +Type: language +Subtag: bnr +Description: Butmas-Tur +Added: 2009-07-29 +%% +Type: language +Subtag: bns +Description: Bundeli +Added: 2009-07-29 +%% +Type: language +Subtag: bnt +Description: Bantu languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: bnu +Description: Bentong +Added: 2009-07-29 +%% +Type: language +Subtag: bnv +Description: Bonerif +Description: Beneraf +Description: Edwas +Added: 2009-07-29 +%% +Type: language +Subtag: bnw +Description: Bisis +Added: 2009-07-29 +%% +Type: language +Subtag: bnx +Description: Bangubangu +Added: 2009-07-29 +%% +Type: language +Subtag: bny +Description: Bintulu +Added: 2009-07-29 +%% +Type: language +Subtag: bnz +Description: Beezen +Added: 2009-07-29 +%% +Type: language +Subtag: boa +Description: Bora +Added: 2009-07-29 +%% +Type: language +Subtag: bob +Description: Aweer +Added: 2009-07-29 +%% +Type: language +Subtag: boe +Description: Mundabli +Added: 2009-07-29 +%% +Type: language +Subtag: bof +Description: Bolon +Added: 2009-07-29 +%% +Type: language +Subtag: bog +Description: Bamako Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: boh +Description: Boma +Added: 2009-07-29 +%% +Type: language +Subtag: boi +Description: Barbareño +Added: 2009-07-29 +%% +Type: language +Subtag: boj +Description: Anjam +Added: 2009-07-29 +%% +Type: language +Subtag: bok +Description: Bonjo +Added: 2009-07-29 +%% +Type: language +Subtag: bol +Description: Bole +Added: 2009-07-29 +%% +Type: language +Subtag: bom +Description: Berom +Added: 2009-07-29 +%% +Type: language +Subtag: bon +Description: Bine +Added: 2009-07-29 +%% +Type: language +Subtag: boo +Description: Tiemacèwè Bozo +Added: 2009-07-29 +%% +Type: language +Subtag: bop +Description: Bonkiman +Added: 2009-07-29 +%% +Type: language +Subtag: boq +Description: Bogaya +Added: 2009-07-29 +%% +Type: language +Subtag: bor +Description: Borôro +Added: 2009-07-29 +%% +Type: language +Subtag: bot +Description: Bongo +Added: 2009-07-29 +%% +Type: language +Subtag: bou +Description: Bondei +Added: 2009-07-29 +%% +Type: language +Subtag: bov +Description: Tuwuli +Added: 2009-07-29 +%% +Type: language +Subtag: bow +Description: Rema +Added: 2009-07-29 +%% +Type: language +Subtag: box +Description: Buamu +Added: 2009-07-29 +%% +Type: language +Subtag: boy +Description: Bodo (Central African Republic) +Added: 2009-07-29 +%% +Type: language +Subtag: boz +Description: Tiéyaxo Bozo +Added: 2009-07-29 +%% +Type: language +Subtag: bpa +Description: Dakaka +Added: 2009-07-29 +%% +Type: language +Subtag: bpb +Description: Barbacoas +Added: 2009-07-29 +%% +Type: language +Subtag: bpd +Description: Banda-Banda +Added: 2009-07-29 +%% +Type: language +Subtag: bpg +Description: Bonggo +Added: 2009-07-29 +%% +Type: language +Subtag: bph +Description: Botlikh +Added: 2009-07-29 +%% +Type: language +Subtag: bpi +Description: Bagupi +Added: 2009-07-29 +%% +Type: language +Subtag: bpj +Description: Binji +Added: 2009-07-29 +%% +Type: language +Subtag: bpk +Description: Orowe +Added: 2009-07-29 +%% +Type: language +Subtag: bpl +Description: Broome Pearling Lugger Pidgin +Added: 2009-07-29 +%% +Type: language +Subtag: bpm +Description: Biyom +Added: 2009-07-29 +%% +Type: language +Subtag: bpn +Description: Dzao Min +Added: 2009-07-29 +%% +Type: language +Subtag: bpo +Description: Anasi +Added: 2009-07-29 +%% +Type: language +Subtag: bpp +Description: Kaure +Added: 2009-07-29 +%% +Type: language +Subtag: bpq +Description: Banda Malay +Added: 2009-07-29 +%% +Type: language +Subtag: bpr +Description: Koronadal Blaan +Added: 2009-07-29 +%% +Type: language +Subtag: bps +Description: Sarangani Blaan +Added: 2009-07-29 +%% +Type: language +Subtag: bpt +Description: Barrow Point +Added: 2009-07-29 +%% +Type: language +Subtag: bpu +Description: Bongu +Added: 2009-07-29 +%% +Type: language +Subtag: bpv +Description: Bian Marind +Added: 2009-07-29 +%% +Type: language +Subtag: bpw +Description: Bo (Papua New Guinea) +Added: 2009-07-29 +%% +Type: language +Subtag: bpx +Description: Palya Bareli +Added: 2009-07-29 +%% +Type: language +Subtag: bpy +Description: Bishnupriya +Added: 2009-07-29 +%% +Type: language +Subtag: bpz +Description: Bilba +Added: 2009-07-29 +%% +Type: language +Subtag: bqa +Description: Tchumbuli +Added: 2009-07-29 +%% +Type: language +Subtag: bqb +Description: Bagusa +Added: 2009-07-29 +%% +Type: language +Subtag: bqc +Description: Boko (Benin) +Added: 2009-07-29 +%% +Type: language +Subtag: bqd +Description: Bung +Added: 2009-07-29 +%% +Type: language +Subtag: bqf +Description: Baga Kaloum +Added: 2009-07-29 +%% +Type: language +Subtag: bqg +Description: Bago-Kusuntu +Added: 2009-07-29 +%% +Type: language +Subtag: bqh +Description: Baima +Added: 2009-07-29 +%% +Type: language +Subtag: bqi +Description: Bakhtiari +Added: 2009-07-29 +%% +Type: language +Subtag: bqj +Description: Bandial +Added: 2009-07-29 +%% +Type: language +Subtag: bqk +Description: Banda-Mbrès +Added: 2009-07-29 +%% +Type: language +Subtag: bql +Description: Bilakura +Added: 2009-07-29 +%% +Type: language +Subtag: bqm +Description: Wumboko +Added: 2009-07-29 +%% +Type: language +Subtag: bqn +Description: Bulgarian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: bqo +Description: Balo +Added: 2009-07-29 +%% +Type: language +Subtag: bqp +Description: Busa +Added: 2009-07-29 +%% +Type: language +Subtag: bqq +Description: Biritai +Added: 2009-07-29 +%% +Type: language +Subtag: bqr +Description: Burusu +Added: 2009-07-29 +%% +Type: language +Subtag: bqs +Description: Bosngun +Added: 2009-07-29 +%% +Type: language +Subtag: bqt +Description: Bamukumbit +Added: 2009-07-29 +%% +Type: language +Subtag: bqu +Description: Boguru +Added: 2009-07-29 +%% +Type: language +Subtag: bqv +Description: Koro Wachi +Description: Begbere-Ejar +Added: 2009-07-29 +%% +Type: language +Subtag: bqw +Description: Buru (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: bqx +Description: Baangi +Added: 2009-07-29 +%% +Type: language +Subtag: bqy +Description: Bengkala Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: bqz +Description: Bakaka +Added: 2009-07-29 +%% +Type: language +Subtag: bra +Description: Braj +Added: 2005-10-16 +%% +Type: language +Subtag: brb +Description: Lave +Added: 2009-07-29 +%% +Type: language +Subtag: brc +Description: Berbice Creole Dutch +Added: 2009-07-29 +%% +Type: language +Subtag: brd +Description: Baraamu +Added: 2009-07-29 +%% +Type: language +Subtag: brf +Description: Bera +Added: 2009-07-29 +%% +Type: language +Subtag: brg +Description: Baure +Added: 2009-07-29 +%% +Type: language +Subtag: brh +Description: Brahui +Added: 2009-07-29 +%% +Type: language +Subtag: bri +Description: Mokpwe +Added: 2009-07-29 +%% +Type: language +Subtag: brj +Description: Bieria +Added: 2009-07-29 +%% +Type: language +Subtag: brk +Description: Birked +Added: 2009-07-29 +%% +Type: language +Subtag: brl +Description: Birwa +Added: 2009-07-29 +%% +Type: language +Subtag: brm +Description: Barambu +Added: 2009-07-29 +%% +Type: language +Subtag: brn +Description: Boruca +Added: 2009-07-29 +%% +Type: language +Subtag: bro +Description: Brokkat +Added: 2009-07-29 +%% +Type: language +Subtag: brp +Description: Barapasi +Added: 2009-07-29 +%% +Type: language +Subtag: brq +Description: Breri +Added: 2009-07-29 +%% +Type: language +Subtag: brr +Description: Birao +Added: 2009-07-29 +%% +Type: language +Subtag: brs +Description: Baras +Added: 2009-07-29 +%% +Type: language +Subtag: brt +Description: Bitare +Added: 2009-07-29 +%% +Type: language +Subtag: bru +Description: Eastern Bru +Added: 2009-07-29 +%% +Type: language +Subtag: brv +Description: Western Bru +Added: 2009-07-29 +%% +Type: language +Subtag: brw +Description: Bellari +Added: 2009-07-29 +%% +Type: language +Subtag: brx +Description: Bodo (India) +Added: 2009-07-29 +%% +Type: language +Subtag: bry +Description: Burui +Added: 2009-07-29 +%% +Type: language +Subtag: brz +Description: Bilbil +Added: 2009-07-29 +%% +Type: language +Subtag: bsa +Description: Abinomn +Added: 2009-07-29 +%% +Type: language +Subtag: bsb +Description: Brunei Bisaya +Added: 2009-07-29 +%% +Type: language +Subtag: bsc +Description: Bassari +Description: Oniyan +Added: 2009-07-29 +%% +Type: language +Subtag: bse +Description: Wushi +Added: 2009-07-29 +%% +Type: language +Subtag: bsf +Description: Bauchi +Added: 2009-07-29 +%% +Type: language +Subtag: bsg +Description: Bashkardi +Added: 2009-07-29 +%% +Type: language +Subtag: bsh +Description: Kati +Added: 2009-07-29 +%% +Type: language +Subtag: bsi +Description: Bassossi +Added: 2009-07-29 +%% +Type: language +Subtag: bsj +Description: Bangwinji +Added: 2009-07-29 +%% +Type: language +Subtag: bsk +Description: Burushaski +Added: 2009-07-29 +%% +Type: language +Subtag: bsl +Description: Basa-Gumna +Added: 2009-07-29 +%% +Type: language +Subtag: bsm +Description: Busami +Added: 2009-07-29 +%% +Type: language +Subtag: bsn +Description: Barasana-Eduria +Added: 2009-07-29 +%% +Type: language +Subtag: bso +Description: Buso +Added: 2009-07-29 +%% +Type: language +Subtag: bsp +Description: Baga Sitemu +Added: 2009-07-29 +%% +Type: language +Subtag: bsq +Description: Bassa +Added: 2009-07-29 +%% +Type: language +Subtag: bsr +Description: Bassa-Kontagora +Added: 2009-07-29 +%% +Type: language +Subtag: bss +Description: Akoose +Added: 2009-07-29 +%% +Type: language +Subtag: bst +Description: Basketo +Added: 2009-07-29 +%% +Type: language +Subtag: bsu +Description: Bahonsuai +Added: 2009-07-29 +%% +Type: language +Subtag: bsv +Description: Baga Sobané +Added: 2009-07-29 +%% +Type: language +Subtag: bsw +Description: Baiso +Added: 2009-07-29 +%% +Type: language +Subtag: bsx +Description: Yangkam +Added: 2009-07-29 +%% +Type: language +Subtag: bsy +Description: Sabah Bisaya +Added: 2009-07-29 +%% +Type: language +Subtag: bta +Description: Bata +Added: 2009-07-29 +%% +Type: language +Subtag: btb +Description: Beti (Cameroon) +Added: 2009-07-29 +Deprecated: 2010-03-11 +Comments: see beb, bum, bxp, eto, ewo, fan, mct +%% +Type: language +Subtag: btc +Description: Bati (Cameroon) +Added: 2009-07-29 +%% +Type: language +Subtag: btd +Description: Batak Dairi +Added: 2009-07-29 +%% +Type: language +Subtag: bte +Description: Gamo-Ningi +Added: 2009-07-29 +%% +Type: language +Subtag: btf +Description: Birgit +Added: 2009-07-29 +%% +Type: language +Subtag: btg +Description: Gagnoa Bété +Added: 2009-07-29 +%% +Type: language +Subtag: bth +Description: Biatah Bidayuh +Added: 2009-07-29 +%% +Type: language +Subtag: bti +Description: Burate +Added: 2009-07-29 +%% +Type: language +Subtag: btj +Description: Bacanese Malay +Added: 2009-07-29 +Macrolanguage: ms +%% +Type: language +Subtag: btk +Description: Batak languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: btl +Description: Bhatola +Added: 2009-07-29 +%% +Type: language +Subtag: btm +Description: Batak Mandailing +Added: 2009-07-29 +%% +Type: language +Subtag: btn +Description: Ratagnon +Added: 2009-07-29 +%% +Type: language +Subtag: bto +Description: Rinconada Bikol +Added: 2009-07-29 +Macrolanguage: bik +%% +Type: language +Subtag: btp +Description: Budibud +Added: 2009-07-29 +%% +Type: language +Subtag: btq +Description: Batek +Added: 2009-07-29 +%% +Type: language +Subtag: btr +Description: Baetora +Added: 2009-07-29 +%% +Type: language +Subtag: bts +Description: Batak Simalungun +Added: 2009-07-29 +%% +Type: language +Subtag: btt +Description: Bete-Bendi +Added: 2009-07-29 +%% +Type: language +Subtag: btu +Description: Batu +Added: 2009-07-29 +%% +Type: language +Subtag: btv +Description: Bateri +Added: 2009-07-29 +%% +Type: language +Subtag: btw +Description: Butuanon +Added: 2009-07-29 +%% +Type: language +Subtag: btx +Description: Batak Karo +Added: 2009-07-29 +%% +Type: language +Subtag: bty +Description: Bobot +Added: 2009-07-29 +%% +Type: language +Subtag: btz +Description: Batak Alas-Kluet +Added: 2009-07-29 +%% +Type: language +Subtag: bua +Description: Buriat +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: bub +Description: Bua +Added: 2009-07-29 +%% +Type: language +Subtag: buc +Description: Bushi +Added: 2009-07-29 +%% +Type: language +Subtag: bud +Description: Ntcham +Added: 2009-07-29 +%% +Type: language +Subtag: bue +Description: Beothuk +Added: 2009-07-29 +%% +Type: language +Subtag: buf +Description: Bushoong +Added: 2009-07-29 +%% +Type: language +Subtag: bug +Description: Buginese +Added: 2005-10-16 +%% +Type: language +Subtag: buh +Description: Younuo Bunu +Added: 2009-07-29 +%% +Type: language +Subtag: bui +Description: Bongili +Added: 2009-07-29 +%% +Type: language +Subtag: buj +Description: Basa-Gurmana +Added: 2009-07-29 +%% +Type: language +Subtag: buk +Description: Bugawac +Added: 2009-07-29 +%% +Type: language +Subtag: bum +Description: Bulu (Cameroon) +Added: 2009-07-29 +%% +Type: language +Subtag: bun +Description: Sherbro +Added: 2009-07-29 +%% +Type: language +Subtag: buo +Description: Terei +Added: 2009-07-29 +%% +Type: language +Subtag: bup +Description: Busoa +Added: 2009-07-29 +%% +Type: language +Subtag: buq +Description: Brem +Added: 2009-07-29 +%% +Type: language +Subtag: bus +Description: Bokobaru +Added: 2009-07-29 +%% +Type: language +Subtag: but +Description: Bungain +Added: 2009-07-29 +%% +Type: language +Subtag: buu +Description: Budu +Added: 2009-07-29 +%% +Type: language +Subtag: buv +Description: Bun +Added: 2009-07-29 +%% +Type: language +Subtag: buw +Description: Bubi +Added: 2009-07-29 +%% +Type: language +Subtag: bux +Description: Boghom +Added: 2009-07-29 +%% +Type: language +Subtag: buy +Description: Bullom So +Added: 2009-07-29 +%% +Type: language +Subtag: buz +Description: Bukwen +Added: 2009-07-29 +%% +Type: language +Subtag: bva +Description: Barein +Added: 2009-07-29 +%% +Type: language +Subtag: bvb +Description: Bube +Added: 2009-07-29 +%% +Type: language +Subtag: bvc +Description: Baelelea +Added: 2009-07-29 +%% +Type: language +Subtag: bvd +Description: Baeggu +Added: 2009-07-29 +%% +Type: language +Subtag: bve +Description: Berau Malay +Added: 2009-07-29 +Macrolanguage: ms +%% +Type: language +Subtag: bvf +Description: Boor +Added: 2009-07-29 +%% +Type: language +Subtag: bvg +Description: Bonkeng +Added: 2009-07-29 +%% +Type: language +Subtag: bvh +Description: Bure +Added: 2009-07-29 +%% +Type: language +Subtag: bvi +Description: Belanda Viri +Added: 2009-07-29 +%% +Type: language +Subtag: bvj +Description: Baan +Added: 2009-07-29 +%% +Type: language +Subtag: bvk +Description: Bukat +Added: 2009-07-29 +%% +Type: language +Subtag: bvl +Description: Bolivian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: bvm +Description: Bamunka +Added: 2009-07-29 +%% +Type: language +Subtag: bvn +Description: Buna +Added: 2009-07-29 +%% +Type: language +Subtag: bvo +Description: Bolgo +Added: 2009-07-29 +%% +Type: language +Subtag: bvq +Description: Birri +Added: 2009-07-29 +%% +Type: language +Subtag: bvr +Description: Burarra +Added: 2009-07-29 +%% +Type: language +Subtag: bvt +Description: Bati (Indonesia) +Added: 2009-07-29 +%% +Type: language +Subtag: bvu +Description: Bukit Malay +Added: 2009-07-29 +Macrolanguage: ms +%% +Type: language +Subtag: bvv +Description: Baniva +Added: 2009-07-29 +%% +Type: language +Subtag: bvw +Description: Boga +Added: 2009-07-29 +%% +Type: language +Subtag: bvx +Description: Dibole +Added: 2009-07-29 +%% +Type: language +Subtag: bvy +Description: Baybayanon +Added: 2010-03-11 +%% +Type: language +Subtag: bvz +Description: Bauzi +Added: 2009-07-29 +%% +Type: language +Subtag: bwa +Description: Bwatoo +Added: 2009-07-29 +%% +Type: language +Subtag: bwb +Description: Namosi-Naitasiri-Serua +Added: 2009-07-29 +%% +Type: language +Subtag: bwc +Description: Bwile +Added: 2009-07-29 +%% +Type: language +Subtag: bwd +Description: Bwaidoka +Added: 2009-07-29 +%% +Type: language +Subtag: bwe +Description: Bwe Karen +Added: 2009-07-29 +%% +Type: language +Subtag: bwf +Description: Boselewa +Added: 2009-07-29 +%% +Type: language +Subtag: bwg +Description: Barwe +Added: 2009-07-29 +%% +Type: language +Subtag: bwh +Description: Bishuo +Added: 2009-07-29 +%% +Type: language +Subtag: bwi +Description: Baniwa +Added: 2009-07-29 +%% +Type: language +Subtag: bwj +Description: Láá Láá Bwamu +Added: 2009-07-29 +%% +Type: language +Subtag: bwk +Description: Bauwaki +Added: 2009-07-29 +%% +Type: language +Subtag: bwl +Description: Bwela +Added: 2009-07-29 +%% +Type: language +Subtag: bwm +Description: Biwat +Added: 2009-07-29 +%% +Type: language +Subtag: bwn +Description: Wunai Bunu +Added: 2009-07-29 +%% +Type: language +Subtag: bwo +Description: Boro (Ethiopia) +Description: Borna (Ethiopia) +Added: 2009-07-29 +%% +Type: language +Subtag: bwp +Description: Mandobo Bawah +Added: 2009-07-29 +%% +Type: language +Subtag: bwq +Description: Southern Bobo Madaré +Added: 2009-07-29 +%% +Type: language +Subtag: bwr +Description: Bura-Pabir +Added: 2009-07-29 +%% +Type: language +Subtag: bws +Description: Bomboma +Added: 2009-07-29 +%% +Type: language +Subtag: bwt +Description: Bafaw-Balong +Added: 2009-07-29 +%% +Type: language +Subtag: bwu +Description: Buli (Ghana) +Added: 2009-07-29 +%% +Type: language +Subtag: bww +Description: Bwa +Added: 2009-07-29 +%% +Type: language +Subtag: bwx +Description: Bu-Nao Bunu +Added: 2009-07-29 +%% +Type: language +Subtag: bwy +Description: Cwi Bwamu +Added: 2009-07-29 +%% +Type: language +Subtag: bwz +Description: Bwisi +Added: 2009-07-29 +%% +Type: language +Subtag: bxa +Description: Bauro +Added: 2009-07-29 +%% +Type: language +Subtag: bxb +Description: Belanda Bor +Added: 2009-07-29 +%% +Type: language +Subtag: bxc +Description: Molengue +Added: 2009-07-29 +%% +Type: language +Subtag: bxd +Description: Pela +Added: 2009-07-29 +%% +Type: language +Subtag: bxe +Description: Birale +Added: 2009-07-29 +%% +Type: language +Subtag: bxf +Description: Bilur +Added: 2009-07-29 +%% +Type: language +Subtag: bxg +Description: Bangala +Added: 2009-07-29 +%% +Type: language +Subtag: bxh +Description: Buhutu +Added: 2009-07-29 +%% +Type: language +Subtag: bxi +Description: Pirlatapa +Added: 2009-07-29 +%% +Type: language +Subtag: bxj +Description: Bayungu +Added: 2009-07-29 +%% +Type: language +Subtag: bxk +Description: Bukusu +Description: Lubukusu +Added: 2009-07-29 +Macrolanguage: luy +%% +Type: language +Subtag: bxl +Description: Jalkunan +Added: 2009-07-29 +%% +Type: language +Subtag: bxm +Description: Mongolia Buriat +Added: 2009-07-29 +Macrolanguage: bua +%% +Type: language +Subtag: bxn +Description: Burduna +Added: 2009-07-29 +%% +Type: language +Subtag: bxo +Description: Barikanchi +Added: 2009-07-29 +%% +Type: language +Subtag: bxp +Description: Bebil +Added: 2009-07-29 +%% +Type: language +Subtag: bxq +Description: Beele +Added: 2009-07-29 +%% +Type: language +Subtag: bxr +Description: Russia Buriat +Added: 2009-07-29 +Macrolanguage: bua +%% +Type: language +Subtag: bxs +Description: Busam +Added: 2009-07-29 +%% +Type: language +Subtag: bxu +Description: China Buriat +Added: 2009-07-29 +Macrolanguage: bua +%% +Type: language +Subtag: bxv +Description: Berakou +Added: 2009-07-29 +%% +Type: language +Subtag: bxw +Description: Bankagooma +Added: 2009-07-29 +%% +Type: language +Subtag: bxx +Description: Borna (Democratic Republic of Congo) +Added: 2009-07-29 +%% +Type: language +Subtag: bxz +Description: Binahari +Added: 2009-07-29 +%% +Type: language +Subtag: bya +Description: Batak +Added: 2009-07-29 +%% +Type: language +Subtag: byb +Description: Bikya +Added: 2009-07-29 +%% +Type: language +Subtag: byc +Description: Ubaghara +Added: 2009-07-29 +%% +Type: language +Subtag: byd +Description: Benyadu' +Added: 2009-07-29 +%% +Type: language +Subtag: bye +Description: Pouye +Added: 2009-07-29 +%% +Type: language +Subtag: byf +Description: Bete +Added: 2009-07-29 +%% +Type: language +Subtag: byg +Description: Baygo +Added: 2009-07-29 +%% +Type: language +Subtag: byh +Description: Bhujel +Added: 2009-07-29 +%% +Type: language +Subtag: byi +Description: Buyu +Added: 2009-07-29 +%% +Type: language +Subtag: byj +Description: Bina (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: byk +Description: Biao +Added: 2009-07-29 +%% +Type: language +Subtag: byl +Description: Bayono +Added: 2009-07-29 +%% +Type: language +Subtag: bym +Description: Bidyara +Added: 2009-07-29 +%% +Type: language +Subtag: byn +Description: Bilin +Description: Blin +Added: 2005-10-16 +%% +Type: language +Subtag: byo +Description: Biyo +Added: 2009-07-29 +%% +Type: language +Subtag: byp +Description: Bumaji +Added: 2009-07-29 +%% +Type: language +Subtag: byq +Description: Basay +Added: 2009-07-29 +%% +Type: language +Subtag: byr +Description: Baruya +Description: Yipma +Added: 2009-07-29 +%% +Type: language +Subtag: bys +Description: Burak +Added: 2009-07-29 +%% +Type: language +Subtag: byt +Description: Berti +Added: 2009-07-29 +%% +Type: language +Subtag: byv +Description: Medumba +Added: 2009-07-29 +%% +Type: language +Subtag: byw +Description: Belhariya +Added: 2009-07-29 +%% +Type: language +Subtag: byx +Description: Qaqet +Added: 2009-07-29 +%% +Type: language +Subtag: byy +Description: Buya +Added: 2009-07-29 +%% +Type: language +Subtag: byz +Description: Banaro +Added: 2009-07-29 +%% +Type: language +Subtag: bza +Description: Bandi +Added: 2009-07-29 +%% +Type: language +Subtag: bzb +Description: Andio +Added: 2009-07-29 +%% +Type: language +Subtag: bzc +Description: Southern Betsimisaraka Malagasy +Added: 2011-08-16 +Macrolanguage: mg +%% +Type: language +Subtag: bzd +Description: Bribri +Added: 2009-07-29 +%% +Type: language +Subtag: bze +Description: Jenaama Bozo +Added: 2009-07-29 +%% +Type: language +Subtag: bzf +Description: Boikin +Added: 2009-07-29 +%% +Type: language +Subtag: bzg +Description: Babuza +Added: 2009-07-29 +%% +Type: language +Subtag: bzh +Description: Mapos Buang +Added: 2009-07-29 +%% +Type: language +Subtag: bzi +Description: Bisu +Added: 2009-07-29 +%% +Type: language +Subtag: bzj +Description: Belize Kriol English +Added: 2009-07-29 +%% +Type: language +Subtag: bzk +Description: Nicaragua Creole English +Added: 2009-07-29 +%% +Type: language +Subtag: bzl +Description: Boano (Sulawesi) +Added: 2009-07-29 +%% +Type: language +Subtag: bzm +Description: Bolondo +Added: 2009-07-29 +%% +Type: language +Subtag: bzn +Description: Boano (Maluku) +Added: 2009-07-29 +%% +Type: language +Subtag: bzo +Description: Bozaba +Added: 2009-07-29 +%% +Type: language +Subtag: bzp +Description: Kemberano +Added: 2009-07-29 +%% +Type: language +Subtag: bzq +Description: Buli (Indonesia) +Added: 2009-07-29 +%% +Type: language +Subtag: bzr +Description: Biri +Added: 2009-07-29 +%% +Type: language +Subtag: bzs +Description: Brazilian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: bzt +Description: Brithenig +Added: 2009-07-29 +%% +Type: language +Subtag: bzu +Description: Burmeso +Added: 2009-07-29 +%% +Type: language +Subtag: bzv +Description: Bebe +Added: 2009-07-29 +%% +Type: language +Subtag: bzw +Description: Basa (Nigeria) +Added: 2009-07-29 +%% +Type: language +Subtag: bzx +Description: Kɛlɛngaxo Bozo +Added: 2009-07-29 +%% +Type: language +Subtag: bzy +Description: Obanliku +Added: 2009-07-29 +%% +Type: language +Subtag: bzz +Description: Evant +Added: 2009-07-29 +%% +Type: language +Subtag: caa +Description: Chortí +Added: 2009-07-29 +%% +Type: language +Subtag: cab +Description: Garifuna +Added: 2009-07-29 +%% +Type: language +Subtag: cac +Description: Chuj +Added: 2009-07-29 +%% +Type: language +Subtag: cad +Description: Caddo +Added: 2005-10-16 +%% +Type: language +Subtag: cae +Description: Lehar +Description: Laalaa +Added: 2009-07-29 +%% +Type: language +Subtag: caf +Description: Southern Carrier +Added: 2009-07-29 +%% +Type: language +Subtag: cag +Description: Nivaclé +Added: 2009-07-29 +%% +Type: language +Subtag: cah +Description: Cahuarano +Added: 2009-07-29 +%% +Type: language +Subtag: cai +Description: Central American Indian languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: caj +Description: Chané +Added: 2009-07-29 +%% +Type: language +Subtag: cak +Description: Kaqchikel +Description: Cakchiquel +Added: 2009-07-29 +%% +Type: language +Subtag: cal +Description: Carolinian +Added: 2009-07-29 +%% +Type: language +Subtag: cam +Description: Cemuhî +Added: 2009-07-29 +%% +Type: language +Subtag: can +Description: Chambri +Added: 2009-07-29 +%% +Type: language +Subtag: cao +Description: Chácobo +Added: 2009-07-29 +%% +Type: language +Subtag: cap +Description: Chipaya +Added: 2009-07-29 +%% +Type: language +Subtag: caq +Description: Car Nicobarese +Added: 2009-07-29 +%% +Type: language +Subtag: car +Description: Galibi Carib +Added: 2005-10-16 +%% +Type: language +Subtag: cas +Description: Tsimané +Added: 2009-07-29 +%% +Type: language +Subtag: cau +Description: Caucasian languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cav +Description: Cavineña +Added: 2009-07-29 +%% +Type: language +Subtag: caw +Description: Callawalla +Added: 2009-07-29 +%% +Type: language +Subtag: cax +Description: Chiquitano +Added: 2009-07-29 +%% +Type: language +Subtag: cay +Description: Cayuga +Added: 2009-07-29 +%% +Type: language +Subtag: caz +Description: Canichana +Added: 2009-07-29 +%% +Type: language +Subtag: cba +Description: Chibchan languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: cbb +Description: Cabiyarí +Added: 2009-07-29 +%% +Type: language +Subtag: cbc +Description: Carapana +Added: 2009-07-29 +%% +Type: language +Subtag: cbd +Description: Carijona +Added: 2009-07-29 +%% +Type: language +Subtag: cbe +Description: Chipiajes +Added: 2009-07-29 +%% +Type: language +Subtag: cbg +Description: Chimila +Added: 2009-07-29 +%% +Type: language +Subtag: cbh +Description: Cagua +Added: 2009-07-29 +%% +Type: language +Subtag: cbi +Description: Chachi +Added: 2009-07-29 +%% +Type: language +Subtag: cbj +Description: Ede Cabe +Added: 2009-07-29 +%% +Type: language +Subtag: cbk +Description: Chavacano +Added: 2009-07-29 +%% +Type: language +Subtag: cbl +Description: Bualkhaw Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cbn +Description: Nyahkur +Added: 2009-07-29 +%% +Type: language +Subtag: cbo +Description: Izora +Added: 2009-07-29 +%% +Type: language +Subtag: cbr +Description: Cashibo-Cacataibo +Added: 2009-07-29 +%% +Type: language +Subtag: cbs +Description: Cashinahua +Added: 2009-07-29 +%% +Type: language +Subtag: cbt +Description: Chayahuita +Added: 2009-07-29 +%% +Type: language +Subtag: cbu +Description: Candoshi-Shapra +Added: 2009-07-29 +%% +Type: language +Subtag: cbv +Description: Cacua +Added: 2009-07-29 +%% +Type: language +Subtag: cbw +Description: Kinabalian +Added: 2010-03-11 +%% +Type: language +Subtag: cby +Description: Carabayo +Added: 2009-07-29 +%% +Type: language +Subtag: cca +Description: Cauca +Added: 2009-07-29 +%% +Type: language +Subtag: ccc +Description: Chamicuro +Added: 2009-07-29 +%% +Type: language +Subtag: ccd +Description: Cafundo Creole +Added: 2009-07-29 +%% +Type: language +Subtag: cce +Description: Chopi +Added: 2009-07-29 +%% +Type: language +Subtag: ccg +Description: Samba Daka +Added: 2009-07-29 +%% +Type: language +Subtag: cch +Description: Atsam +Added: 2009-07-29 +%% +Type: language +Subtag: ccj +Description: Kasanga +Added: 2009-07-29 +%% +Type: language +Subtag: ccl +Description: Cutchi-Swahili +Added: 2009-07-29 +%% +Type: language +Subtag: ccm +Description: Malaccan Creole Malay +Added: 2009-07-29 +%% +Type: language +Subtag: ccn +Description: North Caucasian languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: cco +Description: Comaltepec Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: ccp +Description: Chakma +Added: 2009-07-29 +%% +Type: language +Subtag: ccq +Description: Chaungtha +Added: 2009-07-29 +Deprecated: 2012-08-12 +Preferred-Value: rki +%% +Type: language +Subtag: ccr +Description: Cacaopera +Added: 2009-07-29 +%% +Type: language +Subtag: ccs +Description: South Caucasian languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: cda +Description: Choni +Added: 2009-07-29 +%% +Type: language +Subtag: cdc +Description: Chadic languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: cdd +Description: Caddoan languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: cde +Description: Chenchu +Added: 2009-07-29 +%% +Type: language +Subtag: cdf +Description: Chiru +Added: 2009-07-29 +%% +Type: language +Subtag: cdg +Description: Chamari +Added: 2009-07-29 +%% +Type: language +Subtag: cdh +Description: Chambeali +Added: 2009-07-29 +%% +Type: language +Subtag: cdi +Description: Chodri +Added: 2009-07-29 +%% +Type: language +Subtag: cdj +Description: Churahi +Added: 2009-07-29 +%% +Type: language +Subtag: cdm +Description: Chepang +Added: 2009-07-29 +%% +Type: language +Subtag: cdn +Description: Chaudangsi +Added: 2009-07-29 +%% +Type: language +Subtag: cdo +Description: Min Dong Chinese +Added: 2009-07-29 +Macrolanguage: zh +%% +Type: language +Subtag: cdr +Description: Cinda-Regi-Tiyal +Added: 2009-07-29 +%% +Type: language +Subtag: cds +Description: Chadian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: cdy +Description: Chadong +Added: 2009-07-29 +%% +Type: language +Subtag: cdz +Description: Koda +Added: 2009-07-29 +%% +Type: language +Subtag: cea +Description: Lower Chehalis +Added: 2009-07-29 +%% +Type: language +Subtag: ceb +Description: Cebuano +Added: 2005-10-16 +%% +Type: language +Subtag: ceg +Description: Chamacoco +Added: 2009-07-29 +%% +Type: language +Subtag: cek +Description: Eastern Khumi Chin +Added: 2012-08-12 +%% +Type: language +Subtag: cel +Description: Celtic languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cen +Description: Cen +Added: 2009-07-29 +%% +Type: language +Subtag: cet +Description: Centúúm +Added: 2009-07-29 +%% +Type: language +Subtag: cfa +Description: Dijim-Bwilim +Added: 2009-07-29 +%% +Type: language +Subtag: cfd +Description: Cara +Added: 2009-07-29 +%% +Type: language +Subtag: cfg +Description: Como Karim +Added: 2009-07-29 +%% +Type: language +Subtag: cfm +Description: Falam Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cga +Description: Changriwa +Added: 2009-07-29 +%% +Type: language +Subtag: cgc +Description: Kagayanen +Added: 2009-07-29 +%% +Type: language +Subtag: cgg +Description: Chiga +Added: 2009-07-29 +%% +Type: language +Subtag: cgk +Description: Chocangacakha +Added: 2009-07-29 +%% +Type: language +Subtag: chb +Description: Chibcha +Added: 2005-10-16 +%% +Type: language +Subtag: chc +Description: Catawba +Added: 2009-07-29 +%% +Type: language +Subtag: chd +Description: Highland Oaxaca Chontal +Added: 2009-07-29 +%% +Type: language +Subtag: chf +Description: Tabasco Chontal +Added: 2009-07-29 +%% +Type: language +Subtag: chg +Description: Chagatai +Added: 2005-10-16 +%% +Type: language +Subtag: chh +Description: Chinook +Added: 2009-07-29 +%% +Type: language +Subtag: chj +Description: Ojitlán Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: chk +Description: Chuukese +Added: 2005-10-16 +%% +Type: language +Subtag: chl +Description: Cahuilla +Added: 2009-07-29 +%% +Type: language +Subtag: chm +Description: Mari (Russia) +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: chn +Description: Chinook jargon +Added: 2005-10-16 +%% +Type: language +Subtag: cho +Description: Choctaw +Added: 2005-10-16 +%% +Type: language +Subtag: chp +Description: Chipewyan +Description: Dene Suline +Added: 2005-10-16 +%% +Type: language +Subtag: chq +Description: Quiotepec Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: chr +Description: Cherokee +Added: 2005-10-16 +%% +Type: language +Subtag: cht +Description: Cholón +Added: 2009-07-29 +%% +Type: language +Subtag: chw +Description: Chuwabu +Added: 2009-07-29 +%% +Type: language +Subtag: chx +Description: Chantyal +Added: 2009-07-29 +%% +Type: language +Subtag: chy +Description: Cheyenne +Added: 2005-10-16 +%% +Type: language +Subtag: chz +Description: Ozumacín Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: cia +Description: Cia-Cia +Added: 2009-07-29 +%% +Type: language +Subtag: cib +Description: Ci Gbe +Added: 2009-07-29 +%% +Type: language +Subtag: cic +Description: Chickasaw +Added: 2009-07-29 +%% +Type: language +Subtag: cid +Description: Chimariko +Added: 2009-07-29 +%% +Type: language +Subtag: cie +Description: Cineni +Added: 2009-07-29 +%% +Type: language +Subtag: cih +Description: Chinali +Added: 2009-07-29 +%% +Type: language +Subtag: cik +Description: Chitkuli Kinnauri +Added: 2009-07-29 +%% +Type: language +Subtag: cim +Description: Cimbrian +Added: 2009-07-29 +%% +Type: language +Subtag: cin +Description: Cinta Larga +Added: 2009-07-29 +%% +Type: language +Subtag: cip +Description: Chiapanec +Added: 2009-07-29 +%% +Type: language +Subtag: cir +Description: Tiri +Added: 2009-07-29 +%% +Type: language +Subtag: ciw +Description: Chippewa +Added: 2009-07-29 +Macrolanguage: oj +%% +Type: language +Subtag: ciy +Description: Chaima +Added: 2009-07-29 +%% +Type: language +Subtag: cja +Description: Western Cham +Added: 2009-07-29 +%% +Type: language +Subtag: cje +Description: Chru +Added: 2009-07-29 +%% +Type: language +Subtag: cjh +Description: Upper Chehalis +Added: 2009-07-29 +%% +Type: language +Subtag: cji +Description: Chamalal +Added: 2009-07-29 +%% +Type: language +Subtag: cjk +Description: Chokwe +Added: 2009-07-29 +%% +Type: language +Subtag: cjm +Description: Eastern Cham +Added: 2009-07-29 +%% +Type: language +Subtag: cjn +Description: Chenapian +Added: 2009-07-29 +%% +Type: language +Subtag: cjo +Description: Ashéninka Pajonal +Added: 2009-07-29 +%% +Type: language +Subtag: cjp +Description: Cabécar +Added: 2009-07-29 +%% +Type: language +Subtag: cjr +Description: Chorotega +Added: 2009-07-29 +Deprecated: 2010-03-11 +Preferred-Value: mom +%% +Type: language +Subtag: cjs +Description: Shor +Added: 2009-07-29 +%% +Type: language +Subtag: cjv +Description: Chuave +Added: 2009-07-29 +%% +Type: language +Subtag: cjy +Description: Jinyu Chinese +Added: 2009-07-29 +Macrolanguage: zh +%% +Type: language +Subtag: cka +Description: Khumi Awa Chin +Added: 2009-07-29 +Deprecated: 2012-08-12 +Preferred-Value: cmr +%% +Type: language +Subtag: ckb +Description: Central Kurdish +Added: 2009-07-29 +Macrolanguage: ku +%% +Type: language +Subtag: ckh +Description: Chak +Added: 2009-07-29 +%% +Type: language +Subtag: ckl +Description: Cibak +Added: 2009-07-29 +%% +Type: language +Subtag: cko +Description: Anufo +Added: 2009-07-29 +%% +Type: language +Subtag: ckq +Description: Kajakse +Added: 2009-07-29 +%% +Type: language +Subtag: ckr +Description: Kairak +Added: 2009-07-29 +%% +Type: language +Subtag: cks +Description: Tayo +Added: 2009-07-29 +%% +Type: language +Subtag: ckt +Description: Chukot +Added: 2009-07-29 +%% +Type: language +Subtag: cku +Description: Koasati +Added: 2009-07-29 +%% +Type: language +Subtag: ckv +Description: Kavalan +Added: 2009-07-29 +%% +Type: language +Subtag: ckx +Description: Caka +Added: 2009-07-29 +%% +Type: language +Subtag: cky +Description: Cakfem-Mushere +Added: 2009-07-29 +%% +Type: language +Subtag: ckz +Description: Cakchiquel-Quiché Mixed Language +Added: 2009-07-29 +%% +Type: language +Subtag: cla +Description: Ron +Added: 2009-07-29 +%% +Type: language +Subtag: clc +Description: Chilcotin +Added: 2009-07-29 +%% +Type: language +Subtag: cld +Description: Chaldean Neo-Aramaic +Added: 2009-07-29 +Macrolanguage: syr +%% +Type: language +Subtag: cle +Description: Lealao Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: clh +Description: Chilisso +Added: 2009-07-29 +%% +Type: language +Subtag: cli +Description: Chakali +Added: 2009-07-29 +%% +Type: language +Subtag: clj +Description: Laitu Chin +Added: 2012-08-12 +%% +Type: language +Subtag: clk +Description: Idu-Mishmi +Added: 2009-07-29 +%% +Type: language +Subtag: cll +Description: Chala +Added: 2009-07-29 +%% +Type: language +Subtag: clm +Description: Clallam +Added: 2009-07-29 +%% +Type: language +Subtag: clo +Description: Lowland Oaxaca Chontal +Added: 2009-07-29 +%% +Type: language +Subtag: clt +Description: Lautu Chin +Added: 2012-08-12 +%% +Type: language +Subtag: clu +Description: Caluyanun +Added: 2009-07-29 +%% +Type: language +Subtag: clw +Description: Chulym +Added: 2009-07-29 +%% +Type: language +Subtag: cly +Description: Eastern Highland Chatino +Added: 2009-07-29 +%% +Type: language +Subtag: cma +Description: Maa +Added: 2009-07-29 +%% +Type: language +Subtag: cmc +Description: Chamic languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cme +Description: Cerma +Added: 2009-07-29 +%% +Type: language +Subtag: cmg +Description: Classical Mongolian +Added: 2009-07-29 +%% +Type: language +Subtag: cmi +Description: Emberá-Chamí +Added: 2009-07-29 +%% +Type: language +Subtag: cmk +Description: Chimakum +Added: 2009-07-29 +Deprecated: 2010-03-11 +Preferred-Value: xch +%% +Type: language +Subtag: cml +Description: Campalagian +Added: 2009-07-29 +%% +Type: language +Subtag: cmm +Description: Michigamea +Added: 2009-07-29 +%% +Type: language +Subtag: cmn +Description: Mandarin Chinese +Added: 2009-07-29 +Macrolanguage: zh +%% +Type: language +Subtag: cmo +Description: Central Mnong +Added: 2009-07-29 +%% +Type: language +Subtag: cmr +Description: Mro-Khimi Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cms +Description: Messapic +Added: 2009-07-29 +%% +Type: language +Subtag: cmt +Description: Camtho +Added: 2009-07-29 +%% +Type: language +Subtag: cna +Description: Changthang +Added: 2009-07-29 +%% +Type: language +Subtag: cnb +Description: Chinbon Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cnc +Description: Côông +Added: 2009-07-29 +%% +Type: language +Subtag: cng +Description: Northern Qiang +Added: 2009-07-29 +%% +Type: language +Subtag: cnh +Description: Haka Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cni +Description: Asháninka +Added: 2009-07-29 +%% +Type: language +Subtag: cnk +Description: Khumi Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cnl +Description: Lalana Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: cno +Description: Con +Added: 2009-07-29 +%% +Type: language +Subtag: cns +Description: Central Asmat +Added: 2009-07-29 +%% +Type: language +Subtag: cnt +Description: Tepetotutla Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: cnu +Description: Chenoua +Added: 2009-07-29 +%% +Type: language +Subtag: cnw +Description: Ngawn Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cnx +Description: Middle Cornish +Added: 2009-07-29 +%% +Type: language +Subtag: coa +Description: Cocos Islands Malay +Added: 2009-07-29 +Macrolanguage: ms +%% +Type: language +Subtag: cob +Description: Chicomuceltec +Added: 2009-07-29 +%% +Type: language +Subtag: coc +Description: Cocopa +Added: 2009-07-29 +%% +Type: language +Subtag: cod +Description: Cocama-Cocamilla +Added: 2009-07-29 +%% +Type: language +Subtag: coe +Description: Koreguaje +Added: 2009-07-29 +%% +Type: language +Subtag: cof +Description: Colorado +Added: 2009-07-29 +%% +Type: language +Subtag: cog +Description: Chong +Added: 2009-07-29 +%% +Type: language +Subtag: coh +Description: Chonyi-Dzihana-Kauma +Description: Chichonyi-Chidzihana-Chikauma +Added: 2009-07-29 +%% +Type: language +Subtag: coj +Description: Cochimi +Added: 2009-07-29 +%% +Type: language +Subtag: cok +Description: Santa Teresa Cora +Added: 2009-07-29 +%% +Type: language +Subtag: col +Description: Columbia-Wenatchi +Added: 2009-07-29 +%% +Type: language +Subtag: com +Description: Comanche +Added: 2009-07-29 +%% +Type: language +Subtag: con +Description: Cofán +Added: 2009-07-29 +%% +Type: language +Subtag: coo +Description: Comox +Added: 2009-07-29 +%% +Type: language +Subtag: cop +Description: Coptic +Added: 2005-10-16 +%% +Type: language +Subtag: coq +Description: Coquille +Added: 2009-07-29 +%% +Type: language +Subtag: cot +Description: Caquinte +Added: 2009-07-29 +%% +Type: language +Subtag: cou +Description: Wamey +Added: 2009-07-29 +%% +Type: language +Subtag: cov +Description: Cao Miao +Added: 2009-07-29 +%% +Type: language +Subtag: cow +Description: Cowlitz +Added: 2009-07-29 +%% +Type: language +Subtag: cox +Description: Nanti +Added: 2009-07-29 +%% +Type: language +Subtag: coy +Description: Coyaima +Added: 2009-07-29 +%% +Type: language +Subtag: coz +Description: Chochotec +Added: 2009-07-29 +%% +Type: language +Subtag: cpa +Description: Palantla Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: cpb +Description: Ucayali-Yurúa Ashéninka +Added: 2009-07-29 +%% +Type: language +Subtag: cpc +Description: Ajyíninka Apurucayali +Added: 2009-07-29 +%% +Type: language +Subtag: cpe +Description: English-based creoles and pidgins +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cpf +Description: French-based creoles and pidgins +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cpg +Description: Cappadocian Greek +Added: 2009-07-29 +%% +Type: language +Subtag: cpi +Description: Chinese Pidgin English +Added: 2009-07-29 +%% +Type: language +Subtag: cpn +Description: Cherepon +Added: 2009-07-29 +%% +Type: language +Subtag: cpp +Description: Portuguese-based creoles and pidgins +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cps +Description: Capiznon +Added: 2009-07-29 +%% +Type: language +Subtag: cpu +Description: Pichis Ashéninka +Added: 2009-07-29 +%% +Type: language +Subtag: cpx +Description: Pu-Xian Chinese +Added: 2009-07-29 +Macrolanguage: zh +%% +Type: language +Subtag: cpy +Description: South Ucayali Ashéninka +Added: 2009-07-29 +%% +Type: language +Subtag: cqd +Description: Chuanqiandian Cluster Miao +Added: 2009-07-29 +Macrolanguage: hmn +%% +Type: language +Subtag: cqu +Description: Chilean Quechua +Added: 2009-07-29 +Macrolanguage: qu +%% +Type: language +Subtag: cra +Description: Chara +Added: 2009-07-29 +%% +Type: language +Subtag: crb +Description: Island Carib +Added: 2009-07-29 +%% +Type: language +Subtag: crc +Description: Lonwolwol +Added: 2009-07-29 +%% +Type: language +Subtag: crd +Description: Coeur d'Alene +Added: 2009-07-29 +%% +Type: language +Subtag: crf +Description: Caramanta +Added: 2009-07-29 +%% +Type: language +Subtag: crg +Description: Michif +Added: 2009-07-29 +%% +Type: language +Subtag: crh +Description: Crimean Tatar +Description: Crimean Turkish +Added: 2005-10-16 +%% +Type: language +Subtag: cri +Description: Sãotomense +Added: 2009-07-29 +%% +Type: language +Subtag: crj +Description: Southern East Cree +Added: 2009-07-29 +Macrolanguage: cr +%% +Type: language +Subtag: crk +Description: Plains Cree +Added: 2009-07-29 +Macrolanguage: cr +%% +Type: language +Subtag: crl +Description: Northern East Cree +Added: 2009-07-29 +Macrolanguage: cr +%% +Type: language +Subtag: crm +Description: Moose Cree +Added: 2009-07-29 +Macrolanguage: cr +%% +Type: language +Subtag: crn +Description: El Nayar Cora +Added: 2009-07-29 +%% +Type: language +Subtag: cro +Description: Crow +Added: 2009-07-29 +%% +Type: language +Subtag: crp +Description: Creoles and pidgins +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: crq +Description: Iyo'wujwa Chorote +Added: 2009-07-29 +%% +Type: language +Subtag: crr +Description: Carolina Algonquian +Added: 2009-07-29 +%% +Type: language +Subtag: crs +Description: Seselwa Creole French +Added: 2009-07-29 +%% +Type: language +Subtag: crt +Description: Iyojwa'ja Chorote +Added: 2009-07-29 +%% +Type: language +Subtag: crv +Description: Chaura +Added: 2009-07-29 +%% +Type: language +Subtag: crw +Description: Chrau +Added: 2009-07-29 +%% +Type: language +Subtag: crx +Description: Carrier +Added: 2009-07-29 +%% +Type: language +Subtag: cry +Description: Cori +Added: 2009-07-29 +%% +Type: language +Subtag: crz +Description: Cruzeño +Added: 2009-07-29 +%% +Type: language +Subtag: csa +Description: Chiltepec Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: csb +Description: Kashubian +Added: 2005-10-16 +%% +Type: language +Subtag: csc +Description: Catalan Sign Language +Description: Lengua de señas catalana +Description: Llengua de Signes Catalana +Added: 2009-07-29 +%% +Type: language +Subtag: csd +Description: Chiangmai Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: cse +Description: Czech Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: csf +Description: Cuba Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: csg +Description: Chilean Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: csh +Description: Asho Chin +Added: 2009-07-29 +%% +Type: language +Subtag: csi +Description: Coast Miwok +Added: 2009-07-29 +%% +Type: language +Subtag: csk +Description: Jola-Kasa +Added: 2009-07-29 +%% +Type: language +Subtag: csl +Description: Chinese Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: csm +Description: Central Sierra Miwok +Added: 2009-07-29 +%% +Type: language +Subtag: csn +Description: Colombian Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: cso +Description: Sochiapam Chinantec +Description: Sochiapan Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: csq +Description: Croatia Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: csr +Description: Costa Rican Sign Language +Added: 2009-07-29 +%% +Type: language +Subtag: css +Description: Southern Ohlone +Added: 2009-07-29 +%% +Type: language +Subtag: cst +Description: Northern Ohlone +Added: 2009-07-29 +%% +Type: language +Subtag: csu +Description: Central Sudanic languages +Added: 2009-07-29 +Scope: collection +%% +Type: language +Subtag: csv +Description: Sumtu Chin +Added: 2012-08-12 +%% +Type: language +Subtag: csw +Description: Swampy Cree +Added: 2009-07-29 +Macrolanguage: cr +%% +Type: language +Subtag: csy +Description: Siyin Chin +Added: 2009-07-29 +%% +Type: language +Subtag: csz +Description: Coos +Added: 2009-07-29 +%% +Type: language +Subtag: cta +Description: Tataltepec Chatino +Added: 2009-07-29 +%% +Type: language +Subtag: ctc +Description: Chetco +Added: 2009-07-29 +%% +Type: language +Subtag: ctd +Description: Tedim Chin +Added: 2009-07-29 +%% +Type: language +Subtag: cte +Description: Tepinapa Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: ctg +Description: Chittagonian +Added: 2009-07-29 +%% +Type: language +Subtag: cth +Description: Thaiphum Chin +Added: 2012-08-12 +%% +Type: language +Subtag: ctl +Description: Tlacoatzintepec Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: ctm +Description: Chitimacha +Added: 2009-07-29 +%% +Type: language +Subtag: ctn +Description: Chhintange +Added: 2009-07-29 +%% +Type: language +Subtag: cto +Description: Emberá-Catío +Added: 2009-07-29 +%% +Type: language +Subtag: ctp +Description: Western Highland Chatino +Added: 2009-07-29 +%% +Type: language +Subtag: cts +Description: Northern Catanduanes Bikol +Added: 2009-07-29 +Macrolanguage: bik +%% +Type: language +Subtag: ctt +Description: Wayanad Chetti +Added: 2009-07-29 +%% +Type: language +Subtag: ctu +Description: Chol +Added: 2009-07-29 +%% +Type: language +Subtag: ctz +Description: Zacatepec Chatino +Added: 2009-07-29 +%% +Type: language +Subtag: cua +Description: Cua +Added: 2009-07-29 +%% +Type: language +Subtag: cub +Description: Cubeo +Added: 2009-07-29 +%% +Type: language +Subtag: cuc +Description: Usila Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: cug +Description: Cung +Added: 2009-07-29 +%% +Type: language +Subtag: cuh +Description: Chuka +Description: Gichuka +Added: 2009-07-29 +%% +Type: language +Subtag: cui +Description: Cuiba +Added: 2009-07-29 +%% +Type: language +Subtag: cuj +Description: Mashco Piro +Added: 2009-07-29 +%% +Type: language +Subtag: cuk +Description: San Blas Kuna +Added: 2009-07-29 +%% +Type: language +Subtag: cul +Description: Culina +Description: Kulina +Added: 2009-07-29 +%% +Type: language +Subtag: cum +Description: Cumeral +Added: 2009-07-29 +%% +Type: language +Subtag: cuo +Description: Cumanagoto +Added: 2009-07-29 +%% +Type: language +Subtag: cup +Description: Cupeño +Added: 2009-07-29 +%% +Type: language +Subtag: cuq +Description: Cun +Added: 2009-07-29 +%% +Type: language +Subtag: cur +Description: Chhulung +Added: 2009-07-29 +%% +Type: language +Subtag: cus +Description: Cushitic languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: cut +Description: Teutila Cuicatec +Added: 2009-07-29 +%% +Type: language +Subtag: cuu +Description: Tai Ya +Added: 2009-07-29 +%% +Type: language +Subtag: cuv +Description: Cuvok +Added: 2009-07-29 +%% +Type: language +Subtag: cuw +Description: Chukwa +Added: 2009-07-29 +%% +Type: language +Subtag: cux +Description: Tepeuxila Cuicatec +Added: 2009-07-29 +%% +Type: language +Subtag: cvg +Description: Chug +Added: 2009-07-29 +%% +Type: language +Subtag: cvn +Description: Valle Nacional Chinantec +Added: 2009-07-29 +%% +Type: language +Subtag: cwa +Description: Kabwa +Added: 2009-07-29 +%% +Type: language +Subtag: cwb +Description: Maindo +Added: 2009-07-29 +%% +Type: language +Subtag: cwd +Description: Woods Cree +Added: 2009-07-29 +Macrolanguage: cr +%% +Type: language +Subtag: cwe +Description: Kwere +Added: 2009-07-29 +%% +Type: language +Subtag: cwg +Description: Chewong +Description: Cheq Wong +Added: 2009-07-29 +%% +Type: language +Subtag: cwt +Description: Kuwaataay +Added: 2009-07-29 +%% +Type: language +Subtag: cya +Description: Nopala Chatino +Added: 2009-07-29 +%% +Type: language +Subtag: cyb +Description: Cayubaba +Added: 2009-07-29 +%% +Type: language +Subtag: cyo +Description: Cuyonon +Added: 2009-07-29 +%% +Type: language +Subtag: czh +Description: Huizhou Chinese +Added: 2009-07-29 +Macrolanguage: zh +%% +Type: language +Subtag: czk +Description: Knaanic +Added: 2009-07-29 +%% +Type: language +Subtag: czn +Description: Zenzontepec Chatino +Added: 2009-07-29 +%% +Type: language +Subtag: czo +Description: Min Zhong Chinese +Added: 2009-07-29 +Macrolanguage: zh +%% +Type: language +Subtag: czt +Description: Zotung Chin +Added: 2009-07-29 +%% +Type: language +Subtag: daa +Description: Dangaléat +Added: 2009-07-29 +%% +Type: language +Subtag: dac +Description: Dambi +Added: 2009-07-29 +%% +Type: language +Subtag: dad +Description: Marik +Added: 2009-07-29 +%% +Type: language +Subtag: dae +Description: Duupa +Added: 2009-07-29 +%% +Type: language +Subtag: daf +Description: Dan +Added: 2009-07-29 +%% +Type: language +Subtag: dag +Description: Dagbani +Added: 2009-07-29 +%% +Type: language +Subtag: dah +Description: Gwahatike +Added: 2009-07-29 +%% +Type: language +Subtag: dai +Description: Day +Added: 2009-07-29 +%% +Type: language +Subtag: daj +Description: Dar Fur Daju +Added: 2009-07-29 +%% +Type: language +Subtag: dak +Description: Dakota +Added: 2005-10-16 +%% +Type: language +Subtag: dal +Description: Dahalo +Added: 2009-07-29 +%% +Type: language +Subtag: dam +Description: Damakawa +Added: 2009-07-29 +%% +Type: language +Subtag: dao +Description: Daai Chin +Added: 2009-07-29 +%% +Type: language +Subtag: dap +Description: Nisi (India) +Added: 2009-07-29 +Deprecated: 2012-08-12 +Comments: see njz, tgj +%% +Type: language +Subtag: daq +Description: Dandami Maria +Added: 2009-07-29 +%% +Type: language +Subtag: dar +Description: Dargwa +Added: 2005-10-16 +%% +Type: language +Subtag: das +Description: Daho-Doo +Added: 2009-07-29 +%% +Type: language +Subtag: dau +Description: Dar Sila Daju +Added: 2009-07-29 +%% +Type: language +Subtag: dav +Description: Taita +Description: Dawida +Added: 2009-07-29 +%% +Type: language +Subtag: daw +Description: Davawenyo +Added: 2009-07-29 +%% +Type: language +Subtag: dax +Description: Dayi +Added: 2009-07-29 +%% +Type: language +Subtag: day +Description: Land Dayak languages +Added: 2005-10-16 +Scope: collection +%% +Type: language +Subtag: daz +Description: Dao +Added: 2009-07-29 +%% +Type: language +Subtag: dba +Description: Bangi Me +Added: 2009-07-29 +%% +Type: language +Subtag: dbb +Description: Deno +Added: 2009-07-29 +%% +Type: language +Subtag: dbd +Description: Dadiya +Added: 2009-07-29 +%% +Type: language +Subtag: dbe +Description: Dabe +Added: 2009-07-29 +%% +Type: language +Subtag: dbf +Description: Edopi +Added: 2009-07-29 +%% +Type: language +Subtag: dbg +Description: Dogul Dom Dogon +Added: 2009-07-29 +%% +Type: language +Subtag: dbi +Description: Doka +Added: 2009-07-29 +%% +Type: language +Subtag: dbj +Description: Ida'an +Added: 2009-07-29 +%% +Type: language +Subtag: dbl +Description: Dyirbal +Added: 2009-07-29 +%% +Type: language +Subtag: dbm +Description: Duguri +Added: 2009-07-29 +%% +Type: language +Subtag: dbn +Description: Duriankere +Added: 2009-07-29 +%% +Type: language +Subtag: dbo +Description: Dulbu +Added: 2009-07-29 +%% +Type: language +Subtag: dbp +Description: Duwai +Added: 2009-07-29 +%% +Type: language +Subtag: dbq +Description: Daba +Added: 2009-07-29 +%% +Type: language +Subtag: dbr +Description: Dabarre +Added: 2009-07-29 +%% +Type: language +Subtag: dbt +Description: Ben Tey Dogon +Added: 2012-08-12 +%% +Type: language +Subtag: dbu +Description: Bondum Dom Dogon +Added: 2009-07-29 +%% +Type: language +Subtag: dbv +Description: Dungu +Added: 2009-07-29 +%% +Type: language +Subtag: dbw +Description: Bankan Tey Dogon +Added: 2012-08-12 +%% +Type: language +Subtag: dby +Description: Dibiyaso +Added: 2009-07-29 +%% +Type: language +Subtag: dcc +Description: Deccan +Added: 2009-07-29 +%% +Type: language +Subtag: dcr +Description: Negerhollands +Added: 2009-07-29 +%% +Type: language +Subtag: dda +Description: Dadi Dadi +Added: 2012-08-12 +%% +Type: language +Subtag: ddd +Description: Dongotono +Added: 2009-07-29 +%% +Type: language +Subtag: dde +Description: Doondo +Added: 2009-07-29 +%% +Type: language +Subtag: ddg +Description: Fataluku +Added: 2009-07-29 +%% +Type: language +Subtag: ddi +Description: West Goodenough +Added: 2009-07-29 +%% +Type: language +Subtag: ddj +Description: Jaru +Added: 2009-07-29 +%% +Type: language +Subtag: ddn +Description: Dendi (Benin) +Added: 2009-07-29 +%% +Type: language +Subtag: ddo +Description: Dido +Added: 2009-07-29 +%% +Type: language +Subtag: ddr +Description: Dhudhuroa +Added: 2012-08-12 +%% +Type: language +Subtag: dds +Description: Donno So Dogon +Added: 2009-07-29 +%% +Type: language +Subtag: ddw +Description: Dawera-Daweloor +Added: 2009-07-29 +%% +Type: language +Subtag: dec +Description: Dagik +Added: 2009-07-29 +%% +Type: language +Subtag: ded +Description: Dedua +Added: 2009-07-29 +%% +Type: language +Subtag: dee +Description: Dewoin +Added: 2009-07-29 +%% +Type: language +Subtag: def +Description: Dezfuli +Added: 2009-07-29 +%% +Type: language +Subtag: deg +Description: Degema +Added: 2009-07-29 +%% +Type: language +Subtag: deh +Description: Dehwari +Added: 2009-07-29 +%% +Type: language +Subtag: dei +Description: Demisa +Added: 2009-07-29 +%% +Type: language +Subtag: dek +Description: Dek +Added: 2009-07-29 +%% +Type: language +Subtag: del +Description: Delaware +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: dem +Description: Dem +Added: 2009-07-29 +%% +Type: language +Subtag: den +Description: Slave (Athapascan) +Added: 2005-10-16 +Scope: macrolanguage +%% +Type: language +Subtag: dep +Description: Pidgin Delaware +Added: 2009-07-29 +%% +Type: language +Subtag: deq +Description: Dendi (Central African Republic) +Added: 2009-07-29 +%% +Type: language +Subtag: der +Description: Deori +Added: 2009-07-29 +%% +Type: language +Subtag: des +Description: Desano +Added: 2009-07-29 +%% +Type: language +Subtag: dev +Description: Domung +Added: 2009-07-29 +%% +Type: language +Subtag: dez +Description: Dengese +Added: 2009-07-29 +%% +Type: language +Subtag: dga +Description: Southern Dagaare +Added: 2009-07-29 +%% +Type: language +Subtag: dgb +Description: Bunoge Dogon +Added: 2009-07-29 +%% +Type: language +Subtag: dgc +Description: Casiguran Dumagat Agta +Added: 2009-07-29 +%% +Type: language +Subtag: dgd +Description: Dagaari Dioula +Added: 2009-07-29 +%% +Type: language +Subtag: dge +Description: Degenan +Added: 2009-07-29 +%% +Type: language +Subtag: dgg +Description: Doga +Added: 2009-07-29 +%% +Type: language +Subtag: dgh +Description: Dghwede +Added: 2009-07-29 +%% +Type: language +Subtag: dgi +Description: Northern Dagara +Added: 2009-07-29 +%% +Type: language +Subtag: dgk +Description: Dagba +Added: 2009-07-29 +%% +Type: language +Subtag: dgl +Description: Andaandi +Description: Dongolawi +Added: 2012-08-12 +%% +Type: language +Subtag: dgn +Description: Dagoman +Added: 2009-07-29 +%% +Type: language +Subtag: dgo +Description: Dogri (individual language) +Added: 2009-07-29 +Macrolanguage: doi +%% +Type: language +Subtag: dgr +Description: Dogrib +Added: 2005-10-16 +%% +Type: language +Subtag: dgs +Description: Dogoso +Added: 2009-07-29 +%% +Type: language +Subtag: dgt +Description: Ndrag'ngith +Added: 2012-08-12 +%% +Type: language +Subtag: dgu +Description: Degaru +Added: 2009-07-29 +%% +Type: language +Subtag: dgw +Description: Daungwurrung +Added: 2012-08-12 +%% +Type: language +Subtag: dgx +Description: Doghoro +Added: 2009-07-29 +%% +Type: language +Subtag: dgz +Description: Daga +Added: 2009-07-29 +%% +Type: language +Subtag: dha +Description: Dhanwar (India) +Added: 2009-07-29 +Deprecated: 2011-08-16 +%% +Type: language +Subtag: dhd +Description: Dhundari +Added: 2009-07-29 +Macrolanguage: mwr +%% +Type: language +Subtag: dhg +Description: Dhangu +Added: 2009-07-29 +%% +Type: language +Subtag: dhi +Description: Dhimal +Added: 2009-07-29 +%% +Type: language +Subtag: dhl +Description: Dhalandji +Added: 2009-07-29 +%% +Type: language +Subtag: dhm +Description: Zemba +Added: 2009-07-29 +%% +Type: language +Subtag: dhn +Description: Dhanki +Added: 2009-07-29 +%% +Type: language +Subtag: dho +Description: Dhodia +Added: 2009-07-29 +%% +Type: language +Subtag: dhr +Description: Dhargari +Added: 2009-07-29 +%% +Type: language +Subtag: dhs +Description: Dhaiso +Added: 2009-07-29 +%% +Type: language +Subtag: dhu +Description: Dhurga +Added: 2009-07-29 +%% +Type: language +Subtag: dhv +Description: Dehu +Added: 2009-07-29 +%% +Type: language +Subtag: dhw +Description: Dhanwar (Nepal) +Added: 2009-07-29 +%% +Type: language +Subtag: dia +Description: Dia +Added: 2009-07-29 +%% +Type: language +Subtag: dib +Description: South Central Dinka +Added: 2009-07-29 +Macrolanguage: din +%% +Type: language +Subtag: dic +Description: Lakota Dida +Added: 2009-07-29 +%% +Type: language +Subtag: did +Description: Didinga +Added: 2009-07-29 +%% +Type: language