Use fs for language, add lang_files option

The local app translations are loaded, and then if [files]/lang_files
is provided (a directory containing custom translations), any found
inside it are loaded over top. This makes customizing much easier.
This commit is contained in:
Harvey Tindall
2021-02-01 17:39:19 +00:00
parent fefe2d82a4
commit 0330540f87
7 changed files with 207 additions and 83 deletions
+25 -15
View File
@@ -2,7 +2,7 @@ package main
import (
"encoding/json"
"os"
"io/fs"
"path/filepath"
"strings"
@@ -70,13 +70,14 @@ func (app *appContext) TestJF(gc *gin.Context) {
gc.JSON(200, map[string]bool{"success": true})
}
func (st *Storage) loadLangSetup() error {
// The first filesystem passed should be the localFS, to ensure the local lang files are loaded first.
func (st *Storage) loadLangSetup(filesystems ...fs.FS) error {
st.lang.Setup = map[string]setupLang{}
var english setupLang
load := func(fname string) error {
load := func(filesystem fs.FS, fname string) error {
index := strings.TrimSuffix(fname, filepath.Ext(fname))
lang := setupLang{}
f, err := os.ReadFile(filepath.Join(st.lang.SetupPath, fname))
f, err := fs.ReadFile(filesystem, filepath.Join(st.lang.SetupPath, fname))
if err != nil {
return err
}
@@ -107,20 +108,29 @@ func (st *Storage) loadLangSetup() error {
st.lang.Setup[index] = lang
return nil
}
err := load("en-us.json")
if err != nil {
engFound := false
var err error
for _, filesystem := range filesystems {
err = load(filesystem, "en-us.json")
if err == nil {
engFound = true
}
}
if !engFound {
return err
}
english = st.lang.Setup["en-us"]
files, err := os.ReadDir(st.lang.SetupPath)
if err != nil {
return err
}
for _, f := range files {
if f.Name() != "en-us.json" {
err = load(f.Name())
if err != nil {
return err
for _, filesystem := range filesystems {
files, err := fs.ReadDir(filesystem, st.lang.SetupPath)
if err != nil {
return err
}
for _, f := range files {
if f.Name() != "en-us.json" {
err = load(filesystem, f.Name())
if err != nil {
return err
}
}
}
}