quintodrome/server/nativeapi/translations.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

124 lines
2.9 KiB
Go
Raw Normal View History

2021-06-13 15:15:41 -08:00
package nativeapi
2020-05-01 14:29:50 -08:00
import (
"bytes"
2020-05-01 14:29:50 -08:00
"context"
"encoding/json"
"io"
2021-07-20 15:50:00 -08:00
"io/fs"
2021-10-27 18:45:34 -08:00
"path"
2020-05-01 14:29:50 -08:00
"strings"
"sync"
"github.com/deluan/rest"
"github.com/navidrome/navidrome/consts"
2020-05-01 14:29:50 -08:00
"github.com/navidrome/navidrome/log"
"github.com/navidrome/navidrome/resources"
)
type translation struct {
ID string `json:"id"`
Name string `json:"name"`
Data string `json:"data"`
}
func newTranslationRepository(context.Context) rest.Repository {
2020-05-01 14:29:50 -08:00
return &translationRepository{}
}
type translationRepository struct{}
2026-02-08 05:57:30 -09:00
func (r *translationRepository) Read(id string) (any, error) {
translations, _ := loadTranslations()
2020-05-01 14:29:50 -08:00
if t, ok := translations[id]; ok {
return t, nil
}
return nil, rest.ErrNotFound
}
// Count simple implementation, does not support any `options`
func (r *translationRepository) Count(...rest.QueryOptions) (int64, error) {
_, count := loadTranslations()
return count, nil
2020-05-01 14:29:50 -08:00
}
// ReadAll simple implementation, only returns IDs. Does not support any `options`
2026-02-08 05:57:30 -09:00
func (r *translationRepository) ReadAll(...rest.QueryOptions) (any, error) {
translations, _ := loadTranslations()
2020-05-01 14:29:50 -08:00
var result []translation
for _, t := range translations {
t.Data = ""
result = append(result, t)
}
return result, nil
}
func (r *translationRepository) EntityName() string {
return "translation"
}
2026-02-08 05:57:30 -09:00
func (r *translationRepository) NewInstance() any {
2020-05-01 14:29:50 -08:00
return &translation{}
}
var loadTranslations = sync.OnceValues(func() (map[string]translation, int64) {
translations := make(map[string]translation)
fsys := resources.FS()
dir, err := fsys.Open(consts.I18nFolder)
if err != nil {
log.Error("Error opening translation folder", err)
return translations, 0
}
files, err := dir.(fs.ReadDirFile).ReadDir(-1)
if err != nil {
log.Error("Error reading translation folder", err)
return translations, 0
}
var languages []string
for _, f := range files {
t, err := loadTranslation(fsys, f.Name())
2020-05-01 14:29:50 -08:00
if err != nil {
log.Error("Error loading translation file", "file", f.Name(), err)
continue
2020-05-01 14:29:50 -08:00
}
translations[t.ID] = t
languages = append(languages, t.ID)
}
log.Info("Loaded translations", "languages", languages)
return translations, int64(len(translations))
})
2020-05-01 14:29:50 -08:00
2021-07-20 15:50:00 -08:00
func loadTranslation(fsys fs.FS, fileName string) (translation translation, err error) {
// Get id and full path
2021-10-27 18:45:34 -08:00
name := path.Base(fileName)
id := strings.TrimSuffix(name, path.Ext(name))
filePath := path.Join(consts.I18nFolder, name)
// Load translation from json file
2021-07-20 15:50:00 -08:00
file, err := fsys.Open(filePath)
2020-05-01 14:29:50 -08:00
if err != nil {
return
}
data, err := io.ReadAll(file)
2020-05-04 16:46:16 -08:00
if err != nil {
return
}
2026-02-08 05:57:30 -09:00
var out map[string]any
if err = json.Unmarshal(data, &out); err != nil {
return
}
// Compress JSON
buf := new(bytes.Buffer)
if err = json.Compact(buf, data); err != nil {
2020-05-01 14:29:50 -08:00
return
}
translation.Data = buf.String()
translation.Name = out["languageName"].(string)
translation.ID = id
2020-05-01 14:29:50 -08:00
return
}
var _ rest.Repository = (*translationRepository)(nil)