Refactor application structure and initialize core components

I decided to rewrite the program taking into account the experience gained.
This commit is contained in:
2025-06-06 14:50:16 +05:00
parent 43d794373a
commit b24155caf6
24 changed files with 1295 additions and 63 deletions

View File

@@ -0,0 +1,25 @@
package setting
func (s *setting) GetFFmpegPath() string {
return s.fyneApp.Preferences().String("ffmpegPath")
}
func (s *setting) SetFFmpegPath(path string) {
s.fyneApp.Preferences().SetString("ffmpegPath", path)
}
func (s *setting) GetFFprobePath() string {
return s.fyneApp.Preferences().String("ffprobePath")
}
func (s *setting) SetFFprobePath(path string) {
s.fyneApp.Preferences().SetString("ffprobePath", path)
}
func (s *setting) GetFFplayPath() string {
return s.fyneApp.Preferences().String("ffplayPath")
}
func (s *setting) SetFFplayPath(path string) {
s.fyneApp.Preferences().SetString("ffplayPath", path)
}

View File

@@ -0,0 +1,66 @@
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)
}

View File

@@ -0,0 +1,65 @@
package setting
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/lang"
"golang.org/x/text/language"
)
type SettingContract interface {
GetLanguages() []Lang
GetCurrentLangOrDefaultLang() (currentLang Lang, isDefault bool)
SetLang(language Lang) error
GetFFmpegPath() string
SetFFmpegPath(path string)
GetFFprobePath() string
SetFFprobePath(path string)
GetFFplayPath() string
SetFFplayPath(path string)
}
type setting struct {
fyneApp fyne.App
}
func NewSetting(fyneApp fyne.App) SettingContract {
return &setting{
fyneApp: fyneApp,
}
}
func (s *setting) GetLanguages() []Lang {
items := []Lang{}
for _, item := range supportedLanguages {
items = append(items, item)
}
return items
}
func (s *setting) GetCurrentLangOrDefaultLang() (currentLang Lang, isDefault bool) {
languageCode := s.fyneApp.Preferences().String("language")
if languageCode == "" {
languageTag, err := language.Parse(lang.SystemLocale().LanguageString())
if err != nil {
return currentLang, true
}
base, _ := languageTag.Base()
languageCode = base.String()
}
if currentLang, ok := supportedLanguages[languageCode]; ok {
return currentLang, false
}
return defaultLang(), true
}
func (s *setting) SetLang(language Lang) error {
err := ChangeLang(language)
if err != nil {
return err
}
s.fyneApp.Preferences().SetString("language", language.Code)
return nil
}