language: use compact tags

Change-Id: Iecd38d92cfbd38d84067d1e7184e996f3eab4712
Reviewed-on: https://go-review.googlesource.com/95828
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/internal/colltab/colltab_test.go b/internal/colltab/colltab_test.go
index c403ac3..36943f0 100644
--- a/internal/colltab/colltab_test.go
+++ b/internal/colltab/colltab_test.go
@@ -57,8 +57,10 @@
 		{0, language.MustParse("und-Jpan-BR")}, // Infers "ja", so no match.
 		{0, language.MustParse("zu")},          // No match past index.
 	} {
-		if x := MatchLang(tc.t, tags); x != tc.x {
-			t.Errorf("%d: MatchLang(%q, tags) = %d; want %d", i, tc.t, x, tc.x)
-		}
+		t.Run(tc.t.String(), func(t *testing.T) {
+			if x := MatchLang(tc.t, tags); x != tc.x {
+				t.Errorf("%d: MatchLang(%q, tags) = %d; want %d", i, tc.t, x, tc.x)
+			}
+		})
 	}
 }
diff --git a/language/coverage.go b/language/coverage.go
index 3e7377d..e99fd34 100644
--- a/language/coverage.go
+++ b/language/coverage.go
@@ -124,7 +124,7 @@
 		}
 		a := make([]Base, len(tags))
 		for i, t := range tags {
-			a[i] = Base{language.Language(t.tag.LangID)}
+			a[i] = Base{language.Language(t.lang())}
 		}
 		sort.Sort(bases(a))
 		k := 0
diff --git a/language/gen.go b/language/gen.go
index 62bf6e4..30c8c97 100644
--- a/language/gen.go
+++ b/language/gen.go
@@ -97,16 +97,7 @@
 // TODO: region inclusion data will probably not be use used in future matchers.
 
 var langConsts = []string{
-	"af", "am", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es",
-	"et", "fa", "fi", "fil", "fr", "gu", "he", "hi", "hr", "hu", "hy", "id", "is",
-	"it", "ja", "ka", "kk", "km", "kn", "ko", "ky", "lo", "lt", "lv", "mk", "ml",
-	"mn", "mo", "mr", "ms", "mul", "my", "nb", "ne", "nl", "no", "pa", "pl", "pt",
-	"ro", "ru", "sh", "si", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th",
-	"tl", "tn", "tr", "uk", "ur", "uz", "vi", "zh", "zu",
-
-	// constants for grandfathered tags (if not already defined)
-	"jbo", "ami", "bnn", "hak", "tlh", "lb", "nv", "pwn", "tao", "tay", "tsu",
-	"nn", "sfb", "vgt", "sgg", "cmn", "nan", "hsn",
+	"de", "en", "fr", "it", "mo", "no", "nb", "pt", "sh", "mul", "und",
 }
 
 var scriptConsts = []string{
diff --git a/language/gen_index.go b/language/gen_index.go
index d476874..349bbf9 100644
--- a/language/gen_index.go
+++ b/language/gen_index.go
@@ -104,5 +104,5 @@
 }
 
 func ident(s string) string {
-	return "x" + strings.Replace(s, "-", "", -1)
+	return strings.Replace(s, "-", "", -1) + "Index"
 }
diff --git a/language/language.go b/language/language.go
index 94ec8f1..74b939d 100644
--- a/language/language.go
+++ b/language/language.go
@@ -19,12 +19,66 @@
 // specific language or locale. All language tag values are guaranteed to be
 // well-formed.
 type Tag struct {
-	tag language.Tag
+	language compactID
+	locale   compactID
+	full     fullTag // always a language.Tag for now.
 }
 
-func (t *Tag) lang() language.Language { return t.tag.LangID }
-func (t *Tag) region() language.Region { return t.tag.RegionID }
-func (t *Tag) script() language.Script { return t.tag.ScriptID }
+type fullTag interface {
+	IsRoot() bool
+	Parent() language.Tag
+}
+
+func makeTag(t language.Tag) (tag Tag) {
+	if region := t.TypeForKey("rg"); len(region) > 2 {
+		if r, err := language.ParseRegion(region[:2]); err == nil {
+			tFull := t
+			t, _ = t.SetTypeForKey("rg", "")
+			var exact1, exact2 bool
+			tag.language, exact1 = compactIndex(t)
+			t.RegionID = r
+			tag.locale, exact2 = compactIndex(t)
+			if !exact1 || !exact2 {
+				tag.full = tFull
+			}
+			return tag
+		}
+	}
+	lang, ok := compactIndex(t)
+	tag.language = lang
+	tag.locale = lang
+	if !ok {
+		tag.full = t
+	}
+	return tag
+}
+
+func (t *Tag) tag() language.Tag {
+	if t.full != nil {
+		return t.full.(language.Tag)
+	}
+	tag := t.language.tag()
+	if t.language != t.locale {
+		loc := t.locale.tag()
+		tag.SetTypeForKey("rg", strings.ToLower(loc.RegionID.String())+"zzzz")
+	}
+	return tag
+}
+
+func (t *Tag) mayHaveVariants() bool {
+	return t.full != nil || int(t.language) >= len(coreTags)
+}
+
+func (t *Tag) mayHaveExtensions() bool {
+	return t.full != nil ||
+		int(t.language) >= len(coreTags) ||
+		t.language != t.locale
+}
+
+// TODO: improve performance.
+func (t *Tag) lang() language.Language { return t.tag().LangID }
+func (t *Tag) region() language.Region { return t.tag().RegionID }
+func (t *Tag) script() language.Script { return t.tag().ScriptID }
 
 // Make is a convenience wrapper for Parse that omits the error.
 // In case of an error, a sensible default is returned.
@@ -42,17 +96,16 @@
 // Raw returns the raw base language, script and region, without making an
 // attempt to infer their values.
 func (t Tag) Raw() (b Base, s Script, r Region) {
-	return Base{t.tag.LangID}, Script{t.tag.ScriptID}, Region{t.tag.RegionID}
+	tt := t.tag()
+	return Base{tt.LangID}, Script{tt.ScriptID}, Region{tt.RegionID}
 }
 
 // IsRoot returns true if t is equal to language "und".
 func (t Tag) IsRoot() bool {
-	return t.tag.IsRoot()
-}
-
-// private reports whether the Tag consists solely of a private use tag.
-func (t Tag) private() bool {
-	return t.tag.IsPrivateUse()
+	if t.full != nil {
+		return t.full.IsRoot()
+	}
+	return t.language == _und
 }
 
 // CanonType can be used to enable or disable various types of canonicalization.
@@ -178,11 +231,20 @@
 
 // Canonicalize returns the canonicalized equivalent of the tag.
 func (c CanonType) Canonicalize(t Tag) (Tag, error) {
-	tt, changed := canonicalize(c, t.tag)
-	if changed {
-		tt.RemakeString()
+	// First try fast path.
+	if t.full == nil {
+		if _, changed := canonicalize(c, t.language.tag()); !changed {
+			return t, nil
+		}
 	}
-	return Tag{tt}, nil
+	// It is unlikely that one will canonicalize a tag after matching. So do
+	// a slow but simple approach here.
+	if tag, changed := canonicalize(c, t.tag()); changed {
+		tag.RemakeString()
+		return makeTag(tag), nil
+	}
+	return t, nil
+
 }
 
 // Confidence indicates the level of certainty for a given return value.
@@ -207,17 +269,20 @@
 
 // String returns the canonical string representation of the language tag.
 func (t Tag) String() string {
-	return t.tag.String()
+	return t.tag().String()
 }
 
 // MarshalText implements encoding.TextMarshaler.
 func (t Tag) MarshalText() (text []byte, err error) {
-	return t.tag.MarshalText()
+	return t.tag().MarshalText()
 }
 
 // UnmarshalText implements encoding.TextUnmarshaler.
 func (t *Tag) UnmarshalText(text []byte) error {
-	return t.tag.UnmarshalText(text)
+	var tag language.Tag
+	err := tag.UnmarshalText(text)
+	*t = makeTag(tag)
+	return err
 }
 
 // Base returns the base language of the language tag. If the base language is
@@ -227,7 +292,7 @@
 	if b := t.lang(); b != 0 {
 		return Base{b}, Exact
 	}
-	tt := t.tag
+	tt := t.tag()
 	c := High
 	if tt.ScriptID == 0 && !tt.RegionID.IsCountry() {
 		c = Low
@@ -253,10 +318,10 @@
 // in the past.  Also, the script that is commonly used may change over time.
 // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.
 func (t Tag) Script() (Script, Confidence) {
-	if t.script() != 0 {
-		return Script{t.script()}, Exact
+	if scr := t.script(); scr != 0 {
+		return Script{scr}, Exact
 	}
-	tt := t.tag
+	tt := t.tag()
 	sc, c := language.Script(_Zzzz), No
 	if scr := tt.LangID.SuppressScript(); scr != 0 {
 		// Note: it is not always the case that a language with a suppress
@@ -271,8 +336,8 @@
 			sc, c = tag.ScriptID, Low
 		}
 	} else {
-		t, _ = (Deprecated | Macro).Canonicalize(t)
-		if tag, err := t.tag.Maximize(); err == nil && tag.ScriptID != sc {
+		tt, _ = canonicalize(Deprecated|Macro, tt)
+		if tag, err := tt.Maximize(); err == nil && tag.ScriptID != sc {
 			sc, c = tag.ScriptID, Low
 		}
 	}
@@ -283,15 +348,15 @@
 // infer a most likely candidate from the context.
 // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.
 func (t Tag) Region() (Region, Confidence) {
-	if t.region() != 0 {
-		return Region{t.region()}, Exact
+	if r := t.region(); r != 0 {
+		return Region{r}, Exact
 	}
-	tt := t.tag
+	tt := t.tag()
 	if tt, err := tt.Maximize(); err == nil {
 		return Region{tt.RegionID}, Low // TODO: differentiate between high and low.
 	}
-	t, _ = (Deprecated | Macro).Canonicalize(t)
-	if tag, err := t.tag.Maximize(); err == nil {
+	tt, _ = canonicalize(Deprecated|Macro, tt)
+	if tag, err := tt.Maximize(); err == nil {
 		return Region{tag.RegionID}, Low
 	}
 	return Region{_ZZ}, No // TODO: return world instead of undetermined?
@@ -300,8 +365,11 @@
 // Variants returns the variants specified explicitly for this language tag.
 // or nil if no variant was specified.
 func (t Tag) Variants() []Variant {
+	if !t.mayHaveVariants() {
+		return nil
+	}
 	v := []Variant{}
-	x, str := "", t.tag.Variants()
+	x, str := "", t.tag().Variants()
 	for str != "" {
 		x, str = nextToken(str)
 		v = append(v, Variant{x})
@@ -313,7 +381,19 @@
 // specific language are substituted with fields from the parent language.
 // The parent for a language may change for newer versions of CLDR.
 func (t Tag) Parent() Tag {
-	return Tag{t.tag.Parent()}
+	if t.full != nil {
+		return makeTag(t.full.Parent())
+	}
+	if t.language != t.locale {
+		// Simulate stripping -u-rg-xxxxxx
+		return Tag{language: t.language, locale: t.language}
+	}
+	// TODO: use parent lookup table once cycle from internal package is
+	// removed. Probably by internalizing the table and declaring this fast
+	// enough.
+	// lang := compactID(internal.Parent(uint16(t.language)))
+	lang, _ := compactIndex(t.language.tag().Parent())
+	return Tag{language: lang, locale: lang}
 }
 
 // returns token t and the rest of the string.
@@ -361,14 +441,20 @@
 // false for ok if t does not have the requested extension. The returned
 // extension will be invalid in this case.
 func (t Tag) Extension(x byte) (ext Extension, ok bool) {
-	e, ok := t.tag.Extension(x)
+	if !t.mayHaveExtensions() {
+		return Extension{}, false
+	}
+	e, ok := t.tag().Extension(x)
 	return Extension{e}, ok
 }
 
 // Extensions returns all extensions of t.
 func (t Tag) Extensions() []Extension {
+	if !t.mayHaveExtensions() {
+		return nil
+	}
 	e := []Extension{}
-	for _, ext := range t.tag.Extensions() {
+	for _, ext := range t.tag().Extensions() {
 		e = append(e, Extension{ext})
 	}
 	return e
@@ -379,7 +465,12 @@
 // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
 // TypeForKey will traverse the inheritance chain to get the correct value.
 func (t Tag) TypeForKey(key string) string {
-	return t.tag.TypeForKey(key)
+	if !t.mayHaveExtensions() {
+		if key != "rg" && key != "va" {
+			return ""
+		}
+	}
+	return t.tag().TypeForKey(key)
 }
 
 // SetTypeForKey returns a new Tag with the key set to type, where key and type
@@ -387,8 +478,8 @@
 // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.
 // An empty value removes an existing pair with the same key.
 func (t Tag) SetTypeForKey(key, value string) (Tag, error) {
-	tt, err := t.tag.SetTypeForKey(key, value)
-	return Tag{tt}, err
+	tt, err := t.tag().SetTypeForKey(key, value)
+	return makeTag(tt), err
 }
 
 // CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags
@@ -397,6 +488,10 @@
 // index, exact will be false and the compact index will be returned for the
 // first match after repeatedly taking the Parent of t.
 func CompactIndex(t Tag) (index int, exact bool) {
+	return int(t.locale), t.language == t.locale && t.full == nil
+}
+
+func compactIndex(t language.Tag) (index compactID, exact bool) {
 	// TODO: perhaps give more frequent tags a lower index.
 	// TODO: we could make the indexes stable. This will excluded some
 	//       possibilities for optimization, so don't do this quite yet.
@@ -404,16 +499,19 @@
 
 	b, s, r := t.Raw()
 	switch {
-	case t.tag.HasString():
-		if t.private() {
+	case t.HasString():
+		if t.IsPrivateUse() {
 			// We have no entries for user-defined tags.
 			return 0, false
 		}
 		hasExtra := false
-		if t.tag.HasVariants() {
-			if t.tag.HasExtensions() {
+		if t.HasVariants() {
+			if t.HasExtensions() {
+				build := language.Builder{}
+				build.SetTag(t)
+				build.Private, build.Ext = "", nil
 				exact = false
-				t, _ = Raw.Compose(b, s, r, t.Variants())
+				t = build.Make()
 			}
 			hasExtra = true
 		} else if _, ok := t.Extension('u'); ok {
@@ -421,45 +519,49 @@
 			// Strip all but the 'va' entry.
 			old := t
 			variant := t.TypeForKey("va")
-			t, _ = Raw.Compose(b, s, r)
+			t = language.Tag{LangID: b, ScriptID: s, RegionID: r}
 			if variant != "" {
 				t, _ = t.SetTypeForKey("va", variant)
 				hasExtra = true
 			}
 			exact = old == t
+		} else {
+			exact = false
 		}
 		if hasExtra {
 			// We have some variants.
 			for i, s := range specialTags {
-				if s == t.tag {
-					return i + len(coreTags), exact
+				if s == t {
+					return compactID(i + len(coreTags)), exact
 				}
 			}
 			exact = false
 		}
 	}
-	if x, ok := getCoreIndex(t.tag); ok {
-		return int(x), exact
+	if x, ok := getCoreIndex(t); ok {
+		return x, exact
 	}
 	exact = false
-	if r.regionID != 0 && s.scriptID == 0 {
+	if r != 0 && s == 0 {
 		// Deal with cases where an extra script is inserted for the region.
-		t, _ := t.tag.Maximize()
+		t, _ := t.Maximize()
 		if x, ok := getCoreIndex(t); ok {
-			return int(x), exact
+			return x, exact
 		}
 	}
-	for t = t.Parent(); t != Und; t = t.Parent() {
+	for t = t.Parent(); t != root; t = t.Parent() {
 		// No variants specified: just compare core components.
 		// The key has the form lllssrrr, where l, s, and r are nibbles for
 		// respectively the langID, scriptID, and regionID.
-		if x, ok := getCoreIndex(t.tag); ok {
-			return int(x), exact
+		if x, ok := getCoreIndex(t); ok {
+			return x, exact
 		}
 	}
-	return int(0), exact
+	return 0, exact
 }
 
+var root = language.Tag{}
+
 // Base is an ISO 639 language code, used for encoding the base language
 // of a language tag.
 type Base struct {
diff --git a/language/language_test.go b/language/language_test.go
index 11c5dda..273f61f 100644
--- a/language/language_test.go
+++ b/language/language_test.go
@@ -32,7 +32,7 @@
 }
 
 func TestEquality(t *testing.T) {
-	for i, tt := range parseTests()[48:49] {
+	for i, tt := range parseTests() {
 		s := tt.in
 		tag := Make(s)
 		t1 := Make(tag.String())
@@ -54,26 +54,26 @@
 	}{
 		// TODO: these values will change with each CLDR update. This issue
 		// will be solved if we decide to fix the indexes.
-		{"und", xund, true},
-		{"ca-ES-valencia", xcaESvalencia, true},
-		{"ca-ES-valencia-u-va-posix", xcaESvalencia, false},
-		{"ca-ES-valencia-u-co-phonebk", xcaESvalencia, false},
-		{"ca-ES-valencia-u-co-phonebk-va-posix", xcaESvalencia, false},
+		{"und", undIndex, true},
+		{"ca-ES-valencia", caESvalenciaIndex, true},
+		{"ca-ES-valencia-u-va-posix", caESvalenciaIndex, false},
+		{"ca-ES-valencia-u-co-phonebk", caESvalenciaIndex, false},
+		{"ca-ES-valencia-u-co-phonebk-va-posix", caESvalenciaIndex, false},
 		{"x-klingon", 0, false},
-		{"en-US", xenUS, true},
-		{"en-US-u-va-posix", xenUSuvaposix, true},
-		{"en", xen, true},
-		{"en-u-co-phonebk", xen, false},
-		{"en-001", xen001, true},
-		{"zh-Hant-HK", xzhHantHK, true},
-		{"zh-HK", xzhHantHK, false}, // maximized to zh-Hant-HK
-		{"nl-Beng", 0, false},       // parent skips script
-		{"nl-NO", xnl, false},       // region is ignored
-		{"nl-Latn-NO", xnl, false},
-		{"nl-Latn-NO-u-co-phonebk", xnl, false},
-		{"nl-Latn-NO-valencia", xnl, false},
-		{"nl-Latn-NO-oxendict", xnl, false},
-		{"sh", xsh, true}, // From plural rules.
+		{"en-US", enUSIndex, true},
+		{"en-US-u-va-posix", enUSuvaposixIndex, true},
+		{"en", enIndex, true},
+		{"en-u-co-phonebk", enIndex, false},
+		{"en-001", en001Index, true},
+		{"zh-Hant-HK", zhHantHKIndex, true},
+		{"zh-HK", zhHantHKIndex, false}, // maximized to zh-Hant-HK
+		{"nl-Beng", 0, false},           // parent skips script
+		{"nl-NO", nlIndex, false},       // region is ignored
+		{"nl-Latn-NO", nlIndex, false},
+		{"nl-Latn-NO-u-co-phonebk", nlIndex, false},
+		{"nl-Latn-NO-valencia", nlIndex, false},
+		{"nl-Latn-NO-oxendict", nlIndex, false},
+		{"sh", shIndex, true}, // From plural rules.
 	}
 	for _, tt := range tests {
 		x, ok := CompactIndex(Raw.MustParse(tt.tag))
diff --git a/language/match.go b/language/match.go
index e4ad447..d84e972 100644
--- a/language/match.go
+++ b/language/match.go
@@ -105,23 +105,22 @@
 		// TODO: select first language tag based on script.
 	}
 	if w.RegionID != 0 && tt.RegionID != 0 && tt.RegionID.Contains(w.RegionID) {
-		t, _ := Raw.Compose(Tag{tt}, Region{w.RegionID})
-		tt = t.tag
+		tt.RegionID = w.RegionID
+		tt.RemakeString()
 	}
 	// Copy options from the user-provided tag into the result tag. This is hard
 	// to do after the fact, so we do it here.
 	// TODO: add in alternative variants to -u-va-.
 	// TODO: add preferred region to -u-rg-.
 	if e := w.Extensions(); len(e) > 0 {
-		// TODO: improve performance.
-		ext := make([]Extension, len(e))
-		for _, ee := range e {
-			ext = append(ext, Extension{ee})
+		b := language.Builder{}
+		b.SetTag(tt)
+		for _, e := range e {
+			b.AddExt(e)
 		}
-		t, _ := Raw.Compose(Tag{tt}, ext)
-		tt = t.tag
+		tt = b.Make()
 	}
-	return Tag{tt}, index, c
+	return makeTag(tt), index, c
 }
 
 // ErrMissingLikelyTagsData indicates no information was available
@@ -375,16 +374,18 @@
 	// Add supported languages to the index. Add exact matches first to give
 	// them precedence.
 	for i, tag := range supported {
-		pair, _ := makeHaveTag(tag.tag, i)
-		m.header(tag.tag.LangID).addIfNew(pair, true)
+		tt := tag.tag()
+		pair, _ := makeHaveTag(tt, i)
+		m.header(tt.LangID).addIfNew(pair, true)
 		m.supported = append(m.supported, &pair)
 	}
-	m.default_ = m.header(supported[0].tag.LangID).haveTags[0]
+	m.default_ = m.header(supported[0].lang()).haveTags[0]
 	// Keep these in two different loops to support the case that two equivalent
 	// languages are distinguished, such as iw and he.
 	for i, tag := range supported {
-		pair, max := makeHaveTag(tag.tag, i)
-		if max != tag.tag.LangID {
+		tt := tag.tag()
+		pair, max := makeHaveTag(tt, i)
+		if max != tt.LangID {
 			m.header(max).addIfNew(pair, true)
 		}
 	}
@@ -446,7 +447,7 @@
 func (m *matcher) getBest(want ...Tag) (got *haveTag, orig language.Tag, c Confidence) {
 	best := bestMatch{}
 	for i, ww := range want {
-		w := ww.tag
+		w := ww.tag()
 		var max language.Tag
 		// Check for exact match first.
 		h := m.index[w.LangID]
@@ -486,7 +487,7 @@
 		}
 		pin := true
 		for _, t := range want[i+1:] {
-			if w.LangID == t.tag.LangID {
+			if w.LangID == t.lang() {
 				pin = false
 				break
 			}
@@ -506,7 +507,7 @@
 	}
 	if best.conf <= No {
 		if len(want) != 0 {
-			return nil, want[0].tag, No
+			return nil, want[0].tag(), No
 		}
 		return nil, language.Tag{}, No
 	}
diff --git a/language/match_test.go b/language/match_test.go
index fd36983..3bfefff 100644
--- a/language/match_test.go
+++ b/language/match_test.go
@@ -172,7 +172,7 @@
 			t.Errorf("scripts differ: %q vs %q", aScript, bScript)
 			continue
 		}
-		d, _ := regionGroupDist(a.tag.RegionID, b.tag.RegionID, aScript.scriptID, a.tag.LangID)
+		d, _ := regionGroupDist(a.region(), b.region(), aScript.scriptID, a.lang())
 		if d != tc.distance {
 			t.Errorf("got %q; want %q", d, tc.distance)
 		}
@@ -189,7 +189,8 @@
 		"es-419": true,
 	}
 	for str, want := range testCases {
-		tag := Make(str).tag
+		tt := Make(str)
+		tag := tt.tag()
 		got := isParadigmLocale(tag.LangID, tag.RegionID)
 		if got != want {
 			t.Errorf("isPL(%q) = %v; want %v", str, got, want)
diff --git a/language/parse.go b/language/parse.go
index b68c02a..78122f6 100644
--- a/language/parse.go
+++ b/language/parse.go
@@ -45,13 +45,13 @@
 func (c CanonType) Parse(s string) (t Tag, err error) {
 	tt, err := language.Parse(s)
 	if err != nil {
-		return Tag{tt}, err
+		return makeTag(tt), err
 	}
 	tt, changed := canonicalize(c, tt)
 	if changed {
 		tt.RemakeString()
 	}
-	return Tag{tt}, err
+	return makeTag(tt), err
 }
 
 // Compose creates a Tag from individual parts, which may be of type Tag, Base,
@@ -82,7 +82,7 @@
 		return und, err
 	}
 	b.Tag, _ = canonicalize(c, b.Tag)
-	return Tag{b.Make()}, err
+	return makeTag(b.Make()), err
 }
 
 var errInvalidArgument = errors.New("invalid Extension or Variant")
@@ -104,18 +104,7 @@
 	for _, x := range part {
 		switch v := x.(type) {
 		case Tag:
-			b.Tag.LangID = v.lang()
-			b.Tag.RegionID = v.region()
-			b.Tag.ScriptID = v.script()
-			// TODO: optimize
-			b.Variant = b.Variant[:0]
-			for _, vr := range v.Variants() {
-				b.Variant = append(b.Variant, vr.String())
-			}
-			b.Ext, b.Private = b.Ext[:0], ""
-			for _, e := range v.Extensions() {
-				b.AddExt(e.String())
-			}
+			b.SetTag(v.tag())
 		case Base:
 			b.Tag.LangID = v.langID
 		case Script:
@@ -173,7 +162,7 @@
 			if !ok {
 				return nil, nil, err
 			}
-			t = Tag{tag: language.Tag{LangID: id}}
+			t = makeTag(language.Tag{LangID: id})
 		}
 
 		// Scan the optional weight.
diff --git a/language/parse_test.go b/language/parse_test.go
index fe6bc0d..0982d92 100644
--- a/language/parse_test.go
+++ b/language/parse_test.go
@@ -179,14 +179,14 @@
 		if r, _ := language.ParseRegion(tt.region); r != tag.region() {
 			t.Errorf("%d: region was %q; want %q", i, tag.region(), r)
 		}
-		v := tag.tag.Variants()
+		v := tag.tag().Variants()
 		if v != "" {
 			v = v[1:]
 		}
 		if v != tt.variants {
 			t.Errorf("%d: variants was %q; want %q", i, v, tt.variants)
 		}
-		if e := strings.Join(tag.tag.Extensions(), "-"); e != tt.ext {
+		if e := strings.Join(tag.tag().Extensions(), "-"); e != tt.ext {
 			t.Errorf("%d: extensions were %q; want %q", i, e, tt.ext)
 		}
 	}
diff --git a/language/tables.go b/language/tables.go
index bc3ba6d..52f4af4 100644
--- a/language/tables.go
+++ b/language/tables.go
@@ -8,98 +8,17 @@
 const CLDRVersion = "32"
 
 const (
-	_af  = 22
-	_am  = 39
-	_ar  = 58
-	_az  = 88
-	_bg  = 126
-	_bn  = 165
-	_ca  = 215
-	_cs  = 250
-	_da  = 257
 	_de  = 269
-	_el  = 310
 	_en  = 313
-	_es  = 318
-	_et  = 320
-	_fa  = 328
-	_fi  = 337
-	_fil = 339
 	_fr  = 350
-	_gu  = 420
-	_he  = 444
-	_hi  = 446
-	_hr  = 465
-	_hu  = 469
-	_hy  = 471
-	_id  = 481
-	_is  = 504
 	_it  = 505
-	_ja  = 512
-	_ka  = 528
-	_kk  = 578
-	_km  = 586
-	_kn  = 593
-	_ko  = 596
-	_ky  = 650
-	_lo  = 696
-	_lt  = 704
-	_lv  = 711
-	_mk  = 767
-	_ml  = 772
-	_mn  = 779
 	_mo  = 784
-	_mr  = 795
-	_ms  = 799
-	_mul = 806
-	_my  = 817
-	_nb  = 839
-	_ne  = 849
-	_nl  = 871
 	_no  = 879
-	_pa  = 925
-	_pl  = 947
+	_nb  = 839
 	_pt  = 960
-	_ro  = 988
-	_ru  = 994
 	_sh  = 1031
-	_si  = 1036
-	_sk  = 1042
-	_sl  = 1046
-	_sq  = 1073
-	_sr  = 1074
-	_sv  = 1092
-	_sw  = 1093
-	_ta  = 1104
-	_te  = 1121
-	_th  = 1131
-	_tl  = 1146
-	_tn  = 1152
-	_tr  = 1162
-	_uk  = 1198
-	_ur  = 1204
-	_uz  = 1212
-	_vi  = 1219
-	_zh  = 1321
-	_zu  = 1327
-	_jbo = 515
-	_ami = 1650
-	_bnn = 2357
-	_hak = 438
-	_tlh = 14467
-	_lb  = 661
-	_nv  = 899
-	_pwn = 12055
-	_tao = 14188
-	_tay = 14198
-	_tsu = 14662
-	_nn  = 874
-	_sfb = 13629
-	_vgt = 15701
-	_sgg = 13660
-	_cmn = 3007
-	_nan = 835
-	_hsn = 467
+	_mul = 806
+	_und = 0
 )
 const (
 	_001 = 1
@@ -134,781 +53,781 @@
 // NumCompactTags-1.
 const NumCompactTags = 775
 const (
-	xund          compactID = 0
-	xaf           compactID = 1
-	xafNA         compactID = 2
-	xafZA         compactID = 3
-	xagq          compactID = 4
-	xagqCM        compactID = 5
-	xak           compactID = 6
-	xakGH         compactID = 7
-	xam           compactID = 8
-	xamET         compactID = 9
-	xar           compactID = 10
-	xar001        compactID = 11
-	xarAE         compactID = 12
-	xarBH         compactID = 13
-	xarDJ         compactID = 14
-	xarDZ         compactID = 15
-	xarEG         compactID = 16
-	xarEH         compactID = 17
-	xarER         compactID = 18
-	xarIL         compactID = 19
-	xarIQ         compactID = 20
-	xarJO         compactID = 21
-	xarKM         compactID = 22
-	xarKW         compactID = 23
-	xarLB         compactID = 24
-	xarLY         compactID = 25
-	xarMA         compactID = 26
-	xarMR         compactID = 27
-	xarOM         compactID = 28
-	xarPS         compactID = 29
-	xarQA         compactID = 30
-	xarSA         compactID = 31
-	xarSD         compactID = 32
-	xarSO         compactID = 33
-	xarSS         compactID = 34
-	xarSY         compactID = 35
-	xarTD         compactID = 36
-	xarTN         compactID = 37
-	xarYE         compactID = 38
-	xars          compactID = 39
-	xas           compactID = 40
-	xasIN         compactID = 41
-	xasa          compactID = 42
-	xasaTZ        compactID = 43
-	xast          compactID = 44
-	xastES        compactID = 45
-	xaz           compactID = 46
-	xazCyrl       compactID = 47
-	xazCyrlAZ     compactID = 48
-	xazLatn       compactID = 49
-	xazLatnAZ     compactID = 50
-	xbas          compactID = 51
-	xbasCM        compactID = 52
-	xbe           compactID = 53
-	xbeBY         compactID = 54
-	xbem          compactID = 55
-	xbemZM        compactID = 56
-	xbez          compactID = 57
-	xbezTZ        compactID = 58
-	xbg           compactID = 59
-	xbgBG         compactID = 60
-	xbh           compactID = 61
-	xbm           compactID = 62
-	xbmML         compactID = 63
-	xbn           compactID = 64
-	xbnBD         compactID = 65
-	xbnIN         compactID = 66
-	xbo           compactID = 67
-	xboCN         compactID = 68
-	xboIN         compactID = 69
-	xbr           compactID = 70
-	xbrFR         compactID = 71
-	xbrx          compactID = 72
-	xbrxIN        compactID = 73
-	xbs           compactID = 74
-	xbsCyrl       compactID = 75
-	xbsCyrlBA     compactID = 76
-	xbsLatn       compactID = 77
-	xbsLatnBA     compactID = 78
-	xca           compactID = 79
-	xcaAD         compactID = 80
-	xcaES         compactID = 81
-	xcaFR         compactID = 82
-	xcaIT         compactID = 83
-	xccp          compactID = 84
-	xccpBD        compactID = 85
-	xccpIN        compactID = 86
-	xce           compactID = 87
-	xceRU         compactID = 88
-	xcgg          compactID = 89
-	xcggUG        compactID = 90
-	xchr          compactID = 91
-	xchrUS        compactID = 92
-	xckb          compactID = 93
-	xckbIQ        compactID = 94
-	xckbIR        compactID = 95
-	xcs           compactID = 96
-	xcsCZ         compactID = 97
-	xcu           compactID = 98
-	xcuRU         compactID = 99
-	xcy           compactID = 100
-	xcyGB         compactID = 101
-	xda           compactID = 102
-	xdaDK         compactID = 103
-	xdaGL         compactID = 104
-	xdav          compactID = 105
-	xdavKE        compactID = 106
-	xde           compactID = 107
-	xdeAT         compactID = 108
-	xdeBE         compactID = 109
-	xdeCH         compactID = 110
-	xdeDE         compactID = 111
-	xdeIT         compactID = 112
-	xdeLI         compactID = 113
-	xdeLU         compactID = 114
-	xdje          compactID = 115
-	xdjeNE        compactID = 116
-	xdsb          compactID = 117
-	xdsbDE        compactID = 118
-	xdua          compactID = 119
-	xduaCM        compactID = 120
-	xdv           compactID = 121
-	xdyo          compactID = 122
-	xdyoSN        compactID = 123
-	xdz           compactID = 124
-	xdzBT         compactID = 125
-	xebu          compactID = 126
-	xebuKE        compactID = 127
-	xee           compactID = 128
-	xeeGH         compactID = 129
-	xeeTG         compactID = 130
-	xel           compactID = 131
-	xelCY         compactID = 132
-	xelGR         compactID = 133
-	xen           compactID = 134
-	xen001        compactID = 135
-	xen150        compactID = 136
-	xenAG         compactID = 137
-	xenAI         compactID = 138
-	xenAS         compactID = 139
-	xenAT         compactID = 140
-	xenAU         compactID = 141
-	xenBB         compactID = 142
-	xenBE         compactID = 143
-	xenBI         compactID = 144
-	xenBM         compactID = 145
-	xenBS         compactID = 146
-	xenBW         compactID = 147
-	xenBZ         compactID = 148
-	xenCA         compactID = 149
-	xenCC         compactID = 150
-	xenCH         compactID = 151
-	xenCK         compactID = 152
-	xenCM         compactID = 153
-	xenCX         compactID = 154
-	xenCY         compactID = 155
-	xenDE         compactID = 156
-	xenDG         compactID = 157
-	xenDK         compactID = 158
-	xenDM         compactID = 159
-	xenER         compactID = 160
-	xenFI         compactID = 161
-	xenFJ         compactID = 162
-	xenFK         compactID = 163
-	xenFM         compactID = 164
-	xenGB         compactID = 165
-	xenGD         compactID = 166
-	xenGG         compactID = 167
-	xenGH         compactID = 168
-	xenGI         compactID = 169
-	xenGM         compactID = 170
-	xenGU         compactID = 171
-	xenGY         compactID = 172
-	xenHK         compactID = 173
-	xenIE         compactID = 174
-	xenIL         compactID = 175
-	xenIM         compactID = 176
-	xenIN         compactID = 177
-	xenIO         compactID = 178
-	xenJE         compactID = 179
-	xenJM         compactID = 180
-	xenKE         compactID = 181
-	xenKI         compactID = 182
-	xenKN         compactID = 183
-	xenKY         compactID = 184
-	xenLC         compactID = 185
-	xenLR         compactID = 186
-	xenLS         compactID = 187
-	xenMG         compactID = 188
-	xenMH         compactID = 189
-	xenMO         compactID = 190
-	xenMP         compactID = 191
-	xenMS         compactID = 192
-	xenMT         compactID = 193
-	xenMU         compactID = 194
-	xenMW         compactID = 195
-	xenMY         compactID = 196
-	xenNA         compactID = 197
-	xenNF         compactID = 198
-	xenNG         compactID = 199
-	xenNL         compactID = 200
-	xenNR         compactID = 201
-	xenNU         compactID = 202
-	xenNZ         compactID = 203
-	xenPG         compactID = 204
-	xenPH         compactID = 205
-	xenPK         compactID = 206
-	xenPN         compactID = 207
-	xenPR         compactID = 208
-	xenPW         compactID = 209
-	xenRW         compactID = 210
-	xenSB         compactID = 211
-	xenSC         compactID = 212
-	xenSD         compactID = 213
-	xenSE         compactID = 214
-	xenSG         compactID = 215
-	xenSH         compactID = 216
-	xenSI         compactID = 217
-	xenSL         compactID = 218
-	xenSS         compactID = 219
-	xenSX         compactID = 220
-	xenSZ         compactID = 221
-	xenTC         compactID = 222
-	xenTK         compactID = 223
-	xenTO         compactID = 224
-	xenTT         compactID = 225
-	xenTV         compactID = 226
-	xenTZ         compactID = 227
-	xenUG         compactID = 228
-	xenUM         compactID = 229
-	xenUS         compactID = 230
-	xenVC         compactID = 231
-	xenVG         compactID = 232
-	xenVI         compactID = 233
-	xenVU         compactID = 234
-	xenWS         compactID = 235
-	xenZA         compactID = 236
-	xenZM         compactID = 237
-	xenZW         compactID = 238
-	xeo           compactID = 239
-	xeo001        compactID = 240
-	xes           compactID = 241
-	xes419        compactID = 242
-	xesAR         compactID = 243
-	xesBO         compactID = 244
-	xesBR         compactID = 245
-	xesBZ         compactID = 246
-	xesCL         compactID = 247
-	xesCO         compactID = 248
-	xesCR         compactID = 249
-	xesCU         compactID = 250
-	xesDO         compactID = 251
-	xesEA         compactID = 252
-	xesEC         compactID = 253
-	xesES         compactID = 254
-	xesGQ         compactID = 255
-	xesGT         compactID = 256
-	xesHN         compactID = 257
-	xesIC         compactID = 258
-	xesMX         compactID = 259
-	xesNI         compactID = 260
-	xesPA         compactID = 261
-	xesPE         compactID = 262
-	xesPH         compactID = 263
-	xesPR         compactID = 264
-	xesPY         compactID = 265
-	xesSV         compactID = 266
-	xesUS         compactID = 267
-	xesUY         compactID = 268
-	xesVE         compactID = 269
-	xet           compactID = 270
-	xetEE         compactID = 271
-	xeu           compactID = 272
-	xeuES         compactID = 273
-	xewo          compactID = 274
-	xewoCM        compactID = 275
-	xfa           compactID = 276
-	xfaAF         compactID = 277
-	xfaIR         compactID = 278
-	xff           compactID = 279
-	xffCM         compactID = 280
-	xffGN         compactID = 281
-	xffMR         compactID = 282
-	xffSN         compactID = 283
-	xfi           compactID = 284
-	xfiFI         compactID = 285
-	xfil          compactID = 286
-	xfilPH        compactID = 287
-	xfo           compactID = 288
-	xfoDK         compactID = 289
-	xfoFO         compactID = 290
-	xfr           compactID = 291
-	xfrBE         compactID = 292
-	xfrBF         compactID = 293
-	xfrBI         compactID = 294
-	xfrBJ         compactID = 295
-	xfrBL         compactID = 296
-	xfrCA         compactID = 297
-	xfrCD         compactID = 298
-	xfrCF         compactID = 299
-	xfrCG         compactID = 300
-	xfrCH         compactID = 301
-	xfrCI         compactID = 302
-	xfrCM         compactID = 303
-	xfrDJ         compactID = 304
-	xfrDZ         compactID = 305
-	xfrFR         compactID = 306
-	xfrGA         compactID = 307
-	xfrGF         compactID = 308
-	xfrGN         compactID = 309
-	xfrGP         compactID = 310
-	xfrGQ         compactID = 311
-	xfrHT         compactID = 312
-	xfrKM         compactID = 313
-	xfrLU         compactID = 314
-	xfrMA         compactID = 315
-	xfrMC         compactID = 316
-	xfrMF         compactID = 317
-	xfrMG         compactID = 318
-	xfrML         compactID = 319
-	xfrMQ         compactID = 320
-	xfrMR         compactID = 321
-	xfrMU         compactID = 322
-	xfrNC         compactID = 323
-	xfrNE         compactID = 324
-	xfrPF         compactID = 325
-	xfrPM         compactID = 326
-	xfrRE         compactID = 327
-	xfrRW         compactID = 328
-	xfrSC         compactID = 329
-	xfrSN         compactID = 330
-	xfrSY         compactID = 331
-	xfrTD         compactID = 332
-	xfrTG         compactID = 333
-	xfrTN         compactID = 334
-	xfrVU         compactID = 335
-	xfrWF         compactID = 336
-	xfrYT         compactID = 337
-	xfur          compactID = 338
-	xfurIT        compactID = 339
-	xfy           compactID = 340
-	xfyNL         compactID = 341
-	xga           compactID = 342
-	xgaIE         compactID = 343
-	xgd           compactID = 344
-	xgdGB         compactID = 345
-	xgl           compactID = 346
-	xglES         compactID = 347
-	xgsw          compactID = 348
-	xgswCH        compactID = 349
-	xgswFR        compactID = 350
-	xgswLI        compactID = 351
-	xgu           compactID = 352
-	xguIN         compactID = 353
-	xguw          compactID = 354
-	xguz          compactID = 355
-	xguzKE        compactID = 356
-	xgv           compactID = 357
-	xgvIM         compactID = 358
-	xha           compactID = 359
-	xhaGH         compactID = 360
-	xhaNE         compactID = 361
-	xhaNG         compactID = 362
-	xhaw          compactID = 363
-	xhawUS        compactID = 364
-	xhe           compactID = 365
-	xheIL         compactID = 366
-	xhi           compactID = 367
-	xhiIN         compactID = 368
-	xhr           compactID = 369
-	xhrBA         compactID = 370
-	xhrHR         compactID = 371
-	xhsb          compactID = 372
-	xhsbDE        compactID = 373
-	xhu           compactID = 374
-	xhuHU         compactID = 375
-	xhy           compactID = 376
-	xhyAM         compactID = 377
-	xid           compactID = 378
-	xidID         compactID = 379
-	xig           compactID = 380
-	xigNG         compactID = 381
-	xii           compactID = 382
-	xiiCN         compactID = 383
-	xin           compactID = 384
-	xio           compactID = 385
-	xis           compactID = 386
-	xisIS         compactID = 387
-	xit           compactID = 388
-	xitCH         compactID = 389
-	xitIT         compactID = 390
-	xitSM         compactID = 391
-	xitVA         compactID = 392
-	xiu           compactID = 393
-	xiw           compactID = 394
-	xja           compactID = 395
-	xjaJP         compactID = 396
-	xjbo          compactID = 397
-	xjgo          compactID = 398
-	xjgoCM        compactID = 399
-	xji           compactID = 400
-	xjmc          compactID = 401
-	xjmcTZ        compactID = 402
-	xjv           compactID = 403
-	xjw           compactID = 404
-	xka           compactID = 405
-	xkaGE         compactID = 406
-	xkab          compactID = 407
-	xkabDZ        compactID = 408
-	xkaj          compactID = 409
-	xkam          compactID = 410
-	xkamKE        compactID = 411
-	xkcg          compactID = 412
-	xkde          compactID = 413
-	xkdeTZ        compactID = 414
-	xkea          compactID = 415
-	xkeaCV        compactID = 416
-	xkhq          compactID = 417
-	xkhqML        compactID = 418
-	xki           compactID = 419
-	xkiKE         compactID = 420
-	xkk           compactID = 421
-	xkkKZ         compactID = 422
-	xkkj          compactID = 423
-	xkkjCM        compactID = 424
-	xkl           compactID = 425
-	xklGL         compactID = 426
-	xkln          compactID = 427
-	xklnKE        compactID = 428
-	xkm           compactID = 429
-	xkmKH         compactID = 430
-	xkn           compactID = 431
-	xknIN         compactID = 432
-	xko           compactID = 433
-	xkoKP         compactID = 434
-	xkoKR         compactID = 435
-	xkok          compactID = 436
-	xkokIN        compactID = 437
-	xks           compactID = 438
-	xksIN         compactID = 439
-	xksb          compactID = 440
-	xksbTZ        compactID = 441
-	xksf          compactID = 442
-	xksfCM        compactID = 443
-	xksh          compactID = 444
-	xkshDE        compactID = 445
-	xku           compactID = 446
-	xkw           compactID = 447
-	xkwGB         compactID = 448
-	xky           compactID = 449
-	xkyKG         compactID = 450
-	xlag          compactID = 451
-	xlagTZ        compactID = 452
-	xlb           compactID = 453
-	xlbLU         compactID = 454
-	xlg           compactID = 455
-	xlgUG         compactID = 456
-	xlkt          compactID = 457
-	xlktUS        compactID = 458
-	xln           compactID = 459
-	xlnAO         compactID = 460
-	xlnCD         compactID = 461
-	xlnCF         compactID = 462
-	xlnCG         compactID = 463
-	xlo           compactID = 464
-	xloLA         compactID = 465
-	xlrc          compactID = 466
-	xlrcIQ        compactID = 467
-	xlrcIR        compactID = 468
-	xlt           compactID = 469
-	xltLT         compactID = 470
-	xlu           compactID = 471
-	xluCD         compactID = 472
-	xluo          compactID = 473
-	xluoKE        compactID = 474
-	xluy          compactID = 475
-	xluyKE        compactID = 476
-	xlv           compactID = 477
-	xlvLV         compactID = 478
-	xmas          compactID = 479
-	xmasKE        compactID = 480
-	xmasTZ        compactID = 481
-	xmer          compactID = 482
-	xmerKE        compactID = 483
-	xmfe          compactID = 484
-	xmfeMU        compactID = 485
-	xmg           compactID = 486
-	xmgMG         compactID = 487
-	xmgh          compactID = 488
-	xmghMZ        compactID = 489
-	xmgo          compactID = 490
-	xmgoCM        compactID = 491
-	xmk           compactID = 492
-	xmkMK         compactID = 493
-	xml           compactID = 494
-	xmlIN         compactID = 495
-	xmn           compactID = 496
-	xmnMN         compactID = 497
-	xmo           compactID = 498
-	xmr           compactID = 499
-	xmrIN         compactID = 500
-	xms           compactID = 501
-	xmsBN         compactID = 502
-	xmsMY         compactID = 503
-	xmsSG         compactID = 504
-	xmt           compactID = 505
-	xmtMT         compactID = 506
-	xmua          compactID = 507
-	xmuaCM        compactID = 508
-	xmy           compactID = 509
-	xmyMM         compactID = 510
-	xmzn          compactID = 511
-	xmznIR        compactID = 512
-	xnah          compactID = 513
-	xnaq          compactID = 514
-	xnaqNA        compactID = 515
-	xnb           compactID = 516
-	xnbNO         compactID = 517
-	xnbSJ         compactID = 518
-	xnd           compactID = 519
-	xndZW         compactID = 520
-	xnds          compactID = 521
-	xndsDE        compactID = 522
-	xndsNL        compactID = 523
-	xne           compactID = 524
-	xneIN         compactID = 525
-	xneNP         compactID = 526
-	xnl           compactID = 527
-	xnlAW         compactID = 528
-	xnlBE         compactID = 529
-	xnlBQ         compactID = 530
-	xnlCW         compactID = 531
-	xnlNL         compactID = 532
-	xnlSR         compactID = 533
-	xnlSX         compactID = 534
-	xnmg          compactID = 535
-	xnmgCM        compactID = 536
-	xnn           compactID = 537
-	xnnNO         compactID = 538
-	xnnh          compactID = 539
-	xnnhCM        compactID = 540
-	xno           compactID = 541
-	xnqo          compactID = 542
-	xnr           compactID = 543
-	xnso          compactID = 544
-	xnus          compactID = 545
-	xnusSS        compactID = 546
-	xny           compactID = 547
-	xnyn          compactID = 548
-	xnynUG        compactID = 549
-	xom           compactID = 550
-	xomET         compactID = 551
-	xomKE         compactID = 552
-	xor           compactID = 553
-	xorIN         compactID = 554
-	xos           compactID = 555
-	xosGE         compactID = 556
-	xosRU         compactID = 557
-	xpa           compactID = 558
-	xpaArab       compactID = 559
-	xpaArabPK     compactID = 560
-	xpaGuru       compactID = 561
-	xpaGuruIN     compactID = 562
-	xpap          compactID = 563
-	xpl           compactID = 564
-	xplPL         compactID = 565
-	xprg          compactID = 566
-	xprg001       compactID = 567
-	xps           compactID = 568
-	xpsAF         compactID = 569
-	xpt           compactID = 570
-	xptAO         compactID = 571
-	xptBR         compactID = 572
-	xptCH         compactID = 573
-	xptCV         compactID = 574
-	xptGQ         compactID = 575
-	xptGW         compactID = 576
-	xptLU         compactID = 577
-	xptMO         compactID = 578
-	xptMZ         compactID = 579
-	xptPT         compactID = 580
-	xptST         compactID = 581
-	xptTL         compactID = 582
-	xqu           compactID = 583
-	xquBO         compactID = 584
-	xquEC         compactID = 585
-	xquPE         compactID = 586
-	xrm           compactID = 587
-	xrmCH         compactID = 588
-	xrn           compactID = 589
-	xrnBI         compactID = 590
-	xro           compactID = 591
-	xroMD         compactID = 592
-	xroRO         compactID = 593
-	xrof          compactID = 594
-	xrofTZ        compactID = 595
-	xru           compactID = 596
-	xruBY         compactID = 597
-	xruKG         compactID = 598
-	xruKZ         compactID = 599
-	xruMD         compactID = 600
-	xruRU         compactID = 601
-	xruUA         compactID = 602
-	xrw           compactID = 603
-	xrwRW         compactID = 604
-	xrwk          compactID = 605
-	xrwkTZ        compactID = 606
-	xsah          compactID = 607
-	xsahRU        compactID = 608
-	xsaq          compactID = 609
-	xsaqKE        compactID = 610
-	xsbp          compactID = 611
-	xsbpTZ        compactID = 612
-	xsd           compactID = 613
-	xsdPK         compactID = 614
-	xsdh          compactID = 615
-	xse           compactID = 616
-	xseFI         compactID = 617
-	xseNO         compactID = 618
-	xseSE         compactID = 619
-	xseh          compactID = 620
-	xsehMZ        compactID = 621
-	xses          compactID = 622
-	xsesML        compactID = 623
-	xsg           compactID = 624
-	xsgCF         compactID = 625
-	xsh           compactID = 626
-	xshi          compactID = 627
-	xshiLatn      compactID = 628
-	xshiLatnMA    compactID = 629
-	xshiTfng      compactID = 630
-	xshiTfngMA    compactID = 631
-	xsi           compactID = 632
-	xsiLK         compactID = 633
-	xsk           compactID = 634
-	xskSK         compactID = 635
-	xsl           compactID = 636
-	xslSI         compactID = 637
-	xsma          compactID = 638
-	xsmi          compactID = 639
-	xsmj          compactID = 640
-	xsmn          compactID = 641
-	xsmnFI        compactID = 642
-	xsms          compactID = 643
-	xsn           compactID = 644
-	xsnZW         compactID = 645
-	xso           compactID = 646
-	xsoDJ         compactID = 647
-	xsoET         compactID = 648
-	xsoKE         compactID = 649
-	xsoSO         compactID = 650
-	xsq           compactID = 651
-	xsqAL         compactID = 652
-	xsqMK         compactID = 653
-	xsqXK         compactID = 654
-	xsr           compactID = 655
-	xsrCyrl       compactID = 656
-	xsrCyrlBA     compactID = 657
-	xsrCyrlME     compactID = 658
-	xsrCyrlRS     compactID = 659
-	xsrCyrlXK     compactID = 660
-	xsrLatn       compactID = 661
-	xsrLatnBA     compactID = 662
-	xsrLatnME     compactID = 663
-	xsrLatnRS     compactID = 664
-	xsrLatnXK     compactID = 665
-	xss           compactID = 666
-	xssy          compactID = 667
-	xst           compactID = 668
-	xsv           compactID = 669
-	xsvAX         compactID = 670
-	xsvFI         compactID = 671
-	xsvSE         compactID = 672
-	xsw           compactID = 673
-	xswCD         compactID = 674
-	xswKE         compactID = 675
-	xswTZ         compactID = 676
-	xswUG         compactID = 677
-	xsyr          compactID = 678
-	xta           compactID = 679
-	xtaIN         compactID = 680
-	xtaLK         compactID = 681
-	xtaMY         compactID = 682
-	xtaSG         compactID = 683
-	xte           compactID = 684
-	xteIN         compactID = 685
-	xteo          compactID = 686
-	xteoKE        compactID = 687
-	xteoUG        compactID = 688
-	xtg           compactID = 689
-	xtgTJ         compactID = 690
-	xth           compactID = 691
-	xthTH         compactID = 692
-	xti           compactID = 693
-	xtiER         compactID = 694
-	xtiET         compactID = 695
-	xtig          compactID = 696
-	xtk           compactID = 697
-	xtkTM         compactID = 698
-	xtl           compactID = 699
-	xtn           compactID = 700
-	xto           compactID = 701
-	xtoTO         compactID = 702
-	xtr           compactID = 703
-	xtrCY         compactID = 704
-	xtrTR         compactID = 705
-	xts           compactID = 706
-	xtt           compactID = 707
-	xttRU         compactID = 708
-	xtwq          compactID = 709
-	xtwqNE        compactID = 710
-	xtzm          compactID = 711
-	xtzmMA        compactID = 712
-	xug           compactID = 713
-	xugCN         compactID = 714
-	xuk           compactID = 715
-	xukUA         compactID = 716
-	xur           compactID = 717
-	xurIN         compactID = 718
-	xurPK         compactID = 719
-	xuz           compactID = 720
-	xuzArab       compactID = 721
-	xuzArabAF     compactID = 722
-	xuzCyrl       compactID = 723
-	xuzCyrlUZ     compactID = 724
-	xuzLatn       compactID = 725
-	xuzLatnUZ     compactID = 726
-	xvai          compactID = 727
-	xvaiLatn      compactID = 728
-	xvaiLatnLR    compactID = 729
-	xvaiVaii      compactID = 730
-	xvaiVaiiLR    compactID = 731
-	xve           compactID = 732
-	xvi           compactID = 733
-	xviVN         compactID = 734
-	xvo           compactID = 735
-	xvo001        compactID = 736
-	xvun          compactID = 737
-	xvunTZ        compactID = 738
-	xwa           compactID = 739
-	xwae          compactID = 740
-	xwaeCH        compactID = 741
-	xwo           compactID = 742
-	xwoSN         compactID = 743
-	xxh           compactID = 744
-	xxog          compactID = 745
-	xxogUG        compactID = 746
-	xyav          compactID = 747
-	xyavCM        compactID = 748
-	xyi           compactID = 749
-	xyi001        compactID = 750
-	xyo           compactID = 751
-	xyoBJ         compactID = 752
-	xyoNG         compactID = 753
-	xyue          compactID = 754
-	xyueHans      compactID = 755
-	xyueHansCN    compactID = 756
-	xyueHant      compactID = 757
-	xyueHantHK    compactID = 758
-	xzgh          compactID = 759
-	xzghMA        compactID = 760
-	xzh           compactID = 761
-	xzhHans       compactID = 762
-	xzhHansCN     compactID = 763
-	xzhHansHK     compactID = 764
-	xzhHansMO     compactID = 765
-	xzhHansSG     compactID = 766
-	xzhHant       compactID = 767
-	xzhHantHK     compactID = 768
-	xzhHantMO     compactID = 769
-	xzhHantTW     compactID = 770
-	xzu           compactID = 771
-	xzuZA         compactID = 772
-	xcaESvalencia compactID = 773
-	xenUSuvaposix compactID = 774
+	undIndex          compactID = 0
+	afIndex           compactID = 1
+	afNAIndex         compactID = 2
+	afZAIndex         compactID = 3
+	agqIndex          compactID = 4
+	agqCMIndex        compactID = 5
+	akIndex           compactID = 6
+	akGHIndex         compactID = 7
+	amIndex           compactID = 8
+	amETIndex         compactID = 9
+	arIndex           compactID = 10
+	ar001Index        compactID = 11
+	arAEIndex         compactID = 12
+	arBHIndex         compactID = 13
+	arDJIndex         compactID = 14
+	arDZIndex         compactID = 15
+	arEGIndex         compactID = 16
+	arEHIndex         compactID = 17
+	arERIndex         compactID = 18
+	arILIndex         compactID = 19
+	arIQIndex         compactID = 20
+	arJOIndex         compactID = 21
+	arKMIndex         compactID = 22
+	arKWIndex         compactID = 23
+	arLBIndex         compactID = 24
+	arLYIndex         compactID = 25
+	arMAIndex         compactID = 26
+	arMRIndex         compactID = 27
+	arOMIndex         compactID = 28
+	arPSIndex         compactID = 29
+	arQAIndex         compactID = 30
+	arSAIndex         compactID = 31
+	arSDIndex         compactID = 32
+	arSOIndex         compactID = 33
+	arSSIndex         compactID = 34
+	arSYIndex         compactID = 35
+	arTDIndex         compactID = 36
+	arTNIndex         compactID = 37
+	arYEIndex         compactID = 38
+	arsIndex          compactID = 39
+	asIndex           compactID = 40
+	asINIndex         compactID = 41
+	asaIndex          compactID = 42
+	asaTZIndex        compactID = 43
+	astIndex          compactID = 44
+	astESIndex        compactID = 45
+	azIndex           compactID = 46
+	azCyrlIndex       compactID = 47
+	azCyrlAZIndex     compactID = 48
+	azLatnIndex       compactID = 49
+	azLatnAZIndex     compactID = 50
+	basIndex          compactID = 51
+	basCMIndex        compactID = 52
+	beIndex           compactID = 53
+	beBYIndex         compactID = 54
+	bemIndex          compactID = 55
+	bemZMIndex        compactID = 56
+	bezIndex          compactID = 57
+	bezTZIndex        compactID = 58
+	bgIndex           compactID = 59
+	bgBGIndex         compactID = 60
+	bhIndex           compactID = 61
+	bmIndex           compactID = 62
+	bmMLIndex         compactID = 63
+	bnIndex           compactID = 64
+	bnBDIndex         compactID = 65
+	bnINIndex         compactID = 66
+	boIndex           compactID = 67
+	boCNIndex         compactID = 68
+	boINIndex         compactID = 69
+	brIndex           compactID = 70
+	brFRIndex         compactID = 71
+	brxIndex          compactID = 72
+	brxINIndex        compactID = 73
+	bsIndex           compactID = 74
+	bsCyrlIndex       compactID = 75
+	bsCyrlBAIndex     compactID = 76
+	bsLatnIndex       compactID = 77
+	bsLatnBAIndex     compactID = 78
+	caIndex           compactID = 79
+	caADIndex         compactID = 80
+	caESIndex         compactID = 81
+	caFRIndex         compactID = 82
+	caITIndex         compactID = 83
+	ccpIndex          compactID = 84
+	ccpBDIndex        compactID = 85
+	ccpINIndex        compactID = 86
+	ceIndex           compactID = 87
+	ceRUIndex         compactID = 88
+	cggIndex          compactID = 89
+	cggUGIndex        compactID = 90
+	chrIndex          compactID = 91
+	chrUSIndex        compactID = 92
+	ckbIndex          compactID = 93
+	ckbIQIndex        compactID = 94
+	ckbIRIndex        compactID = 95
+	csIndex           compactID = 96
+	csCZIndex         compactID = 97
+	cuIndex           compactID = 98
+	cuRUIndex         compactID = 99
+	cyIndex           compactID = 100
+	cyGBIndex         compactID = 101
+	daIndex           compactID = 102
+	daDKIndex         compactID = 103
+	daGLIndex         compactID = 104
+	davIndex          compactID = 105
+	davKEIndex        compactID = 106
+	deIndex           compactID = 107
+	deATIndex         compactID = 108
+	deBEIndex         compactID = 109
+	deCHIndex         compactID = 110
+	deDEIndex         compactID = 111
+	deITIndex         compactID = 112
+	deLIIndex         compactID = 113
+	deLUIndex         compactID = 114
+	djeIndex          compactID = 115
+	djeNEIndex        compactID = 116
+	dsbIndex          compactID = 117
+	dsbDEIndex        compactID = 118
+	duaIndex          compactID = 119
+	duaCMIndex        compactID = 120
+	dvIndex           compactID = 121
+	dyoIndex          compactID = 122
+	dyoSNIndex        compactID = 123
+	dzIndex           compactID = 124
+	dzBTIndex         compactID = 125
+	ebuIndex          compactID = 126
+	ebuKEIndex        compactID = 127
+	eeIndex           compactID = 128
+	eeGHIndex         compactID = 129
+	eeTGIndex         compactID = 130
+	elIndex           compactID = 131
+	elCYIndex         compactID = 132
+	elGRIndex         compactID = 133
+	enIndex           compactID = 134
+	en001Index        compactID = 135
+	en150Index        compactID = 136
+	enAGIndex         compactID = 137
+	enAIIndex         compactID = 138
+	enASIndex         compactID = 139
+	enATIndex         compactID = 140
+	enAUIndex         compactID = 141
+	enBBIndex         compactID = 142
+	enBEIndex         compactID = 143
+	enBIIndex         compactID = 144
+	enBMIndex         compactID = 145
+	enBSIndex         compactID = 146
+	enBWIndex         compactID = 147
+	enBZIndex         compactID = 148
+	enCAIndex         compactID = 149
+	enCCIndex         compactID = 150
+	enCHIndex         compactID = 151
+	enCKIndex         compactID = 152
+	enCMIndex         compactID = 153
+	enCXIndex         compactID = 154
+	enCYIndex         compactID = 155
+	enDEIndex         compactID = 156
+	enDGIndex         compactID = 157
+	enDKIndex         compactID = 158
+	enDMIndex         compactID = 159
+	enERIndex         compactID = 160
+	enFIIndex         compactID = 161
+	enFJIndex         compactID = 162
+	enFKIndex         compactID = 163
+	enFMIndex         compactID = 164
+	enGBIndex         compactID = 165
+	enGDIndex         compactID = 166
+	enGGIndex         compactID = 167
+	enGHIndex         compactID = 168
+	enGIIndex         compactID = 169
+	enGMIndex         compactID = 170
+	enGUIndex         compactID = 171
+	enGYIndex         compactID = 172
+	enHKIndex         compactID = 173
+	enIEIndex         compactID = 174
+	enILIndex         compactID = 175
+	enIMIndex         compactID = 176
+	enINIndex         compactID = 177
+	enIOIndex         compactID = 178
+	enJEIndex         compactID = 179
+	enJMIndex         compactID = 180
+	enKEIndex         compactID = 181
+	enKIIndex         compactID = 182
+	enKNIndex         compactID = 183
+	enKYIndex         compactID = 184
+	enLCIndex         compactID = 185
+	enLRIndex         compactID = 186
+	enLSIndex         compactID = 187
+	enMGIndex         compactID = 188
+	enMHIndex         compactID = 189
+	enMOIndex         compactID = 190
+	enMPIndex         compactID = 191
+	enMSIndex         compactID = 192
+	enMTIndex         compactID = 193
+	enMUIndex         compactID = 194
+	enMWIndex         compactID = 195
+	enMYIndex         compactID = 196
+	enNAIndex         compactID = 197
+	enNFIndex         compactID = 198
+	enNGIndex         compactID = 199
+	enNLIndex         compactID = 200
+	enNRIndex         compactID = 201
+	enNUIndex         compactID = 202
+	enNZIndex         compactID = 203
+	enPGIndex         compactID = 204
+	enPHIndex         compactID = 205
+	enPKIndex         compactID = 206
+	enPNIndex         compactID = 207
+	enPRIndex         compactID = 208
+	enPWIndex         compactID = 209
+	enRWIndex         compactID = 210
+	enSBIndex         compactID = 211
+	enSCIndex         compactID = 212
+	enSDIndex         compactID = 213
+	enSEIndex         compactID = 214
+	enSGIndex         compactID = 215
+	enSHIndex         compactID = 216
+	enSIIndex         compactID = 217
+	enSLIndex         compactID = 218
+	enSSIndex         compactID = 219
+	enSXIndex         compactID = 220
+	enSZIndex         compactID = 221
+	enTCIndex         compactID = 222
+	enTKIndex         compactID = 223
+	enTOIndex         compactID = 224
+	enTTIndex         compactID = 225
+	enTVIndex         compactID = 226
+	enTZIndex         compactID = 227
+	enUGIndex         compactID = 228
+	enUMIndex         compactID = 229
+	enUSIndex         compactID = 230
+	enVCIndex         compactID = 231
+	enVGIndex         compactID = 232
+	enVIIndex         compactID = 233
+	enVUIndex         compactID = 234
+	enWSIndex         compactID = 235
+	enZAIndex         compactID = 236
+	enZMIndex         compactID = 237
+	enZWIndex         compactID = 238
+	eoIndex           compactID = 239
+	eo001Index        compactID = 240
+	esIndex           compactID = 241
+	es419Index        compactID = 242
+	esARIndex         compactID = 243
+	esBOIndex         compactID = 244
+	esBRIndex         compactID = 245
+	esBZIndex         compactID = 246
+	esCLIndex         compactID = 247
+	esCOIndex         compactID = 248
+	esCRIndex         compactID = 249
+	esCUIndex         compactID = 250
+	esDOIndex         compactID = 251
+	esEAIndex         compactID = 252
+	esECIndex         compactID = 253
+	esESIndex         compactID = 254
+	esGQIndex         compactID = 255
+	esGTIndex         compactID = 256
+	esHNIndex         compactID = 257
+	esICIndex         compactID = 258
+	esMXIndex         compactID = 259
+	esNIIndex         compactID = 260
+	esPAIndex         compactID = 261
+	esPEIndex         compactID = 262
+	esPHIndex         compactID = 263
+	esPRIndex         compactID = 264
+	esPYIndex         compactID = 265
+	esSVIndex         compactID = 266
+	esUSIndex         compactID = 267
+	esUYIndex         compactID = 268
+	esVEIndex         compactID = 269
+	etIndex           compactID = 270
+	etEEIndex         compactID = 271
+	euIndex           compactID = 272
+	euESIndex         compactID = 273
+	ewoIndex          compactID = 274
+	ewoCMIndex        compactID = 275
+	faIndex           compactID = 276
+	faAFIndex         compactID = 277
+	faIRIndex         compactID = 278
+	ffIndex           compactID = 279
+	ffCMIndex         compactID = 280
+	ffGNIndex         compactID = 281
+	ffMRIndex         compactID = 282
+	ffSNIndex         compactID = 283
+	fiIndex           compactID = 284
+	fiFIIndex         compactID = 285
+	filIndex          compactID = 286
+	filPHIndex        compactID = 287
+	foIndex           compactID = 288
+	foDKIndex         compactID = 289
+	foFOIndex         compactID = 290
+	frIndex           compactID = 291
+	frBEIndex         compactID = 292
+	frBFIndex         compactID = 293
+	frBIIndex         compactID = 294
+	frBJIndex         compactID = 295
+	frBLIndex         compactID = 296
+	frCAIndex         compactID = 297
+	frCDIndex         compactID = 298
+	frCFIndex         compactID = 299
+	frCGIndex         compactID = 300
+	frCHIndex         compactID = 301
+	frCIIndex         compactID = 302
+	frCMIndex         compactID = 303
+	frDJIndex         compactID = 304
+	frDZIndex         compactID = 305
+	frFRIndex         compactID = 306
+	frGAIndex         compactID = 307
+	frGFIndex         compactID = 308
+	frGNIndex         compactID = 309
+	frGPIndex         compactID = 310
+	frGQIndex         compactID = 311
+	frHTIndex         compactID = 312
+	frKMIndex         compactID = 313
+	frLUIndex         compactID = 314
+	frMAIndex         compactID = 315
+	frMCIndex         compactID = 316
+	frMFIndex         compactID = 317
+	frMGIndex         compactID = 318
+	frMLIndex         compactID = 319
+	frMQIndex         compactID = 320
+	frMRIndex         compactID = 321
+	frMUIndex         compactID = 322
+	frNCIndex         compactID = 323
+	frNEIndex         compactID = 324
+	frPFIndex         compactID = 325
+	frPMIndex         compactID = 326
+	frREIndex         compactID = 327
+	frRWIndex         compactID = 328
+	frSCIndex         compactID = 329
+	frSNIndex         compactID = 330
+	frSYIndex         compactID = 331
+	frTDIndex         compactID = 332
+	frTGIndex         compactID = 333
+	frTNIndex         compactID = 334
+	frVUIndex         compactID = 335
+	frWFIndex         compactID = 336
+	frYTIndex         compactID = 337
+	furIndex          compactID = 338
+	furITIndex        compactID = 339
+	fyIndex           compactID = 340
+	fyNLIndex         compactID = 341
+	gaIndex           compactID = 342
+	gaIEIndex         compactID = 343
+	gdIndex           compactID = 344
+	gdGBIndex         compactID = 345
+	glIndex           compactID = 346
+	glESIndex         compactID = 347
+	gswIndex          compactID = 348
+	gswCHIndex        compactID = 349
+	gswFRIndex        compactID = 350
+	gswLIIndex        compactID = 351
+	guIndex           compactID = 352
+	guINIndex         compactID = 353
+	guwIndex          compactID = 354
+	guzIndex          compactID = 355
+	guzKEIndex        compactID = 356
+	gvIndex           compactID = 357
+	gvIMIndex         compactID = 358
+	haIndex           compactID = 359
+	haGHIndex         compactID = 360
+	haNEIndex         compactID = 361
+	haNGIndex         compactID = 362
+	hawIndex          compactID = 363
+	hawUSIndex        compactID = 364
+	heIndex           compactID = 365
+	heILIndex         compactID = 366
+	hiIndex           compactID = 367
+	hiINIndex         compactID = 368
+	hrIndex           compactID = 369
+	hrBAIndex         compactID = 370
+	hrHRIndex         compactID = 371
+	hsbIndex          compactID = 372
+	hsbDEIndex        compactID = 373
+	huIndex           compactID = 374
+	huHUIndex         compactID = 375
+	hyIndex           compactID = 376
+	hyAMIndex         compactID = 377
+	idIndex           compactID = 378
+	idIDIndex         compactID = 379
+	igIndex           compactID = 380
+	igNGIndex         compactID = 381
+	iiIndex           compactID = 382
+	iiCNIndex         compactID = 383
+	inIndex           compactID = 384
+	ioIndex           compactID = 385
+	isIndex           compactID = 386
+	isISIndex         compactID = 387
+	itIndex           compactID = 388
+	itCHIndex         compactID = 389
+	itITIndex         compactID = 390
+	itSMIndex         compactID = 391
+	itVAIndex         compactID = 392
+	iuIndex           compactID = 393
+	iwIndex           compactID = 394
+	jaIndex           compactID = 395
+	jaJPIndex         compactID = 396
+	jboIndex          compactID = 397
+	jgoIndex          compactID = 398
+	jgoCMIndex        compactID = 399
+	jiIndex           compactID = 400
+	jmcIndex          compactID = 401
+	jmcTZIndex        compactID = 402
+	jvIndex           compactID = 403
+	jwIndex           compactID = 404
+	kaIndex           compactID = 405
+	kaGEIndex         compactID = 406
+	kabIndex          compactID = 407
+	kabDZIndex        compactID = 408
+	kajIndex          compactID = 409
+	kamIndex          compactID = 410
+	kamKEIndex        compactID = 411
+	kcgIndex          compactID = 412
+	kdeIndex          compactID = 413
+	kdeTZIndex        compactID = 414
+	keaIndex          compactID = 415
+	keaCVIndex        compactID = 416
+	khqIndex          compactID = 417
+	khqMLIndex        compactID = 418
+	kiIndex           compactID = 419
+	kiKEIndex         compactID = 420
+	kkIndex           compactID = 421
+	kkKZIndex         compactID = 422
+	kkjIndex          compactID = 423
+	kkjCMIndex        compactID = 424
+	klIndex           compactID = 425
+	klGLIndex         compactID = 426
+	klnIndex          compactID = 427
+	klnKEIndex        compactID = 428
+	kmIndex           compactID = 429
+	kmKHIndex         compactID = 430
+	knIndex           compactID = 431
+	knINIndex         compactID = 432
+	koIndex           compactID = 433
+	koKPIndex         compactID = 434
+	koKRIndex         compactID = 435
+	kokIndex          compactID = 436
+	kokINIndex        compactID = 437
+	ksIndex           compactID = 438
+	ksINIndex         compactID = 439
+	ksbIndex          compactID = 440
+	ksbTZIndex        compactID = 441
+	ksfIndex          compactID = 442
+	ksfCMIndex        compactID = 443
+	kshIndex          compactID = 444
+	kshDEIndex        compactID = 445
+	kuIndex           compactID = 446
+	kwIndex           compactID = 447
+	kwGBIndex         compactID = 448
+	kyIndex           compactID = 449
+	kyKGIndex         compactID = 450
+	lagIndex          compactID = 451
+	lagTZIndex        compactID = 452
+	lbIndex           compactID = 453
+	lbLUIndex         compactID = 454
+	lgIndex           compactID = 455
+	lgUGIndex         compactID = 456
+	lktIndex          compactID = 457
+	lktUSIndex        compactID = 458
+	lnIndex           compactID = 459
+	lnAOIndex         compactID = 460
+	lnCDIndex         compactID = 461
+	lnCFIndex         compactID = 462
+	lnCGIndex         compactID = 463
+	loIndex           compactID = 464
+	loLAIndex         compactID = 465
+	lrcIndex          compactID = 466
+	lrcIQIndex        compactID = 467
+	lrcIRIndex        compactID = 468
+	ltIndex           compactID = 469
+	ltLTIndex         compactID = 470
+	luIndex           compactID = 471
+	luCDIndex         compactID = 472
+	luoIndex          compactID = 473
+	luoKEIndex        compactID = 474
+	luyIndex          compactID = 475
+	luyKEIndex        compactID = 476
+	lvIndex           compactID = 477
+	lvLVIndex         compactID = 478
+	masIndex          compactID = 479
+	masKEIndex        compactID = 480
+	masTZIndex        compactID = 481
+	merIndex          compactID = 482
+	merKEIndex        compactID = 483
+	mfeIndex          compactID = 484
+	mfeMUIndex        compactID = 485
+	mgIndex           compactID = 486
+	mgMGIndex         compactID = 487
+	mghIndex          compactID = 488
+	mghMZIndex        compactID = 489
+	mgoIndex          compactID = 490
+	mgoCMIndex        compactID = 491
+	mkIndex           compactID = 492
+	mkMKIndex         compactID = 493
+	mlIndex           compactID = 494
+	mlINIndex         compactID = 495
+	mnIndex           compactID = 496
+	mnMNIndex         compactID = 497
+	moIndex           compactID = 498
+	mrIndex           compactID = 499
+	mrINIndex         compactID = 500
+	msIndex           compactID = 501
+	msBNIndex         compactID = 502
+	msMYIndex         compactID = 503
+	msSGIndex         compactID = 504
+	mtIndex           compactID = 505
+	mtMTIndex         compactID = 506
+	muaIndex          compactID = 507
+	muaCMIndex        compactID = 508
+	myIndex           compactID = 509
+	myMMIndex         compactID = 510
+	mznIndex          compactID = 511
+	mznIRIndex        compactID = 512
+	nahIndex          compactID = 513
+	naqIndex          compactID = 514
+	naqNAIndex        compactID = 515
+	nbIndex           compactID = 516
+	nbNOIndex         compactID = 517
+	nbSJIndex         compactID = 518
+	ndIndex           compactID = 519
+	ndZWIndex         compactID = 520
+	ndsIndex          compactID = 521
+	ndsDEIndex        compactID = 522
+	ndsNLIndex        compactID = 523
+	neIndex           compactID = 524
+	neINIndex         compactID = 525
+	neNPIndex         compactID = 526
+	nlIndex           compactID = 527
+	nlAWIndex         compactID = 528
+	nlBEIndex         compactID = 529
+	nlBQIndex         compactID = 530
+	nlCWIndex         compactID = 531
+	nlNLIndex         compactID = 532
+	nlSRIndex         compactID = 533
+	nlSXIndex         compactID = 534
+	nmgIndex          compactID = 535
+	nmgCMIndex        compactID = 536
+	nnIndex           compactID = 537
+	nnNOIndex         compactID = 538
+	nnhIndex          compactID = 539
+	nnhCMIndex        compactID = 540
+	noIndex           compactID = 541
+	nqoIndex          compactID = 542
+	nrIndex           compactID = 543
+	nsoIndex          compactID = 544
+	nusIndex          compactID = 545
+	nusSSIndex        compactID = 546
+	nyIndex           compactID = 547
+	nynIndex          compactID = 548
+	nynUGIndex        compactID = 549
+	omIndex           compactID = 550
+	omETIndex         compactID = 551
+	omKEIndex         compactID = 552
+	orIndex           compactID = 553
+	orINIndex         compactID = 554
+	osIndex           compactID = 555
+	osGEIndex         compactID = 556
+	osRUIndex         compactID = 557
+	paIndex           compactID = 558
+	paArabIndex       compactID = 559
+	paArabPKIndex     compactID = 560
+	paGuruIndex       compactID = 561
+	paGuruINIndex     compactID = 562
+	papIndex          compactID = 563
+	plIndex           compactID = 564
+	plPLIndex         compactID = 565
+	prgIndex          compactID = 566
+	prg001Index       compactID = 567
+	psIndex           compactID = 568
+	psAFIndex         compactID = 569
+	ptIndex           compactID = 570
+	ptAOIndex         compactID = 571
+	ptBRIndex         compactID = 572
+	ptCHIndex         compactID = 573
+	ptCVIndex         compactID = 574
+	ptGQIndex         compactID = 575
+	ptGWIndex         compactID = 576
+	ptLUIndex         compactID = 577
+	ptMOIndex         compactID = 578
+	ptMZIndex         compactID = 579
+	ptPTIndex         compactID = 580
+	ptSTIndex         compactID = 581
+	ptTLIndex         compactID = 582
+	quIndex           compactID = 583
+	quBOIndex         compactID = 584
+	quECIndex         compactID = 585
+	quPEIndex         compactID = 586
+	rmIndex           compactID = 587
+	rmCHIndex         compactID = 588
+	rnIndex           compactID = 589
+	rnBIIndex         compactID = 590
+	roIndex           compactID = 591
+	roMDIndex         compactID = 592
+	roROIndex         compactID = 593
+	rofIndex          compactID = 594
+	rofTZIndex        compactID = 595
+	ruIndex           compactID = 596
+	ruBYIndex         compactID = 597
+	ruKGIndex         compactID = 598
+	ruKZIndex         compactID = 599
+	ruMDIndex         compactID = 600
+	ruRUIndex         compactID = 601
+	ruUAIndex         compactID = 602
+	rwIndex           compactID = 603
+	rwRWIndex         compactID = 604
+	rwkIndex          compactID = 605
+	rwkTZIndex        compactID = 606
+	sahIndex          compactID = 607
+	sahRUIndex        compactID = 608
+	saqIndex          compactID = 609
+	saqKEIndex        compactID = 610
+	sbpIndex          compactID = 611
+	sbpTZIndex        compactID = 612
+	sdIndex           compactID = 613
+	sdPKIndex         compactID = 614
+	sdhIndex          compactID = 615
+	seIndex           compactID = 616
+	seFIIndex         compactID = 617
+	seNOIndex         compactID = 618
+	seSEIndex         compactID = 619
+	sehIndex          compactID = 620
+	sehMZIndex        compactID = 621
+	sesIndex          compactID = 622
+	sesMLIndex        compactID = 623
+	sgIndex           compactID = 624
+	sgCFIndex         compactID = 625
+	shIndex           compactID = 626
+	shiIndex          compactID = 627
+	shiLatnIndex      compactID = 628
+	shiLatnMAIndex    compactID = 629
+	shiTfngIndex      compactID = 630
+	shiTfngMAIndex    compactID = 631
+	siIndex           compactID = 632
+	siLKIndex         compactID = 633
+	skIndex           compactID = 634
+	skSKIndex         compactID = 635
+	slIndex           compactID = 636
+	slSIIndex         compactID = 637
+	smaIndex          compactID = 638
+	smiIndex          compactID = 639
+	smjIndex          compactID = 640
+	smnIndex          compactID = 641
+	smnFIIndex        compactID = 642
+	smsIndex          compactID = 643
+	snIndex           compactID = 644
+	snZWIndex         compactID = 645
+	soIndex           compactID = 646
+	soDJIndex         compactID = 647
+	soETIndex         compactID = 648
+	soKEIndex         compactID = 649
+	soSOIndex         compactID = 650
+	sqIndex           compactID = 651
+	sqALIndex         compactID = 652
+	sqMKIndex         compactID = 653
+	sqXKIndex         compactID = 654
+	srIndex           compactID = 655
+	srCyrlIndex       compactID = 656
+	srCyrlBAIndex     compactID = 657
+	srCyrlMEIndex     compactID = 658
+	srCyrlRSIndex     compactID = 659
+	srCyrlXKIndex     compactID = 660
+	srLatnIndex       compactID = 661
+	srLatnBAIndex     compactID = 662
+	srLatnMEIndex     compactID = 663
+	srLatnRSIndex     compactID = 664
+	srLatnXKIndex     compactID = 665
+	ssIndex           compactID = 666
+	ssyIndex          compactID = 667
+	stIndex           compactID = 668
+	svIndex           compactID = 669
+	svAXIndex         compactID = 670
+	svFIIndex         compactID = 671
+	svSEIndex         compactID = 672
+	swIndex           compactID = 673
+	swCDIndex         compactID = 674
+	swKEIndex         compactID = 675
+	swTZIndex         compactID = 676
+	swUGIndex         compactID = 677
+	syrIndex          compactID = 678
+	taIndex           compactID = 679
+	taINIndex         compactID = 680
+	taLKIndex         compactID = 681
+	taMYIndex         compactID = 682
+	taSGIndex         compactID = 683
+	teIndex           compactID = 684
+	teINIndex         compactID = 685
+	teoIndex          compactID = 686
+	teoKEIndex        compactID = 687
+	teoUGIndex        compactID = 688
+	tgIndex           compactID = 689
+	tgTJIndex         compactID = 690
+	thIndex           compactID = 691
+	thTHIndex         compactID = 692
+	tiIndex           compactID = 693
+	tiERIndex         compactID = 694
+	tiETIndex         compactID = 695
+	tigIndex          compactID = 696
+	tkIndex           compactID = 697
+	tkTMIndex         compactID = 698
+	tlIndex           compactID = 699
+	tnIndex           compactID = 700
+	toIndex           compactID = 701
+	toTOIndex         compactID = 702
+	trIndex           compactID = 703
+	trCYIndex         compactID = 704
+	trTRIndex         compactID = 705
+	tsIndex           compactID = 706
+	ttIndex           compactID = 707
+	ttRUIndex         compactID = 708
+	twqIndex          compactID = 709
+	twqNEIndex        compactID = 710
+	tzmIndex          compactID = 711
+	tzmMAIndex        compactID = 712
+	ugIndex           compactID = 713
+	ugCNIndex         compactID = 714
+	ukIndex           compactID = 715
+	ukUAIndex         compactID = 716
+	urIndex           compactID = 717
+	urINIndex         compactID = 718
+	urPKIndex         compactID = 719
+	uzIndex           compactID = 720
+	uzArabIndex       compactID = 721
+	uzArabAFIndex     compactID = 722
+	uzCyrlIndex       compactID = 723
+	uzCyrlUZIndex     compactID = 724
+	uzLatnIndex       compactID = 725
+	uzLatnUZIndex     compactID = 726
+	vaiIndex          compactID = 727
+	vaiLatnIndex      compactID = 728
+	vaiLatnLRIndex    compactID = 729
+	vaiVaiiIndex      compactID = 730
+	vaiVaiiLRIndex    compactID = 731
+	veIndex           compactID = 732
+	viIndex           compactID = 733
+	viVNIndex         compactID = 734
+	voIndex           compactID = 735
+	vo001Index        compactID = 736
+	vunIndex          compactID = 737
+	vunTZIndex        compactID = 738
+	waIndex           compactID = 739
+	waeIndex          compactID = 740
+	waeCHIndex        compactID = 741
+	woIndex           compactID = 742
+	woSNIndex         compactID = 743
+	xhIndex           compactID = 744
+	xogIndex          compactID = 745
+	xogUGIndex        compactID = 746
+	yavIndex          compactID = 747
+	yavCMIndex        compactID = 748
+	yiIndex           compactID = 749
+	yi001Index        compactID = 750
+	yoIndex           compactID = 751
+	yoBJIndex         compactID = 752
+	yoNGIndex         compactID = 753
+	yueIndex          compactID = 754
+	yueHansIndex      compactID = 755
+	yueHansCNIndex    compactID = 756
+	yueHantIndex      compactID = 757
+	yueHantHKIndex    compactID = 758
+	zghIndex          compactID = 759
+	zghMAIndex        compactID = 760
+	zhIndex           compactID = 761
+	zhHansIndex       compactID = 762
+	zhHansCNIndex     compactID = 763
+	zhHansHKIndex     compactID = 764
+	zhHansMOIndex     compactID = 765
+	zhHansSGIndex     compactID = 766
+	zhHantIndex       compactID = 767
+	zhHantHKIndex     compactID = 768
+	zhHantMOIndex     compactID = 769
+	zhHantTWIndex     compactID = 770
+	zuIndex           compactID = 771
+	zuZAIndex         compactID = 772
+	caESvalenciaIndex compactID = 773
+	enUSuvaposixIndex compactID = 774
 )
 
 var coreTags = []language.CompactCoreInfo{ // 773 elements
diff --git a/language/tags.go b/language/tags.go
index 1d1b7f8..acc482a 100644
--- a/language/tags.go
+++ b/language/tags.go
@@ -61,85 +61,83 @@
 
 	Und Tag = Tag{}
 
-	// TODO: use compact tags once the transition is completed.
-
-	Afrikaans            Tag = Raw.MustParse("af")      // Tag{lang: _af}                //  af
-	Amharic              Tag = Raw.MustParse("am")      // Tag{lang: _am}                //  am
-	Arabic               Tag = Raw.MustParse("ar")      // Tag{lang: _ar}                //  ar
-	ModernStandardArabic Tag = Raw.MustParse("ar-001")  // Tag{lang: _ar, region: _001}  //  ar-001
-	Azerbaijani          Tag = Raw.MustParse("az")      // Tag{lang: _az}                //  az
-	Bulgarian            Tag = Raw.MustParse("bg")      // Tag{lang: _bg}                //  bg
-	Bengali              Tag = Raw.MustParse("bn")      // Tag{lang: _bn}                //  bn
-	Catalan              Tag = Raw.MustParse("ca")      // Tag{lang: _ca}                //  ca
-	Czech                Tag = Raw.MustParse("cs")      // Tag{lang: _cs}                //  cs
-	Danish               Tag = Raw.MustParse("da")      // Tag{lang: _da}                //  da
-	German               Tag = Raw.MustParse("de")      // Tag{lang: _de}                //  de
-	Greek                Tag = Raw.MustParse("el")      // Tag{lang: _el}                //  el
-	English              Tag = Raw.MustParse("en")      // Tag{lang: _en}                //  en
-	AmericanEnglish      Tag = Raw.MustParse("en-US")   // Tag{lang: _en, region: _US}   //  en-US
-	BritishEnglish       Tag = Raw.MustParse("en-GB")   // Tag{lang: _en, region: _GB}   //  en-GB
-	Spanish              Tag = Raw.MustParse("es")      // Tag{lang: _es}                //  es
-	EuropeanSpanish      Tag = Raw.MustParse("es-ES")   // Tag{lang: _es, region: _ES}   //  es-ES
-	LatinAmericanSpanish Tag = Raw.MustParse("es-419")  // Tag{lang: _es, region: _419}  //  es-419
-	Estonian             Tag = Raw.MustParse("et")      // Tag{lang: _et}                //  et
-	Persian              Tag = Raw.MustParse("fa")      // Tag{lang: _fa}                //  fa
-	Finnish              Tag = Raw.MustParse("fi")      // Tag{lang: _fi}                //  fi
-	Filipino             Tag = Raw.MustParse("fil")     // Tag{lang: _fil}               //  fil
-	French               Tag = Raw.MustParse("fr")      // Tag{lang: _fr}                //  fr
-	CanadianFrench       Tag = Raw.MustParse("fr-CA")   // Tag{lang: _fr, region: _CA}   //  fr-CA
-	Gujarati             Tag = Raw.MustParse("gu")      // Tag{lang: _gu}                //  gu
-	Hebrew               Tag = Raw.MustParse("he")      // Tag{lang: _he}                //  he
-	Hindi                Tag = Raw.MustParse("hi")      // Tag{lang: _hi}                //  hi
-	Croatian             Tag = Raw.MustParse("hr")      // Tag{lang: _hr}                //  hr
-	Hungarian            Tag = Raw.MustParse("hu")      // Tag{lang: _hu}                //  hu
-	Armenian             Tag = Raw.MustParse("hy")      // Tag{lang: _hy}                //  hy
-	Indonesian           Tag = Raw.MustParse("id")      // Tag{lang: _id}                //  id
-	Icelandic            Tag = Raw.MustParse("is")      // Tag{lang: _is}                //  is
-	Italian              Tag = Raw.MustParse("it")      // Tag{lang: _it}                //  it
-	Japanese             Tag = Raw.MustParse("ja")      // Tag{lang: _ja}                //  ja
-	Georgian             Tag = Raw.MustParse("ka")      // Tag{lang: _ka}                //  ka
-	Kazakh               Tag = Raw.MustParse("kk")      // Tag{lang: _kk}                //  kk
-	Khmer                Tag = Raw.MustParse("km")      // Tag{lang: _km}                //  km
-	Kannada              Tag = Raw.MustParse("kn")      // Tag{lang: _kn}                //  kn
-	Korean               Tag = Raw.MustParse("ko")      // Tag{lang: _ko}                //  ko
-	Kirghiz              Tag = Raw.MustParse("ky")      // Tag{lang: _ky}                //  ky
-	Lao                  Tag = Raw.MustParse("lo")      // Tag{lang: _lo}                //  lo
-	Lithuanian           Tag = Raw.MustParse("lt")      // Tag{lang: _lt}                //  lt
-	Latvian              Tag = Raw.MustParse("lv")      // Tag{lang: _lv}                //  lv
-	Macedonian           Tag = Raw.MustParse("mk")      // Tag{lang: _mk}                //  mk
-	Malayalam            Tag = Raw.MustParse("ml")      // Tag{lang: _ml}                //  ml
-	Mongolian            Tag = Raw.MustParse("mn")      // Tag{lang: _mn}                //  mn
-	Marathi              Tag = Raw.MustParse("mr")      // Tag{lang: _mr}                //  mr
-	Malay                Tag = Raw.MustParse("ms")      // Tag{lang: _ms}                //  ms
-	Burmese              Tag = Raw.MustParse("my")      // Tag{lang: _my}                //  my
-	Nepali               Tag = Raw.MustParse("ne")      // Tag{lang: _ne}                //  ne
-	Dutch                Tag = Raw.MustParse("nl")      // Tag{lang: _nl}                //  nl
-	Norwegian            Tag = Raw.MustParse("no")      // Tag{lang: _no}                //  no
-	Punjabi              Tag = Raw.MustParse("pa")      // Tag{lang: _pa}                //  pa
-	Polish               Tag = Raw.MustParse("pl")      // Tag{lang: _pl}                //  pl
-	Portuguese           Tag = Raw.MustParse("pt")      // Tag{lang: _pt}                //  pt
-	BrazilianPortuguese  Tag = Raw.MustParse("pt-BR")   // Tag{lang: _pt, region: _BR}   //  pt-BR
-	EuropeanPortuguese   Tag = Raw.MustParse("pt-PT")   // Tag{lang: _pt, region: _PT}   //  pt-PT
-	Romanian             Tag = Raw.MustParse("ro")      // Tag{lang: _ro}                //  ro
-	Russian              Tag = Raw.MustParse("ru")      // Tag{lang: _ru}                //  ru
-	Sinhala              Tag = Raw.MustParse("si")      // Tag{lang: _si}                //  si
-	Slovak               Tag = Raw.MustParse("sk")      // Tag{lang: _sk}                //  sk
-	Slovenian            Tag = Raw.MustParse("sl")      // Tag{lang: _sl}                //  sl
-	Albanian             Tag = Raw.MustParse("sq")      // Tag{lang: _sq}                //  sq
-	Serbian              Tag = Raw.MustParse("sr")      // Tag{lang: _sr}                //  sr
-	SerbianLatin         Tag = Raw.MustParse("sr-Latn") // Tag{lang: _sr, script: _Latn} //  sr-Latn
-	Swedish              Tag = Raw.MustParse("sv")      // Tag{lang: _sv}                //  sv
-	Swahili              Tag = Raw.MustParse("sw")      // Tag{lang: _sw}                //  sw
-	Tamil                Tag = Raw.MustParse("ta")      // Tag{lang: _ta}                //  ta
-	Telugu               Tag = Raw.MustParse("te")      // Tag{lang: _te}                //  te
-	Thai                 Tag = Raw.MustParse("th")      // Tag{lang: _th}                //  th
-	Turkish              Tag = Raw.MustParse("tr")      // Tag{lang: _tr}                //  tr
-	Ukrainian            Tag = Raw.MustParse("uk")      // Tag{lang: _uk}                //  uk
-	Urdu                 Tag = Raw.MustParse("ur")      // Tag{lang: _ur}                //  ur
-	Uzbek                Tag = Raw.MustParse("uz")      // Tag{lang: _uz}                //  uz
-	Vietnamese           Tag = Raw.MustParse("vi")      // Tag{lang: _vi}                //  vi
-	Chinese              Tag = Raw.MustParse("zh")      // Tag{lang: _zh}                //  zh
-	SimplifiedChinese    Tag = Raw.MustParse("zh-Hans") // Tag{lang: _zh, script: _Hans} //  zh-Hans
-	TraditionalChinese   Tag = Raw.MustParse("zh-Hant") // Tag{lang: _zh, script: _Hant} //  zh-Hant
-	Zulu                 Tag = Raw.MustParse("zu")      // Tag{lang: _zu}                //  zu
+	Afrikaans            Tag = Tag{language: afIndex, locale: afIndex}
+	Amharic              Tag = Tag{language: amIndex, locale: amIndex}
+	Arabic               Tag = Tag{language: arIndex, locale: arIndex}
+	ModernStandardArabic Tag = Tag{language: ar001Index, locale: ar001Index}
+	Azerbaijani          Tag = Tag{language: azIndex, locale: azIndex}
+	Bulgarian            Tag = Tag{language: bgIndex, locale: bgIndex}
+	Bengali              Tag = Tag{language: bnIndex, locale: bnIndex}
+	Catalan              Tag = Tag{language: caIndex, locale: caIndex}
+	Czech                Tag = Tag{language: csIndex, locale: csIndex}
+	Danish               Tag = Tag{language: daIndex, locale: daIndex}
+	German               Tag = Tag{language: deIndex, locale: deIndex}
+	Greek                Tag = Tag{language: elIndex, locale: elIndex}
+	English              Tag = Tag{language: enIndex, locale: enIndex}
+	AmericanEnglish      Tag = Tag{language: enUSIndex, locale: enUSIndex}
+	BritishEnglish       Tag = Tag{language: enGBIndex, locale: enGBIndex}
+	Spanish              Tag = Tag{language: esIndex, locale: esIndex}
+	EuropeanSpanish      Tag = Tag{language: esESIndex, locale: esESIndex}
+	LatinAmericanSpanish Tag = Tag{language: es419Index, locale: es419Index}
+	Estonian             Tag = Tag{language: etIndex, locale: etIndex}
+	Persian              Tag = Tag{language: faIndex, locale: faIndex}
+	Finnish              Tag = Tag{language: fiIndex, locale: fiIndex}
+	Filipino             Tag = Tag{language: filIndex, locale: filIndex}
+	French               Tag = Tag{language: frIndex, locale: frIndex}
+	CanadianFrench       Tag = Tag{language: frCAIndex, locale: frCAIndex}
+	Gujarati             Tag = Tag{language: guIndex, locale: guIndex}
+	Hebrew               Tag = Tag{language: heIndex, locale: heIndex}
+	Hindi                Tag = Tag{language: hiIndex, locale: hiIndex}
+	Croatian             Tag = Tag{language: hrIndex, locale: hrIndex}
+	Hungarian            Tag = Tag{language: huIndex, locale: huIndex}
+	Armenian             Tag = Tag{language: hyIndex, locale: hyIndex}
+	Indonesian           Tag = Tag{language: idIndex, locale: idIndex}
+	Icelandic            Tag = Tag{language: isIndex, locale: isIndex}
+	Italian              Tag = Tag{language: itIndex, locale: itIndex}
+	Japanese             Tag = Tag{language: jaIndex, locale: jaIndex}
+	Georgian             Tag = Tag{language: kaIndex, locale: kaIndex}
+	Kazakh               Tag = Tag{language: kkIndex, locale: kkIndex}
+	Khmer                Tag = Tag{language: kmIndex, locale: kmIndex}
+	Kannada              Tag = Tag{language: knIndex, locale: knIndex}
+	Korean               Tag = Tag{language: koIndex, locale: koIndex}
+	Kirghiz              Tag = Tag{language: kyIndex, locale: kyIndex}
+	Lao                  Tag = Tag{language: loIndex, locale: loIndex}
+	Lithuanian           Tag = Tag{language: ltIndex, locale: ltIndex}
+	Latvian              Tag = Tag{language: lvIndex, locale: lvIndex}
+	Macedonian           Tag = Tag{language: mkIndex, locale: mkIndex}
+	Malayalam            Tag = Tag{language: mlIndex, locale: mlIndex}
+	Mongolian            Tag = Tag{language: mnIndex, locale: mnIndex}
+	Marathi              Tag = Tag{language: mrIndex, locale: mrIndex}
+	Malay                Tag = Tag{language: msIndex, locale: msIndex}
+	Burmese              Tag = Tag{language: myIndex, locale: myIndex}
+	Nepali               Tag = Tag{language: neIndex, locale: neIndex}
+	Dutch                Tag = Tag{language: nlIndex, locale: nlIndex}
+	Norwegian            Tag = Tag{language: noIndex, locale: noIndex}
+	Punjabi              Tag = Tag{language: paIndex, locale: paIndex}
+	Polish               Tag = Tag{language: plIndex, locale: plIndex}
+	Portuguese           Tag = Tag{language: ptIndex, locale: ptIndex}
+	BrazilianPortuguese  Tag = Tag{language: ptBRIndex, locale: ptBRIndex}
+	EuropeanPortuguese   Tag = Tag{language: ptPTIndex, locale: ptPTIndex}
+	Romanian             Tag = Tag{language: roIndex, locale: roIndex}
+	Russian              Tag = Tag{language: ruIndex, locale: ruIndex}
+	Sinhala              Tag = Tag{language: siIndex, locale: siIndex}
+	Slovak               Tag = Tag{language: skIndex, locale: skIndex}
+	Slovenian            Tag = Tag{language: slIndex, locale: slIndex}
+	Albanian             Tag = Tag{language: sqIndex, locale: sqIndex}
+	Serbian              Tag = Tag{language: srIndex, locale: srIndex}
+	SerbianLatin         Tag = Tag{language: srLatnIndex, locale: srLatnIndex}
+	Swedish              Tag = Tag{language: svIndex, locale: svIndex}
+	Swahili              Tag = Tag{language: swIndex, locale: swIndex}
+	Tamil                Tag = Tag{language: taIndex, locale: taIndex}
+	Telugu               Tag = Tag{language: teIndex, locale: teIndex}
+	Thai                 Tag = Tag{language: thIndex, locale: thIndex}
+	Turkish              Tag = Tag{language: trIndex, locale: trIndex}
+	Ukrainian            Tag = Tag{language: ukIndex, locale: ukIndex}
+	Urdu                 Tag = Tag{language: urIndex, locale: urIndex}
+	Uzbek                Tag = Tag{language: uzIndex, locale: uzIndex}
+	Vietnamese           Tag = Tag{language: viIndex, locale: viIndex}
+	Chinese              Tag = Tag{language: zhIndex, locale: zhIndex}
+	SimplifiedChinese    Tag = Tag{language: zhHansIndex, locale: zhHansIndex}
+	TraditionalChinese   Tag = Tag{language: zhHantIndex, locale: zhHantIndex}
+	Zulu                 Tag = Tag{language: zuIndex, locale: zuIndex}
 )