catalog.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package locale // import "miniflux.app/v2/internal/locale"
  4. import (
  5. "embed"
  6. "encoding/json"
  7. "fmt"
  8. )
  9. type translationDict map[string]any
  10. type catalog map[string]translationDict
  11. var defaultCatalog = make(catalog, len(AvailableLanguages))
  12. //go:embed translations/*.json
  13. var translationFiles embed.FS
  14. func getTranslationDict(language string) (translationDict, error) {
  15. if _, ok := defaultCatalog[language]; !ok {
  16. var err error
  17. if defaultCatalog[language], err = loadTranslationFile(language); err != nil {
  18. return nil, err
  19. }
  20. }
  21. return defaultCatalog[language], nil
  22. }
  23. // LoadCatalogMessages loads and parses all translations encoded in JSON.
  24. func LoadCatalogMessages() error {
  25. var err error
  26. for language := range AvailableLanguages {
  27. defaultCatalog[language], err = loadTranslationFile(language)
  28. if err != nil {
  29. return err
  30. }
  31. }
  32. return nil
  33. }
  34. func loadTranslationFile(language string) (translationDict, error) {
  35. translationFileData, err := translationFiles.ReadFile(fmt.Sprintf("translations/%s.json", language))
  36. if err != nil {
  37. return nil, err
  38. }
  39. translationMessages, err := parseTranslationMessages(translationFileData)
  40. if err != nil {
  41. return nil, err
  42. }
  43. return translationMessages, nil
  44. }
  45. func parseTranslationMessages(data []byte) (translationDict, error) {
  46. var translationMessages translationDict
  47. if err := json.Unmarshal(data, &translationMessages); err != nil {
  48. return nil, fmt.Errorf(`invalid translation file: %w`, err)
  49. }
  50. return translationMessages, nil
  51. }