Refactor localization system and migrate to Fyne's built-in support

Replaced the `i18n` and `toml` dependencies with Fyne's built-in language system for localization management. Updated the `Localizer` implementation to handle translations using JSON files and embed functionality. Simplified language selection and persisted settings via Fyne's preferences API.
This commit is contained in:
2025-06-01 15:20:33 +05:00
parent d69767f5e9
commit 3241b88158
40 changed files with 917 additions and 1869 deletions

View File

@@ -7,7 +7,6 @@ import (
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
"github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/image/colornames"
"net/url"
)
@@ -29,9 +28,7 @@ func NewView(app kernel.AppContract) *View {
}
func (v View) Gratitude() {
view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "gratitude",
}))
view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage("gratitude"))
view.Resize(fyne.Size{Width: 500, Height: 400})
view.SetFixedSize(true)
@@ -39,9 +36,7 @@ func (v View) Gratitude() {
image.SetMinSize(fyne.Size{Width: 100, Height: 100})
image.FillMode = canvas.ImageFillContain
gratitude := canvas.NewText(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "gratitude",
}), colornames.Darkgreen)
gratitude := canvas.NewText(v.app.GetLocalizerService().GetMessage("gratitude"), colornames.Darkgreen)
gratitude.TextStyle = fyne.TextStyle{Bold: true}
gratitude.TextSize = 20
@@ -49,13 +44,11 @@ func (v View) Gratitude() {
container.NewScroll(container.NewVBox(
container.NewBorder(nil, nil, container.NewVBox(image), nil, container.NewVBox(
gratitude,
widget.NewLabel(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "gratitudeText",
})),
widget.NewLabel(v.app.GetLocalizerService().GetMessage("gratitudeText")),
widget.NewLabel("Екатерина"),
widget.NewLabel("Евгений"),
),
))),
)),
)),
)
view.CenterOnScreen()
@@ -63,9 +56,7 @@ func (v View) Gratitude() {
}
func (v View) About(ffmpegVersion string, ffprobeVersion string, ffplayVersion string) {
view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "about",
}))
view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage("about"))
view.Resize(fyne.Size{Width: 793, Height: 550})
view.SetFixedSize(true)
@@ -73,54 +64,51 @@ func (v View) About(ffmpegVersion string, ffprobeVersion string, ffplayVersion s
programmName.TextStyle = fyne.TextStyle{Bold: true}
programmName.TextSize = 20
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "programmLink",
}), &url.URL{
Scheme: "https",
Host: "gui-for-ffmpeg.projects.kor-elf.net",
Path: "/",
})
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "licenseLink",
}), &url.URL{
Scheme: "https",
Host: "git.kor-elf.net",
Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE",
})
licenseLinkOther := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "licenseLinkOther",
}), &url.URL{
Scheme: "https",
Host: "git.kor-elf.net",
Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE-3RD-PARTY.txt",
})
programmVersion := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "programmVersion",
TemplateData: map[string]string{
"Version": v.app.GetAppFyne().Metadata().Version,
programmLink := widget.NewHyperlink(
v.app.GetLocalizerService().GetMessage("programmLink"),
&url.URL{
Scheme: "https",
Host: "gui-for-ffmpeg.projects.kor-elf.net",
Path: "/",
},
}))
)
licenseLink := widget.NewHyperlink(
v.app.GetLocalizerService().GetMessage("licenseLink"),
&url.URL{
Scheme: "https",
Host: "git.kor-elf.net",
Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE",
},
)
licenseLinkOther := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(
"licenseLinkOther"),
&url.URL{
Scheme: "https",
Host: "git.kor-elf.net",
Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE-3RD-PARTY.txt",
},
)
programmVersion := widget.NewRichTextFromMarkdown(
v.app.GetLocalizerService().GetMessage(
"programmVersion",
map[string]any{"Version": v.app.GetAppFyne().Metadata().Version},
),
)
aboutText := widget.NewRichText(
&widget.TextSegment{
Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "aboutText",
}),
Text: v.app.GetLocalizerService().GetMessage("aboutText"),
},
)
image := canvas.NewImageFromFile("icon.png")
image.SetMinSize(fyne.Size{Width: 100, Height: 100})
image.FillMode = canvas.ImageFillContain
ffmpegTrademark := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "ffmpegTrademark",
}))
ffmpegLGPL := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "ffmpegLGPL",
}))
ffmpegTrademark := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage("ffmpegTrademark"))
ffmpegLGPL := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage("ffmpegLGPL"))
view.SetContent(
container.NewScroll(container.NewVBox(
@@ -137,9 +125,7 @@ func (v View) About(ffmpegVersion string, ffprobeVersion string, ffplayVersion s
v.getAboutFfmpeg(ffmpegVersion),
v.getAboutFfprobe(ffprobeVersion),
v.getAboutFfplay(ffplayVersion),
widget.NewCard(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "AlsoUsedProgram",
}), "", v.getOther()),
widget.NewCard(v.app.GetLocalizerService().GetMessage("AlsoUsedProgram"), "", v.getOther()),
)),
)
view.CenterOnScreen()
@@ -147,119 +133,71 @@ func (v View) About(ffmpegVersion string, ffprobeVersion string, ffplayVersion s
}
func (v View) HelpFFplay() {
view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplay",
}))
view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage("helpFFplay"))
view.Resize(fyne.Size{Width: 800, Height: 550})
view.SetFixedSize(true)
data := [][]string{
[]string{
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeys",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayDescription",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayKeys"),
v.app.GetLocalizerService().GetMessage("helpFFplayDescription"),
},
[]string{
"Q, ESC",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayQuit",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayQuit"),
},
[]string{
"F, " + v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayDoubleClickLeftMouseButton",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayToggleFullScreen",
}),
"F, " + v.app.GetLocalizerService().GetMessage("helpFFplayDoubleClickLeftMouseButton"),
v.app.GetLocalizerService().GetMessage("helpFFplayToggleFullScreen"),
},
[]string{
"P, " +
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeySpace",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayPause",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayKeySpace"),
v.app.GetLocalizerService().GetMessage("helpFFplayPause"),
},
[]string{
"M",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayToggleMute",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayToggleMute"),
},
[]string{
"9, /",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayDecreaseVolume",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayDecreaseVolume"),
},
[]string{
"0, *",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayIncreaseVolume",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayIncreaseVolume"),
},
[]string{
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeyLeft",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplaySeekBackward10Seconds",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayKeyLeft"),
v.app.GetLocalizerService().GetMessage("helpFFplaySeekBackward10Seconds"),
},
[]string{
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeyRight",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplaySeekForward10Seconds",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayKeyRight"),
v.app.GetLocalizerService().GetMessage("helpFFplaySeekForward10Seconds"),
},
[]string{
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeyDown",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplaySeekBackward1Minute",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayKeyDown"),
v.app.GetLocalizerService().GetMessage("helpFFplaySeekBackward1Minute"),
},
[]string{
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeyUp",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplaySeekBForward1Minute",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayKeyUp"),
v.app.GetLocalizerService().GetMessage("helpFFplaySeekBForward1Minute"),
},
[]string{
"Page Down",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplaySeekBackward10Minutes",
}),
v.app.GetLocalizerService().GetMessage("helpFFplaySeekBackward10Minutes"),
},
[]string{
"Page Up",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplaySeekBForward10Minutes",
}),
v.app.GetLocalizerService().GetMessage("helpFFplaySeekBForward10Minutes"),
},
[]string{
"S, " + v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayKeyHoldS",
}),
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayActivateFrameStepMode",
}),
"S, " + v.app.GetLocalizerService().GetMessage("helpFFplayKeyHoldS"),
v.app.GetLocalizerService().GetMessage("helpFFplayActivateFrameStepMode"),
},
[]string{
"W",
v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "helpFFplayCycleVideoFiltersOrShowModes",
}),
v.app.GetLocalizerService().GetMessage("helpFFplayCycleVideoFiltersOrShowModes"),
},
}
@@ -300,17 +238,13 @@ func (v View) getAboutFfmpeg(version string) *fyne.Container {
programmName.TextStyle = fyne.TextStyle{Bold: true}
programmName.TextSize = 20
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "programmLink",
}), &url.URL{
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("programmLink"), &url.URL{
Scheme: "https",
Host: "ffmpeg.org",
Path: "",
})
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "licenseLink",
}), &url.URL{
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("licenseLink"), &url.URL{
Scheme: "https",
Host: "ffmpeg.org",
Path: "legal.html",
@@ -330,17 +264,13 @@ func (v View) getAboutFfprobe(version string) *fyne.Container {
programmName.TextStyle = fyne.TextStyle{Bold: true}
programmName.TextSize = 20
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "programmLink",
}), &url.URL{
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("programmLink"), &url.URL{
Scheme: "https",
Host: "ffmpeg.org",
Path: "ffprobe.html",
})
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "licenseLink",
}), &url.URL{
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("licenseLink"), &url.URL{
Scheme: "https",
Host: "ffmpeg.org",
Path: "legal.html",
@@ -360,17 +290,13 @@ func (v View) getAboutFfplay(version string) *fyne.Container {
programmName.TextStyle = fyne.TextStyle{Bold: true}
programmName.TextSize = 20
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "programmLink",
}), &url.URL{
programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("programmLink"), &url.URL{
Scheme: "https",
Host: "ffmpeg.org",
Path: "ffplay.html",
})
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "licenseLink",
}), &url.URL{
licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("licenseLink"), &url.URL{
Scheme: "https",
Host: "ffmpeg.org",
Path: "legal.html",

View File

@@ -6,7 +6,6 @@ import (
"fyne.io/fyne/v2/widget"
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/theme"
"github.com/nicksnyder/go-i18n/v2/i18n"
"image/color"
)
@@ -40,7 +39,7 @@ func (v ViewSetting) Main(save func(*SettingForm) error, cancel func()) {
errorMessage.TextStyle = fyne.TextStyle{Bold: true}
viewSettingForm := &SettingForm{
Language: v.app.GetLocalizerService().GetCurrentLanguage().Lang,
Language: v.app.GetLocalizerService().GetCurrentLanguage(),
ThemeInfo: v.themeService.GetCurrentThemeInfo(),
}
@@ -55,7 +54,7 @@ func (v ViewSetting) Main(save func(*SettingForm) error, cancel func()) {
viewSettingForm.Language = lang
}
})
selectLanguage.Selected = v.app.GetLocalizerService().GetCurrentLanguage().Lang.Title
selectLanguage.Selected = v.app.GetLocalizerService().GetCurrentLanguage().Title
themeItems := []string{}
themeByTitle := map[string]theme.ThemeInfoContract{}
@@ -73,24 +72,18 @@ func (v ViewSetting) Main(save func(*SettingForm) error, cancel func()) {
form := &widget.Form{
Items: []*widget.FormItem{
{
Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "menuSettingsLanguage",
}),
Text: v.app.GetLocalizerService().GetMessage("menuSettingsLanguage"),
Widget: selectLanguage,
},
{
Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "menuSettingsTheme",
}),
Text: v.app.GetLocalizerService().GetMessage("menuSettingsTheme"),
Widget: selectTheme,
},
{
Widget: errorMessage,
},
},
SubmitText: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "save",
}),
SubmitText: v.app.GetLocalizerService().GetMessage("save"),
OnSubmit: func() {
err := save(viewSettingForm)
if err != nil {
@@ -100,13 +93,9 @@ func (v ViewSetting) Main(save func(*SettingForm) error, cancel func()) {
}
if cancel != nil {
form.OnCancel = cancel
form.CancelText = v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "cancel",
})
form.CancelText = v.app.GetLocalizerService().GetMessage("cancel")
}
messageHead := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "settings",
})
messageHead := v.app.GetLocalizerService().GetMessage("settings")
v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", form))
}