I decided to rewrite the program taking into account the experience gained.
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package setting
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fyne.io/fyne/v2"
|
|
fyneLang "fyne.io/fyne/v2/lang"
|
|
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/resources"
|
|
)
|
|
|
|
var supportedLanguages = map[string]Lang{
|
|
"ru": {Code: "ru", Title: "Русский"},
|
|
"kk": {Code: "kk", Title: "Қазақ Тілі"},
|
|
"en": {Code: "en", Title: "English"},
|
|
}
|
|
|
|
type Lang struct {
|
|
Code string
|
|
Title string
|
|
}
|
|
|
|
func ChangeLang(lang Lang) error {
|
|
translationsData, err := getTranslations(lang)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
name := fyneLang.SystemLocale().LanguageString()
|
|
return fyneLang.AddTranslations(fyne.NewStaticResource(name+".json", translationsData))
|
|
}
|
|
|
|
func defaultLang() Lang {
|
|
return supportedLanguages["ru"]
|
|
}
|
|
|
|
func getTranslations(language Lang) ([]byte, error) {
|
|
translations := resources.GetTranslations()
|
|
|
|
baseJson, err := translations.ReadFile("translations/base." + language.Code + ".json")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
appJson, err := translations.ReadFile("translations/app." + language.Code + ".json")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return mergeTranslations(baseJson, appJson)
|
|
}
|
|
|
|
func mergeTranslations(baseJson []byte, appJson []byte) ([]byte, error) {
|
|
base := map[string]interface{}{}
|
|
custom := map[string]interface{}{}
|
|
err := json.Unmarshal(baseJson, &base)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = json.Unmarshal(appJson, &custom)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for k, v := range custom {
|
|
base[k] = v
|
|
}
|
|
return json.Marshal(base)
|
|
}
|