Refactor localization system and migrate to Fyne's built-in support
Replaced the `i18n` and `toml` dependencies with Fyne's built-in language system for localization management. Updated the `Localizer` implementation to handle translations using JSON files and embed functionality. Simplified language selection and persisted settings via Fyne's preferences API.
This commit is contained in:
@@ -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)
|
||||
|
@@ -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("Произошла ошибка!"),
|
||||
|
@@ -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
|
||||
|
@@ -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),
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
})
|
||||
|
143
kernel/translations/app.en.json
Normal file
143
kernel/translations/app.en.json
Normal file
@@ -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"
|
||||
}
|
143
kernel/translations/app.kk.json
Normal file
143
kernel/translations/app.kk.json
Normal file
@@ -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": "Күту"
|
||||
}
|
143
kernel/translations/app.ru.json
Normal file
143
kernel/translations/app.ru.json
Normal file
@@ -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": "В очереди"
|
||||
}
|
45
kernel/translations/base.en.json
Normal file
45
kernel/translations/base.en.json
Normal file
@@ -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"
|
||||
}
|
45
kernel/translations/base.kk.json
Normal file
45
kernel/translations/base.kk.json
Normal file
@@ -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": "Сә"
|
||||
}
|
45
kernel/translations/base.ru.json
Normal file
45
kernel/translations/base.ru.json
Normal file
@@ -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": "Ср"
|
||||
}
|
Reference in New Issue
Block a user