1 | // Copyright 2017 The Go Authors. All rights reserved.
|
---|
2 | // Use of this source code is governed by a BSD-style
|
---|
3 | // license that can be found in the LICENSE file.
|
---|
4 |
|
---|
5 | // Package language implements BCP 47 language tags and related functionality.
|
---|
6 | //
|
---|
7 | // The most important function of package language is to match a list of
|
---|
8 | // user-preferred languages to a list of supported languages.
|
---|
9 | // It alleviates the developer of dealing with the complexity of this process
|
---|
10 | // and provides the user with the best experience
|
---|
11 | // (see https://blog.golang.org/matchlang).
|
---|
12 | //
|
---|
13 | // # Matching preferred against supported languages
|
---|
14 | //
|
---|
15 | // A Matcher for an application that supports English, Australian English,
|
---|
16 | // Danish, and standard Mandarin can be created as follows:
|
---|
17 | //
|
---|
18 | // var matcher = language.NewMatcher([]language.Tag{
|
---|
19 | // language.English, // The first language is used as fallback.
|
---|
20 | // language.MustParse("en-AU"),
|
---|
21 | // language.Danish,
|
---|
22 | // language.Chinese,
|
---|
23 | // })
|
---|
24 | //
|
---|
25 | // This list of supported languages is typically implied by the languages for
|
---|
26 | // which there exists translations of the user interface.
|
---|
27 | //
|
---|
28 | // User-preferred languages usually come as a comma-separated list of BCP 47
|
---|
29 | // language tags.
|
---|
30 | // The MatchString finds best matches for such strings:
|
---|
31 | //
|
---|
32 | // handler(w http.ResponseWriter, r *http.Request) {
|
---|
33 | // lang, _ := r.Cookie("lang")
|
---|
34 | // accept := r.Header.Get("Accept-Language")
|
---|
35 | // tag, _ := language.MatchStrings(matcher, lang.String(), accept)
|
---|
36 | //
|
---|
37 | // // tag should now be used for the initialization of any
|
---|
38 | // // locale-specific service.
|
---|
39 | // }
|
---|
40 | //
|
---|
41 | // The Matcher's Match method can be used to match Tags directly.
|
---|
42 | //
|
---|
43 | // Matchers are aware of the intricacies of equivalence between languages, such
|
---|
44 | // as deprecated subtags, legacy tags, macro languages, mutual
|
---|
45 | // intelligibility between scripts and languages, and transparently passing
|
---|
46 | // BCP 47 user configuration.
|
---|
47 | // For instance, it will know that a reader of Bokmål Danish can read Norwegian
|
---|
48 | // and will know that Cantonese ("yue") is a good match for "zh-HK".
|
---|
49 | //
|
---|
50 | // # Using match results
|
---|
51 | //
|
---|
52 | // To guarantee a consistent user experience to the user it is important to
|
---|
53 | // use the same language tag for the selection of any locale-specific services.
|
---|
54 | // For example, it is utterly confusing to substitute spelled-out numbers
|
---|
55 | // or dates in one language in text of another language.
|
---|
56 | // More subtly confusing is using the wrong sorting order or casing
|
---|
57 | // algorithm for a certain language.
|
---|
58 | //
|
---|
59 | // All the packages in x/text that provide locale-specific services
|
---|
60 | // (e.g. collate, cases) should be initialized with the tag that was
|
---|
61 | // obtained at the start of an interaction with the user.
|
---|
62 | //
|
---|
63 | // Note that Tag that is returned by Match and MatchString may differ from any
|
---|
64 | // of the supported languages, as it may contain carried over settings from
|
---|
65 | // the user tags.
|
---|
66 | // This may be inconvenient when your application has some additional
|
---|
67 | // locale-specific data for your supported languages.
|
---|
68 | // Match and MatchString both return the index of the matched supported tag
|
---|
69 | // to simplify associating such data with the matched tag.
|
---|
70 | //
|
---|
71 | // # Canonicalization
|
---|
72 | //
|
---|
73 | // If one uses the Matcher to compare languages one does not need to
|
---|
74 | // worry about canonicalization.
|
---|
75 | //
|
---|
76 | // The meaning of a Tag varies per application. The language package
|
---|
77 | // therefore delays canonicalization and preserves information as much
|
---|
78 | // as possible. The Matcher, however, will always take into account that
|
---|
79 | // two different tags may represent the same language.
|
---|
80 | //
|
---|
81 | // By default, only legacy and deprecated tags are converted into their
|
---|
82 | // canonical equivalent. All other information is preserved. This approach makes
|
---|
83 | // the confidence scores more accurate and allows matchers to distinguish
|
---|
84 | // between variants that are otherwise lost.
|
---|
85 | //
|
---|
86 | // As a consequence, two tags that should be treated as identical according to
|
---|
87 | // BCP 47 or CLDR, like "en-Latn" and "en", will be represented differently. The
|
---|
88 | // Matcher handles such distinctions, though, and is aware of the
|
---|
89 | // equivalence relations. The CanonType type can be used to alter the
|
---|
90 | // canonicalization form.
|
---|
91 | //
|
---|
92 | // # References
|
---|
93 | //
|
---|
94 | // BCP 47 - Tags for Identifying Languages http://tools.ietf.org/html/bcp47
|
---|
95 | package language // import "golang.org/x/text/language"
|
---|
96 |
|
---|
97 | // TODO: explanation on how to match languages for your own locale-specific
|
---|
98 | // service.
|
---|