language: compact index bug fix: match zh-HK to zh-Hant-HK
Also add some other tests.
Add GetCoreKey to language/internal in preperation of
generation.
Change-Id: I675e6236e468231b53bd295251d43f7db0c4b49b
Reviewed-on: https://go-review.googlesource.com/95826
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/language/compact.go b/language/compact.go
new file mode 100644
index 0000000..125cc56
--- /dev/null
+++ b/language/compact.go
@@ -0,0 +1,14 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package language
+
+import "golang.org/x/text/language/internal"
+
+type compactID uint16
+
+func getCoreIndex(t language.Tag) (id compactID, ok bool) {
+ x, ok := coreTags[language.GetCoreKey(t)]
+ return compactID(x), ok
+}
diff --git a/language/internal/compact.go b/language/internal/compact.go
new file mode 100644
index 0000000..9e5dc8f
--- /dev/null
+++ b/language/internal/compact.go
@@ -0,0 +1,17 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package language
+
+// GetCoreKey generates a uint32 value that is guaranteed to be unique for
+// different language, region, and script values.
+func GetCoreKey(t Tag) (key uint32) {
+ if t.LangID > langNoIndexOffset {
+ return 0xfff00000
+ }
+ key |= uint32(t.LangID) << (8 + 12)
+ key |= uint32(t.ScriptID) << 12
+ key |= uint32(t.RegionID)
+ return key
+}
diff --git a/language/language.go b/language/language.go
index 3829d6d..b800fd9 100644
--- a/language/language.go
+++ b/language/language.go
@@ -438,17 +438,24 @@
exact = false
}
}
- for ; t != Und; t = t.Parent() {
+ if x, ok := getCoreIndex(t.tag); ok {
+ return int(x), exact
+ }
+ exact = false
+ if r.regionID != 0 && s.scriptID == 0 {
+ // Deal with cases where an extra script is inserted for the region.
+ t, _ := t.tag.Maximize()
+ if x, ok := getCoreIndex(t); ok {
+ return int(x), exact
+ }
+ }
+ for t = t.Parent(); t != Und; 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.
- key := uint32(b.langID) << (8 + 12)
- key |= uint32(s.scriptID) << 12
- key |= uint32(r.regionID)
- if x, ok := coreTags[key]; ok {
+ if x, ok := getCoreIndex(t.tag); ok {
return int(x), exact
}
- exact = false
}
return int(0), exact
}
diff --git a/language/language_test.go b/language/language_test.go
index 084a86f..1a605c9 100644
--- a/language/language_test.go
+++ b/language/language_test.go
@@ -65,6 +65,14 @@
{"en", 136, true},
{"en-u-co-phonebk", 136, false},
{"en-001", 137, true},
+ {"zh-Hant-HK", 763, true},
+ {"zh-HK", 763, false}, // maximized to zh-Hant-HK
+ {"nl-Beng", 0, false}, // parent skips script
+ {"nl-NO", 524, false}, // region is ignored
+ {"nl-Latn-NO", 524, false},
+ {"nl-Latn-NO-u-co-phonebk", 524, false},
+ {"nl-Latn-NO-valencia", 524, false},
+ {"nl-Latn-NO-oxendict", 524, false},
{"sh", 0, false}, // We don't normalize.
}
for _, tt := range tests {