func init() { tags := make([]language.Tag, numSupported) s := supported for i := range tags { p := strings.IndexByte(s, '|') tags[i] = language.Raw.Make(s[:p]) s = s[p+1:] } matcher = language.NewMatcher(tags) Supported = language.NewCoverage(tags) Values = language.NewCoverage(langTagSet.Tags, supportedScripts, supportedRegions) }
func ExampleParseAcceptLanguage() { // Tags are reordered based on their q rating. A missing q value means 1.0. fmt.Println(language.ParseAcceptLanguage(" nn;q=0.3, en-gb;q=0.8, en,")) m := language.NewMatcher([]language.Tag{language.Norwegian, language.Make("en-AU")}) t, _, _ := language.ParseAcceptLanguage("da, en-gb;q=0.8, en;q=0.7") fmt.Println(m.Match(t...)) // Danish is pretty close to Norwegian. t, _, _ = language.ParseAcceptLanguage(" da, nl") fmt.Println(m.Match(t...)) // Output: // [en en-GB nn] [1 0.8 0.3] <nil> // en-AU 1 High // no 0 High }
// ExampleDictionary shows how to reduce the amount of data linked into your // binary by only using the predefined Dictionary variables of the languages you // wish to support. func ExampleDictionary() { tags := []language.Tag{ language.English, language.German, language.Japanese, language.Russian, } dicts := []*display.Dictionary{ display.English, display.German, display.Japanese, display.Russian, } m := language.NewMatcher(tags) getDict := func(t language.Tag) *display.Dictionary { _, i, confidence := m.Match(t) // Skip this check if you want to support a fall-back language, which // will be the first one passed to NewMatcher. if confidence == language.No { return nil } return dicts[i] } // The matcher will match Swiss German to German. n := getDict(language.Make("gsw")).Languages() fmt.Println(n.Name(language.German)) fmt.Println(n.Name(language.Make("de-CH"))) fmt.Println(n.Name(language.Make("gsw"))) // Output: // Deutsch // Schweizer Hochdeutsch // Schweizerdeutsch }
// ExampleMatcher_bestMatch gives some examples of getting the best match of // a set of tags to any of the tags of given set. func ExampleMatcher() { // This is the set of tags from which we want to pick the best match. These // can be, for example, the supported languages for some package. tags := []language.Tag{ language.English, language.BritishEnglish, language.French, language.Afrikaans, language.BrazilianPortuguese, language.EuropeanPortuguese, language.Croatian, language.SimplifiedChinese, language.Raw.Make("iw-IL"), language.Raw.Make("iw"), language.Raw.Make("he"), } m := language.NewMatcher(tags) // A simple match. fmt.Println(m.Match(language.Make("fr"))) // Australian English is closer to British than American English. fmt.Println(m.Match(language.Make("en-AU"))) // Default to the first tag passed to the Matcher if there is no match. fmt.Println(m.Match(language.Make("zu"))) // Get the default tag. fmt.Println(m.Match()) fmt.Println("----") // Croatian speakers will likely understand Serbian written in Latin script. fmt.Println(m.Match(language.Make("sr-Latn"))) // We match SimplifiedChinese, but with Low confidence. fmt.Println(m.Match(language.TraditionalChinese)) // Serbian in Latin script is a closer match to Croatian than Traditional // Chinese to Simplified Chinese. fmt.Println(m.Match(language.TraditionalChinese, language.Make("sr-Latn"))) fmt.Println("----") // In case a multiple variants of a language are available, the most spoken // variant is typically returned. fmt.Println(m.Match(language.Portuguese)) // Pick the first value passed to Match in case of a tie. fmt.Println(m.Match(language.Dutch, language.Make("en-AU"), language.Make("af-NA"))) fmt.Println(m.Match(language.Dutch, language.Make("af-NA"), language.Make("en-AU"))) fmt.Println("----") // If a Matcher is initialized with a language and it's deprecated version, // it will distinguish between them. fmt.Println(m.Match(language.Raw.Make("iw"))) // However, for non-exact matches, it will treat deprecated versions as // equivalent and consider other factors first. fmt.Println(m.Match(language.Raw.Make("he-IL"))) // Output: // fr 2 Exact // en-GB 1 High // en 0 No // en 0 No // ---- // hr 6 High // zh-Hans 7 Low // hr 6 High // ---- // pt-BR 4 High // en-GB 1 High // af 3 High // ---- // iw 9 Exact // iw-IL 8 Exact }
func (c *Collator) iter(i int) *iter { // TODO: evaluate performance for making the second iterator optional. return &c._iter[i] } // Supported returns the list of languages for which collating differs from its parent. func Supported() []language.Tag { ids := strings.Split(availableLocales, ",") tags := make([]language.Tag, len(ids)) for i, s := range ids { tags[i] = language.Make(s) } return tags } var matcher = language.NewMatcher(Supported()) // New returns a new Collator initialized for the given locale. func New(t language.Tag) *Collator { _, index, _ := matcher.Match(t) return NewFromTable(colltab.Init(locales[index])) } func NewFromTable(t colltab.Weigher) *Collator { c := &Collator{ Strength: colltab.Tertiary, f: norm.NFD, t: t, } c._iter[0].init(c) c._iter[1].init(c)