Added queues.
Reworked the architecture.
This commit is contained in:
@@ -1,138 +0,0 @@
|
||||
package localizer
|
||||
|
||||
import (
|
||||
"github.com/BurntSushi/toml"
|
||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||
"golang.org/x/text/cases"
|
||||
"golang.org/x/text/language"
|
||||
"golang.org/x/text/language/display"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
)
|
||||
|
||||
type ServiceContract interface {
|
||||
GetLanguages() []Lang
|
||||
GetMessage(localizeConfig *i18n.LocalizeConfig) string
|
||||
SetCurrentLanguage(lang Lang) error
|
||||
SetCurrentLanguageByCode(code string) error
|
||||
GetCurrentLanguage() *CurrentLanguage
|
||||
}
|
||||
|
||||
type Lang struct {
|
||||
Code string
|
||||
Title string
|
||||
}
|
||||
|
||||
type CurrentLanguage struct {
|
||||
Lang Lang
|
||||
localizer *i18n.Localizer
|
||||
localizerDefault *i18n.Localizer
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
bundle *i18n.Bundle
|
||||
languages []Lang
|
||||
currentLanguage *CurrentLanguage
|
||||
}
|
||||
|
||||
func NewService(directory string, languageDefault language.Tag) (*Service, error) {
|
||||
bundle := i18n.NewBundle(languageDefault)
|
||||
bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
|
||||
|
||||
languages, err := initLanguages(directory, bundle)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localizerDefault := i18n.NewLocalizer(bundle, languageDefault.String())
|
||||
|
||||
return &Service{
|
||||
bundle: bundle,
|
||||
languages: languages,
|
||||
currentLanguage: &CurrentLanguage{
|
||||
Lang: Lang{
|
||||
Code: languageDefault.String(),
|
||||
Title: cases.Title(languageDefault).String(display.Self.Name(languageDefault)),
|
||||
},
|
||||
localizer: localizerDefault,
|
||||
localizerDefault: localizerDefault,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func initLanguages(directory string, bundle *i18n.Bundle) ([]Lang, error) {
|
||||
var languages []Lang
|
||||
|
||||
files, err := filepath.Glob(directory + "/active.*.toml")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, file := range files {
|
||||
lang, err := bundle.LoadMessageFile(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
title := cases.Title(lang.Tag).String(display.Self.Name(lang.Tag))
|
||||
languages = append(languages, Lang{Code: lang.Tag.String(), Title: title})
|
||||
}
|
||||
|
||||
sort.Sort(languagesSort(languages))
|
||||
|
||||
return languages, nil
|
||||
}
|
||||
|
||||
func (s Service) GetLanguages() []Lang {
|
||||
return s.languages
|
||||
}
|
||||
|
||||
func (s Service) GetMessage(localizeConfig *i18n.LocalizeConfig) string {
|
||||
message, err := s.GetCurrentLanguage().localizer.Localize(localizeConfig)
|
||||
if err != nil {
|
||||
message, err = s.GetCurrentLanguage().localizerDefault.Localize(localizeConfig)
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
func (s Service) SetCurrentLanguage(lang Lang) error {
|
||||
s.currentLanguage.Lang = lang
|
||||
s.currentLanguage.localizer = i18n.NewLocalizer(s.bundle, lang.Code)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Service) SetCurrentLanguageByCode(code string) error {
|
||||
lang, err := language.Parse(code)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
title := cases.Title(lang).String(display.Self.Name(lang))
|
||||
return s.SetCurrentLanguage(Lang{Code: lang.String(), Title: title})
|
||||
}
|
||||
|
||||
func (s Service) GetCurrentLanguage() *CurrentLanguage {
|
||||
return s.currentLanguage
|
||||
}
|
||||
|
||||
type languagesSort []Lang
|
||||
|
||||
func (l languagesSort) Len() int { return len(l) }
|
||||
func (l languagesSort) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
||||
func (l languagesSort) Less(i, j int) bool {
|
||||
return languagePriority(l[i]) < languagePriority(l[j])
|
||||
}
|
||||
func languagePriority(l Lang) int {
|
||||
priority := 0
|
||||
|
||||
switch l.Code {
|
||||
case "ru":
|
||||
priority = -3
|
||||
case "kk":
|
||||
priority = -2
|
||||
case "en":
|
||||
priority = -1
|
||||
}
|
||||
|
||||
return priority
|
||||
}
|
@@ -3,27 +3,26 @@ package localizer
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||
)
|
||||
|
||||
type ViewContract interface {
|
||||
LanguageSelection(funcSelected func(lang Lang))
|
||||
LanguageSelection(funcSelected func(lang kernel.Lang))
|
||||
}
|
||||
|
||||
type View struct {
|
||||
w fyne.Window
|
||||
localizerService ServiceContract
|
||||
app kernel.AppContract
|
||||
}
|
||||
|
||||
func NewView(w fyne.Window, localizerService ServiceContract) *View {
|
||||
func NewView(app kernel.AppContract) *View {
|
||||
return &View{
|
||||
w: w,
|
||||
localizerService: localizerService,
|
||||
app: app,
|
||||
}
|
||||
}
|
||||
|
||||
func (v View) LanguageSelection(funcSelected func(lang Lang)) {
|
||||
languages := v.localizerService.GetLanguages()
|
||||
func (v View) LanguageSelection(funcSelected func(lang kernel.Lang)) {
|
||||
languages := v.app.GetLocalizerService().GetLanguages()
|
||||
listView := widget.NewList(
|
||||
func() int {
|
||||
return len(languages)
|
||||
@@ -36,18 +35,17 @@ func (v View) LanguageSelection(funcSelected func(lang Lang)) {
|
||||
block.SetText(languages[i].Title)
|
||||
})
|
||||
listView.OnSelected = func(id widget.ListItemID) {
|
||||
_ = v.localizerService.SetCurrentLanguage(languages[id])
|
||||
_ = v.app.GetLocalizerService().SetCurrentLanguage(languages[id])
|
||||
funcSelected(languages[id])
|
||||
}
|
||||
|
||||
messageHead := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||
messageHead := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
|
||||
MessageID: "languageSelectionHead",
|
||||
})
|
||||
|
||||
v.w.SetContent(widget.NewCard(messageHead, "", listView))
|
||||
v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", listView))
|
||||
}
|
||||
|
||||
func LanguageSelectionForm(localizerService ServiceContract, funcSelected func(lang Lang)) fyne.CanvasObject {
|
||||
func LanguageSelectionForm(localizerService kernel.LocalizerContract, funcSelected func(lang kernel.Lang)) fyne.CanvasObject {
|
||||
languages := localizerService.GetLanguages()
|
||||
currentLanguage := localizerService.GetCurrentLanguage()
|
||||
listView := widget.NewList(
|
||||
|
Reference in New Issue
Block a user