From 3241b8815810bb7082fbd24452f7114cd1dc761f Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Sun, 1 Jun 2025 15:20:33 +0500 Subject: [PATCH] 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. --- README.md | 12 - convertor/view.go | 5 +- convertor/view/conversion.go | 59 +- convertor/view/form_items/h264_nvenc/view.go | 5 +- convertor/view/form_items/libx264/view.go | 7 +- convertor/view/form_items/libx265/view.go | 7 +- convertor/view_setting.go | 33 +- ...ew_setting_button_download_ffmpeg_linux.go | 13 +- ..._setting_button_download_ffmpeg_windows.go | 13 +- error/view.go | 17 +- go.mod | 6 +- handler/convertor.go | 13 +- handler/convertor_linux.go | 17 +- handler/convertor_windows.go | 17 +- handler/main.go | 28 +- handler/menu.go | 76 +-- images/screenshot-folder-structure.png | Bin 6871 -> 5891 bytes kernel/app.go | 7 +- kernel/error.go | 5 +- kernel/items_to_convert.go | 23 +- kernel/layout.go | 7 +- kernel/localizer.go | 246 ++++---- kernel/progressbar.go | 17 +- kernel/right_tabs.go | 5 +- kernel/translations/app.en.json | 143 +++++ kernel/translations/app.kk.json | 143 +++++ kernel/translations/app.ru.json | 143 +++++ kernel/translations/base.en.json | 45 ++ kernel/translations/base.kk.json | 45 ++ kernel/translations/base.ru.json | 45 ++ languages/.gitignore | 1 - languages/active.en.toml | 563 ------------------ languages/active.kk.toml | 563 ------------------ languages/active.ru.toml | 141 ----- localizer/repository.go | 26 - localizer/view.go | 15 +- main.go | 13 +- menu/view.go | 218 +++---- menu/view_setting.go | 25 +- theme/theme.go | 19 +- 40 files changed, 917 insertions(+), 1869 deletions(-) create mode 100644 kernel/translations/app.en.json create mode 100644 kernel/translations/app.kk.json create mode 100644 kernel/translations/app.ru.json create mode 100644 kernel/translations/base.en.json create mode 100644 kernel/translations/base.kk.json create mode 100644 kernel/translations/base.ru.json delete mode 100644 languages/.gitignore delete mode 100644 languages/active.en.toml delete mode 100644 languages/active.kk.toml delete mode 100644 languages/active.ru.toml delete mode 100644 localizer/repository.go diff --git a/README.md b/README.md index 1d3cc54..38031b4 100644 --- a/README.md +++ b/README.md @@ -26,19 +26,7 @@ 7. Создаться папка **fyne-cross/bin** и там будет созданна папка с тем названием под которую Вы компилировали приложения (linux-amd64 или windows-amd64). 8. В папку **fyne-cross/bin/linux-amd64** или **fyne-cross/bin/windows-amd64** копируете: * icon.png - * languages * LICENSE * LICENSE-3RD-PARTY.txt

Структура должна получиться такая:

- -## Работа с переводами: -1. go install -v github.com/nicksnyder/go-i18n/v2/goi18n@latest -3. Создаём файл languages/translate.\*.toml -4. goi18n merge -sourceLanguage ru -outdir languages languages/active.\*.toml languages/translate.\*.toml -5. В файлах **languages/translate.\*.toml** переводим текст на нужный язык -6. goi18n merge -sourceLanguage ru -outdir languages languages/active.\*.toml languages/translate.\*.toml - -___где * подставляем нужный язык___ - -Более подробно можно почитать тут: https://github.com/nicksnyder/go-i18n \ No newline at end of file diff --git a/convertor/view.go b/convertor/view.go index 58e6a3f..e3dcb14 100644 --- a/convertor/view.go +++ b/convertor/view.go @@ -7,7 +7,6 @@ import ( "fyne.io/fyne/v2/widget" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" ) @@ -45,9 +44,7 @@ func NewView(app kernel.AppContract) *View { } func (v View) Main(formConversion view.ConversionContract) { - converterVideoFilesTitle := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "converterVideoFilesTitle", - }) + converterVideoFilesTitle := v.app.GetLocalizerService().GetMessage("converterVideoFilesTitle") v.app.GetWindow().SetContent(widget.NewCard(converterVideoFilesTitle, "", container.NewVScroll(formConversion.GetContent()))) formConversion.AfterViewContent() } diff --git a/convertor/view/conversion.go b/convertor/view/conversion.go index 7959bd9..1ceeafa 100644 --- a/convertor/view/conversion.go +++ b/convertor/view/conversion.go @@ -12,7 +12,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" - "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" "os" "path/filepath" @@ -54,14 +53,14 @@ func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContr items := []*widget.FormItem{ { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "fileForConversionTitle"}), + Text: app.GetLocalizerService().GetMessage("fileForConversionTitle"), Widget: fileForConversion.button, }, { Widget: container.NewHScroll(fileForConversion.message), }, { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "buttonForSelectedDirTitle"}), + Text: app.GetLocalizerService().GetMessage("buttonForSelectedDirTitle"), Widget: directoryForSaving.button, }, { @@ -74,11 +73,11 @@ func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContr Widget: selectEncoder.SelectFileType, }, { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "selectFormat"}), + Text: app.GetLocalizerService().GetMessage("selectFormat"), Widget: selectEncoder.SelectFormat, }, { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "selectEncoder"}), + Text: app.GetLocalizerService().GetMessage("selectEncoder"), Widget: selectEncoder.SelectEncoder, }, } @@ -141,30 +140,22 @@ func (c Conversion) selectFileForConversion(err error) { func (c Conversion) submit() { if len(c.itemsToConvertService.GetItems()) == 0 { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorNoFilesAddedForConversion", - }))) + showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorNoFilesAddedForConversion"))) c.enableFormConversion() return } if len(c.directoryForSaving.path) == 0 { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorSelectedFolderSave", - }))) + showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorSelectedFolderSave"))) c.enableFormConversion() return } if len(c.selectEncoder.SelectFormat.Selected) == 0 { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorSelectedFormat", - }))) + showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorSelectedFormat"))) return } if c.selectEncoder.Encoder == nil { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorSelectedEncoder", - }))) + showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorSelectedEncoder"))) return } c.conversionMessage.Text = "" @@ -208,13 +199,9 @@ func newFileForConversion(app kernel.AppContract, itemsToConvertService kernel.I changeCallbacks: map[int]func(err error){}, } - buttonTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "choose", - }) + "\n" + app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "or", - }) + "\n" + app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "dragAndDropFiles", - }) + buttonTitle := app.GetLocalizerService().GetMessage("choose") + "\n" + + app.GetLocalizerService().GetMessage("or") + "\n" + + app.GetLocalizerService().GetMessage("dragAndDropFiles") var locationURI fyne.ListableURI @@ -281,9 +268,7 @@ func newFileForConversion(app kernel.AppContract, itemsToConvertService kernel.I } app.GetWindow().GetLayout().GetRightTabs().SelectAddedFilesTab() if isError { - fileForConversion.message.Text = app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorDragAndDropFile", - }) + fileForConversion.message.Text = app.GetLocalizerService().GetMessage("errorDragAndDropFile") setStringErrorStyle(fileForConversion.message) fileForConversion.eventSelectFile(errors.New(fileForConversion.message.Text)) } else { @@ -322,9 +307,7 @@ func newDirectoryForSaving(app kernel.AppContract, settingDirectoryForSaving set directoryForSaving.message.TextSize = 16 directoryForSaving.message.TextStyle = fyne.TextStyle{Bold: true} - buttonTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "choose", - }) + buttonTitle := app.GetLocalizerService().GetMessage("choose") var locationURI fyne.ListableURI @@ -386,9 +369,7 @@ func newOverwriteOutputFiles(app kernel.AppContract) *overwriteOutputFiles { overwriteOutputFiles := &overwriteOutputFiles{ isChecked: false, } - checkboxOverwriteOutputFilesTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "checkboxOverwriteOutputFilesTitle", - }) + checkboxOverwriteOutputFilesTitle := app.GetLocalizerService().GetMessage("checkboxOverwriteOutputFilesTitle") overwriteOutputFiles.checkbox = widget.NewCheck(checkboxOverwriteOutputFilesTitle, func(b bool) { overwriteOutputFiles.isChecked = b }) @@ -437,7 +418,7 @@ func newSelectEncoder(app kernel.AppContract, formats encoder.ConvertorFormatsCo encoders = map[int]encoder2.EncoderDataContract{} for _, e := range format.GetEncoders() { encoders[len(encoders)] = e - encoderOptions = append(encoderOptions, app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "encoder_" + e.GetTitle()})) + encoderOptions = append(encoderOptions, app.GetLocalizerService().GetMessage("encoder_"+e.GetTitle())) } selectEncoder.SelectEncoder.SetOptions(encoderOptions) selectEncoder.SelectEncoder.SetSelectedIndex(0) @@ -448,9 +429,9 @@ func newSelectEncoder(app kernel.AppContract, formats encoder.ConvertorFormatsCo fileTypeOptions = append(fileTypeOptions, fileType.Name()) } - encoderGroupVideo := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "encoderGroupVideo"}) - encoderGroupAudio := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "encoderGroupAudio"}) - encoderGroupImage := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "encoderGroupImage"}) + encoderGroupVideo := app.GetLocalizerService().GetMessage("encoderGroupVideo") + encoderGroupAudio := app.GetLocalizerService().GetMessage("encoderGroupAudio") + encoderGroupImage := app.GetLocalizerService().GetMessage("encoderGroupImage") encoderGroup := map[string]string{ encoderGroupVideo: "video", encoderGroupAudio: "audio", @@ -517,9 +498,7 @@ type form struct { func newForm(app kernel.AppContract, items []*widget.FormItem) *form { f := widget.NewForm() - f.SubmitText = app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "converterVideoFilesSubmitTitle", - }) + f.SubmitText = app.GetLocalizerService().GetMessage("converterVideoFilesSubmitTitle") f.Items = items return &form{ diff --git a/convertor/view/form_items/h264_nvenc/view.go b/convertor/view/form_items/h264_nvenc/view.go index 81b3c15..2f92333 100644 --- a/convertor/view/form_items/h264_nvenc/view.go +++ b/convertor/view/form_items/h264_nvenc/view.go @@ -6,7 +6,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/h264_nvenc" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" ) func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { @@ -45,7 +44,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] elementSelect.SetSelected(presetDefault) elementSelect.Hide() - checkboxTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "parameterCheckbox"}) + checkboxTitle := app.GetLocalizerService().GetMessage("parameterCheckbox") elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) { if b == true { parameter.SetEnable() @@ -58,7 +57,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] return []*widget.FormItem{ { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "formPreset"}), + Text: app.GetLocalizerService().GetMessage("formPreset"), Widget: container.NewVBox(elementCheckbox, elementSelect), }, } diff --git a/convertor/view/form_items/libx264/view.go b/convertor/view/form_items/libx264/view.go index f552c66..dd8ae34 100644 --- a/convertor/view/form_items/libx264/view.go +++ b/convertor/view/form_items/libx264/view.go @@ -6,7 +6,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx264" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" ) func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { @@ -28,7 +27,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] presetDefault := "" for _, name := range libx264.Presets { - title := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "preset_" + name}) + title := app.GetLocalizerService().GetMessage("preset_" + name) presetsForSelect = append(presetsForSelect, title) presets[title] = name if name == parameter.Get() { @@ -45,7 +44,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] elementSelect.SetSelected(presetDefault) elementSelect.Hide() - checkboxTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "parameterCheckbox"}) + checkboxTitle := app.GetLocalizerService().GetMessage("parameterCheckbox") elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) { if b == true { parameter.SetEnable() @@ -58,7 +57,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] return []*widget.FormItem{ { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "formPreset"}), + Text: app.GetLocalizerService().GetMessage("formPreset"), Widget: container.NewVBox(elementCheckbox, elementSelect), }, } diff --git a/convertor/view/form_items/libx265/view.go b/convertor/view/form_items/libx265/view.go index 434defd..ae71d4d 100644 --- a/convertor/view/form_items/libx265/view.go +++ b/convertor/view/form_items/libx265/view.go @@ -6,7 +6,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx265" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" ) func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { @@ -28,7 +27,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] presetDefault := "" for _, name := range libx265.Presets { - title := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "preset_" + name}) + title := app.GetLocalizerService().GetMessage("preset_" + name) presetsForSelect = append(presetsForSelect, title) presets[title] = name if name == parameter.Get() { @@ -45,7 +44,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] elementSelect.SetSelected(presetDefault) elementSelect.Hide() - checkboxTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "parameterCheckbox"}) + checkboxTitle := app.GetLocalizerService().GetMessage("parameterCheckbox") elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) { if b == true { parameter.SetEnable() @@ -58,7 +57,7 @@ func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) [] return []*widget.FormItem{ { - Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "formPreset"}), + Text: app.GetLocalizerService().GetMessage("formPreset"), Widget: container.NewVBox(elementCheckbox, elementSelect), }, } diff --git a/convertor/view_setting.go b/convertor/view_setting.go index ca5e3f4..b18a070 100644 --- a/convertor/view_setting.go +++ b/convertor/view_setting.go @@ -6,7 +6,6 @@ import ( "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/storage" "fyne.io/fyne/v2/widget" - "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" "net/url" "path/filepath" @@ -37,33 +36,25 @@ func (v View) SelectFFPath( form := &widget.Form{ Items: []*widget.FormItem{ { - Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "titleDownloadLink", - }), + Text: v.app.GetLocalizerService().GetMessage("titleDownloadLink"), Widget: link, }, { - Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "pathToFfmpeg", - }), + Text: v.app.GetLocalizerService().GetMessage("pathToFfmpeg"), Widget: buttonFFmpeg, }, { Widget: container.NewHScroll(buttonFFmpegMessage), }, { - Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "pathToFfprobe", - }), + Text: v.app.GetLocalizerService().GetMessage("pathToFfprobe"), Widget: buttonFFprobe, }, { Widget: container.NewHScroll(buttonFFprobeMessage), }, { - Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "pathToFfplay", - }), + Text: v.app.GetLocalizerService().GetMessage("pathToFfplay"), Widget: buttonFFplay, }, { @@ -73,9 +64,7 @@ func (v View) SelectFFPath( Widget: errorMessage, }, }, - SubmitText: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "save", - }), + SubmitText: v.app.GetLocalizerService().GetMessage("save"), OnSubmit: func() { err := save(*ffmpegPath, *ffprobePath, *ffplayPath) if err != nil { @@ -85,13 +74,9 @@ func (v View) SelectFFPath( } if cancel != nil { form.OnCancel = cancel - form.CancelText = v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "cancel", - }) + form.CancelText = v.app.GetLocalizerService().GetMessage("cancel") } - selectFFPathTitle := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "selectFFPathTitle", - }) + selectFFPathTitle := v.app.GetLocalizerService().GetMessage("selectFFPathTitle") if v.downloadFFmpeg.blockDownloadFFmpegContainer == nil { v.downloadFFmpeg.blockDownloadFFmpegContainer = v.blockDownloadFFmpeg(donwloadFFmpeg) @@ -110,9 +95,7 @@ func (v View) getButtonSelectFile(path string) (filePath *string, button *widget buttonMessage.TextSize = 16 buttonMessage.TextStyle = fyne.TextStyle{Bold: true} - buttonTitle := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "choose", - }) + buttonTitle := v.app.GetLocalizerService().GetMessage("choose") var locationURI fyne.ListableURI if len(path) > 0 { diff --git a/convertor/view_setting_button_download_ffmpeg_linux.go b/convertor/view_setting_button_download_ffmpeg_linux.go index aa462d3..d08900c 100644 --- a/convertor/view_setting_button_download_ffmpeg_linux.go +++ b/convertor/view_setting_button_download_ffmpeg_linux.go @@ -8,7 +8,6 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" - "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/image/colornames" "image/color" ) @@ -29,9 +28,7 @@ func (v View) blockDownloadFFmpeg( var buttonDownloadFFmpeg *widget.Button - buttonDownloadFFmpeg = widget.NewButton(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "download", - }), func() { + buttonDownloadFFmpeg = widget.NewButton(v.app.GetLocalizerService().GetMessage("download"), func() { fyne.Do(func() { buttonDownloadFFmpeg.Disable() }) @@ -47,15 +44,11 @@ func (v View) blockDownloadFFmpeg( }) - downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "downloadFFmpegFromSite", - }) + downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage("downloadFFmpegFromSite") return container.NewVBox( canvas.NewLine(colornames.Darkgreen), - widget.NewCard(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "buttonDownloadFFmpeg", - }), "", container.NewVBox( + widget.NewCard(v.app.GetLocalizerService().GetMessage("buttonDownloadFFmpeg"), "", container.NewVBox( widget.NewRichTextFromMarkdown( downloadFFmpegFromSiteMessage+" [https://github.com/BtbN/FFmpeg-Builds/releases](https://github.com/BtbN/FFmpeg-Builds/releases)", ), diff --git a/convertor/view_setting_button_download_ffmpeg_windows.go b/convertor/view_setting_button_download_ffmpeg_windows.go index 5b706b6..b71deef 100644 --- a/convertor/view_setting_button_download_ffmpeg_windows.go +++ b/convertor/view_setting_button_download_ffmpeg_windows.go @@ -8,7 +8,6 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" - "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/image/colornames" "image/color" ) @@ -29,9 +28,7 @@ func (v View) blockDownloadFFmpeg( var buttonDownloadFFmpeg *widget.Button - buttonDownloadFFmpeg = widget.NewButton(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "download", - }), func() { + buttonDownloadFFmpeg = widget.NewButton(v.app.GetLocalizerService().GetMessage("download"), func() { go func() { fyne.Do(func() { @@ -47,15 +44,11 @@ func (v View) blockDownloadFFmpeg( }() }) - downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "downloadFFmpegFromSite", - }) + downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage("downloadFFmpegFromSite") return container.NewVBox( canvas.NewLine(colornames.Darkgreen), - widget.NewCard(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "buttonDownloadFFmpeg", - }), "", container.NewVBox( + widget.NewCard(v.app.GetLocalizerService().GetMessage("buttonDownloadFFmpeg"), "", container.NewVBox( widget.NewRichTextFromMarkdown( downloadFFmpegFromSiteMessage+" [https://github.com/BtbN/FFmpeg-Builds/releases](https://github.com/BtbN/FFmpeg-Builds/releases)", ), diff --git a/error/view.go b/error/view.go index 50182e6..f2becd4 100644 --- a/error/view.go +++ b/error/view.go @@ -2,11 +2,9 @@ package error import ( "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/widget" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/localizer" - "github.com/nicksnyder/go-i18n/v2/i18n" ) type ViewContract interface { @@ -14,26 +12,17 @@ type ViewContract interface { } type View struct { - app kernel.AppContract - isSetLanguage bool + app kernel.AppContract } func NewView(app kernel.AppContract) *View { return &View{ - app: app, - isSetLanguage: true, + app: app, } } func (v View) PanicError(err error) { - if v.isSetLanguage { - v.isSetLanguage = false - _ = v.app.GetLocalizerService().SetCurrentLanguageByCode(lang.SystemLocale().LanguageString()) - } - - messageHead := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "error", - }) + messageHead := v.app.GetLocalizerService().GetMessage("error") v.app.GetWindow().SetContent(container.NewBorder( container.NewVBox( diff --git a/go.mod b/go.mod index 1bbe1ff..2c96e56 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,13 @@ toolchain go1.23.9 require ( fyne.io/fyne/v2 v2.6.1 - github.com/BurntSushi/toml v1.5.0 - github.com/nicksnyder/go-i18n/v2 v2.6.0 github.com/ulikunitz/xz v0.5.12 golang.org/x/image v0.27.0 - golang.org/x/text v0.25.0 ) require ( fyne.io/systray v1.11.0 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fredbi/uri v1.1.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect @@ -33,6 +31,7 @@ require ( github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect github.com/kr/text v0.2.0 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/nicksnyder/go-i18n/v2 v2.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rymdport/portal v0.4.1 // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect @@ -41,5 +40,6 @@ require ( github.com/yuin/goldmark v1.7.11 // indirect golang.org/x/net v0.40.0 // indirect golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.25.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/handler/convertor.go b/handler/convertor.go index 8643d35..2bc81fe 100644 --- a/handler/convertor.go +++ b/handler/convertor.go @@ -8,7 +8,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/helper" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" - "github.com/nicksnyder/go-i18n/v2/i18n" ) type ConvertorHandlerContract interface { @@ -134,25 +133,19 @@ func (h ConvertorHandler) checkingFFPathUtilities() bool { func (h ConvertorHandler) saveSettingFFPath(ffmpegPath string, ffprobePath string, ffplayPath string) error { ffmpegChecking, _ := h.app.GetConvertorService().ChangeFFmpegPath(ffmpegPath) if ffmpegChecking == false { - errorText := h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorFFmpeg", - }) + errorText := h.app.GetLocalizerService().GetMessage("errorFFmpeg") return errors.New(errorText) } ffprobeChecking, _ := h.app.GetConvertorService().ChangeFFprobePath(ffprobePath) if ffprobeChecking == false { - errorText := h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorFFprobe", - }) + errorText := h.app.GetLocalizerService().GetMessage("errorFFprobe") return errors.New(errorText) } ffplayChecking, _ := h.app.GetConvertorService().ChangeFFplayPath(ffplayPath) if ffplayChecking == false { - errorText := h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorFFplay", - }) + errorText := h.app.GetLocalizerService().GetMessage("errorFFplay") return errors.New(errorText) } diff --git a/handler/convertor_linux.go b/handler/convertor_linux.go index c1a032a..1c87a3c 100644 --- a/handler/convertor_linux.go +++ b/handler/convertor_linux.go @@ -10,7 +10,6 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/widget" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" "github.com/ulikunitz/xz" "io" "net/http" @@ -30,9 +29,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre return err } } - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "downloadRun", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("downloadRun") fyne.Do(func() { progressMessage.Refresh() }) @@ -41,9 +38,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre return err } - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "unzipRun", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("unzipRun") fyne.Do(func() { progressMessage.Refresh() }) @@ -53,9 +48,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre } _ = os.Remove("ffmpeg/ffmpeg.tar.xz") - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "testFF", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("testFF") fyne.Do(func() { progressMessage.Refresh() }) @@ -69,9 +62,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre return err } - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "completedQueue", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("completedQueue") fyne.Do(func() { progressMessage.Refresh() }) diff --git a/handler/convertor_windows.go b/handler/convertor_windows.go index fb08d87..206aa57 100644 --- a/handler/convertor_windows.go +++ b/handler/convertor_windows.go @@ -10,7 +10,6 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/widget" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" "io" "net/http" "os" @@ -30,9 +29,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre return err } } - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "downloadRun", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("downloadRun") fyne.Do(func() { progressMessage.Refresh() }) @@ -41,9 +38,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre return err } - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "unzipRun", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("unzipRun") fyne.Do(func() { progressMessage.Refresh() }) @@ -53,9 +48,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre } _ = os.Remove("ffmpeg/ffmpeg.zip") - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "testFF", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("testFF") fyne.Do(func() { progressMessage.Refresh() }) @@ -68,9 +61,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre return err } - progressMessage.Text = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "completedQueue", - }) + progressMessage.Text = h.app.GetLocalizerService().GetMessage("completedQueue") fyne.Do(func() { progressMessage.Refresh() }) diff --git a/handler/main.go b/handler/main.go index e8a669b..09d4fa8 100644 --- a/handler/main.go +++ b/handler/main.go @@ -1,42 +1,32 @@ package handler import ( - "fyne.io/fyne/v2/lang" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/localizer" ) type MainHandler struct { - app kernel.AppContract - convertorHandler ConvertorHandlerContract - menuHandler MenuHandlerContract - localizerRepository localizer.RepositoryContract + app kernel.AppContract + convertorHandler ConvertorHandlerContract + menuHandler MenuHandlerContract } func NewMainHandler( app kernel.AppContract, convertorHandler ConvertorHandlerContract, menuHandler MenuHandlerContract, - localizerRepository localizer.RepositoryContract, ) *MainHandler { return &MainHandler{ - app: app, - convertorHandler: convertorHandler, - menuHandler: menuHandler, - localizerRepository: localizerRepository, + app: app, + convertorHandler: convertorHandler, + menuHandler: menuHandler, } } func (h MainHandler) Start() { - language := h.localizerRepository.GetCode() - if len(language) == 0 { - err := h.app.GetLocalizerService().SetCurrentLanguageByCode(lang.SystemLocale().LanguageString()) - if err != nil { - h.menuHandler.LanguageSelection() - return - } + if h.app.GetLocalizerService().IsStartWithLanguageSelection() { + h.menuHandler.LanguageSelection() + return } - _ = h.app.GetLocalizerService().SetCurrentLanguageByCode(language) h.convertorHandler.MainConvertor() } diff --git a/handler/menu.go b/handler/menu.go index 7bc8b87..932a0ed 100644 --- a/handler/menu.go +++ b/handler/menu.go @@ -6,7 +6,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/localizer" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/menu" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/theme" - "github.com/nicksnyder/go-i18n/v2/i18n" ) type MenuHandlerContract interface { @@ -15,13 +14,12 @@ type MenuHandlerContract interface { } type MenuHandler struct { - app kernel.AppContract - convertorHandler ConvertorHandlerContract - menuView menu.ViewContract - menuViewSetting menu.ViewSettingContract - localizerView localizer.ViewContract - localizerRepository localizer.RepositoryContract - themeService theme.ThemeContract + app kernel.AppContract + convertorHandler ConvertorHandlerContract + menuView menu.ViewContract + menuViewSetting menu.ViewSettingContract + localizerView localizer.ViewContract + themeService theme.ThemeContract } func NewMenuHandler( @@ -30,17 +28,15 @@ func NewMenuHandler( menuView menu.ViewContract, menuViewSetting menu.ViewSettingContract, localizerView localizer.ViewContract, - localizerRepository localizer.RepositoryContract, themeService theme.ThemeContract, ) *MenuHandler { return &MenuHandler{ - app: app, - convertorHandler: convertorHandler, - menuView: menuView, - menuViewSetting: menuViewSetting, - localizerView: localizerView, - localizerRepository: localizerRepository, - themeService: themeService, + app: app, + convertorHandler: convertorHandler, + menuView: menuView, + menuViewSetting: menuViewSetting, + localizerView: localizerView, + themeService: themeService, } } @@ -52,31 +48,23 @@ func (h MenuHandler) GetMainMenu() *fyne.MainMenu { } func (h MenuHandler) getMenuSettings() *fyne.Menu { - quit := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "exit", - }), nil) + quit := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("exit"), nil) quit.IsQuit = true h.app.GetLocalizerService().AddChangeCallback("exit", func(text string) { quit.Label = text }) - settingsSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "settings", - }), h.settingsSelection) + settingsSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("settings"), h.settingsSelection) h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { settingsSelection.Label = text }) - ffPathSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "changeFFPath", - }), h.convertorHandler.FfPathSelection) + ffPathSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("changeFFPath"), h.convertorHandler.FfPathSelection) h.app.GetLocalizerService().AddChangeCallback("changeFFPath", func(text string) { ffPathSelection.Label = text }) - settings := fyne.NewMenu(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "settings", - }), settingsSelection, ffPathSelection, quit) + settings := fyne.NewMenu(h.app.GetLocalizerService().GetMessage("settings"), settingsSelection, ffPathSelection, quit) h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { settings.Label = text settings.Refresh() @@ -86,30 +74,22 @@ func (h MenuHandler) getMenuSettings() *fyne.Menu { } func (h MenuHandler) getMenuHelp() *fyne.Menu { - about := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "about", - }), h.openAbout) + about := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("about"), h.openAbout) h.app.GetLocalizerService().AddChangeCallback("about", func(text string) { about.Label = text }) - gratitude := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "gratitude", - }), h.menuView.Gratitude) + gratitude := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("gratitude"), h.menuView.Gratitude) h.app.GetLocalizerService().AddChangeCallback("gratitude", func(text string) { gratitude.Label = text }) - helpFFplay := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "helpFFplay", - }), h.menuView.HelpFFplay) + helpFFplay := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("helpFFplay"), h.menuView.HelpFFplay) h.app.GetLocalizerService().AddChangeCallback("helpFFplay", func(text string) { helpFFplay.Label = text }) - help := fyne.NewMenu(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "help", - }), helpFFplay, about, gratitude) + help := fyne.NewMenu(h.app.GetLocalizerService().GetMessage("help"), helpFFplay, about, gratitude) h.app.GetLocalizerService().AddChangeCallback("help", func(text string) { help.Label = text help.Refresh() @@ -121,21 +101,15 @@ func (h MenuHandler) getMenuHelp() *fyne.Menu { func (h MenuHandler) openAbout() { ffmpeg, err := h.convertorHandler.GetFfmpegVersion() if err != nil { - ffmpeg = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorFFmpegVersion", - }) + ffmpeg = h.app.GetLocalizerService().GetMessage("errorFFmpegVersion") } ffprobe, err := h.convertorHandler.GetFfprobeVersion() if err != nil { - ffprobe = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorFFprobeVersion", - }) + ffprobe = h.app.GetLocalizerService().GetMessage("errorFFprobeVersion") } ffplay, err := h.convertorHandler.GetFfplayVersion() if err != nil { - ffplay = h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorFFplayVersion", - }) + ffplay = h.app.GetLocalizerService().GetMessage("errorFFplayVersion") } h.menuView.About(ffmpeg, ffprobe, ffplay) @@ -143,18 +117,16 @@ func (h MenuHandler) openAbout() { func (h MenuHandler) LanguageSelection() { h.localizerView.LanguageSelection(func(lang kernel.Lang) { - _ = h.localizerRepository.Save(lang.Code) h.convertorHandler.MainConvertor() }) } func (h MenuHandler) settingsSelection() { save := func(setting *menu.SettingForm) error { - err := h.app.GetLocalizerService().SetCurrentLanguage(setting.Language) + err := h.app.GetLocalizerService().SetCurrentLanguage(setting.Language, true) if err != nil { return err } - _ = h.localizerRepository.Save(setting.Language.Code) err = h.themeService.SetCurrentTheme(setting.ThemeInfo) if err != nil { diff --git a/images/screenshot-folder-structure.png b/images/screenshot-folder-structure.png index 1e29071ac4a6242718a6b0381ecbbd6502454028..58b4406fd5e0cefedcaa3999969c49cc8d4b901c 100644 GIT binary patch delta 5819 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 bBC!3?(!S1Q-4%H`qy{uq^;D{r?W6t&ISGkK delta 6807 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 Nl9pnn0=7l){{S=~osa+k diff --git a/kernel/app.go b/kernel/app.go index 3babb14..242ea8c 100644 --- a/kernel/app.go +++ b/kernel/app.go @@ -30,7 +30,6 @@ type App struct { func NewApp( metadata *fyne.AppMetadata, - localizerService LocalizerContract, queue QueueListContract, ffplayService FFplayContract, convertorService ConvertorContract, @@ -38,6 +37,12 @@ func NewApp( app.SetMetadata(*metadata) a := app.New() + localizerService, err := newLocalizer(a) + if err != nil { + panicErrorLang(a, err) + return nil + } + statusesText := GetBlockProgressbarStatusesText(localizerService) blockProgressbarService := NewBlockProgressbar(statusesText, ffplayService) rightTabsService := NewRightTabs(localizerService) diff --git a/kernel/error.go b/kernel/error.go index 7f03ea1..cd26e13 100644 --- a/kernel/error.go +++ b/kernel/error.go @@ -2,14 +2,11 @@ package kernel import ( "fyne.io/fyne/v2" - "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) -func PanicErrorLang(err error, metadata *fyne.AppMetadata) { - app.SetMetadata(*metadata) - a := app.New() +func panicErrorLang(a fyne.App, err error) { window := a.NewWindow("GUI for FFmpeg") window.SetContent(container.NewVBox( widget.NewLabel("Произошла ошибка!"), diff --git a/kernel/items_to_convert.go b/kernel/items_to_convert.go index 0adbc3d..093540c 100644 --- a/kernel/items_to_convert.go +++ b/kernel/items_to_convert.go @@ -6,7 +6,6 @@ import ( "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" - "github.com/nicksnyder/go-i18n/v2/i18n" ) type ItemsToConvertContract interface { @@ -35,21 +34,23 @@ func NewItemsToConvert(itemsContainer *fyne.Container, ffplayService FFplayContr line := canvas.NewLine(theme.Color(theme.ColorNameFocus)) line.StrokeWidth = 5 - checkboxAutoRemove := widget.NewCheck(localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "autoClearAfterAddingToQueue", - }), func(checked bool) { - ItemsToConvert.isAutoRemove = checked - }) + checkboxAutoRemove := widget.NewCheck( + localizerService.GetMessage("autoClearAfterAddingToQueue"), + func(checked bool) { + ItemsToConvert.isAutoRemove = checked + }, + ) checkboxAutoRemove.SetChecked(ItemsToConvert.isAutoRemove) localizerService.AddChangeCallback("autoClearAfterAddingToQueue", func(text string) { checkboxAutoRemove.Text = text }) - buttonClear := widget.NewButton(localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "clearAll", - }), func() { - ItemsToConvert.clear() - }) + buttonClear := widget.NewButton( + localizerService.GetMessage("clearAll"), + func() { + ItemsToConvert.clear() + }, + ) buttonClear.Importance = widget.DangerImportance localizerService.AddChangeCallback("clearAll", func(text string) { buttonClear.Text = text diff --git a/kernel/layout.go b/kernel/layout.go index 3d34179..7953967 100644 --- a/kernel/layout.go +++ b/kernel/layout.go @@ -6,7 +6,6 @@ import ( "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" - "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" "strconv" "strings" @@ -77,7 +76,7 @@ type QueueLayoutItem struct { } func NewQueueLayoutObject(queue QueueListContract, localizerService LocalizerContract, ffplayService FFplayContract, rightTabsService RightTabsContract, blockProgressbar *fyne.Container) *QueueLayoutObject { - title := widget.NewLabel(localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "queue"})) + title := widget.NewLabel(localizerService.GetMessage("queue")) title.TextStyle.Bold = true localizerService.AddChangeCallback("queue", func(text string) { @@ -222,7 +221,7 @@ func (o QueueLayoutObject) getStatusColor(status StatusContract) color.Color { } func (o QueueLayoutObject) getStatusTitle(status StatusContract) string { - return o.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: status.Name() + "Queue"}) + return o.localizerService.GetMessage(status.Name() + "Queue") } type queueStatistics struct { @@ -441,7 +440,7 @@ func newQueueStatistics(messaigeID string, localizerService LocalizerContract) * count := int64(0) - title := localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: messaigeID}) + title := localizerService.GetMessage(messaigeID) queueStatistics := &queueStatistics{ widget: checkbox, title: strings.ToLower(title), diff --git a/kernel/localizer.go b/kernel/localizer.go index 3823c7d..085fb69 100644 --- a/kernel/localizer.go +++ b/kernel/localizer.go @@ -1,21 +1,28 @@ package kernel import ( - "github.com/BurntSushi/toml" - "github.com/nicksnyder/go-i18n/v2/i18n" - "golang.org/x/text/cases" + "embed" + "encoding/json" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/lang" "golang.org/x/text/language" - "golang.org/x/text/language/display" - "path/filepath" - "sort" ) +//go:embed translations +var translations embed.FS + +var supportedLanguages = map[string]Lang{ + "ru": {Code: "ru", Title: "Русский"}, + "kk": {Code: "kk", Title: "Қазақ Тілі"}, + "en": {Code: "en", Title: "English"}, +} + type LocalizerContract interface { + IsStartWithLanguageSelection() bool + GetMessage(key string, data ...any) string GetLanguages() []Lang - GetMessage(localizeConfig *i18n.LocalizeConfig) string - SetCurrentLanguage(lang Lang) error - SetCurrentLanguageByCode(code string) error - GetCurrentLanguage() *CurrentLanguage + GetCurrentLanguage() Lang + SetCurrentLanguage(selectLang Lang, isSaveSetting bool) error AddChangeCallback(messageID string, callback func(text string)) } @@ -24,135 +31,164 @@ type Lang struct { Title string } -type CurrentLanguage struct { - Lang Lang - localizer *i18n.Localizer - localizerDefault *i18n.Localizer -} - type changeCallback struct { messageID string callback func(text string) } type Localizer struct { - bundle *i18n.Bundle - languages []Lang - currentLanguage *CurrentLanguage - changeCallbacks map[int]*changeCallback + setting SettingLanguageContract + currentLang Lang + changeCallbacks map[int]*changeCallback + isStartWithLanguageSelection bool } -func NewLocalizer(directory string, languageDefault language.Tag) (*Localizer, error) { - bundle := i18n.NewBundle(languageDefault) - bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal) +func newLocalizer(app fyne.App) (*Localizer, error) { + setting := newSettingLanguage(app) + currentLanguage, isLanguageNotSupported := setting.GetLang() - languages, err := initLanguages(directory, bundle) + localizer := &Localizer{ + setting: setting, + changeCallbacks: map[int]*changeCallback{}, + isStartWithLanguageSelection: isLanguageNotSupported, + } + + err := localizer.SetCurrentLanguage(currentLanguage, false) if err != nil { return nil, err } - localizerDefault := i18n.NewLocalizer(bundle, languageDefault.String()) - - return &Localizer{ - bundle: bundle, - languages: languages, - currentLanguage: &CurrentLanguage{ - Lang: Lang{ - Code: languageDefault.String(), - Title: cases.Title(languageDefault).String(display.Self.Name(languageDefault)), - }, - localizer: localizerDefault, - localizerDefault: localizerDefault, - }, - changeCallbacks: map[int]*changeCallback{}, - }, nil + return localizer, nil } -func initLanguages(directory string, bundle *i18n.Bundle) ([]Lang, error) { - var languages []Lang +func (l *Localizer) IsStartWithLanguageSelection() bool { + return l.isStartWithLanguageSelection +} - files, err := filepath.Glob(directory + "/active.*.toml") +func (l *Localizer) GetMessage(key string, data ...any) string { + return lang.L(key, data...) +} + +func (l *Localizer) GetLanguages() []Lang { + return getLanguages() +} + +func (l *Localizer) GetCurrentLanguage() Lang { + return l.currentLang +} + +func (l *Localizer) SetCurrentLanguage(selectLang Lang, isSaveSetting bool) error { + l.currentLang = selectLang + + translationsData, err := l.getTranslations(selectLang) 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}) + return err } - sort.Sort(languagesSort(languages)) - - return languages, nil -} - -func (l Localizer) GetLanguages() []Lang { - return l.languages -} - -func (l Localizer) GetMessage(localizeConfig *i18n.LocalizeConfig) string { - message, err := l.GetCurrentLanguage().localizer.Localize(localizeConfig) + name := lang.SystemLocale().LanguageString() + err = lang.AddTranslations(fyne.NewStaticResource(name+".json", translationsData)) if err != nil { - message, err = l.GetCurrentLanguage().localizerDefault.Localize(localizeConfig) - if err != nil { - return err.Error() - } + return err + } + + if isSaveSetting { + l.setting.SetLang(selectLang) } - return message -} -func (l Localizer) SetCurrentLanguage(lang Lang) error { - l.currentLanguage.Lang = lang - l.currentLanguage.localizer = i18n.NewLocalizer(l.bundle, lang.Code) l.eventSetCurrentLanguage() return nil } -func (l Localizer) SetCurrentLanguageByCode(code string) error { - lang, err := language.Parse(code) - if err != nil { - return err - } - title := cases.Title(lang).String(display.Self.Name(lang)) - return l.SetCurrentLanguage(Lang{Code: lang.String(), Title: title}) -} - -func (l Localizer) GetCurrentLanguage() *CurrentLanguage { - return l.currentLanguage -} - -func (l Localizer) AddChangeCallback(messageID string, callback func(text string)) { +func (l *Localizer) AddChangeCallback(messageID string, callback func(text string)) { l.changeCallbacks[len(l.changeCallbacks)] = &changeCallback{messageID: messageID, callback: callback} } -func (l Localizer) eventSetCurrentLanguage() { +func (l *Localizer) eventSetCurrentLanguage() { for _, changeCallback := range l.changeCallbacks { - text := l.GetMessage(&i18n.LocalizeConfig{MessageID: changeCallback.messageID}) + text := l.GetMessage(changeCallback.messageID) changeCallback.callback(text) } } -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 +func (l *Localizer) getTranslations(language Lang) ([]byte, error) { + 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 priority + return l.mergeTranslations(baseJson, appJson) +} + +func (l *Localizer) 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) +} + +func getLanguages() []Lang { + items := []Lang{} + for _, item := range supportedLanguages { + items = append(items, item) + } + return items +} + +type SettingLanguageContract interface { + GetLang() (currentLang Lang, isLanguageNotSupported bool) + SetLang(language Lang) +} + +type SettingLanguage struct { + app fyne.App +} + +func newSettingLanguage(app fyne.App) *SettingLanguage { + return &SettingLanguage{ + app: app, + } +} + +func (s *SettingLanguage) GetLang() (currentLang Lang, isLanguageNotSupported bool) { + languageCode := s.app.Preferences().String("language") + currentLang = supportedLanguages["ru"] + + if languageCode == "" { + languageTag, err := language.Parse(lang.SystemLocale().LanguageString()) + if err != nil { + return currentLang, true + } + base, _ := languageTag.Base() + languageCode = base.String() + } + + if findLang, ok := findSupportedLanguage(languageCode); ok { + return findLang, false + } + + return currentLang, true +} + +func (s *SettingLanguage) SetLang(language Lang) { + s.app.Preferences().SetString("language", language.Code) +} + +func findSupportedLanguage(code string) (Lang, bool) { + lang, ok := supportedLanguages[code] + return lang, ok } diff --git a/kernel/progressbar.go b/kernel/progressbar.go index 48b8485..95d4ce5 100644 --- a/kernel/progressbar.go +++ b/kernel/progressbar.go @@ -8,7 +8,6 @@ import ( "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" - "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" "io" "regexp" @@ -209,9 +208,7 @@ func (p Progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error { if isProcessCompleted == false { if len(errorText) == 0 { - errorText = p.localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorConverter", - }) + errorText = p.localizerService.GetMessage("errorConverter") } return errors.New(errorText) } @@ -227,15 +224,9 @@ type BlockProgressbarStatusesText struct { func GetBlockProgressbarStatusesText(localizerService LocalizerContract) *BlockProgressbarStatusesText { statusesText := &BlockProgressbarStatusesText{ - inProgress: localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "inProgressQueue", - }), - completed: localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "completedQueue", - }), - error: localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "errorQueue", - }), + inProgress: localizerService.GetMessage("inProgressQueue"), + completed: localizerService.GetMessage("completedQueue"), + error: localizerService.GetMessage("errorQueue"), } localizerService.AddChangeCallback("inProgressQueue", func(text string) { diff --git a/kernel/right_tabs.go b/kernel/right_tabs.go index 16f8de1..9b41880 100644 --- a/kernel/right_tabs.go +++ b/kernel/right_tabs.go @@ -3,7 +3,6 @@ package kernel import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" - "github.com/nicksnyder/go-i18n/v2/i18n" ) type RightTabsContract interface { @@ -26,13 +25,13 @@ type RightTabs struct { func NewRightTabs(localizerService LocalizerContract) *RightTabs { addedFilesContainer := container.NewVBox() - addedFilesTab := container.NewTabItem(localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "addedFilesTitle"}), addedFilesContainer) + addedFilesTab := container.NewTabItem(localizerService.GetMessage("addedFilesTitle"), addedFilesContainer) localizerService.AddChangeCallback("addedFilesTitle", func(text string) { addedFilesTab.Text = text }) fileQueueContainer := container.NewVBox() - fileQueueTab := container.NewTabItem(localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "fileQueueTitle"}), fileQueueContainer) + fileQueueTab := container.NewTabItem(localizerService.GetMessage("fileQueueTitle"), fileQueueContainer) localizerService.AddChangeCallback("fileQueueTitle", func(text string) { fileQueueTab.Text = text }) diff --git a/kernel/translations/app.en.json b/kernel/translations/app.en.json new file mode 100644 index 0000000..9919f8d --- /dev/null +++ b/kernel/translations/app.en.json @@ -0,0 +1,143 @@ +{ + "AlsoUsedProgram": "The program also uses:", + "about": "About", + "aboutText": "A simple interface for the FFmpeg console utility. \nBut I am not the author of the FFmpeg utility itself.", + "addedFilesTitle": "Added files", + "autoClearAfterAddingToQueue": "Auto-clear after adding to queue", + "buttonDownloadFFmpeg": "Download FFmpeg automatically", + "buttonForSelectedDirTitle": "Save to folder:", + "cancel": "Cancel", + "changeFFPath": "FFmpeg, FFprobe and FFplay", + "changeLanguage": "Change language", + "checkboxOverwriteOutputFilesTitle": "Allow file to be overwritten", + "choose": "choose", + "clearAll": "Clear List", + "completedQueue": "Completed", + "converterVideoFilesSubmitTitle": "Convert", + "converterVideoFilesTitle": "Video, audio and picture converter", + "download": "Download", + "downloadFFmpegFromSite": "Will be downloaded from the site:", + "downloadRun": "Downloading...", + "dragAndDropFiles": "drag and drop files", + "encoderGroupAudio": "Audio", + "encoderGroupImage": "Images", + "encoderGroupVideo": "Video", + "encoder_apng": "APNG image", + "encoder_bmp": "BMP image", + "encoder_flv": "FLV", + "encoder_gif": "GIF image", + "encoder_h264_nvenc": "H.264 with NVIDIA support", + "encoder_libmp3lame": "libmp3lame MP3 (MPEG audio layer 3)", + "encoder_libshine": "libshine MP3 (MPEG audio layer 3)", + "encoder_libtwolame": "libtwolame MP2 (MPEG audio layer 2)", + "encoder_libvpx": "libvpx VP8 (codec vp8)", + "encoder_libvpx-vp9": "libvpx VP9 (codec vp9)", + "encoder_libwebp": "libwebp WebP image", + "encoder_libwebp_anim": "libwebp_anim WebP image", + "encoder_libx264": "H.264 libx264", + "encoder_libx265": "H.265 libx265", + "encoder_libxvid": "libxvidcore MPEG-4 part 2", + "encoder_mjpeg": "MJPEG (Motion JPEG)", + "encoder_mp2": "MP2 (MPEG audio layer 2)", + "encoder_mp2fixed": "MP2 fixed point (MPEG audio layer 2)", + "encoder_mpeg1video": "MPEG-1", + "encoder_mpeg2video": "MPEG-2", + "encoder_mpeg4": "MPEG-4 part 2", + "encoder_msmpeg4": "MPEG-4 part 2 Microsoft variant version 3", + "encoder_msmpeg4v2": "MPEG-4 part 2 Microsoft variant version 2", + "encoder_msvideo1": "Microsoft Video-1", + "encoder_png": "PNG image", + "encoder_qtrle": "QuickTime Animation (RLE) video", + "encoder_sgi": "SGI image", + "encoder_tiff": "TIFF image", + "encoder_wmav1": "Windows Media Audio 1", + "encoder_wmav2": "Windows Media Audio 2", + "encoder_wmv1": "Windows Media Video 7", + "encoder_wmv2": "Windows Media Video 8", + "encoder_xbm": "XBM (X BitMap) image", + "error": "An error has occurred!", + "errorConverter": "Couldn't convert video", + "errorDragAndDropFile": "Not all files were added", + "errorFFmpeg": "this is not FFmpeg", + "errorFFmpegVersion": "Could not determine FFmpeg version", + "errorFFplay": "this is not FFplay", + "errorFFplayVersion": "Could not determine FFplay version", + "errorFFprobe": "this is not FFprobe", + "errorFFprobeVersion": "Failed to determine FFprobe version", + "errorNoFilesAddedForConversion": "There are no files to convert", + "errorQueue": "Error", + "errorSelectedEncoder": "Converter not selected", + "errorSelectedFolderSave": "No save folder selected!", + "errorSelectedFormat": "File extension not selected", + "exit": "Exit", + "ffmpegLGPL": "This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**.", + "ffmpegTrademark": "**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project.", + "fileForConversionTitle": "File:", + "fileQueueTitle": "Queue", + "formPreset": "Preset", + "gratitude": "Gratitude", + "gratitudeText": "I sincerely thank you for your invaluable\n\r and timely assistance:", + "help": "Help", + "helpFFplay": "FFplay Player Keys", + "helpFFplayActivateFrameStepMode": "Activate frame-by-frame mode.", + "helpFFplayCycleVideoFiltersOrShowModes": "A cycle of video filters or display modes.", + "helpFFplayDecreaseVolume": "Decrease the volume.", + "helpFFplayDescription": "Description", + "helpFFplayDoubleClickLeftMouseButton": "double click\nleft mouse button", + "helpFFplayIncreaseVolume": "Increase the volume.", + "helpFFplayKeyDown": "down", + "helpFFplayKeyHoldS": "hold S", + "helpFFplayKeyLeft": "left", + "helpFFplayKeyRight": "right", + "helpFFplayKeySpace": "SPACE", + "helpFFplayKeyUp": "up", + "helpFFplayKeys": "Keys", + "helpFFplayPause": "Pause or continue playing.", + "helpFFplayQuit": "Close the player.", + "helpFFplaySeekBForward10Minutes": "Fast forward 10 minutes.", + "helpFFplaySeekBForward1Minute": "Fast forward 1 minute.", + "helpFFplaySeekBackward10Minutes": "Rewind 10 minutes.", + "helpFFplaySeekBackward10Seconds": "Rewind 10 seconds.", + "helpFFplaySeekBackward1Minute": "Rewind 1 minute.", + "helpFFplaySeekForward10Seconds": "Fast forward 10 seconds.", + "helpFFplayToggleFullScreen": "Switch to full screen or exit full screen.", + "helpFFplayToggleMute": "Mute or unmute.", + "inProgressQueue": "In Progress", + "languageSelectionFormHead": "Switch language", + "languageSelectionHead": "Choose language", + "licenseLink": "License information", + "licenseLinkOther": "Licenses from other products used in the program", + "menuSettingsLanguage": "Language", + "menuSettingsTheme": "Theme", + "or": "or", + "parameterCheckbox": "Enable option", + "pathToFfmpeg": "Path to FFmpeg:", + "pathToFfplay": "Path to FFplay:", + "pathToFfprobe": "Path to FFprobe:", + "preset_fast": "fast (slower than \"faster\", but the file will weigh less)", + "preset_faster": "faster (slower than \"veryfast\", but the file will weigh less)", + "preset_medium": "medium (slower than \"fast\", but the file will weigh less)", + "preset_placebo": "placebo (not recommended)", + "preset_slow": "slow (slower than \"medium\", but the file will weigh less)", + "preset_slower": "slower (slower than \"slow\", but the file will weigh less)", + "preset_superfast": "superfast (slower than \"ultrafast\", but the file will weigh less)", + "preset_ultrafast": "ultrafast (fast, but the file will weigh a lot)", + "preset_veryfast": "veryfast (slower than \"superfast\", but the file will weigh less)", + "preset_veryslow": "veryslow (slower than \"slower\", but the file will weigh less)", + "programmLink": "Project website", + "programmVersion": "**Program version:** {{.Version}}", + "queue": "Queue", + "save": "Save", + "selectEncoder": "Encoder:", + "selectFFPathTitle": "Specify the path to FFmpeg and FFprobe", + "selectFormat": "File extension:", + "settings": "Settings", + "testFF": "Checking FFmpeg for serviceability...", + "themesNameDark": "Dark", + "themesNameDefault": "Default", + "themesNameLight": "Light", + "titleDownloadLink": "You can download it from here", + "total": "Total", + "unzipRun": "Unpacked...", + "waitingQueue": "Waiting" +} \ No newline at end of file diff --git a/kernel/translations/app.kk.json b/kernel/translations/app.kk.json new file mode 100644 index 0000000..6fb1b81 --- /dev/null +++ b/kernel/translations/app.kk.json @@ -0,0 +1,143 @@ +{ + "AlsoUsedProgram": "Бағдарлама сонымен қатар пайдаланады:", + "about": "Бағдарлама туралы", + "aboutText": "FFmpeg консоль утилитасы үшін қарапайым интерфейс. \nБірақ мен FFmpeg утилитасының авторы емеспін.", + "addedFilesTitle": "Қосылған файлдар", + "autoClearAfterAddingToQueue": "Кезекке қосқаннан кейін тазалаңыз", + "buttonDownloadFFmpeg": "FFmpeg автоматты түрде жүктеп алыңыз", + "buttonForSelectedDirTitle": "Қалтаға сақтаңыз:", + "cancel": "Болдырмау", + "changeFFPath": "FFmpeg, FFprobe және FFplay", + "changeLanguage": "Тілді өзгерту", + "checkboxOverwriteOutputFilesTitle": "Файлды қайта жазуға рұқсат беріңіз", + "choose": "таңдау", + "clearAll": "Тізімді өшіру", + "completedQueue": "Дайын", + "converterVideoFilesSubmitTitle": "Файлды түрлендіру", + "converterVideoFilesTitle": "Бейне, аудио және суретті түрлендіргіш", + "download": "Жүктеп алу", + "downloadFFmpegFromSite": "Сайттан жүктеледі:", + "downloadRun": "Жүктеп алынуда...", + "dragAndDropFiles": "файлдарды сүйреп апарыңыз", + "encoderGroupAudio": "Аудио", + "encoderGroupImage": "Суреттер", + "encoderGroupVideo": "Бейне", + "encoder_apng": "APNG image", + "encoder_bmp": "BMP image", + "encoder_flv": "FLV", + "encoder_gif": "GIF image", + "encoder_h264_nvenc": "NVIDIA қолдауымен H.264", + "encoder_libmp3lame": "libmp3lame MP3 (MPEG audio layer 3)", + "encoder_libshine": "libshine MP3 (MPEG audio layer 3)", + "encoder_libtwolame": "libtwolame MP2 (MPEG audio layer 2)", + "encoder_libvpx": "libvpx VP8 (codec vp8)", + "encoder_libvpx-vp9": "libvpx VP9 (codec vp9)", + "encoder_libwebp": "libwebp WebP image", + "encoder_libwebp_anim": "libwebp_anim WebP image", + "encoder_libx264": "H.264 libx264", + "encoder_libx265": "H.265 libx265", + "encoder_libxvid": "libxvidcore MPEG-4 part 2", + "encoder_mjpeg": "MJPEG (Motion JPEG)", + "encoder_mp2": "MP2 (MPEG audio layer 2)", + "encoder_mp2fixed": "MP2 fixed point (MPEG audio layer 2)", + "encoder_mpeg1video": "MPEG-1", + "encoder_mpeg2video": "MPEG-2", + "encoder_mpeg4": "MPEG-4 part 2", + "encoder_msmpeg4": "MPEG-4 part 2 Microsoft variant version 3", + "encoder_msmpeg4v2": "MPEG-4 part 2 Microsoft variant version 2", + "encoder_msvideo1": "Microsoft Video-1", + "encoder_png": "PNG image", + "encoder_qtrle": "QuickTime Animation (RLE) video", + "encoder_sgi": "SGI image", + "encoder_tiff": "TIFF image", + "encoder_wmav1": "Windows Media Audio 1", + "encoder_wmav2": "Windows Media Audio 2", + "encoder_wmv1": "Windows Media Video 7", + "encoder_wmv2": "Windows Media Video 8", + "encoder_xbm": "XBM (X BitMap) image", + "error": "Қате орын алды!", + "errorConverter": "Бейнені түрлендіру мүмкін болмады", + "errorDragAndDropFile": "Барлық файлдар қосылмаған", + "errorFFmpeg": "бұл FFmpeg емес", + "errorFFmpegVersion": "FFmpeg нұсқасын анықтау мүмкін болмады", + "errorFFplay": "бұл FFplay емес", + "errorFFplayVersion": "FFplay нұсқасын анықтау мүмкін болмады", + "errorFFprobe": "бұл FFprobe емес", + "errorFFprobeVersion": "FFprobe нұсқасын анықтау мүмкін болмады", + "errorNoFilesAddedForConversion": "Түрлендіруге арналған файлдар жоқ", + "errorQueue": "Қате", + "errorSelectedEncoder": "Түрлендіргіш таңдалмаған", + "errorSelectedFolderSave": "Сақтау қалтасы таңдалмаған!", + "errorSelectedFormat": "Файл кеңейтімі таңдалмаған", + "exit": "Шығу", + "ffmpegLGPL": "Бұл бағдарламалық құрал **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)** астында **FFmpeg** жобасының кітапханаларын пайдаланады.", + "ffmpegTrademark": "FFmpeg — **[FFmpeg](https://ffmpeg.org/about.html)** жобасын жасаушы **[Fabrice Bellard](http://bellard.org/)** сауда белгісі.", + "fileForConversionTitle": "Файл:", + "fileQueueTitle": "Кезек", + "formPreset": "Алдын ала орнатылған", + "gratitude": "Алғыс", + "gratitudeText": "Сізге баға жетпес және уақтылы көмектескеніңіз\n\r үшін шын жүректен алғыс айтамын:", + "help": "Анықтама", + "helpFFplay": "FFplay ойнатқышының пернелері", + "helpFFplayActivateFrameStepMode": "Уақыт аралығын іске қосыңыз.", + "helpFFplayCycleVideoFiltersOrShowModes": "Бейне сүзгілерінің немесе дисплей режимдерінің циклі.", + "helpFFplayDecreaseVolume": "Дыбыс деңгейін төмендетіңіз.", + "helpFFplayDescription": "Сипаттама", + "helpFFplayDoubleClickLeftMouseButton": "тінтуірдің сол жақ\nбатырмасын екі рет басу", + "helpFFplayIncreaseVolume": "Дыбыс деңгейін арттыру.", + "helpFFplayKeyDown": "төмен", + "helpFFplayKeyHoldS": "ұстау S", + "helpFFplayKeyLeft": "сол", + "helpFFplayKeyRight": "құқық", + "helpFFplayKeySpace": "SPACE (пробел)", + "helpFFplayKeyUp": "жоғары", + "helpFFplayKeys": "Кілттер", + "helpFFplayPause": "Кідіртіңіз немесе жоғалтуды жалғастырыңыз.", + "helpFFplayQuit": "Ойнатқышты жабыңыз.", + "helpFFplaySeekBForward10Minutes": "10 минутқа алға айналдырыңыз.", + "helpFFplaySeekBForward1Minute": "1 минутқа алға айналдырыңыз.", + "helpFFplaySeekBackward10Minutes": "10 минутқа артқа айналдырыңыз.", + "helpFFplaySeekBackward10Seconds": "10 секундқа артқа айналдырыңыз.", + "helpFFplaySeekBackward1Minute": "1 минутқа артқа айналдырыңыз.", + "helpFFplaySeekForward10Seconds": "10 секунд алға айналдырыңыз.", + "helpFFplayToggleFullScreen": "Толық экранға ауысу немесе толық экраннан шығу.", + "helpFFplayToggleMute": "Дыбысты өшіріңіз немесе дыбысты қосыңыз.", + "inProgressQueue": "Орындалуда", + "languageSelectionFormHead": "Тілді ауыстыру", + "languageSelectionHead": "Тілді таңдаңыз", + "licenseLink": "Лицензия туралы ақпарат", + "licenseLinkOther": "Бағдарламада пайдаланылатын басқа өнімдердің лицензиялары", + "menuSettingsLanguage": "Тіл", + "menuSettingsTheme": "Тақырып", + "or": "немесе", + "parameterCheckbox": "Опцияны қосу", + "pathToFfmpeg": "FFmpeg жол:", + "pathToFfplay": "FFplay жол:", + "pathToFfprobe": "FFprobe жол:", + "preset_fast": "fast («faster» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_faster": "faster («veryfast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_medium": "medium («fast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_placebo": "placebo (ұсынылмайды)", + "preset_slow": "slow («medium» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_slower": "slower («slow» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_superfast": "superfast («ultrafast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_ultrafast": "ultrafast (жылдам, бірақ файлдың салмағы көп болады)", + "preset_veryfast": "veryfast («superfast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "preset_veryslow": "veryslow («slower» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", + "programmLink": "Жобаның веб-сайты", + "programmVersion": "**Бағдарлама нұсқасы:** {{.Version}}", + "queue": "Кезек", + "save": "Сақтау", + "selectEncoder": "Кодировщик:", + "selectFFPathTitle": "FFmpeg және FFprobe жолын көрсетіңіз", + "selectFormat": "Файл кеңейтімі:", + "settings": "Параметрлер", + "testFF": "FFmpeg функционалдығы тексерілуде...", + "themesNameDark": "Қараңғы тақырып", + "themesNameDefault": "Әдепкі бойынша", + "themesNameLight": "Жеңіл тақырып", + "titleDownloadLink": "Сіз оны осы жерден жүктей аласыз", + "total": "Барлығы", + "unzipRun": "Орамнан шығарылуда...", + "waitingQueue": "Күту" +} \ No newline at end of file diff --git a/kernel/translations/app.ru.json b/kernel/translations/app.ru.json new file mode 100644 index 0000000..20a5da8 --- /dev/null +++ b/kernel/translations/app.ru.json @@ -0,0 +1,143 @@ +{ + "AlsoUsedProgram": "Также в программе используется:", + "about": "О программе", + "aboutText": "Простенький интерфейс для консольной утилиты FFmpeg. \nНо я не являюсь автором самой утилиты FFmpeg.", + "addedFilesTitle": "Добавленные файлы", + "autoClearAfterAddingToQueue": "Очищать после добавления в очередь", + "buttonDownloadFFmpeg": "Скачать автоматически FFmpeg", + "buttonForSelectedDirTitle": "Сохранить в папку:", + "cancel": "Отмена", + "changeFFPath": "FFmpeg, FFprobe и FFplay", + "changeLanguage": "Поменять язык", + "checkboxOverwriteOutputFilesTitle": "Разрешить перезаписать файл", + "choose": "выбрать", + "clearAll": "Очистить список", + "completedQueue": "Готово", + "converterVideoFilesSubmitTitle": "Конвертировать", + "converterVideoFilesTitle": "Конвертер видео, аудио и картинок", + "download": "Скачать", + "downloadFFmpegFromSite": "Будет скачано с сайта:", + "downloadRun": "Скачивается...", + "dragAndDropFiles": "перетащить файлы", + "encoderGroupAudio": "Аудио", + "encoderGroupImage": "Картинки", + "encoderGroupVideo": "Видео", + "encoder_apng": "APNG image", + "encoder_bmp": "BMP image", + "encoder_flv": "FLV", + "encoder_gif": "GIF image", + "encoder_h264_nvenc": "H.264 с поддержкой NVIDIA", + "encoder_libmp3lame": "libmp3lame MP3 (MPEG audio layer 3)", + "encoder_libshine": "libshine MP3 (MPEG audio layer 3)", + "encoder_libtwolame": "libtwolame MP2 (MPEG audio layer 2)", + "encoder_libvpx": "libvpx VP8 (codec vp8)", + "encoder_libvpx-vp9": "libvpx VP9 (codec vp9)", + "encoder_libwebp": "libwebp WebP image", + "encoder_libwebp_anim": "libwebp_anim WebP image", + "encoder_libx264": "H.264 libx264", + "encoder_libx265": "H.265 libx265", + "encoder_libxvid": "libxvidcore MPEG-4 part 2", + "encoder_mjpeg": "MJPEG (Motion JPEG)", + "encoder_mp2": "MP2 (MPEG audio layer 2)", + "encoder_mp2fixed": "MP2 fixed point (MPEG audio layer 2)", + "encoder_mpeg1video": "MPEG-1", + "encoder_mpeg2video": "MPEG-2", + "encoder_mpeg4": "MPEG-4 part 2", + "encoder_msmpeg4": "MPEG-4 part 2 Microsoft variant version 3", + "encoder_msmpeg4v2": "MPEG-4 part 2 Microsoft variant version 2", + "encoder_msvideo1": "Microsoft Video-1", + "encoder_png": "PNG image", + "encoder_qtrle": "QuickTime Animation (RLE) video", + "encoder_sgi": "SGI image", + "encoder_tiff": "TIFF image", + "encoder_wmav1": "Windows Media Audio 1", + "encoder_wmav2": "Windows Media Audio 2", + "encoder_wmv1": "Windows Media Video 7", + "encoder_wmv2": "Windows Media Video 8", + "encoder_xbm": "XBM (X BitMap) image", + "error": "Произошла ошибка!", + "errorConverter": "не смогли отконвертировать видео", + "errorDragAndDropFile": "Не все файлы добавились", + "errorFFmpeg": "это не FFmpeg", + "errorFFmpegVersion": "Не смогли определить версию FFmpeg", + "errorFFplay": "это не FFplay", + "errorFFplayVersion": "Не смогли определить версию FFplay", + "errorFFprobe": "это не FFprobe", + "errorFFprobeVersion": "Не смогли определить версию FFprobe", + "errorNoFilesAddedForConversion": "Нет файлов для конвертации", + "errorQueue": "Ошибка", + "errorSelectedEncoder": "Конвертер не выбран", + "errorSelectedFolderSave": "Папка для сохранения не выбрана!", + "errorSelectedFormat": "Расширение файла не выбрана", + "exit": "Выход", + "ffmpegLGPL": "Это программное обеспечение использует библиотеки из проекта **FFmpeg** под **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**.", + "ffmpegTrademark": "**FFmpeg** — торговая марка **[Fabrice Bellard](http://bellard.org/)** , создателя проекта **[FFmpeg](https://ffmpeg.org/about.html)**.", + "fileForConversionTitle": "Файл:", + "fileQueueTitle": "Очередь", + "formPreset": "Предустановка", + "gratitude": "Благодарность", + "gratitudeText": "Я искренне благодарю вас за неоценимую\n\rи своевременную помощь:", + "help": "Справка", + "helpFFplay": "Клавиши проигрывателя FFplay", + "helpFFplayActivateFrameStepMode": "Активировать покадровый режим.", + "helpFFplayCycleVideoFiltersOrShowModes": "Цикл видеофильтров или режимов показа.", + "helpFFplayDecreaseVolume": "Уменьшить громкость.", + "helpFFplayDescription": "Описание", + "helpFFplayDoubleClickLeftMouseButton": "двойной щелчок\nлевой кнопкой мыши", + "helpFFplayIncreaseVolume": "Увеличить громкость.", + "helpFFplayKeyDown": "вниз", + "helpFFplayKeyHoldS": "держать S", + "helpFFplayKeyLeft": "лево", + "helpFFplayKeyRight": "право", + "helpFFplayKeySpace": "SPACE (пробел)", + "helpFFplayKeyUp": "вверх", + "helpFFplayKeys": "Клавиши", + "helpFFplayPause": "Поставить на паузу или продолжить проигрывать.", + "helpFFplayQuit": "Закрыть проигрыватель.", + "helpFFplaySeekBForward10Minutes": "Перемотать вперёд на 10 минут.", + "helpFFplaySeekBForward1Minute": "Перемотать вперёд на 1 минуту.", + "helpFFplaySeekBackward10Minutes": "Перемотать назад на 10 минут.", + "helpFFplaySeekBackward10Seconds": "Перемотать назад на 10 секунд.", + "helpFFplaySeekBackward1Minute": "Перемотать назад на 1 минуту.", + "helpFFplaySeekForward10Seconds": "Перемотать вперёд на 10 секунд.", + "helpFFplayToggleFullScreen": "Переключиться на полный экран или выйти с полного экрана.", + "helpFFplayToggleMute": "Отключить звук или включить звук.", + "inProgressQueue": "Выполняется", + "languageSelectionFormHead": "Переключить язык", + "languageSelectionHead": "Выберите язык", + "licenseLink": "Сведения о лицензии", + "licenseLinkOther": "Лицензии от других продуктов, которые используются в программе", + "menuSettingsLanguage": "Язык", + "menuSettingsTheme": "Тема", + "or": "или", + "parameterCheckbox": "Включить параметр", + "pathToFfmpeg": "Путь к FFmpeg:", + "pathToFfplay": "Путь к FFplay:", + "pathToFfprobe": "Путь к FFprobe:", + "preset_fast": "fast (медленней чем faster, но будет файл и меньше весить)", + "preset_faster": "faster (медленней чем veryfast, но будет файл и меньше весить)", + "preset_medium": "medium (медленней чем fast, но будет файл и меньше весить)", + "preset_placebo": "placebo (не рекомендуется)", + "preset_slow": "slow (медленней чем medium, но будет файл и меньше весить)", + "preset_slower": "slower (медленней чем slow, но будет файл и меньше весить)", + "preset_superfast": "superfast (медленней чем ultrafast, но будет файл и меньше весить)", + "preset_ultrafast": "ultrafast (быстро, но файл будет много весить)", + "preset_veryfast": "veryfast (медленней чем superfast, но будет файл и меньше весить)", + "preset_veryslow": "veryslow (медленней чем slower, но будет файл и меньше весить)", + "programmLink": "Сайт проекта", + "programmVersion": "**Версия программы:** {{.Version}}", + "queue": "Очередь", + "save": "Сохранить", + "selectEncoder": "Кодировщик:", + "selectFFPathTitle": "Укажите путь к FFmpeg и к FFprobe", + "selectFormat": "Расширение файла:", + "settings": "Настройки", + "testFF": "Проверка FFmpeg на работоспособность...", + "themesNameDark": "Тёмная", + "themesNameDefault": "По умолчанию", + "themesNameLight": "Светлая", + "titleDownloadLink": "Скачать можно от сюда", + "total": "Всего", + "unzipRun": "Распаковывается...", + "waitingQueue": "В очереди" +} \ No newline at end of file diff --git a/kernel/translations/base.en.json b/kernel/translations/base.en.json new file mode 100644 index 0000000..3f5dd3d --- /dev/null +++ b/kernel/translations/base.en.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Advanced", + "Cancel": "Cancel", + "Confirm": "Confirm", + "Copy": "Copy", + "Create Folder": "Create Folder", + "Cut": "Cut", + "Enter filename": "Enter filename", + "Error": "Error", + "Favourites": "Favourites", + "File": "File", + "Folder": "Folder", + "New Folder": "New Folder", + "No": "No", + "OK": "OK", + "Open": "Open", + "Paste": "Paste", + "Quit": "Quit", + "Redo": "Redo", + "Save": "Save", + "Select all": "Select all", + "Show Hidden Files": "Show Hidden Files", + "Undo": "Undo", + "Yes": "Yes", + "file.name": { + "other": "Name" + }, + "file.parent": { + "other": "Parent" + }, + "friday": "Friday", + "friday.short": "Fri", + "monday": "Monday", + "monday.short": "Mon", + "saturday": "Saturday", + "saturday.short": "Sat", + "sunday": "Sunday", + "sunday.short": "Sun", + "thursday": "Thursday", + "thursday.short": "Thu", + "tuesday": "Tuesday", + "tuesday.short": "Tue", + "wednesday": "Wednesday", + "wednesday.short": "Wed" +} \ No newline at end of file diff --git a/kernel/translations/base.kk.json b/kernel/translations/base.kk.json new file mode 100644 index 0000000..469566b --- /dev/null +++ b/kernel/translations/base.kk.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Кеңейтілген", + "Cancel": "Бас тарту", + "Confirm": "Растау", + "Copy": "Көшіру", + "Create Folder": "Қалта жасау", + "Cut": "Кесу", + "Enter filename": "Файл атауын енгізіңіз", + "Error": "Қате", + "Favourites": "Таңдаулылар", + "File": "Файл", + "Folder": "Қалта", + "New Folder": "Жаңа қалта", + "No": "Жоқ", + "OK": "ОК", + "Open": "Ашу", + "Paste": "Кірістіру", + "Quit": "Шығу", + "Redo": "Қайталау", + "Save": "Сақтау", + "Select all": "Барлығын таңдаңыз", + "Show Hidden Files": "Жасырын файлдарды көрсету", + "Undo": "Бас тарту", + "Yes": "Иә", + "file.name": { + "other": "Аты" + }, + "file.parent": { + "other": "Жоғары" + }, + "friday": "Жұма", + "friday.short": "Жұ", + "monday": "Дүйсенбі", + "monday.short": "Дү", + "saturday": "Сенбі", + "saturday.short": "Сен", + "sunday": "Жексенбі", + "sunday.short": "Же", + "thursday": "Сейсенбі", + "thursday.short": "Се", + "tuesday": "Бейсенбі", + "tuesday.short": "Бе", + "wednesday": "Сәрсенбі", + "wednesday.short": "Сә" +} \ No newline at end of file diff --git a/kernel/translations/base.ru.json b/kernel/translations/base.ru.json new file mode 100644 index 0000000..ac22058 --- /dev/null +++ b/kernel/translations/base.ru.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Расширенные", + "Cancel": "Отмена", + "Confirm": "Подтвердить", + "Copy": "Копировать", + "Create Folder": "Создать папку", + "Cut": "Вырезать", + "Enter filename": "Введите имя файла", + "Error": "Ошибка", + "Favourites": "Избранное", + "File": "Файл", + "Folder": "Папка", + "New Folder": "Новая папка", + "No": "Нет", + "OK": "ОК", + "Open": "Открыть", + "Paste": "Вставить", + "Quit": "Выйти", + "Redo": "Повторить", + "Save": "Сохранить", + "Select all": "Выбрать всё", + "Show Hidden Files": "Показать скрытые файлы", + "Undo": "Отменить", + "Yes": "Да", + "file.name": { + "other": "Имя" + }, + "file.parent": { + "other": "Вверх" + }, + "friday": "Пятница", + "friday.short": "Пт", + "monday": "Понедельник", + "monday.short": "Пн", + "saturday": "Суббота", + "saturday.short": "Сб", + "sunday": "Воскресенье", + "sunday.short": "Вс", + "thursday": "Вторник", + "thursday.short": "Вт", + "tuesday": "Четверг", + "tuesday.short": "Чт", + "wednesday": "Среда", + "wednesday.short": "Ср" +} \ No newline at end of file diff --git a/languages/.gitignore b/languages/.gitignore deleted file mode 100644 index bc8acef..0000000 --- a/languages/.gitignore +++ /dev/null @@ -1 +0,0 @@ -translate.*.toml diff --git a/languages/active.en.toml b/languages/active.en.toml deleted file mode 100644 index a9ab0bc..0000000 --- a/languages/active.en.toml +++ /dev/null @@ -1,563 +0,0 @@ -[AlsoUsedProgram] -hash = "sha1-a72be72e7808bb8a0144ed7a93acb29c568b1ed4" -other = "The program also uses:" - -[about] -hash = "sha1-3da0b9ef719fd707f443ac00404447f29445976f" -other = "About" - -[aboutText] -hash = "sha1-8bd565814118ba8b90c40eb5b62acf8d2676e7d6" -other = "A simple interface for the FFmpeg console utility. \nBut I am not the author of the FFmpeg utility itself." - -[addedFilesTitle] -hash = "sha1-8ba0f6e477b0d78df2cc06f1d8b41b888623b851" -other = "Added files" - -[autoClearAfterAddingToQueue] -hash = "sha1-b3781695a4c35380d2cd075bb52f27a2a6d8f19c" -other = "Auto-clear after adding to queue" - -[buttonDownloadFFmpeg] -hash = "sha1-c223c2e15171156192bc3146aee91e6094bb475b" -other = "Download FFmpeg automatically" - -[buttonForSelectedDirTitle] -hash = "sha1-8cbe5c67bcf89e4624635a79cbea104227faedda" -other = "Save to folder:" - -[cancel] -hash = "sha1-0ec753be8df955a117404fb634b01b45eb386e2a" -other = "Cancel" - -[changeFFPath] -hash = "sha1-1f704de0560f8135eb6924cd232ed919ca2e5af0" -other = "FFmpeg, FFprobe and FFplay" - -[changeLanguage] -hash = "sha1-8b276eaf378d485c769fb3d5dcc06dfc25b0c01b" -other = "Change language" - -[checkboxOverwriteOutputFilesTitle] -hash = "sha1-5860124bb781e7ef680f573fa93977e96328d4e7" -other = "Allow file to be overwritten" - -[choose] -hash = "sha1-f60bb5f761024d973834b5e9d25ceebce2c85f94" -other = "choose" - -[clearAll] -hash = "sha1-f32702d79ac206432400ac6b041695d020f6fa77" -other = "Clear List" - -[completedQueue] -hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" -other = "Completed" - -[converterVideoFilesSubmitTitle] -hash = "sha1-7ac460f3c24c9952082f2db6e4d62f752598709c" -other = "Convert" - -[converterVideoFilesTitle] -hash = "sha1-1ab29597cc9dfefab08e54ea5442e7ffa15f0394" -other = "Video, audio and picture converter" - -[download] -hash = "sha1-fe8f79f29da457de2f6bc9531de6e536e0c426ad" -other = "Download" - -[downloadFFmpegFromSite] -hash = "sha1-0889c95aa3a8659d8d903b4dab7097699c4d8aa4" -other = "Will be downloaded from the site:" - -[downloadRun] -hash = "sha1-55f87f114628fa2d5d8e67d1e1cda22c0e4f9271" -other = "Downloading..." - -[dragAndDropFiles] -hash = "sha1-07bb747cc7590d7a51cdf96dff49a74139097766" -other = "drag and drop files" - -[encoderGroupAudio] -hash = "sha1-24321cb5400df96be8f3e2131918bebdb3a01bba" -other = "Audio" - -[encoderGroupImage] -hash = "sha1-a7e528bc7ac9538aec87d1593c38b80be95d4745" -other = "Images" - -[encoderGroupVideo] -hash = "sha1-8e7b9894c7ef0f57ac0bf910f6a8aac1c8a53683" -other = "Video" - -[encoder_apng] -hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" -other = "APNG image" - -[encoder_bmp] -hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" -other = "BMP image" - -[encoder_flv] -hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" -other = "FLV" - -[encoder_gif] -hash = "sha1-d092a779172291b5215aa095390a5b11659128a4" -other = "GIF image" - -[encoder_h264_nvenc] -hash = "sha1-169389f8c4a2518410159c363378ab5c978c32e5" -other = "H.264 with NVIDIA support" - -[encoder_libmp3lame] -hash = "sha1-cd2c8d6f246c8bc18554b7105cb50b78d3cb2b98" -other = "libmp3lame MP3 (MPEG audio layer 3)" - -[encoder_libshine] -hash = "sha1-891d56c85857e5d83ef5a1fe077c1f1540788f49" -other = "libshine MP3 (MPEG audio layer 3)" - -[encoder_libtwolame] -hash = "sha1-b2f53be810b74edc3c454ac75de7ddecfee322ca" -other = "libtwolame MP2 (MPEG audio layer 2)" - -[encoder_libvpx] -hash = "sha1-b85c923aecfb48de0e87e71b6a21bfc2c547c70e" -other = "libvpx VP8 (codec vp8)" - -[encoder_libvpx-vp9] -hash = "sha1-3106417bd89bee87daa691e87614caf78cb934fe" -other = "libvpx VP9 (codec vp9)" - -[encoder_libwebp] -hash = "sha1-1d590d47d46f7880246061fce0e0de6d743db39e" -other = "libwebp WebP image" - -[encoder_libwebp_anim] -hash = "sha1-f141a9c8f23d79c13d44c30d8f34e05b363771ad" -other = "libwebp_anim WebP image" - -[encoder_libx264] -hash = "sha1-6d764ac459c0bf3c819d76618418cdfbb7a749eb" -other = "H.264 libx264" - -[encoder_libx265] -hash = "sha1-55544c166b1e15fd71a58096518e528109599eea" -other = "H.265 libx265" - -[encoder_libxvid] -hash = "sha1-d4bed46d6cdd2bfa8fd1689801164a83ab10c3f5" -other = "libxvidcore MPEG-4 part 2" - -[encoder_mjpeg] -hash = "sha1-94ba63a322b493a04da65e566781fe1cf8bb0d50" -other = "MJPEG (Motion JPEG)" - -[encoder_mp2] -hash = "sha1-a9154b7203349e5d6fbfd67d1ea97715f54b2065" -other = "MP2 (MPEG audio layer 2)" - -[encoder_mp2fixed] -hash = "sha1-dd2ee670d8bc8a60a96a717ebd26f16b5748cf3f" -other = "MP2 fixed point (MPEG audio layer 2)" - -[encoder_mpeg1video] -hash = "sha1-30043660719a3cb19dab5c33450665a8a9cc1c01" -other = "MPEG-1" - -[encoder_mpeg2video] -hash = "sha1-ccb2dcd8510cfdc9d52e5258af1863e5f2c51e77" -other = "MPEG-2" - -[encoder_mpeg4] -hash = "sha1-67fe42f18421b2f6c90fcdc579f9199bfca4b182" -other = "MPEG-4 part 2" - -[encoder_msmpeg4] -hash = "sha1-313ee597e4f0d9bd63a2bc6ac1618f028aef76f4" -other = "MPEG-4 part 2 Microsoft variant version 3" - -[encoder_msmpeg4v2] -hash = "sha1-adc442ce88f2717693b2da3010a1937d77ee522f" -other = "MPEG-4 part 2 Microsoft variant version 2" - -[encoder_msvideo1] -hash = "sha1-00f43ac0dc162bca10e0d98d6b70c0c6a902f66f" -other = "Microsoft Video-1" - -[encoder_png] -hash = "sha1-6715d4b82f5d9dfe3e53e30b402ffa1a6fbf30a5" -other = "PNG image" - -[encoder_qtrle] -hash = "sha1-31bf155cffaf6842ebc54084e4337ca08fdd9848" -other = "QuickTime Animation (RLE) video" - -[encoder_sgi] -hash = "sha1-f4510e237f7fc3c02caa728f9e500f4b069f9c11" -other = "SGI image" - -[encoder_tiff] -hash = "sha1-ed09d78c38e0b17ed695f35740c756dd7340eeac" -other = "TIFF image" - -[encoder_wmav1] -hash = "sha1-cd4a4c5eeac694b6699d55d0f9b477b3b50f18c7" -other = "Windows Media Audio 1" - -[encoder_wmav2] -hash = "sha1-eb2e5306cb33a702577ecfbdca0461862c66c053" -other = "Windows Media Audio 2" - -[encoder_wmv1] -hash = "sha1-f9b748554c590c36a56bcba2cd317196b7bdeddb" -other = "Windows Media Video 7" - -[encoder_wmv2] -hash = "sha1-5b21c87f5c6104797ead60b488b2948428f6b1b7" -other = "Windows Media Video 8" - -[encoder_xbm] -hash = "sha1-2dfc35881da62e9a1379d8238cf7839b24f79566" -other = "XBM (X BitMap) image" - -[error] -hash = "sha1-a7df8f8b5d754f226ac4cb320577fe692b33e483" -other = "An error has occurred!" - -[errorConverter] -hash = "sha1-55ebddceddb8b044e33cc3893ec2eba7bbd9fcf9" -other = "Couldn't convert video" - -[errorDragAndDropFile] -hash = "sha1-863cf1ad9c820d5b0c2006ceeaa29e25f81c1714" -other = "Not all files were added" - -[errorFFmpeg] -hash = "sha1-ccf0b95c0d1b392dc215258d917eb4e5d0b88ed0" -other = "this is not FFmpeg" - -[errorFFmpegVersion] -hash = "sha1-9a4148d42186b6b32cf83bef726e23022c53283f" -other = "Could not determine FFmpeg version" - -[errorFFplay] -hash = "sha1-988122112ac6002094e25518cfb5f0d606217298" -other = "this is not FFplay" - -[errorFFplayVersion] -hash = "sha1-cd60928d20d93210e103dd464306ab138bf1b184" -other = "Could not determine FFplay version" - -[errorFFprobe] -hash = "sha1-86d1b0b4c4ccd6a4f71e758fc67ce11aff4ba9b8" -other = "this is not FFprobe" - -[errorFFprobeVersion] -hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" -other = "Failed to determine FFprobe version" - -[errorNoFilesAddedForConversion] -hash = "sha1-5cf1f65bef15cb0382e56be98f44c6abde56a314" -other = "There are no files to convert" - -[errorQueue] -hash = "sha1-72aecd9ad85642d84d62dbbf3cf70953c5f696c7" -other = "Error" - -[errorSelectedEncoder] -hash = "sha1-33ed1aaf4cb3c2ee9d8f8c325b9b75d16ddf9979" -other = "Converter not selected" - -[errorSelectedFolderSave] -hash = "sha1-16f3ef93ee36813fdd79d8fb9bb7fc02acbb94a8" -other = "No save folder selected!" - -[errorSelectedFormat] -hash = "sha1-cda92c56a1ef1aabc92bbfc405ede8ab13087e66" -other = "File extension not selected" - -[exit] -hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f" -other = "Exit" - -[ffmpegLGPL] -hash = "sha1-d395b16cc8f8eab98a8a970307c5b010ba22dde6" -other = "This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**." - -[ffmpegTrademark] -hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" -other = "**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project." - -[fileForConversionTitle] -hash = "sha1-96ac799e1086b31fd8f5f8d4c801829d6c853f08" -other = "File:" - -[fileQueueTitle] -hash = "sha1-aec93b16baeaf55fed871075c9494a460e4a91b8" -other = "Queue" - -[formPreset] -hash = "sha1-7759891ba1ef9f7adc70defc7ac18fbf149c1a68" -other = "Preset" - -[gratitude] -hash = "sha1-51968fc38e53a9a11c861126c62404674fd6096f" -other = "Gratitude" - -[gratitudeText] -hash = "sha1-cb343e4d39ca31e6da6f72b9394cc915cb7d1258" -other = "I sincerely thank you for your invaluable\n\r and timely assistance:" - -[help] -hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" -other = "Help" - -[helpFFplay] -hash = "sha1-ecc294b8b3d217ee1c2d63dc2f0253c3d1b3712c" -other = "FFplay Player Keys" - -[helpFFplayActivateFrameStepMode] -hash = "sha1-f47ede90932d69465f6197cb2a7cc4d1e3ab150e" -other = "Activate frame-by-frame mode." - -[helpFFplayCycleVideoFiltersOrShowModes] -hash = "sha1-83bb702c777e4768cdc326a668d541c23ab759b7" -other = "A cycle of video filters or display modes." - -[helpFFplayDecreaseVolume] -hash = "sha1-de28db96a9c22be885ec5067a13f8f17fd3954bc" -other = "Decrease the volume." - -[helpFFplayDescription] -hash = "sha1-f5441f6aee76222c4120066575e80c2d177ac3c0" -other = "Description" - -[helpFFplayDoubleClickLeftMouseButton] -hash = "sha1-2657aa576055769952dfcde570fc9b4765d594ad" -other = "double click\nleft mouse button" - -[helpFFplayIncreaseVolume] -hash = "sha1-8ba7bde2d9a80f4a7cd122cf4973975698d3bd34" -other = "Increase the volume." - -[helpFFplayKeyDown] -hash = "sha1-c5aefd2f8c6908a69b08fe4a2d235b1ae0113470" -other = "down" - -[helpFFplayKeyHoldS] -hash = "sha1-89c5dd8287c15b3f40db66e06b038c34a715f02f" -other = "hold S" - -[helpFFplayKeyLeft] -hash = "sha1-feb671890703fb0300a436744d34018bbc7ba13a" -other = "left" - -[helpFFplayKeyRight] -hash = "sha1-a4f025d4bf7f90ee5bec6c48b2710bc9c5bbb267" -other = "right" - -[helpFFplayKeySpace] -hash = "sha1-a367ad00358ec44edc1d54a96df6f9114b0f8697" -other = "SPACE" - -[helpFFplayKeyUp] -hash = "sha1-e4845aa8c0e100a80eaf65446c59085236fd2098" -other = "up" - -[helpFFplayKeys] -hash = "sha1-0ad272ade8c568f394499f1492ecfab56e701e5d" -other = "Keys" - -[helpFFplayPause] -hash = "sha1-e83e107900fde0c39295f599c2cf8fba8d8cb604" -other = "Pause or continue playing." - -[helpFFplayQuit] -hash = "sha1-70785a2fd5d5a6519b7439f0d8cfcd7d54c5771d" -other = "Close the player." - -[helpFFplaySeekBForward10Minutes] -hash = "sha1-58ed63343376240f2596e447b5245c1805f35234" -other = "Fast forward 10 minutes." - -[helpFFplaySeekBForward1Minute] -hash = "sha1-3fe46b8d5413b7fdc53ae9ed9427bcb1769ec74c" -other = "Fast forward 1 minute." - -[helpFFplaySeekBackward10Minutes] -hash = "sha1-927dffe9af72ffd40f46873b452a4c90627bccf8" -other = "Rewind 10 minutes." - -[helpFFplaySeekBackward10Seconds] -hash = "sha1-e97615ecec0f8cf5647e8802bdda38dc2b0d809f" -other = "Rewind 10 seconds." - -[helpFFplaySeekBackward1Minute] -hash = "sha1-5b19e280a0850122c8ebc80c622491bb09520e1a" -other = "Rewind 1 minute." - -[helpFFplaySeekForward10Seconds] -hash = "sha1-8d840251d4a1668edaea3515df197a8a79031ec3" -other = "Fast forward 10 seconds." - -[helpFFplayToggleFullScreen] -hash = "sha1-d32df02849258c5b02f15e5711f54ee6a8a75fd4" -other = "Switch to full screen or exit full screen." - -[helpFFplayToggleMute] -hash = "sha1-4bdbb124fe8de3a8037c1e74719e9600b21b25ab" -other = "Mute or unmute." - -[inProgressQueue] -hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" -other = "In Progress" - -[languageSelectionFormHead] -hash = "sha1-0ff5fa82cf684112660128cba1711297acf11003" -other = "Switch language" - -[languageSelectionHead] -hash = "sha1-daf1108fc10d3b1a908288d611f749b3cc651e4b" -other = "Choose language" - -[licenseLink] -hash = "sha1-ea18ab849f0eea030d770da82c2a6b3484a7bd13" -other = "License information" - -[licenseLinkOther] -hash = "sha1-359fff328717c05104e51a2d29f05bf1875d26b7" -other = "Licenses from other products used in the program" - -[menuSettingsLanguage] -hash = "sha1-ed3f0e507a5b4ed0649d7c768fe0d47413d839ba" -other = "Language" - -[menuSettingsTheme] -hash = "sha1-553c45f1b84a92b08dc1f088c13f924cde95765e" -other = "Theme" - -[or] -hash = "sha1-30bb0333ca1583110e4ced513b5d2455b86f529b" -other = "or" - -[parameterCheckbox] -hash = "sha1-9e35221d454870996fd51d576249cf47d1784a3c" -other = "Enable option" - -[pathToFfmpeg] -hash = "sha1-fafc50f1db0f720fe83a96cd70a9e1ad824e96b6" -other = "Path to FFmpeg:" - -[pathToFfplay] -hash = "sha1-5389830dd75a63aa8a5e41e8f07c5fadd8385398" -other = "Path to FFplay:" - -[pathToFfprobe] -hash = "sha1-b872edc9633a2e81ef678dc46fe46a7e91732024" -other = "Path to FFprobe:" - -[preset_fast] -hash = "sha1-935e1ac9d3c8ba4478326c909ba66662acb0540e" -other = "fast (slower than \"faster\", but the file will weigh less)" - -[preset_faster] -hash = "sha1-98620b73c896440c39ea6ec4b9b19d41301c9a7e" -other = "faster (slower than \"veryfast\", but the file will weigh less)" - -[preset_medium] -hash = "sha1-f7d1c30135c22c2f07c247075c0df103bb3c3ea5" -other = "medium (slower than \"fast\", but the file will weigh less)" - -[preset_placebo] -hash = "sha1-7bcff099104bb192881139e6404981bd426b3f91" -other = "placebo (not recommended)" - -[preset_slow] -hash = "sha1-681bf587275a45b48af49bb2ad8f0947919530e7" -other = "slow (slower than \"medium\", but the file will weigh less)" - -[preset_slower] -hash = "sha1-d1c692ee2b7643ae2c71a48bea880327a3c6b1e3" -other = "slower (slower than \"slow\", but the file will weigh less)" - -[preset_superfast] -hash = "sha1-41c39959e8f1547cc9259a5b459c4ccbf368cc23" -other = "superfast (slower than \"ultrafast\", but the file will weigh less)" - -[preset_ultrafast] -hash = "sha1-dfed981573ac2046832f9a9450bc9388958753fa" -other = "ultrafast (fast, but the file will weigh a lot)" - -[preset_veryfast] -hash = "sha1-370b82509887d02d7a2ef9b110df4616b16123ce" -other = "veryfast (slower than \"superfast\", but the file will weigh less)" - -[preset_veryslow] -hash = "sha1-d428bfa6deea9dd5c7c1f80ceba24e123ae96d0d" -other = "veryslow (slower than \"slower\", but the file will weigh less)" - -[programmLink] -hash = "sha1-18f9a3fad6aacefe1b05eed23122800b391ff5ca" -other = "Project website" - -[programmVersion] -hash = "sha1-fa2e4994a301bb24bc2a8fa166e5486ea95a7475" -other = "**Program version:** {{.Version}}" - -[queue] -hash = "sha1-aec93b16baeaf55fed871075c9494a460e4a91b8" -other = "Queue" - -[save] -hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc" -other = "Save" - -[selectEncoder] -hash = "sha1-88f3670b09758a3336057520a215058d61006abd" -other = "Encoder:" - -[selectFFPathTitle] -hash = "sha1-95581446a28d968ff1a027c623159a7eb08654cf" -other = "Specify the path to FFmpeg and FFprobe" - -[selectFormat] -hash = "sha1-f3809b0b48886570cd4cf1d7099de6da5b6d4524" -other = "File extension:" - -[settings] -hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f" -other = "Settings" - -[testFF] -hash = "sha1-f5b8ed88e9609963035d2235be0a79bbec619976" -other = "Checking FFmpeg for serviceability..." - -[themesNameDark] -hash = "sha1-bd16b234708a2515a9f2d0ca41fb11e7fe8a38a2" -other = "Dark" - -[themesNameDefault] -hash = "sha1-469631cb165dcbbfea9e747056c25fbccb28c481" -other = "Default" - -[themesNameLight] -hash = "sha1-8080010c5e7d7edf56e89a99d8a2422898417845" -other = "Light" - -[titleDownloadLink] -hash = "sha1-92df86371f6c3a06ca1e4754f113142776a32d49" -other = "You can download it from here" - -[total] -hash = "sha1-3b5143902e0c5c84459aedf918e17604d9735b94" -other = "Total" - -[unzipRun] -hash = "sha1-c554dad13026668a1f6adf3171837c5d51bbac36" -other = "Unpacked..." - -[waitingQueue] -hash = "sha1-307429dd84150877080c4bbff2b340d1e7dadff2" -other = "Waiting" diff --git a/languages/active.kk.toml b/languages/active.kk.toml deleted file mode 100644 index 100be4c..0000000 --- a/languages/active.kk.toml +++ /dev/null @@ -1,563 +0,0 @@ -[AlsoUsedProgram] -hash = "sha1-a72be72e7808bb8a0144ed7a93acb29c568b1ed4" -other = "Бағдарлама сонымен қатар пайдаланады:" - -[about] -hash = "sha1-3da0b9ef719fd707f443ac00404447f29445976f" -other = "Бағдарлама туралы" - -[aboutText] -hash = "sha1-8bd565814118ba8b90c40eb5b62acf8d2676e7d6" -other = "FFmpeg консоль утилитасы үшін қарапайым интерфейс. \nБірақ мен FFmpeg утилитасының авторы емеспін." - -[addedFilesTitle] -hash = "sha1-8ba0f6e477b0d78df2cc06f1d8b41b888623b851" -other = "Қосылған файлдар" - -[autoClearAfterAddingToQueue] -hash = "sha1-b3781695a4c35380d2cd075bb52f27a2a6d8f19c" -other = "Кезекке қосқаннан кейін тазалаңыз" - -[buttonDownloadFFmpeg] -hash = "sha1-c223c2e15171156192bc3146aee91e6094bb475b" -other = "FFmpeg автоматты түрде жүктеп алыңыз" - -[buttonForSelectedDirTitle] -hash = "sha1-8cbe5c67bcf89e4624635a79cbea104227faedda" -other = "Қалтаға сақтаңыз:" - -[cancel] -hash = "sha1-0ec753be8df955a117404fb634b01b45eb386e2a" -other = "Болдырмау" - -[changeFFPath] -hash = "sha1-1f704de0560f8135eb6924cd232ed919ca2e5af0" -other = "FFmpeg, FFprobe және FFplay" - -[changeLanguage] -hash = "sha1-8b276eaf378d485c769fb3d5dcc06dfc25b0c01b" -other = "Тілді өзгерту" - -[checkboxOverwriteOutputFilesTitle] -hash = "sha1-5860124bb781e7ef680f573fa93977e96328d4e7" -other = "Файлды қайта жазуға рұқсат беріңіз" - -[choose] -hash = "sha1-f60bb5f761024d973834b5e9d25ceebce2c85f94" -other = "таңдау" - -[clearAll] -hash = "sha1-f32702d79ac206432400ac6b041695d020f6fa77" -other = "Тізімді өшіру" - -[completedQueue] -hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" -other = "Дайын" - -[converterVideoFilesSubmitTitle] -hash = "sha1-7ac460f3c24c9952082f2db6e4d62f752598709c" -other = "Файлды түрлендіру" - -[converterVideoFilesTitle] -hash = "sha1-1ab29597cc9dfefab08e54ea5442e7ffa15f0394" -other = "Бейне, аудио және суретті түрлендіргіш" - -[download] -hash = "sha1-fe8f79f29da457de2f6bc9531de6e536e0c426ad" -other = "Жүктеп алу" - -[downloadFFmpegFromSite] -hash = "sha1-0889c95aa3a8659d8d903b4dab7097699c4d8aa4" -other = "Сайттан жүктеледі:" - -[downloadRun] -hash = "sha1-55f87f114628fa2d5d8e67d1e1cda22c0e4f9271" -other = "Жүктеп алынуда..." - -[dragAndDropFiles] -hash = "sha1-07bb747cc7590d7a51cdf96dff49a74139097766" -other = "файлдарды сүйреп апарыңыз" - -[encoderGroupAudio] -hash = "sha1-24321cb5400df96be8f3e2131918bebdb3a01bba" -other = "Аудио" - -[encoderGroupImage] -hash = "sha1-a7e528bc7ac9538aec87d1593c38b80be95d4745" -other = "Суреттер" - -[encoderGroupVideo] -hash = "sha1-8e7b9894c7ef0f57ac0bf910f6a8aac1c8a53683" -other = "Бейне" - -[encoder_apng] -hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" -other = "APNG image" - -[encoder_bmp] -hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" -other = "BMP image" - -[encoder_flv] -hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" -other = "FLV" - -[encoder_gif] -hash = "sha1-d092a779172291b5215aa095390a5b11659128a4" -other = "GIF image" - -[encoder_h264_nvenc] -hash = "sha1-169389f8c4a2518410159c363378ab5c978c32e5" -other = "NVIDIA қолдауымен H.264" - -[encoder_libmp3lame] -hash = "sha1-cd2c8d6f246c8bc18554b7105cb50b78d3cb2b98" -other = "libmp3lame MP3 (MPEG audio layer 3)" - -[encoder_libshine] -hash = "sha1-891d56c85857e5d83ef5a1fe077c1f1540788f49" -other = "libshine MP3 (MPEG audio layer 3)" - -[encoder_libtwolame] -hash = "sha1-b2f53be810b74edc3c454ac75de7ddecfee322ca" -other = "libtwolame MP2 (MPEG audio layer 2)" - -[encoder_libvpx] -hash = "sha1-b85c923aecfb48de0e87e71b6a21bfc2c547c70e" -other = "libvpx VP8 (codec vp8)" - -[encoder_libvpx-vp9] -hash = "sha1-3106417bd89bee87daa691e87614caf78cb934fe" -other = "libvpx VP9 (codec vp9)" - -[encoder_libwebp] -hash = "sha1-1d590d47d46f7880246061fce0e0de6d743db39e" -other = "libwebp WebP image" - -[encoder_libwebp_anim] -hash = "sha1-f141a9c8f23d79c13d44c30d8f34e05b363771ad" -other = "libwebp_anim WebP image" - -[encoder_libx264] -hash = "sha1-6d764ac459c0bf3c819d76618418cdfbb7a749eb" -other = "H.264 libx264" - -[encoder_libx265] -hash = "sha1-55544c166b1e15fd71a58096518e528109599eea" -other = "H.265 libx265" - -[encoder_libxvid] -hash = "sha1-d4bed46d6cdd2bfa8fd1689801164a83ab10c3f5" -other = "libxvidcore MPEG-4 part 2" - -[encoder_mjpeg] -hash = "sha1-94ba63a322b493a04da65e566781fe1cf8bb0d50" -other = "MJPEG (Motion JPEG)" - -[encoder_mp2] -hash = "sha1-a9154b7203349e5d6fbfd67d1ea97715f54b2065" -other = "MP2 (MPEG audio layer 2)" - -[encoder_mp2fixed] -hash = "sha1-dd2ee670d8bc8a60a96a717ebd26f16b5748cf3f" -other = "MP2 fixed point (MPEG audio layer 2)" - -[encoder_mpeg1video] -hash = "sha1-30043660719a3cb19dab5c33450665a8a9cc1c01" -other = "MPEG-1" - -[encoder_mpeg2video] -hash = "sha1-ccb2dcd8510cfdc9d52e5258af1863e5f2c51e77" -other = "MPEG-2" - -[encoder_mpeg4] -hash = "sha1-67fe42f18421b2f6c90fcdc579f9199bfca4b182" -other = "MPEG-4 part 2" - -[encoder_msmpeg4] -hash = "sha1-313ee597e4f0d9bd63a2bc6ac1618f028aef76f4" -other = "MPEG-4 part 2 Microsoft variant version 3" - -[encoder_msmpeg4v2] -hash = "sha1-adc442ce88f2717693b2da3010a1937d77ee522f" -other = "MPEG-4 part 2 Microsoft variant version 2" - -[encoder_msvideo1] -hash = "sha1-00f43ac0dc162bca10e0d98d6b70c0c6a902f66f" -other = "Microsoft Video-1" - -[encoder_png] -hash = "sha1-6715d4b82f5d9dfe3e53e30b402ffa1a6fbf30a5" -other = "PNG image" - -[encoder_qtrle] -hash = "sha1-31bf155cffaf6842ebc54084e4337ca08fdd9848" -other = "QuickTime Animation (RLE) video" - -[encoder_sgi] -hash = "sha1-f4510e237f7fc3c02caa728f9e500f4b069f9c11" -other = "SGI image" - -[encoder_tiff] -hash = "sha1-ed09d78c38e0b17ed695f35740c756dd7340eeac" -other = "TIFF image" - -[encoder_wmav1] -hash = "sha1-cd4a4c5eeac694b6699d55d0f9b477b3b50f18c7" -other = "Windows Media Audio 1" - -[encoder_wmav2] -hash = "sha1-eb2e5306cb33a702577ecfbdca0461862c66c053" -other = "Windows Media Audio 2" - -[encoder_wmv1] -hash = "sha1-f9b748554c590c36a56bcba2cd317196b7bdeddb" -other = "Windows Media Video 7" - -[encoder_wmv2] -hash = "sha1-5b21c87f5c6104797ead60b488b2948428f6b1b7" -other = "Windows Media Video 8" - -[encoder_xbm] -hash = "sha1-2dfc35881da62e9a1379d8238cf7839b24f79566" -other = "XBM (X BitMap) image" - -[error] -hash = "sha1-a7df8f8b5d754f226ac4cb320577fe692b33e483" -other = "Қате орын алды!" - -[errorConverter] -hash = "sha1-55ebddceddb8b044e33cc3893ec2eba7bbd9fcf9" -other = "Бейнені түрлендіру мүмкін болмады" - -[errorDragAndDropFile] -hash = "sha1-863cf1ad9c820d5b0c2006ceeaa29e25f81c1714" -other = "Барлық файлдар қосылмаған" - -[errorFFmpeg] -hash = "sha1-ccf0b95c0d1b392dc215258d917eb4e5d0b88ed0" -other = "бұл FFmpeg емес" - -[errorFFmpegVersion] -hash = "sha1-9a4148d42186b6b32cf83bef726e23022c53283f" -other = "FFmpeg нұсқасын анықтау мүмкін болмады" - -[errorFFplay] -hash = "sha1-988122112ac6002094e25518cfb5f0d606217298" -other = "бұл FFplay емес" - -[errorFFplayVersion] -hash = "sha1-cd60928d20d93210e103dd464306ab138bf1b184" -other = "FFplay нұсқасын анықтау мүмкін болмады" - -[errorFFprobe] -hash = "sha1-86d1b0b4c4ccd6a4f71e758fc67ce11aff4ba9b8" -other = "бұл FFprobe емес" - -[errorFFprobeVersion] -hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" -other = "FFprobe нұсқасын анықтау мүмкін болмады" - -[errorNoFilesAddedForConversion] -hash = "sha1-5cf1f65bef15cb0382e56be98f44c6abde56a314" -other = "Түрлендіруге арналған файлдар жоқ" - -[errorQueue] -hash = "sha1-72aecd9ad85642d84d62dbbf3cf70953c5f696c7" -other = "Қате" - -[errorSelectedEncoder] -hash = "sha1-33ed1aaf4cb3c2ee9d8f8c325b9b75d16ddf9979" -other = "Түрлендіргіш таңдалмаған" - -[errorSelectedFolderSave] -hash = "sha1-16f3ef93ee36813fdd79d8fb9bb7fc02acbb94a8" -other = "Сақтау қалтасы таңдалмаған!" - -[errorSelectedFormat] -hash = "sha1-cda92c56a1ef1aabc92bbfc405ede8ab13087e66" -other = "Файл кеңейтімі таңдалмаған" - -[exit] -hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f" -other = "Шығу" - -[ffmpegLGPL] -hash = "sha1-d395b16cc8f8eab98a8a970307c5b010ba22dde6" -other = "Бұл бағдарламалық құрал **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)** астында **FFmpeg** жобасының кітапханаларын пайдаланады." - -[ffmpegTrademark] -hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" -other = "FFmpeg — **[FFmpeg](https://ffmpeg.org/about.html)** жобасын жасаушы **[Fabrice Bellard](http://bellard.org/)** сауда белгісі." - -[fileForConversionTitle] -hash = "sha1-96ac799e1086b31fd8f5f8d4c801829d6c853f08" -other = "Файл:" - -[fileQueueTitle] -hash = "sha1-aec93b16baeaf55fed871075c9494a460e4a91b8" -other = "Кезек" - -[formPreset] -hash = "sha1-7759891ba1ef9f7adc70defc7ac18fbf149c1a68" -other = "Алдын ала орнатылған" - -[gratitude] -hash = "sha1-51968fc38e53a9a11c861126c62404674fd6096f" -other = "Алғыс" - -[gratitudeText] -hash = "sha1-cb343e4d39ca31e6da6f72b9394cc915cb7d1258" -other = "Сізге баға жетпес және уақтылы көмектескеніңіз\n\r үшін шын жүректен алғыс айтамын:" - -[help] -hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" -other = "Анықтама" - -[helpFFplay] -hash = "sha1-ecc294b8b3d217ee1c2d63dc2f0253c3d1b3712c" -other = "FFplay ойнатқышының пернелері" - -[helpFFplayActivateFrameStepMode] -hash = "sha1-f47ede90932d69465f6197cb2a7cc4d1e3ab150e" -other = "Уақыт аралығын іске қосыңыз." - -[helpFFplayCycleVideoFiltersOrShowModes] -hash = "sha1-83bb702c777e4768cdc326a668d541c23ab759b7" -other = "Бейне сүзгілерінің немесе дисплей режимдерінің циклі." - -[helpFFplayDecreaseVolume] -hash = "sha1-de28db96a9c22be885ec5067a13f8f17fd3954bc" -other = "Дыбыс деңгейін төмендетіңіз." - -[helpFFplayDescription] -hash = "sha1-f5441f6aee76222c4120066575e80c2d177ac3c0" -other = "Сипаттама" - -[helpFFplayDoubleClickLeftMouseButton] -hash = "sha1-2657aa576055769952dfcde570fc9b4765d594ad" -other = "тінтуірдің сол жақ\nбатырмасын екі рет басу" - -[helpFFplayIncreaseVolume] -hash = "sha1-8ba7bde2d9a80f4a7cd122cf4973975698d3bd34" -other = "Дыбыс деңгейін арттыру." - -[helpFFplayKeyDown] -hash = "sha1-c5aefd2f8c6908a69b08fe4a2d235b1ae0113470" -other = "төмен" - -[helpFFplayKeyHoldS] -hash = "sha1-89c5dd8287c15b3f40db66e06b038c34a715f02f" -other = "ұстау S" - -[helpFFplayKeyLeft] -hash = "sha1-feb671890703fb0300a436744d34018bbc7ba13a" -other = "сол" - -[helpFFplayKeyRight] -hash = "sha1-a4f025d4bf7f90ee5bec6c48b2710bc9c5bbb267" -other = "құқық" - -[helpFFplayKeySpace] -hash = "sha1-a367ad00358ec44edc1d54a96df6f9114b0f8697" -other = "SPACE (пробел)" - -[helpFFplayKeyUp] -hash = "sha1-e4845aa8c0e100a80eaf65446c59085236fd2098" -other = "жоғары" - -[helpFFplayKeys] -hash = "sha1-0ad272ade8c568f394499f1492ecfab56e701e5d" -other = "Кілттер" - -[helpFFplayPause] -hash = "sha1-e83e107900fde0c39295f599c2cf8fba8d8cb604" -other = "Кідіртіңіз немесе жоғалтуды жалғастырыңыз." - -[helpFFplayQuit] -hash = "sha1-70785a2fd5d5a6519b7439f0d8cfcd7d54c5771d" -other = "Ойнатқышты жабыңыз." - -[helpFFplaySeekBForward10Minutes] -hash = "sha1-58ed63343376240f2596e447b5245c1805f35234" -other = "10 минутқа алға айналдырыңыз." - -[helpFFplaySeekBForward1Minute] -hash = "sha1-3fe46b8d5413b7fdc53ae9ed9427bcb1769ec74c" -other = "1 минутқа алға айналдырыңыз." - -[helpFFplaySeekBackward10Minutes] -hash = "sha1-927dffe9af72ffd40f46873b452a4c90627bccf8" -other = "10 минутқа артқа айналдырыңыз." - -[helpFFplaySeekBackward10Seconds] -hash = "sha1-e97615ecec0f8cf5647e8802bdda38dc2b0d809f" -other = "10 секундқа артқа айналдырыңыз." - -[helpFFplaySeekBackward1Minute] -hash = "sha1-5b19e280a0850122c8ebc80c622491bb09520e1a" -other = "1 минутқа артқа айналдырыңыз." - -[helpFFplaySeekForward10Seconds] -hash = "sha1-8d840251d4a1668edaea3515df197a8a79031ec3" -other = "10 секунд алға айналдырыңыз." - -[helpFFplayToggleFullScreen] -hash = "sha1-d32df02849258c5b02f15e5711f54ee6a8a75fd4" -other = "Толық экранға ауысу немесе толық экраннан шығу." - -[helpFFplayToggleMute] -hash = "sha1-4bdbb124fe8de3a8037c1e74719e9600b21b25ab" -other = "Дыбысты өшіріңіз немесе дыбысты қосыңыз." - -[inProgressQueue] -hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" -other = "Орындалуда" - -[languageSelectionFormHead] -hash = "sha1-0ff5fa82cf684112660128cba1711297acf11003" -other = "Тілді ауыстыру" - -[languageSelectionHead] -hash = "sha1-daf1108fc10d3b1a908288d611f749b3cc651e4b" -other = "Тілді таңдаңыз" - -[licenseLink] -hash = "sha1-ea18ab849f0eea030d770da82c2a6b3484a7bd13" -other = "Лицензия туралы ақпарат" - -[licenseLinkOther] -hash = "sha1-359fff328717c05104e51a2d29f05bf1875d26b7" -other = "Бағдарламада пайдаланылатын басқа өнімдердің лицензиялары" - -[menuSettingsLanguage] -hash = "sha1-ed3f0e507a5b4ed0649d7c768fe0d47413d839ba" -other = "Тіл" - -[menuSettingsTheme] -hash = "sha1-553c45f1b84a92b08dc1f088c13f924cde95765e" -other = "Тақырып" - -[or] -hash = "sha1-30bb0333ca1583110e4ced513b5d2455b86f529b" -other = "немесе" - -[parameterCheckbox] -hash = "sha1-9e35221d454870996fd51d576249cf47d1784a3c" -other = "Опцияны қосу" - -[pathToFfmpeg] -hash = "sha1-fafc50f1db0f720fe83a96cd70a9e1ad824e96b6" -other = "FFmpeg жол:" - -[pathToFfplay] -hash = "sha1-5389830dd75a63aa8a5e41e8f07c5fadd8385398" -other = "FFplay жол:" - -[pathToFfprobe] -hash = "sha1-b872edc9633a2e81ef678dc46fe46a7e91732024" -other = "FFprobe жол:" - -[preset_fast] -hash = "sha1-935e1ac9d3c8ba4478326c909ba66662acb0540e" -other = "fast («faster» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_faster] -hash = "sha1-98620b73c896440c39ea6ec4b9b19d41301c9a7e" -other = "faster («veryfast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_medium] -hash = "sha1-f7d1c30135c22c2f07c247075c0df103bb3c3ea5" -other = "medium («fast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_placebo] -hash = "sha1-7bcff099104bb192881139e6404981bd426b3f91" -other = "placebo (ұсынылмайды)" - -[preset_slow] -hash = "sha1-681bf587275a45b48af49bb2ad8f0947919530e7" -other = "slow («medium» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_slower] -hash = "sha1-d1c692ee2b7643ae2c71a48bea880327a3c6b1e3" -other = "slower («slow» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_superfast] -hash = "sha1-41c39959e8f1547cc9259a5b459c4ccbf368cc23" -other = "superfast («ultrafast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_ultrafast] -hash = "sha1-dfed981573ac2046832f9a9450bc9388958753fa" -other = "ultrafast (жылдам, бірақ файлдың салмағы көп болады)" - -[preset_veryfast] -hash = "sha1-370b82509887d02d7a2ef9b110df4616b16123ce" -other = "veryfast («superfast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[preset_veryslow] -hash = "sha1-d428bfa6deea9dd5c7c1f80ceba24e123ae96d0d" -other = "veryslow («slower» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)" - -[programmLink] -hash = "sha1-18f9a3fad6aacefe1b05eed23122800b391ff5ca" -other = "Жобаның веб-сайты" - -[programmVersion] -hash = "sha1-fa2e4994a301bb24bc2a8fa166e5486ea95a7475" -other = "**Бағдарлама нұсқасы:** {{.Version}}" - -[queue] -hash = "sha1-aec93b16baeaf55fed871075c9494a460e4a91b8" -other = "Кезек" - -[save] -hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc" -other = "Сақтау" - -[selectEncoder] -hash = "sha1-88f3670b09758a3336057520a215058d61006abd" -other = "Кодировщик:" - -[selectFFPathTitle] -hash = "sha1-95581446a28d968ff1a027c623159a7eb08654cf" -other = "FFmpeg және FFprobe жолын көрсетіңіз" - -[selectFormat] -hash = "sha1-f3809b0b48886570cd4cf1d7099de6da5b6d4524" -other = "Файл кеңейтімі:" - -[settings] -hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f" -other = "Параметрлер" - -[testFF] -hash = "sha1-f5b8ed88e9609963035d2235be0a79bbec619976" -other = "FFmpeg функционалдығы тексерілуде..." - -[themesNameDark] -hash = "sha1-bd16b234708a2515a9f2d0ca41fb11e7fe8a38a2" -other = "Қараңғы тақырып" - -[themesNameDefault] -hash = "sha1-469631cb165dcbbfea9e747056c25fbccb28c481" -other = "Әдепкі бойынша" - -[themesNameLight] -hash = "sha1-8080010c5e7d7edf56e89a99d8a2422898417845" -other = "Жеңіл тақырып" - -[titleDownloadLink] -hash = "sha1-92df86371f6c3a06ca1e4754f113142776a32d49" -other = "Сіз оны осы жерден жүктей аласыз" - -[total] -hash = "sha1-3b5143902e0c5c84459aedf918e17604d9735b94" -other = "Барлығы" - -[unzipRun] -hash = "sha1-c554dad13026668a1f6adf3171837c5d51bbac36" -other = "Орамнан шығарылуда..." - -[waitingQueue] -hash = "sha1-307429dd84150877080c4bbff2b340d1e7dadff2" -other = "Күту" diff --git a/languages/active.ru.toml b/languages/active.ru.toml deleted file mode 100644 index 0609a33..0000000 --- a/languages/active.ru.toml +++ /dev/null @@ -1,141 +0,0 @@ -AlsoUsedProgram = "Также в программе используется:" -about = "О программе" -aboutText = "Простенький интерфейс для консольной утилиты FFmpeg. \nНо я не являюсь автором самой утилиты FFmpeg." -addedFilesTitle = "Добавленные файлы" -autoClearAfterAddingToQueue = "Очищать после добавления в очередь" -buttonDownloadFFmpeg = "Скачать автоматически FFmpeg" -buttonForSelectedDirTitle = "Сохранить в папку:" -cancel = "Отмена" -changeFFPath = "FFmpeg, FFprobe и FFplay" -changeLanguage = "Поменять язык" -checkboxOverwriteOutputFilesTitle = "Разрешить перезаписать файл" -choose = "выбрать" -clearAll = "Очистить список" -completedQueue = "Готово" -converterVideoFilesSubmitTitle = "Конвертировать" -converterVideoFilesTitle = "Конвертер видео, аудио и картинок" -download = "Скачать" -downloadFFmpegFromSite = "Будет скачано с сайта:" -downloadRun = "Скачивается..." -dragAndDropFiles = "перетащить файлы" -encoderGroupAudio = "Аудио" -encoderGroupImage = "Картинки" -encoderGroupVideo = "Видео" -encoder_apng = "APNG image" -encoder_bmp = "BMP image" -encoder_flv = "FLV" -encoder_gif = "GIF image" -encoder_h264_nvenc = "H.264 с поддержкой NVIDIA" -encoder_libmp3lame = "libmp3lame MP3 (MPEG audio layer 3)" -encoder_libshine = "libshine MP3 (MPEG audio layer 3)" -encoder_libtwolame = "libtwolame MP2 (MPEG audio layer 2)" -encoder_libvpx = "libvpx VP8 (codec vp8)" -encoder_libvpx-vp9 = "libvpx VP9 (codec vp9)" -encoder_libwebp = "libwebp WebP image" -encoder_libwebp_anim = "libwebp_anim WebP image" -encoder_libx264 = "H.264 libx264" -encoder_libx265 = "H.265 libx265" -encoder_libxvid = "libxvidcore MPEG-4 part 2" -encoder_mjpeg = "MJPEG (Motion JPEG)" -encoder_mp2 = "MP2 (MPEG audio layer 2)" -encoder_mp2fixed = "MP2 fixed point (MPEG audio layer 2)" -encoder_mpeg1video = "MPEG-1" -encoder_mpeg2video = "MPEG-2" -encoder_mpeg4 = "MPEG-4 part 2" -encoder_msmpeg4 = "MPEG-4 part 2 Microsoft variant version 3" -encoder_msmpeg4v2 = "MPEG-4 part 2 Microsoft variant version 2" -encoder_msvideo1 = "Microsoft Video-1" -encoder_png = "PNG image" -encoder_qtrle = "QuickTime Animation (RLE) video" -encoder_sgi = "SGI image" -encoder_tiff = "TIFF image" -encoder_wmav1 = "Windows Media Audio 1" -encoder_wmav2 = "Windows Media Audio 2" -encoder_wmv1 = "Windows Media Video 7" -encoder_wmv2 = "Windows Media Video 8" -encoder_xbm = "XBM (X BitMap) image" -error = "Произошла ошибка!" -errorConverter = "не смогли отконвертировать видео" -errorDragAndDropFile = "Не все файлы добавились" -errorFFmpeg = "это не FFmpeg" -errorFFmpegVersion = "Не смогли определить версию FFmpeg" -errorFFplay = "это не FFplay" -errorFFplayVersion = "Не смогли определить версию FFplay" -errorFFprobe = "это не FFprobe" -errorFFprobeVersion = "Не смогли определить версию FFprobe" -errorNoFilesAddedForConversion = "Нет файлов для конвертации" -errorQueue = "Ошибка" -errorSelectedEncoder = "Конвертер не выбран" -errorSelectedFolderSave = "Папка для сохранения не выбрана!" -errorSelectedFormat = "Расширение файла не выбрана" -exit = "Выход" -ffmpegLGPL = "Это программное обеспечение использует библиотеки из проекта **FFmpeg** под **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**." -ffmpegTrademark = "**FFmpeg** — торговая марка **[Fabrice Bellard](http://bellard.org/)** , создателя проекта **[FFmpeg](https://ffmpeg.org/about.html)**." -fileForConversionTitle = "Файл:" -fileQueueTitle = "Очередь" -formPreset = "Предустановка" -gratitude = "Благодарность" -gratitudeText = "Я искренне благодарю вас за неоценимую\n\rи своевременную помощь:" -help = "Справка" -helpFFplay = "Клавиши проигрывателя FFplay" -helpFFplayActivateFrameStepMode = "Активировать покадровый режим." -helpFFplayCycleVideoFiltersOrShowModes = "Цикл видеофильтров или режимов показа." -helpFFplayDecreaseVolume = "Уменьшить громкость." -helpFFplayDescription = "Описание" -helpFFplayDoubleClickLeftMouseButton = "двойной щелчок\nлевой кнопкой мыши" -helpFFplayIncreaseVolume = "Увеличить громкость." -helpFFplayKeyDown = "вниз" -helpFFplayKeyHoldS = "держать S" -helpFFplayKeyLeft = "лево" -helpFFplayKeyRight = "право" -helpFFplayKeySpace = "SPACE (пробел)" -helpFFplayKeyUp = "вверх" -helpFFplayKeys = "Клавиши" -helpFFplayPause = "Поставить на паузу или продолжить проигрывать." -helpFFplayQuit = "Закрыть проигрыватель." -helpFFplaySeekBForward10Minutes = "Перемотать вперёд на 10 минут." -helpFFplaySeekBForward1Minute = "Перемотать вперёд на 1 минуту." -helpFFplaySeekBackward10Minutes = "Перемотать назад на 10 минут." -helpFFplaySeekBackward10Seconds = "Перемотать назад на 10 секунд." -helpFFplaySeekBackward1Minute = "Перемотать назад на 1 минуту." -helpFFplaySeekForward10Seconds = "Перемотать вперёд на 10 секунд." -helpFFplayToggleFullScreen = "Переключиться на полный экран или выйти с полного экрана." -helpFFplayToggleMute = "Отключить звук или включить звук." -inProgressQueue = "Выполняется" -languageSelectionFormHead = "Переключить язык" -languageSelectionHead = "Выберите язык" -licenseLink = "Сведения о лицензии" -licenseLinkOther = "Лицензии от других продуктов, которые используются в программе" -menuSettingsLanguage = "Язык" -menuSettingsTheme = "Тема" -or = "или" -parameterCheckbox = "Включить параметр" -pathToFfmpeg = "Путь к FFmpeg:" -pathToFfplay = "Путь к FFplay:" -pathToFfprobe = "Путь к FFprobe:" -preset_fast = "fast (медленней чем faster, но будет файл и меньше весить)" -preset_faster = "faster (медленней чем veryfast, но будет файл и меньше весить)" -preset_medium = "medium (медленней чем fast, но будет файл и меньше весить)" -preset_placebo = "placebo (не рекомендуется)" -preset_slow = "slow (медленней чем medium, но будет файл и меньше весить)" -preset_slower = "slower (медленней чем slow, но будет файл и меньше весить)" -preset_superfast = "superfast (медленней чем ultrafast, но будет файл и меньше весить)" -preset_ultrafast = "ultrafast (быстро, но файл будет много весить)" -preset_veryfast = "veryfast (медленней чем superfast, но будет файл и меньше весить)" -preset_veryslow = "veryslow (медленней чем slower, но будет файл и меньше весить)" -programmLink = "Сайт проекта" -programmVersion = "**Версия программы:** {{.Version}}" -queue = "Очередь" -save = "Сохранить" -selectEncoder = "Кодировщик:" -selectFFPathTitle = "Укажите путь к FFmpeg и к FFprobe" -selectFormat = "Расширение файла:" -settings = "Настройки" -testFF = "Проверка FFmpeg на работоспособность..." -themesNameDark = "Тёмная" -themesNameDefault = "По умолчанию" -themesNameLight = "Светлая" -titleDownloadLink = "Скачать можно от сюда" -total = "Всего" -unzipRun = "Распаковывается..." -waitingQueue = "В очереди" diff --git a/localizer/repository.go b/localizer/repository.go deleted file mode 100644 index eed9051..0000000 --- a/localizer/repository.go +++ /dev/null @@ -1,26 +0,0 @@ -package localizer - -import ( - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" -) - -type RepositoryContract interface { - GetCode() string - Save(code string) setting.Setting -} - -type Repository struct { - settingRepository setting.RepositoryContract -} - -func NewRepository(settingRepository setting.RepositoryContract) *Repository { - return &Repository{settingRepository: settingRepository} -} - -func (r Repository) GetCode() string { - return r.settingRepository.GetValue("language") -} - -func (r Repository) Save(code string) setting.Setting { - return r.settingRepository.CreateOrUpdate("language", code) -} diff --git a/localizer/view.go b/localizer/view.go index c0e5af6..9233b6d 100644 --- a/localizer/view.go +++ b/localizer/view.go @@ -4,7 +4,6 @@ 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 { @@ -35,13 +34,11 @@ func (v View) LanguageSelection(funcSelected func(lang kernel.Lang)) { block.SetText(languages[i].Title) }) listView.OnSelected = func(id widget.ListItemID) { - _ = v.app.GetLocalizerService().SetCurrentLanguage(languages[id]) + _ = v.app.GetLocalizerService().SetCurrentLanguage(languages[id], true) funcSelected(languages[id]) } - messageHead := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "languageSelectionHead", - }) + messageHead := v.app.GetLocalizerService().GetMessage("languageSelectionHead") v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", listView)) } @@ -58,17 +55,15 @@ func LanguageSelectionForm(localizerService kernel.LocalizerContract, funcSelect func(i widget.ListItemID, o fyne.CanvasObject) { block := o.(*widget.Label) block.SetText(languages[i].Title) - if languages[i].Code == currentLanguage.Lang.Code { + if languages[i].Code == currentLanguage.Code { block.TextStyle = fyne.TextStyle{Bold: true} } }) listView.OnSelected = func(id widget.ListItemID) { - _ = localizerService.SetCurrentLanguage(languages[id]) + _ = localizerService.SetCurrentLanguage(languages[id], true) funcSelected(languages[id]) } - messageHead := localizerService.GetMessage(&i18n.LocalizeConfig{ - MessageID: "languageSelectionFormHead", - }) + messageHead := localizerService.GetMessage("languageSelectionFormHead") return widget.NewCard(messageHead, "", listView) } diff --git a/main.go b/main.go index 38c2315..1c67187 100644 --- a/main.go +++ b/main.go @@ -10,7 +10,6 @@ import ( "git.kor-elf.net/kor-elf/gui-for-ffmpeg/menu" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/theme" - "golang.org/x/text/language" ) var application kernel.AppContract @@ -25,12 +24,6 @@ func init() { Icon: iconResource, } - localizerService, err := kernel.NewLocalizer("languages", language.Russian) - if err != nil { - kernel.PanicErrorLang(err, appMetadata) - return - } - ffPathUtilities = &kernel.FFPathUtilities{FFmpeg: "", FFprobe: "", FFplay: ""} convertorService := kernel.NewService(ffPathUtilities) ffplayService := kernel.NewFFplay(ffPathUtilities) @@ -38,7 +31,6 @@ func init() { queue := kernel.NewQueueList() application = kernel.NewApp( appMetadata, - localizerService, queue, ffplayService, convertorService, @@ -71,12 +63,11 @@ func main() { themeRepository := theme.NewRepository(settingRepository) themeService := theme.NewTheme(application, themeRepository) - localizerRepository := localizer.NewRepository(settingRepository) menuView := menu.NewView(application) menuSettingView := menu.NewViewSetting(application, themeService) - mainMenu := handler.NewMenuHandler(application, convertorHandler, menuView, menuSettingView, localizerView, localizerRepository, themeService) + mainMenu := handler.NewMenuHandler(application, convertorHandler, menuView, menuSettingView, localizerView, themeService) - mainHandler := handler.NewMainHandler(application, convertorHandler, mainMenu, localizerRepository) + mainHandler := handler.NewMainHandler(application, convertorHandler, mainMenu) mainHandler.Start() application.GetWindow().SetMainMenu(mainMenu.GetMainMenu()) diff --git a/menu/view.go b/menu/view.go index 324b012..29864d8 100644 --- a/menu/view.go +++ b/menu/view.go @@ -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", diff --git a/menu/view_setting.go b/menu/view_setting.go index 045662e..02e7fbd 100644 --- a/menu/view_setting.go +++ b/menu/view_setting.go @@ -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)) } diff --git a/theme/theme.go b/theme/theme.go index 2c87899..1b4aa8b 100644 --- a/theme/theme.go +++ b/theme/theme.go @@ -4,7 +4,6 @@ import ( "fyne.io/fyne/v2" fyneTheme "fyne.io/fyne/v2/theme" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" ) @@ -92,25 +91,19 @@ func (inf themeInfo) GetVariant() fyne.ThemeVariant { func getThemes(localizer kernel.LocalizerContract) map[string]ThemeInfoContract { themesNameDefault := &themeInfo{ - name: "default", - title: localizer.GetMessage(&i18n.LocalizeConfig{ - MessageID: "themesNameDefault", - }), + name: "default", + title: localizer.GetMessage("themesNameDefault"), } themesNameLight := &themeInfo{ - name: "light", - title: localizer.GetMessage(&i18n.LocalizeConfig{ - MessageID: "themesNameLight", - }), + name: "light", + title: localizer.GetMessage("themesNameLight"), variant: fyneTheme.VariantLight, } themesNameDark := &themeInfo{ - name: "dark", - title: localizer.GetMessage(&i18n.LocalizeConfig{ - MessageID: "themesNameDark", - }), + name: "dark", + title: localizer.GetMessage("themesNameDark"), variant: fyneTheme.VariantDark, }