language

package
Version: v0.2.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 14, 2015 License: Apache-2.0, MIT Imports: 7 Imported by: 0

Documentation

Overview

Package language implements BCP 47 language tags and related functionality.

The Tag type, which is used to represent language tags, is agnostic to the meaning of its subtags. Tags are not fully canonicalized to preserve information that may be valuable in certain contexts. As a consequence, two different tags may represent identical languages in certain contexts.

To determine equivalence between tags, a user should typically use a Matcher that is aware of the intricacies of equivalence within the given context. The default Matcher implementation provided in this package takes into account things such as deprecated subtags, legacy tags, and mutual intelligibility between scripts and languages.

See http://tools.ietf.org/html/bcp47 for more details.

NOTE: This package is still under development. Parts of it are not yet implemented, and the API is subject to change.

Index

Examples

Constants

View Source
const (
	// Replace deprecated base languages with their preferred replacements.
	DeprecatedBase CanonType = 1 << iota
	// Replace deprecated scripts with their preferred replacements.
	DeprecatedScript
	// Replace deprecated regions with their preferred replacements.
	DeprecatedRegion
	// Remove redundant scripts.
	SuppressScript
	// Normalize legacy encodings. This includes legacy languages defined in
	// CLDR as well as bibliographic codes defined in ISO-639.
	Legacy
	// Map the dominant language of a macro language group to the macro language
	// subtag. For example cmn -> zh.
	Macro
	// The CLDR flag should be used if full compatibility with CLDR is required.
	// There are a few cases where language.Tag may differ from CLDR. To follow all
	// of CLDR's suggestions, use All|CLDR.
	CLDR

	// Raw can be used to Compose or Parse without Canonicalization.
	Raw CanonType = 0

	// Replace all deprecated tags with their preferred replacements.
	Deprecated = DeprecatedBase | DeprecatedScript | DeprecatedRegion

	// All canonicalizations recommended by BCP 47.
	BCP47 = Deprecated | SuppressScript

	// All canonicalizations.
	All = BCP47 | Legacy | Macro

	// Default is the canonicalization used by Parse, Make and Compose. To
	// preserve as much information as possible, canonicalizations that remove
	// potentially valuable information are not included. The Matcher is
	// designed to recognize similar tags that would be the same if
	// they were canonicalized using All.
	Default = Deprecated | Legacy
)
View Source
const Version = "27.0.1"

Version is the version of CLDR used to generate the data in this package.

Variables

View Source
var ErrMissingLikelyTagsData = errors.New("missing likely tags data")

ErrMissingLikelyTagsData indicates no information was available to compute likely values of missing tags.

Functions

This section is empty.

Types

type Base

type Base struct {
	// contains filtered or unexported fields
}

Base is an ISO 639 language code, used for encoding the base language of a language tag.

func MustParseBase

func MustParseBase(s string) Base

MustParseBase is like ParseBase, but panics if the given base cannot be parsed. It simplifies safe initialization of Base values.

func ParseBase

func ParseBase(s string) (Base, error)

ParseBase parses a 2- or 3-letter ISO 639 code. It returns a ValueError if s is a well-formed but unknown language identifier or another error if another error occurred.

func (Base) ISO3

func (b Base) ISO3() string

ISO3 returns the ISO 639-3 language code.

func (Base) IsPrivateUse

func (b Base) IsPrivateUse() bool

IsPrivateUse reports whether this language code is reserved for private use.

func (Base) String

func (b Base) String() string

String returns the BCP 47 representation of the langID. Use b as variable name, instead of id, to ensure the variable used is consistent with that of Base in which this type is embedded.

type CanonType

type CanonType int

CanonType can be used to enable or disable various types of canonicalization.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	p := func(id string) {
		fmt.Printf("BCP47(%s) -> %s\n", id, language.BCP47.Make(id))
		fmt.Printf("Macro(%s) -> %s\n", id, language.Macro.Make(id))
		fmt.Printf("All(%s) -> %s\n", id, language.All.Make(id))
	}
	p("en-Latn")
	p("sh")
	p("zh-cmn")
	p("bjd")
	p("iw-Latn-fonipa-u-cu-usd")
}
Output:

BCP47(en-Latn) -> en
Macro(en-Latn) -> en-Latn
All(en-Latn) -> en
BCP47(sh) -> sh
Macro(sh) -> sh
All(sh) -> sr-Latn
BCP47(zh-cmn) -> cmn
Macro(zh-cmn) -> zh
All(zh-cmn) -> zh
BCP47(bjd) -> drl
Macro(bjd) -> bjd
All(bjd) -> drl
BCP47(iw-Latn-fonipa-u-cu-usd) -> he-Latn-fonipa-u-cu-usd
Macro(iw-Latn-fonipa-u-cu-usd) -> iw-Latn-fonipa-u-cu-usd
All(iw-Latn-fonipa-u-cu-usd) -> he-Latn-fonipa-u-cu-usd

func (CanonType) Canonicalize

func (c CanonType) Canonicalize(t Tag) (Tag, error)

Canonicalize returns the canonicalized equivalent of the tag.

func (CanonType) Compose

func (c CanonType) Compose(part ...interface{}) (t Tag, err error)

Compose creates a Tag from individual parts, which may be of type Tag, Base, Script, Region, Variant, []Variant, Extension, []Extension or error. If a Base, Script or Region or slice of type Variant or Extension is passed more than once, the latter will overwrite the former. Variants and Extensions are accumulated, but if two extensions of the same type are passed, the latter will replace the former. A Tag overwrites all former values and typically only makes sense as the first argument. The resulting tag is returned after canonicalizing using CanonType c. If one or more errors are encountered, one of the errors is returned.

func (CanonType) Make

func (c CanonType) Make(s string) Tag

Make is a convenience wrapper for c.Parse that omits the error. In case of an error, a sensible default is returned.

func (CanonType) MustParse

func (c CanonType) MustParse(s string) Tag

MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. It simplifies safe initialization of Tag values.

func (CanonType) Parse

func (c CanonType) Parse(s string) (t Tag, err error)

Parse parses the given BCP 47 string and returns a valid Tag. If parsing failed it returns an error and any part of the tag that could be parsed. If parsing succeeded but an unknown value was found, it returns ValueError. The Tag returned in this case is just stripped of the unknown value. All other values are preserved. It accepts tags in the BCP 47 format and extensions to this standard defined in http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. The resulting tag is canonicalized using the the canonicalization type c.

type Confidence

type Confidence int

Confidence indicates the level of certainty for a given return value. For example, Serbian may be written in Cyrillic or Latin script. The confidence level indicates whether a value was explicitly specified, whether it is typically the only possible value, or whether there is an ambiguity.

const (
	No    Confidence = iota // full confidence that there was no match
	Low                     // most likely value picked out of a set of alternatives
	High                    // value is generally assumed to be the correct match
	Exact                   // exact match or explicitly specified value
)

func (Confidence) String

func (c Confidence) String() string

type Coverage

type Coverage interface {
	// Tags returns the list of supported tags.
	Tags() []Tag

	// BaseLanguages returns the list of supported base languages.
	BaseLanguages() []Base

	// Scripts returns the list of supported scripts.
	Scripts() []Script

	// Regions returns the list of supported regions.
	Regions() []Region
}

The Coverage interface is used to define the level of coverage of an internationalization service. Note that not all types are supported by all services. As lists may be generated on the fly, it is recommended that users of a Coverage cache the results.

var (
	// Supported defines a Coverage that lists all supported subtags. Tags
	// always returns nil.
	Supported Coverage = allSubtags{}
)

func NewCoverage

func NewCoverage(list ...interface{}) Coverage

NewCoverage returns a Coverage for the given lists. It is typically used by packages providing internationalization services to define their level of coverage. A list may be of type []T or func() []T, where T is either Tag, Base, Script or Region. The returned Coverage derives the value for Bases from Tags if no func or slice for []Base is specified. For other unspecified types the returned Coverage will return nil for the respective methods.

type Currency

type Currency struct {
	// contains filtered or unexported fields
}

Currency is an ISO 4217 currency designator.

func MustParseCurrency

func MustParseCurrency(s string) Currency

MustParseCurrency is like ParseCurrency, but panics if the given currency cannot be parsed. It simplifies safe initialization of Currency values.

func ParseCurrency

func ParseCurrency(s string) (Currency, error)

ParseCurrency parses a 3-letter ISO 4217 code. It returns a ValueError if s is a well-formed but unknown currency identifier or another error if another error occurred.

func (Currency) String

func (c Currency) String() string

String returns the upper case representation of the currency.

type Extension

type Extension struct {
	// contains filtered or unexported fields
}

Extension is a single BCP 47 extension.

func ParseExtension

func ParseExtension(s string) (e Extension, err error)

ParseExtension parses s as an extension and returns it on success.

func (Extension) String

func (e Extension) String() string

String returns the string representation of the extension, including the type tag.

func (Extension) Tokens

func (e Extension) Tokens() []string

Tokens returns the list of tokens of e.

func (Extension) Type

func (e Extension) Type() byte

Type returns the one-byte extension type of e. It returns 0 for the zero exception.

type Matcher

type Matcher interface {
	Match(t ...Tag) (tag Tag, index int, c Confidence)
}

Matcher is the interface that wraps the Match method.

Match returns the best match for any of the given tags, along with a unique index associated with the returned tag and a confidence score.

Example

ExampleMatcher_bestMatch gives some examples of getting the best match of a set of tags to any of the tags of given set.

package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	// 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("ar")))

	// 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("fr-BE"), language.Make("af-NA")))
	fmt.Println(m.Match(language.Dutch, language.Make("af-NA"), language.Make("fr-BE")))

	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
fr 2 High
af 3 High
----
iw 9 Exact
iw-IL 8 Exact

func NewMatcher

func NewMatcher(t []Tag) Matcher

NewMatcher returns a Matcher that finds the best match for a tag based on written intelligibility. The index returned by the Match method corresponds to the index of the matched tag in the given list. The first element is used as the default value in case no good match is found.

Its Match method matches matches the first of the given Tags to reach a certain confidence threshold. The tags passed to Match should therefore be specified in order of preference. Various factors such as deprecated variants of tags, legacy mappings and information based on mutual intelligibility defined in CLDR are considered to determine equivalence.

type Region

type Region struct {
	// contains filtered or unexported fields
}

Region is an ISO 3166-1 or UN M.49 code for representing countries and regions.

func EncodeM49

func EncodeM49(r int) (Region, error)

EncodeM49 returns the Region for the given UN M.49 code. It returns an error if r is not a valid code.

func MustParseRegion

func MustParseRegion(s string) Region

MustParseRegion is like ParseRegion, but panics if the given region cannot be parsed. It simplifies safe initialization of Region values.

func ParseRegion

func ParseRegion(s string) (Region, error)

ParseRegion parses a 2- or 3-letter ISO 3166-1 or a UN M.49 code. It returns a ValueError if s is a well-formed but unknown region identifier or another error if another error occurred.

func (Region) Canonicalize

func (r Region) Canonicalize() Region

Canonicalize returns the region or a possible replacement if the region is deprecated. It will not return a replacement for deprecated regions that are split into multiple regions.

func (Region) Contains

func (r Region) Contains(c Region) bool

Contains returns whether Region c is contained by Region r. It returns true if c == r.

func (Region) ISO3

func (r Region) ISO3() string

ISO3 returns the 3-letter ISO code of r. Note that not all regions have a 3-letter ISO code. In such cases this method returns "ZZZ".

func (Region) IsCountry

func (r Region) IsCountry() bool

IsCountry returns whether this region is a country or autonomous area. This includes non-standard definitions from CLDR.

func (Region) IsGroup

func (r Region) IsGroup() bool

IsGroup returns whether this region defines a collection of regions. This includes non-standard definitions from CLDR.

func (Region) IsPrivateUse

func (r Region) IsPrivateUse() bool

IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This may include private-use tags that are assigned by CLDR and used in this implementation. So IsPrivateUse and IsCountry can be simultaneously true.

func (Region) M49

func (r Region) M49() int

M49 returns the UN M.49 encoding of r, or 0 if this encoding is not defined for r.

func (Region) String

func (r Region) String() string

String returns the BCP 47 representation for the region. It returns "ZZ" for an unspecified region.

func (Region) TLD

func (r Region) TLD() (Region, error)

TLD returns the country code top-level domain (ccTLD). UK is returned for GB. In all other cases it returns either the region itself or an error.

This method may return an error for a region for which there exists a canonical form with a ccTLD. To get that ccTLD canonicalize r first. The region will already be canonicalized it was obtained from a Tag that was obtained using any of the default methods.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	us := language.MustParseRegion("US")
	gb := language.MustParseRegion("GB")
	bu := language.MustParseRegion("BU")

	fmt.Println(us.TLD())
	fmt.Println(gb.TLD())
	fmt.Println(bu.TLD())

	fmt.Println(us.Canonicalize().TLD())
	fmt.Println(gb.Canonicalize().TLD())
	fmt.Println(bu.Canonicalize().TLD())
}
Output:

US <nil>
UK <nil>
ZZ language: region is not a valid ccTLD
US <nil>
UK <nil>
MM <nil>

type Script

type Script struct {
	// contains filtered or unexported fields
}

Script is a 4-letter ISO 15924 code for representing scripts. It is idiomatically represented in title case.

func MustParseScript

func MustParseScript(s string) Script

MustParseScript is like ParseScript, but panics if the given script cannot be parsed. It simplifies safe initialization of Script values.

func ParseScript

func ParseScript(s string) (Script, error)

ParseScript parses a 4-letter ISO 15924 code. It returns a ValueError if s is a well-formed but unknown script identifier or another error if another error occurred.

func (Script) IsPrivateUse

func (s Script) IsPrivateUse() bool

IsPrivateUse reports whether this script code is reserved for private use.

func (Script) String

func (s Script) String() string

String returns the script code in title case. It returns "Zzzz" for an unspecified script.

type Tag

type Tag struct {
	// contains filtered or unexported fields
}

Tag represents a BCP 47 language tag. It is used to specify an instance of a specific language or locale. All language tag values are guaranteed to be well-formed.

Example (Values)
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	us := language.MustParseRegion("US")
	en := language.MustParseBase("en")

	lang, _, region := language.AmericanEnglish.Raw()
	fmt.Println(lang == en, region == us)

	lang, _, region = language.BritishEnglish.Raw()
	fmt.Println(lang == en, region == us)

	// Tags can be compared for exact equivalence using '=='.
	en_us, _ := language.Compose(en, us)
	fmt.Println(en_us == language.AmericanEnglish)

}
Output:

true true
true false
true
var (
	Und Tag = Tag{}

	Afrikaans            Tag = Tag{/* contains filtered or unexported fields */} //  af
	Amharic              Tag = Tag{/* contains filtered or unexported fields */} //  am
	Arabic               Tag = Tag{/* contains filtered or unexported fields */} //  ar
	ModernStandardArabic Tag = Tag{/* contains filtered or unexported fields */} //  ar-001
	Azerbaijani          Tag = Tag{/* contains filtered or unexported fields */} //  az
	Bulgarian            Tag = Tag{/* contains filtered or unexported fields */} //  bg
	Bengali              Tag = Tag{/* contains filtered or unexported fields */} //  bn
	Catalan              Tag = Tag{/* contains filtered or unexported fields */} //  ca
	Czech                Tag = Tag{/* contains filtered or unexported fields */} //  cs
	Danish               Tag = Tag{/* contains filtered or unexported fields */} //  da
	German               Tag = Tag{/* contains filtered or unexported fields */} //  de
	Greek                Tag = Tag{/* contains filtered or unexported fields */} //  el
	English              Tag = Tag{/* contains filtered or unexported fields */} //  en
	AmericanEnglish      Tag = Tag{/* contains filtered or unexported fields */} //  en-US
	BritishEnglish       Tag = Tag{/* contains filtered or unexported fields */} //  en-GB
	Spanish              Tag = Tag{/* contains filtered or unexported fields */} //  es
	EuropeanSpanish      Tag = Tag{/* contains filtered or unexported fields */} //  es-ES
	LatinAmericanSpanish Tag = Tag{/* contains filtered or unexported fields */} //  es-419
	Estonian             Tag = Tag{/* contains filtered or unexported fields */} //  et
	Persian              Tag = Tag{/* contains filtered or unexported fields */} //  fa
	Finnish              Tag = Tag{/* contains filtered or unexported fields */} //  fi
	Filipino             Tag = Tag{/* contains filtered or unexported fields */} //  fil
	French               Tag = Tag{/* contains filtered or unexported fields */} //  fr
	CanadianFrench       Tag = Tag{/* contains filtered or unexported fields */} //  fr-CA
	Gujarati             Tag = Tag{/* contains filtered or unexported fields */} //  gu
	Hebrew               Tag = Tag{/* contains filtered or unexported fields */} //  he
	Hindi                Tag = Tag{/* contains filtered or unexported fields */} //  hi
	Croatian             Tag = Tag{/* contains filtered or unexported fields */} //  hr
	Hungarian            Tag = Tag{/* contains filtered or unexported fields */} //  hu
	Armenian             Tag = Tag{/* contains filtered or unexported fields */} //  hy
	Indonesian           Tag = Tag{/* contains filtered or unexported fields */} //  id
	Icelandic            Tag = Tag{/* contains filtered or unexported fields */} //  is
	Italian              Tag = Tag{/* contains filtered or unexported fields */} //  it
	Japanese             Tag = Tag{/* contains filtered or unexported fields */} //  ja
	Georgian             Tag = Tag{/* contains filtered or unexported fields */} //  ka
	Kazakh               Tag = Tag{/* contains filtered or unexported fields */} //  kk
	Khmer                Tag = Tag{/* contains filtered or unexported fields */} //  km
	Kannada              Tag = Tag{/* contains filtered or unexported fields */} //  kn
	Korean               Tag = Tag{/* contains filtered or unexported fields */} //  ko
	Kirghiz              Tag = Tag{/* contains filtered or unexported fields */} //  ky
	Lao                  Tag = Tag{/* contains filtered or unexported fields */} //  lo
	Lithuanian           Tag = Tag{/* contains filtered or unexported fields */} //  lt
	Latvian              Tag = Tag{/* contains filtered or unexported fields */} //  lv
	Macedonian           Tag = Tag{/* contains filtered or unexported fields */} //  mk
	Malayalam            Tag = Tag{/* contains filtered or unexported fields */} //  ml
	Mongolian            Tag = Tag{/* contains filtered or unexported fields */} //  mn
	Marathi              Tag = Tag{/* contains filtered or unexported fields */} //  mr
	Malay                Tag = Tag{/* contains filtered or unexported fields */} //  ms
	Burmese              Tag = Tag{/* contains filtered or unexported fields */} //  my
	Nepali               Tag = Tag{/* contains filtered or unexported fields */} //  ne
	Dutch                Tag = Tag{/* contains filtered or unexported fields */} //  nl
	Norwegian            Tag = Tag{/* contains filtered or unexported fields */} //  no
	Punjabi              Tag = Tag{/* contains filtered or unexported fields */} //  pa
	Polish               Tag = Tag{/* contains filtered or unexported fields */} //  pl
	Portuguese           Tag = Tag{/* contains filtered or unexported fields */} //  pt
	BrazilianPortuguese  Tag = Tag{/* contains filtered or unexported fields */} //  pt-BR
	EuropeanPortuguese   Tag = Tag{/* contains filtered or unexported fields */} //  pt-PT
	Romanian             Tag = Tag{/* contains filtered or unexported fields */} //  ro
	Russian              Tag = Tag{/* contains filtered or unexported fields */} //  ru
	Sinhala              Tag = Tag{/* contains filtered or unexported fields */} //  si
	Slovak               Tag = Tag{/* contains filtered or unexported fields */} //  sk
	Slovenian            Tag = Tag{/* contains filtered or unexported fields */} //  sl
	Albanian             Tag = Tag{/* contains filtered or unexported fields */} //  sq
	Serbian              Tag = Tag{/* contains filtered or unexported fields */} //  sr
	SerbianLatin         Tag = Tag{/* contains filtered or unexported fields */} //  sr-Latn
	Swedish              Tag = Tag{/* contains filtered or unexported fields */} //  sv
	Swahili              Tag = Tag{/* contains filtered or unexported fields */} //  sw
	Tamil                Tag = Tag{/* contains filtered or unexported fields */} //  ta
	Telugu               Tag = Tag{/* contains filtered or unexported fields */} //  te
	Thai                 Tag = Tag{/* contains filtered or unexported fields */} //  th
	Turkish              Tag = Tag{/* contains filtered or unexported fields */} //  tr
	Ukrainian            Tag = Tag{/* contains filtered or unexported fields */} //  uk
	Urdu                 Tag = Tag{/* contains filtered or unexported fields */} //  ur
	Uzbek                Tag = Tag{/* contains filtered or unexported fields */} //  uz
	Vietnamese           Tag = Tag{/* contains filtered or unexported fields */} //  vi
	Chinese              Tag = Tag{/* contains filtered or unexported fields */} //  zh
	SimplifiedChinese    Tag = Tag{/* contains filtered or unexported fields */} //  zh-Hans
	TraditionalChinese   Tag = Tag{/* contains filtered or unexported fields */} //  zh-Hant
	Zulu                 Tag = Tag{/* contains filtered or unexported fields */} //  zu
)

func Compose

func Compose(part ...interface{}) (t Tag, err error)

Compose creates a Tag from individual parts, which may be of type Tag, Base, Script, Region, Variant, []Variant, Extension, []Extension or error. If a Base, Script or Region or slice of type Variant or Extension is passed more than once, the latter will overwrite the former. Variants and Extensions are accumulated, but if two extensions of the same type are passed, the latter will replace the former. A Tag overwrites all former values and typically only makes sense as the first argument. The resulting tag is returned after canonicalizing using the Default CanonType. If one or more errors are encountered, one of the errors is returned.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	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 Make

func Make(s string) Tag

Make is a convenience wrapper for Parse that omits the error. In case of an error, a sensible default is returned.

func MustParse

func MustParse(s string) Tag

MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. It simplifies safe initialization of Tag values.

func Parse

func Parse(s string) (t Tag, err error)

Parse parses the given BCP 47 string and returns a valid Tag. If parsing failed it returns an error and any part of the tag that could be parsed. If parsing succeeded but an unknown value was found, it returns ValueError. The Tag returned in this case is just stripped of the unknown value. All other values are preserved. It accepts tags in the BCP 47 format and extensions to this standard defined in http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. The resulting tag is canonicalized using the default canonicalization type.

Example (Errors)
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	for _, s := range []string{"Foo", "Bar", "Foobar"} {
		_, err := language.Parse(s)
		if err != nil {
			if inv, ok := err.(language.ValueError); ok {
				fmt.Println(inv.Subtag())
			} else {
				fmt.Println(s)
			}
		}
	}
	for _, s := range []string{"en", "aa-Uuuu", "AC", "ac-u"} {
		_, err := language.Parse(s)
		switch e := err.(type) {
		case language.ValueError:
			fmt.Printf("%s: culprit %q\n", s, e.Subtag())
		case nil:
			// No error.
		default:
			// A syntax error.
			fmt.Printf("%s: ill-formed\n", s)
		}
	}
}
Output:

foo
Foobar
aa-Uuuu: culprit "Uuuu"
AC: culprit "ac"
ac-u: ill-formed

func ParseAcceptLanguage

func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error)

ParseAcceptLanguage parses the contents of a Accept-Language header as defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and a list of corresponding quality weights. The Tags will be sorted by highest weight first and then by first occurrence. Tags with a weight of zero will be dropped. An error will be returned if the input could not be parsed.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	// 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 (Tag) Base

func (t Tag) Base() (Base, Confidence)

Base returns the base language of the language tag. If the base language is unspecified, an attempt will be made to infer it from the context. It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	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 (Tag) ComprehensibleTo

func (t Tag) ComprehensibleTo(speaker Tag) Confidence

ComprehensibleTo returns the confidence score for speaker being able to comprehend the (written) language t. It uses a Matcher under the hood.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	// 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 (Tag) Extension

func (t Tag) Extension(x byte) (ext Extension, ok bool)

Extension returns the extension of type x for tag t. It will return false for ok if t does not have the requested extension. The returned extension will be invalid in this case.

func (Tag) Extensions

func (t Tag) Extensions() []Extension

Extensions returns all extensions of t.

func (Tag) IsRoot

func (t Tag) IsRoot() bool

IsRoot returns true if t is equal to language "und".

func (Tag) Parent

func (t Tag) Parent() Tag

Parent returns the CLDR parent of t. In CLDR, missing fields in data for a specific language are substituted with fields from the parent language. The parent for a language may change for newer versions of CLDR.

func (Tag) Raw

func (t Tag) Raw() (b Base, s Script, r Region)

Raw returns the raw base language, script and region, without making an attempt to infer their values.

func (Tag) Region

func (t Tag) Region() (Region, Confidence)

Region returns the region for the language tag. If it was not explicitly given, it will infer a most likely candidate from the context. It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	ru := language.Make("ru")
	en := language.Make("en")
	fmt.Println(ru.Region())
	fmt.Println(en.Region())
}
Output:

RU Low
US Low

func (Tag) Script

func (t Tag) Script() (Script, Confidence)

Script infers the script for the language tag. If it was not explicitly given, it will infer a most likely candidate. If more than one script is commonly used for a language, the most likely one is returned with a low confidence indication. For example, it returns (Cyrl, Low) for Serbian. If a script cannot be inferred (Zzzz, No) is returned. We do not use Zyyy (undetermined) as one would suspect from the IANA registry for BCP 47. In a Unicode context Zyyy marks common characters (like 1, 2, 3, '.', etc.) and is therefore more like multiple scripts. See http://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for unknown value in CLDR. (Zzzz, Exact) is returned if Zzzz was explicitly specified. Note that an inferred script is never guaranteed to be the correct one. Latin is almost exclusively used for Afrikaans, but Arabic has been used for some texts 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.

Example
package main

import (
	"fmt"

	"golang.org/x/text/language"
)

func main() {
	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

func (Tag) SetTypeForKey

func (t Tag) SetTypeForKey(key, value string) (Tag, error)

SetTypeForKey returns a new Tag with the key set to type, where key and type are of the allowed values defined for the Unicode locale extension ('u') in http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. An empty value removes an existing pair with the same key.

func (Tag) String

func (t Tag) String() string

String returns the canonical string representation of the language tag.

func (Tag) TypeForKey

func (t Tag) TypeForKey(key string) string

TypeForKey returns the type associated with the given key, where key and type are of the allowed values defined for the Unicode locale extension ('u') in http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. TypeForKey will traverse the inheritance chain to get the correct value.

func (Tag) Variants

func (t Tag) Variants() []Variant

Variant returns the variants specified explicitly for this language tag. or nil if no variant was specified.

type ValueError

type ValueError struct {
	// contains filtered or unexported fields
}

ValueError is returned by any of the parsing functions when the input is well-formed but the respective subtag is not recognized as a valid value.

func (ValueError) Error

func (e ValueError) Error() string

Error implements the error interface.

func (ValueError) Subtag

func (e ValueError) Subtag() string

Subtag returns the subtag for which the error occurred.

type Variant

type Variant struct {
	// contains filtered or unexported fields
}

Variant represents a registered variant of a language as defined by BCP 47.

func ParseVariant

func ParseVariant(s string) (Variant, error)

ParseVariant parses and returns a Variant. An error is returned if s is not a valid variant.

func (Variant) String

func (v Variant) String() string

String returns the string representation of the variant.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL