translator.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package i18n
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. /* NewTranslator creates closure data map and returns translation functions */
  7. func NewTranslator(data map[string]map[string]string, defaultLang string) (func(string, string, ...any) string, func(string, string, ...any) error) {
  8. /* initialize map and copy data */
  9. translationMap := make(map[string]map[string]string, len(data))
  10. for lang, translation := range data {
  11. translationMap[lang] = make(map[string]string, len(translation))
  12. for key, value := range translation {
  13. translationMap[lang][key] = value
  14. }
  15. }
  16. /* T translates and returns localized string */
  17. T := func(lang string, key string, args ...any) string {
  18. /* attempt direct translation */
  19. if l, ok := translationMap[lang]; ok {
  20. if tr, ok := l[key]; ok {
  21. if len(args) == 0 {
  22. return tr
  23. }
  24. return fmt.Sprintf(tr, args...)
  25. }
  26. }
  27. /* fall back to default language */
  28. if l, ok := translationMap[defaultLang]; ok {
  29. if tr, ok := l[key]; ok {
  30. if len(args) == 0 {
  31. return tr
  32. }
  33. return fmt.Sprintf(tr, args...)
  34. }
  35. }
  36. /* no localized text, return key */
  37. return key
  38. }
  39. /* Terr translates localized string and returns it into error */
  40. Terr := func(lang string, key string, args ...any) error {
  41. return errors.New(T(lang, key, args...))
  42. }
  43. /* return functions */
  44. return T, Terr
  45. }