func ExampleCompose() { nl, _ := language.ParseBase("nl") us, _ := language.ParseRegion("US") de := language.Make("de-1901-u-co-phonebk") jp := language.Make("ja-JP") fi := language.Make("fi-x-ing") u, _ := language.ParseExtension("u-nu-arabic") x, _ := language.ParseExtension("x-piglatin") // Combine a base language and region. fmt.Println(language.Compose(nl, us)) // Combine a base language and extension. fmt.Println(language.Compose(nl, x)) // Replace the region. fmt.Println(language.Compose(jp, us)) // Combine several tags. fmt.Println(language.Compose(us, nl, u)) // Replace the base language of a tag. fmt.Println(language.Compose(de, nl)) fmt.Println(language.Compose(de, nl, u)) // Remove the base language. fmt.Println(language.Compose(de, language.Base{})) // Remove all variants. fmt.Println(language.Compose(de, []language.Variant{})) // Remove all extensions. fmt.Println(language.Compose(de, []language.Extension{})) fmt.Println(language.Compose(fi, []language.Extension{})) // Remove all variants and extensions. fmt.Println(language.Compose(de.Raw())) // An error is gobbled or returned if non-nil. fmt.Println(language.Compose(language.ParseRegion("ZA"))) fmt.Println(language.Compose(language.ParseRegion("HH"))) // Compose uses the same Default canonicalization as Make. fmt.Println(language.Compose(language.Raw.Parse("en-Latn-UK"))) // Call compose on a different CanonType for different results. fmt.Println(language.All.Compose(language.Raw.Parse("en-Latn-UK"))) // Output: // nl-US <nil> // nl-x-piglatin <nil> // ja-US <nil> // nl-US-u-nu-arabic <nil> // nl-1901-u-co-phonebk <nil> // nl-1901-u-nu-arabic <nil> // und-1901-u-co-phonebk <nil> // de-u-co-phonebk <nil> // de-1901 <nil> // fi <nil> // de <nil> // und-ZA <nil> // und language: subtag "HH" is well-formed but unknown // en-Latn-GB <nil> // en-GB <nil> }
func ExampleID_Region() { ru := language.Make("ru") en := language.Make("en") fmt.Println(ru.Region()) fmt.Println(en.Region()) // Output: // RU Low // US Low }
func ExampleID_Base() { fmt.Println(language.Make("und").Base()) fmt.Println(language.Make("und-US").Base()) fmt.Println(language.Make("und-NL").Base()) fmt.Println(language.Make("und-419").Base()) fmt.Println(language.Make("und-ZZ").Base()) // Output: // en Low // en High // nl High // en Low // en Low }
func ExampleTag_Base() { fmt.Println(language.Make("und").Base()) fmt.Println(language.Make("und-US").Base()) fmt.Println(language.Make("und-NL").Base()) fmt.Println(language.Make("und-419").Base()) // Latin America fmt.Println(language.Make("und-ZZ").Base()) // Output: // en Low // en High // nl High // es Low // en Low }
func ExampleTags() { n := display.Tags(language.English) fmt.Println(n.Name(language.Make("nl"))) fmt.Println(n.Name(language.Make("nl-BE"))) fmt.Println(n.Name(language.Make("nl-CW"))) fmt.Println(n.Name(language.Make("nl-Arab"))) fmt.Println(n.Name(language.Make("nl-Cyrl-RU"))) // Output: // Dutch // Flemish // Dutch (Curaçao) // Dutch (Arabic) // Dutch (Cyrillic, Russia) }
// parseMain parses XML files in the main directory of the CLDR core.zip file. func parseMain() { d := &cldr.Decoder{} d.SetDirFilter("main") d.SetSectionFilter("characters") data := decodeCLDR(d) for _, loc := range data.Locales() { x := data.RawLDML(loc) if skipLang(x.Identity.Language.Type) { continue } if x.Characters != nil { x, _ = data.LDML(loc) loc = language.Make(loc).String() for _, ec := range x.Characters.ExemplarCharacters { if ec.Draft != "" { continue } if _, ok := localeChars[loc]; !ok { mainLocales = append(mainLocales, loc) localeChars[loc] = make(charSets) } localeChars[loc][ec.Type] = parseCharacters(ec.Data()) } } } }
func ExampleID_Part() { loc := language.Make("sr-RS") script := loc.Part(language.ScriptPart) region := loc.Part(language.RegionPart) fmt.Printf("%q %q", script, region) // Output: "" "RS" }
func ExampleParent() { p := func(tag string) { fmt.Printf("parent(%v): %v\n", tag, language.Make(tag).Parent()) } p("zh-CN") // Australian English inherits from British English. p("en-AU") // If the tag has a different maximized script from its parent, a tag with // this maximized script is inserted. This allows different language tags // which have the same base language and script in common to inherit from // a common set of settings. p("zh-HK") // If the maximized script of the parent is not identical, CLDR will skip // inheriting from it, as it means there will not be many entries in common // and inheriting from it is nonsensical. p("zh-Hant") // The parent of a tag with variants and extensions is the tag with all // variants and extensions removed. p("de-1994-u-co-phonebk") // Remove default script. p("de-Latn-LU") // Output: // parent(zh-CN): zh // parent(en-AU): en-GB // parent(zh-HK): zh-Hant // parent(zh-Hant): und // parent(de-1994-u-co-phonebk): de // parent(de-Latn-LU): de }
func ExampleID_Script() { en := language.Make("en") sr := language.Make("sr") sr_Latn := language.Make("sr_Latn") fmt.Println(en.Script()) fmt.Println(sr.Script()) // Was a script explicitly specified? _, c := sr.Script() fmt.Println(c == language.Exact) _, c = sr_Latn.Script() fmt.Println(c == language.Exact) // Output: // Latn High // Cyrl Low // false // true }
// 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 }
// 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 }
func ExampleTag_ComprehensibleTo() { // Various levels of comprehensibility. fmt.Println(language.English.ComprehensibleTo(language.English)) fmt.Println(language.BritishEnglish.ComprehensibleTo(language.AmericanEnglish)) // An explicit Und results in no match. fmt.Println(language.Und.ComprehensibleTo(language.English)) fmt.Println("----") // There is usually no mutual comprehensibility between different scripts. fmt.Println(language.English.ComprehensibleTo(language.Make("en-Dsrt"))) // One exception is for Traditional versus Simplified Chinese, albeit with // a low confidence. fmt.Println(language.SimplifiedChinese.ComprehensibleTo(language.TraditionalChinese)) fmt.Println("----") // A Swiss German speaker will often understand High German. fmt.Println(language.Make("de").ComprehensibleTo(language.Make("gsw"))) // The converse is not generally the case. fmt.Println(language.Make("gsw").ComprehensibleTo(language.Make("de"))) // Output: // Exact // High // No // ---- // No // Low // ---- // High // No }
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 }
func (g *phraseGenerator) init(id string) { ec := exemplarCharacters loc := language.Make(id).String() // get sets for locale or parent locale if the set is not defined. for i := range g.sets { for p, ok := loc, true; ok; p, ok = parent(p) { if set, ok := ec[p]; ok && set[i] != "" { g.sets[i].set = strings.Split(set[i], " ") break } } } r := newRewriter() r.addCases = *cases for i := range g.sets { g.sets[i].set = r.rewrite(g.sets[i].set) } // compute indexes for i, set := range g.sets { g.n += len(set.set) g.sets[i].charIndex = g.n } }
func newGoCollator(loc string) (Collator, error) { c := &goCollator{c: collate.New(language.Make(loc))} return c, nil }
// 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 }