package i18n import ( "errors" "fmt" ) /* NewTranslator creates closure data map and returns translation functions */ func NewTranslator(data map[string]map[string]string, defaultLang string) (func(string, string, ...any) string, func(string, string, ...any) error) { /* initialize map and copy data */ translationMap := make(map[string]map[string]string, len(data)) for lang, translation := range data { translationMap[lang] = make(map[string]string, len(translation)) for key, value := range translation { translationMap[lang][key] = value } } /* T translates and returns localized string */ T := func(lang string, key string, args ...any) string { /* attempt direct translation */ if l, ok := translationMap[lang]; ok { if tr, ok := l[key]; ok { if len(args) == 0 { return tr } return fmt.Sprintf(tr, args...) } } /* fall back to default language */ if l, ok := translationMap[defaultLang]; ok { if tr, ok := l[key]; ok { if len(args) == 0 { return tr } return fmt.Sprintf(tr, args...) } } /* no localized text, return key */ return key } /* Terr translates localized string and returns it into error */ Terr := func(lang string, key string, args ...any) error { return errors.New(T(lang, key, args...)) } /* return functions */ return T, Terr }