func (mc *mergeCommand) execute() error { if len(mc.translationFiles) < 1 { return fmt.Errorf("need at least one translation file to parse") } if lang := language.Parse(mc.sourceLanguageTag); lang == nil { return fmt.Errorf("invalid source locale: %s", mc.sourceLanguageTag) } marshal, err := newMarshalFunc(mc.format) if err != nil { return err } bundle := bundle.New() for _, tf := range mc.translationFiles { if err := bundle.LoadTranslationFile(tf); err != nil { return fmt.Errorf("failed to load translation file %s because %s\n", tf, err) } } translations := bundle.Translations() sourceLanguageTag := language.NormalizeTag(mc.sourceLanguageTag) sourceTranslations := translations[sourceLanguageTag] if sourceTranslations == nil { return fmt.Errorf("no translations found for source locale %s", sourceLanguageTag) } for translationID, src := range sourceTranslations { for _, localeTranslations := range translations { if dst := localeTranslations[translationID]; dst == nil || reflect.TypeOf(src) != reflect.TypeOf(dst) { localeTranslations[translationID] = src.UntranslatedCopy() } } } for localeID, localeTranslations := range translations { lang := language.MustParse(localeID)[0] all := filter(localeTranslations, func(t translation.Translation) translation.Translation { return t.Normalize(lang) }) if err := mc.writeFile("all", all, localeID, marshal); err != nil { return err } untranslated := filter(localeTranslations, func(t translation.Translation) translation.Translation { if t.Incomplete(lang) { return t.Normalize(lang).Backfill(sourceTranslations[t.ID()]) } return nil }) if err := mc.writeFile("untranslated", untranslated, localeID, marshal); err != nil { return err } } return nil }
func (b *Bundle) translatedLanguage(src string) *language.Language { langs := language.Parse(src) for _, lang := range langs { if len(b.translations[lang.Tag]) > 0 || len(b.fallbackTranslations[lang.Tag]) > 0 { return lang } } return nil }
// ParseTranslationFileBytes is similar to LoadTranslationFile except it parses the bytes in buf. // // It is useful for parsing translation files embedded with go-bindata. func (b *Bundle) ParseTranslationFileBytes(filename string, buf []byte) error { basename := filepath.Base(filename) langs := language.Parse(basename) switch l := len(langs); { case l == 0: return fmt.Errorf("no language found in %q", basename) case l > 1: return fmt.Errorf("multiple languages found in filename %q: %v; expected one", basename, langs) } translations, err := parseTranslations(filename, buf) if err != nil { return err } b.AddTranslation(langs[0], translations...) return nil }