catalog.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Copyright 2018 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package locale // import "miniflux.app/locale"
  5. import (
  6. "embed"
  7. "encoding/json"
  8. "fmt"
  9. )
  10. type translationDict map[string]interface{}
  11. type catalog map[string]translationDict
  12. var defaultCatalog catalog
  13. //go:embed translations/*.json
  14. var translationFiles embed.FS
  15. // LoadCatalogMessages loads and parses all translations encoded in JSON.
  16. func LoadCatalogMessages() error {
  17. var err error
  18. defaultCatalog = make(catalog)
  19. for language := range AvailableLanguages() {
  20. defaultCatalog[language], err = loadTranslationFile(language)
  21. if err != nil {
  22. return err
  23. }
  24. }
  25. return nil
  26. }
  27. func loadTranslationFile(language string) (translationDict, error) {
  28. translationFileData, err := translationFiles.ReadFile(fmt.Sprintf("translations/%s.json", language))
  29. if err != nil {
  30. return nil, err
  31. }
  32. translationMessages, err := parseTranslationMessages(translationFileData)
  33. if err != nil {
  34. return nil, err
  35. }
  36. return translationMessages, nil
  37. }
  38. func parseTranslationMessages(data []byte) (translationDict, error) {
  39. var translationMessages translationDict
  40. if err := json.Unmarshal(data, &translationMessages); err != nil {
  41. return nil, fmt.Errorf(`invalid translation file: %w`, err)
  42. }
  43. return translationMessages, nil
  44. }