func (b *Bundle) translate(lang *language.Language, translationID string, args ...interface{}) string { if lang == nil { return translationID } translations := b.translations[lang.Tag] if translations == nil { translations = b.fallbackTranslations[lang.Tag] if translations == nil { return translationID } } translation := translations[translationID] if translation == nil { return translationID } var data interface{} var count interface{} if argc := len(args); argc > 0 { if isNumber(args[0]) { count = args[0] if argc > 1 { data = args[1] } } else { data = args[0] } } if count != nil { if data == nil { data = map[string]interface{}{"Count": count} } else { dataMap := toMap(data) dataMap["Count"] = count data = dataMap } } p, _ := lang.Plural(count) template := translation.Template(p) if template == nil { return translationID } s := template.Execute(data) if s == "" { return translationID } return s }
// AddTranslation adds translations for a language. // // It is useful if your translations are in a format not supported by LoadTranslationFile. func (b *Bundle) AddTranslation(lang *language.Language, translations ...translation.Translation) { if b.translations[lang.Tag] == nil { b.translations[lang.Tag] = make(map[string]translation.Translation, len(translations)) } currentTranslations := b.translations[lang.Tag] for _, newTranslation := range translations { if currentTranslation := currentTranslations[newTranslation.ID()]; currentTranslation != nil { currentTranslations[newTranslation.ID()] = currentTranslation.Merge(newTranslation) } else { currentTranslations[newTranslation.ID()] = newTranslation } } // lang can provide translations for less specific language tags. for _, tag := range lang.MatchingTags() { b.fallbackTranslations[tag] = currentTranslations } }