| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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
- }
|