summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go')
-rw-r--r--vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go234
1 files changed, 0 insertions, 234 deletions
diff --git a/vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go b/vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go
deleted file mode 100644
index 5d3b0df13..000000000
--- a/vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go
+++ /dev/null
@@ -1,234 +0,0 @@
-package i18n
-
-import (
- "fmt"
-
- "text/template"
-
- "github.com/nicksnyder/go-i18n/v2/internal/plural"
- "golang.org/x/text/language"
-)
-
-// Localizer provides Localize and MustLocalize methods that return localized messages.
-type Localizer struct {
- // bundle contains the messages that can be returned by the Localizer.
- bundle *Bundle
-
- // tags is the list of language tags that the Localizer checks
- // in order when localizing a message.
- tags []language.Tag
-}
-
-// NewLocalizer returns a new Localizer that looks up messages
-// in the bundle according to the language preferences in langs.
-// It can parse Accept-Language headers as defined in http://www.ietf.org/rfc/rfc2616.txt.
-func NewLocalizer(bundle *Bundle, langs ...string) *Localizer {
- return &Localizer{
- bundle: bundle,
- tags: parseTags(langs),
- }
-}
-
-func parseTags(langs []string) []language.Tag {
- tags := []language.Tag{}
- for _, lang := range langs {
- t, _, err := language.ParseAcceptLanguage(lang)
- if err != nil {
- continue
- }
- tags = append(tags, t...)
- }
- return tags
-}
-
-// LocalizeConfig configures a call to the Localize method on Localizer.
-type LocalizeConfig struct {
- // MessageID is the id of the message to lookup.
- // This field is ignored if DefaultMessage is set.
- MessageID string
-
- // TemplateData is the data passed when executing the message's template.
- // If TemplateData is nil and PluralCount is not nil, then the message template
- // will be executed with data that contains the plural count.
- TemplateData interface{}
-
- // PluralCount determines which plural form of the message is used.
- PluralCount interface{}
-
- // DefaultMessage is used if the message is not found in any message files.
- DefaultMessage *Message
-
- // Funcs is used to extend the Go template engine's built in functions
- Funcs template.FuncMap
-}
-
-type invalidPluralCountErr struct {
- messageID string
- pluralCount interface{}
- err error
-}
-
-func (e *invalidPluralCountErr) Error() string {
- return fmt.Sprintf("invalid plural count %#v for message id %q: %s", e.pluralCount, e.messageID, e.err)
-}
-
-// MessageNotFoundErr is returned from Localize when a message could not be found.
-type MessageNotFoundErr struct {
- messageID string
-}
-
-func (e *MessageNotFoundErr) Error() string {
- return fmt.Sprintf("message %q not found", e.messageID)
-}
-
-type pluralizeErr struct {
- messageID string
- tag language.Tag
-}
-
-func (e *pluralizeErr) Error() string {
- return fmt.Sprintf("unable to pluralize %q because there no plural rule for %q", e.messageID, e.tag)
-}
-
-type messageIDMismatchErr struct {
- messageID string
- defaultMessageID string
-}
-
-func (e *messageIDMismatchErr) Error() string {
- return fmt.Sprintf("message id %q does not match default message id %q", e.messageID, e.defaultMessageID)
-}
-
-// Localize returns a localized message.
-func (l *Localizer) Localize(lc *LocalizeConfig) (string, error) {
- msg, _, err := l.LocalizeWithTag(lc)
- return msg, err
-}
-
-// Localize returns a localized message.
-func (l *Localizer) LocalizeMessage(msg *Message) (string, error) {
- return l.Localize(&LocalizeConfig{
- DefaultMessage: msg,
- })
-}
-
-// TODO: uncomment this (and the test) when extract has been updated to extract these call sites too.
-// Localize returns a localized message.
-// func (l *Localizer) LocalizeMessageID(messageID string) (string, error) {
-// return l.Localize(&LocalizeConfig{
-// MessageID: messageID,
-// })
-// }
-
-// LocalizeWithTag returns a localized message and the language tag.
-// It may return a best effort localized message even if an error happens.
-func (l *Localizer) LocalizeWithTag(lc *LocalizeConfig) (string, language.Tag, error) {
- messageID := lc.MessageID
- if lc.DefaultMessage != nil {
- if messageID != "" && messageID != lc.DefaultMessage.ID {
- return "", language.Und, &messageIDMismatchErr{messageID: messageID, defaultMessageID: lc.DefaultMessage.ID}
- }
- messageID = lc.DefaultMessage.ID
- }
-
- var operands *plural.Operands
- templateData := lc.TemplateData
- if lc.PluralCount != nil {
- var err error
- operands, err = plural.NewOperands(lc.PluralCount)
- if err != nil {
- return "", language.Und, &invalidPluralCountErr{messageID: messageID, pluralCount: lc.PluralCount, err: err}
- }
- if templateData == nil {
- templateData = map[string]interface{}{
- "PluralCount": lc.PluralCount,
- }
- }
- }
-
- tag, template := l.getTemplate(messageID, lc.DefaultMessage)
- if template == nil {
- return "", language.Und, &MessageNotFoundErr{messageID: messageID}
- }
-
- pluralForm := l.pluralForm(tag, operands)
- if pluralForm == plural.Invalid {
- return "", language.Und, &pluralizeErr{messageID: messageID, tag: tag}
- }
-
- msg, err := template.Execute(pluralForm, templateData, lc.Funcs)
- if err != nil {
- // Attempt to fallback to "Other" pluralization in case translations are incomplete.
- if pluralForm != plural.Other {
- msg2, err2 := template.Execute(plural.Other, templateData, lc.Funcs)
- if err2 == nil {
- return msg2, tag, err
- }
- }
- return "", language.Und, err
- }
- return msg, tag, nil
-}
-
-func (l *Localizer) getTemplate(id string, defaultMessage *Message) (language.Tag, *MessageTemplate) {
- // Fast path.
- // Optimistically assume this message id is defined in each language.
- fastTag, template := l.matchTemplate(id, defaultMessage, l.bundle.matcher, l.bundle.tags)
- if template != nil {
- return fastTag, template
- }
-
- if len(l.bundle.tags) <= 1 {
- return l.bundle.defaultLanguage, nil
- }
-
- // Slow path.
- // We didn't find a translation for the tag suggested by the default matcher
- // so we need to create a new matcher that contains only the tags in the bundle
- // that have this message.
- foundTags := make([]language.Tag, 0, len(l.bundle.messageTemplates)+1)
- foundTags = append(foundTags, l.bundle.defaultLanguage)
-
- for t, templates := range l.bundle.messageTemplates {
- template := templates[id]
- if template == nil || template.Other == "" {
- continue
- }
- foundTags = append(foundTags, t)
- }
-
- return l.matchTemplate(id, defaultMessage, language.NewMatcher(foundTags), foundTags)
-}
-
-func (l *Localizer) matchTemplate(id string, defaultMessage *Message, matcher language.Matcher, tags []language.Tag) (language.Tag, *MessageTemplate) {
- _, i, _ := matcher.Match(l.tags...)
- tag := tags[i]
- templates := l.bundle.messageTemplates[tag]
- if templates != nil && templates[id] != nil {
- return tag, templates[id]
- }
- if tag == l.bundle.defaultLanguage && defaultMessage != nil {
- return tag, NewMessageTemplate(defaultMessage)
- }
- return tag, nil
-}
-
-func (l *Localizer) pluralForm(tag language.Tag, operands *plural.Operands) plural.Form {
- if operands == nil {
- return plural.Other
- }
- pluralRule := l.bundle.pluralRules.Rule(tag)
- if pluralRule == nil {
- return plural.Invalid
- }
- return pluralRule.PluralFormFunc(operands)
-}
-
-// MustLocalize is similar to Localize, except it panics if an error happens.
-func (l *Localizer) MustLocalize(lc *LocalizeConfig) string {
- localized, err := l.Localize(lc)
- if err != nil {
- panic(err)
- }
- return localized
-}