func (mc *mergeCommand) execute() error { if len(mc.translationFiles) < 1 { return fmt.Errorf("need at least one translation file to parse") } if _, err := locale.New(mc.sourceLocaleID); err != nil { return fmt.Errorf("invalid source locale %s: %s", mc.sourceLocaleID, err) } 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() sourceTranslations := translations[mc.sourceLocaleID] 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 { locale := locale.MustNew(localeID) all := filter(localeTranslations, func(t translation.Translation) translation.Translation { return t.Normalize(locale.Language) }) if err := mc.writeFile("all", all, localeID, marshal); err != nil { return err } untranslated := filter(localeTranslations, func(t translation.Translation) translation.Translation { if t.Incomplete(locale.Language) { return t.Normalize(locale.Language).Backfill(sourceTranslations[t.ID()]) } return nil }) if err := mc.writeFile("untranslated", untranslated, localeID, marshal); err != nil { return err } } return nil }
// If translationID is a plural form, then the first variadic argument must be an integer type // (int, int8, int16, int32, int64) or a float formatted as a string (e.g. "123.45"). // The second variadic argument may be a map[string]interface{} that contains template data. type TranslateFunc func(translationID string, args ...interface{}) string // IdentityTfunc returns a TranslateFunc that always returns the translationID passed to it. // // It is a useful placeholder when parsing a text/template or html/template // before the actual Tfunc is available. func IdentityTfunc() TranslateFunc { return func(translationID string, args ...interface{}) string { return translationID } } var defaultBundle = bundle.New() // MustLoadTranslationFile is similar to LoadTranslationFile // except it panics if an error happens. func MustLoadTranslationFile(filename string) { defaultBundle.MustLoadTranslationFile(filename) } // LoadTranslationFile loads the translations from filename into memory. // // The locale that the translations are associated with is parsed from the filename. // // Generally you should load translation files once during your program's initialization. func LoadTranslationFile(filename string) error { return defaultBundle.LoadTranslationFile(filename) }