From 80f9a6565daf5158d31c0464c4f20d601d54fbdf Mon Sep 17 00:00:00 2001 From: Suoslex Date: Wed, 25 Sep 2024 01:08:25 +0800 Subject: [PATCH 1/3] First version of Russian translation --- src/i18n/locales/en.json | 15 +- src/i18n/locales/ru.json | 230 +++++++++++------- .../components/feature-carousel/index.tsx | 6 +- .../virtual-table/table-config-dropdown.tsx | 12 +- .../routes/action-required-route.tsx | 2 +- .../albums/components/album-detail-header.tsx | 4 +- .../components/album-list-header-filters.tsx | 6 +- .../album-artist-list-header-filters.tsx | 8 +- .../context-menu/context-menu-provider.tsx | 2 +- .../components/genre-list-header-filters.tsx | 8 +- .../player/components/right-controls.tsx | 5 +- ...aylist-detail-song-list-header-filters.tsx | 4 +- .../playlist-list-header-filters.tsx | 2 +- .../components/playlist-query-builder.tsx | 4 +- .../servers/components/server-list-item.tsx | 30 ++- .../shared/components/order-toggle-button.tsx | 4 +- .../features/titlebar/components/app-menu.tsx | 2 +- 17 files changed, 231 insertions(+), 113 deletions(-) diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index e91b3527a..e7b81be10 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -55,7 +55,7 @@ "disc": "disc", "dismiss": "dismiss", "duration": "duration", - "edit": "edit", + "edit": " Edit", "enable": "enable", "expand": "expand", "favorite": "favorite", @@ -147,6 +147,7 @@ "smartPlaylist": "smart $t(entity.playlist_one)", "track_one": "track", "track_other": "tracks", + "song_many": "{{ count }} songs", "trackWithCount_one": "{{count}} track", "trackWithCount_other": "{{count}} tracks" }, @@ -315,6 +316,14 @@ "settings": "$t(common.setting_other)", "version": "version {{version}}" }, + "manageServers": { + "title": "manage servers", + "serverDetails": "server details", + "url": "URL", + "username": "username", + "editServerDetailsTooltip": "edit server details", + "removeServer": "remove server" + }, "contextMenu": { "addFavorite": "$t(action.addToFavorites)", "addLast": "$t(player.addLast)", @@ -449,7 +458,8 @@ "stop": "stop", "toggleFullscreenPlayer": "toggle fullscreen player", "unfavorite": "unfavorite", - "pause": "pause" + "pause": "pause", + "viewQueue": "view queue" }, "setting": { "accentColor": "accent color", @@ -706,6 +716,7 @@ "config": { "general": { "autoFitColumns": "auto fit columns", + "followCurrentSong": "follow current song", "displayType": "display type", "gap": "$t(common.gap)", "itemGap": "item gap (px)", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index cb885f799..f0e9f0f29 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -7,8 +7,8 @@ "addToFavorites": "добавить в $t(entity.favorite_other)", "addToPlaylist": "добавить в $t(entity.playlist_one)", "createPlaylist": "создать $t(entity.playlist_one)", - "removeFromPlaylist": "удалить из $t(entity.playlist_one)", - "viewPlaylists": "просмотреть $t(entity.playlist_other)", + "removeFromPlaylist": "удалить из $t(entity.playlist_few)", + "viewPlaylists": "показать $t(entity.playlist_other)", "refresh": "$t(common.refresh)", "deletePlaylist": "удалить $t(entity.playlist_one)", "removeFromQueue": "удалить из очереди", @@ -16,7 +16,7 @@ "moveToBottom": "вниз", "setRating": "оценить", "toggleSmartPlaylistEditor": "вкл./откл. редактор $t(entity.smartPlaylist)", - "removeFromFavorites": "удалить из $t(entity.favorite_other)", + "removeFromFavorites": "удалить из $t(entity.favorite_few)", "openIn": { "lastfm": "открыть на Last.fm", "musicbrainz": "открыть на MusicBrainz" @@ -30,7 +30,7 @@ "refresh": "обновить", "unknown": "неизвестно", "areYouSure": "вы уверены?", - "edit": "изменить", + "edit": "Изменить", "favorite": "любимый", "left": "лево", "save": "сохранить", @@ -38,15 +38,15 @@ "currentSong": "текущий $t(entity.track_one)", "collapse": "закрыть", "trackNumber": "трек", - "descending": "убывание", + "descending": "по убыванию", "add": "добавить", "gap": "промежуток", - "ascending": "возрастанию", + "ascending": "по возрастанию", "dismiss": "отклонить", "year": "год", - "manage": "управлять", + "manage": "управление", "limit": "ограничение", - "minimize": "минимизировать", + "minimize": "свернуть", "modified": "изменено", "duration": "длительность", "name": "имя", @@ -66,6 +66,8 @@ "cancel": "отменить", "forceRestartRequired": "перезапустите приложение, чтобы применить изменения... закройте уведомление для перезапуска", "setting": "настройка", + "setting_one": "настройка", + "setting_other": "настройки", "version": "версия", "title": "название", "filter_one": "фильтр", @@ -78,11 +80,11 @@ "action_one": "действие", "action_few": "действия", "action_many": "действий", - "playerMustBePaused": "воспроизведение должно быть остановлено", + "playerMustBePaused": "необходимо остановить воспроизведение", "confirm": "подтвердить", - "resetToDefault": "по умолчанию", - "home": "главная страница", - "comingSoon": "скоро будет…", + "resetToDefault": "сбросить настройки", + "home": "главная", + "comingSoon": "скоро...", "reset": "сбросить", "channel_one": "канал", "channel_few": "канала", @@ -92,14 +94,14 @@ "menu": "меню", "restartRequired": "необходим перезапуск приложения", "previousSong": "предыдущий $t(entity.track_one)", - "noResultsFromQuery": "нет результатов", + "noResultsFromQuery": "ничего не найдено", "quit": "выйти", - "expand": "расширить", + "expand": "раскрыть", "search": "поиск", "saveAs": "сохранить как", "disc": "диск", "yes": "да", - "random": "случайный", + "random": "случайно", "size": "размер", "biography": "биография", "note": "заметка", @@ -114,9 +116,11 @@ "entity": { "album_one": "альбом", "album_few": "альбома", + "album_other": "альбомы", "album_many": "альбомов", "genre_one": "жанр", "genre_few": "жанра", + "genre_other": "жанры", "genre_many": "жанров", "playlistWithCount_one": "{{count}} плейлист", "playlistWithCount_few": "{{count}} плейлиста", @@ -124,18 +128,26 @@ "playlist_one": "плейлист", "playlist_few": "плейлиста", "playlist_many": "плейлистов", + "playlist_other": "плейлисты", + "play": "{{count}} прослушиваний", + "play_one": "{{count}} прослушивание", + "play_other": "{{count}} прослушиваний", "artist_one": "автор", "artist_few": "автора", + "artist_other": "исполнители", "artist_many": "авторов", "folderWithCount_one": "{{count}} папка", "folderWithCount_few": "{{count}} папки", "folderWithCount_many": "{{count}} папок", - "albumArtist_one": "автор альбома", - "albumArtist_few": "автора альбома", - "albumArtist_many": "авторов альбома", + "albumArtist_one": "исполнитель альбома", + "albumArtist_few": "исполнители альбома", + "albumArtist_other": "исполнители альбомов", + "albumArtist_many": "исполнителей альбома", "track_one": "трек", "track_few": "трека", "track_many": "треков", + "track_other": "треки", + "song_many": "{{ count }} композиций", "albumArtistCount_one": "{{count}} автор альбома", "albumArtistCount_few": "{{count}} автора альбома", "albumArtistCount_many": "{{count}} авторов альбома", @@ -145,24 +157,27 @@ "favorite_one": "любимый", "favorite_few": "любимых", "favorite_many": "любимые", + "favorite_other": "любимые", "artistWithCount_one": "{{count}} автор", "artistWithCount_few": "{{count}} автора", "artistWithCount_many": "{{count}} авторов", "folder_one": "папка", "folder_few": "папки", "folder_many": "папок", + "folder_other": "папки", "smartPlaylist": "умный $t(entity.playlist_one)", "genreWithCount_one": "{{count}} жанр", "genreWithCount_few": "{{count}} жанра", "genreWithCount_many": "{{count}} жанров", "trackWithCount_one": "{{count}} трек", "trackWithCount_few": "{{count}} трека", - "trackWithCount_many": "{{count}} треков" + "trackWithCount_many": "{{count}} треков", + "trackWithCount_other": "{{count}} треков" }, "table": { "config": { "view": { - "card": "карта", + "card": "карточки", "table": "таблица", "poster": "постер" }, @@ -171,8 +186,9 @@ "gap": "$t(common.gap)", "tableColumns": "столбцы таблицы", "autoFitColumns": "автоматически расставить столбцы", + "followCurrentSong": "следовать за исполняемым треком", "size": "$t(common.size)", - "itemSize": "рамер элементов (px)", + "itemSize": "размер элементов (px)", "itemGap": "отступ между элементами (px)" }, "label": { @@ -185,7 +201,7 @@ "bpm": "$t(common.bpm)", "lastPlayed": "последний", "trackNumber": "номер трека", - "rowIndex": "индекс ряда", + "rowIndex": "номер строки", "rating": "$t(common.rating)", "artist": "$t(entity.artist_one)", "album": "$t(entity.album_one)", @@ -234,25 +250,25 @@ } }, "error": { - "remotePortWarning": "перезапустить сервер для применения нового порта", + "remotePortWarning": "необходимо перезапустить сервер для применения нового порта", "systemFontError": "произошла ошибка при попытке получить системные шрифты", - "playbackError": "произошла ошибка при попытке проиграть медиа", + "playbackError": "произошла ошибка при попытке проигрывания медиа", "endpointNotImplementedError": "запрос {{endpoint}} не реализован для {{serverType}}", "remotePortError": "произошла ошибка при попытке установить порт удаленного сервера", - "serverRequired": "необходим сервер", - "authenticationFailed": "авторизация завершилась с ошибкой", + "serverRequired": "сервер не выбран", + "authenticationFailed": "не удалось авторизироваться", "apiRouteError": "невозможно выполнить запрос", "genericError": "произошла ошибка", - "credentialsRequired": "необходимы учётные данные", + "credentialsRequired": "введите данные для входа", "sessionExpiredError": "ваш сеанс истёк", - "remoteEnableError": "ошибка произошла при попытке $t(common.enable) удалённый сервер", + "remoteEnableError": "произошла ошибка при попытке $t(common.enable) удалённый сервер", "localFontAccessDenied": "не получилось получить доступ к шрифтам", "serverNotSelectedError": "не выбран сервер", - "remoteDisableError": "ошибка произошла при попытке $t(common.disable) удалённый сервер", + "remoteDisableError": "произошла ошибка при попытке $t(common.disable) удалённый сервер", "mpvRequired": "необходим MPV", "audioDeviceFetchError": "произошла ошибка с аудиоустройством", "invalidServer": "недействительный сервер", - "loginRateError": "слишком много попыток входа, пожалуйста, попробуйте ещё раз через несколько секунд", + "loginRateError": "превышено максимальное количество попыток входа, пожалуйста, попробуйте ещё раз через несколько секунд", "openError": "не удалось открыть файл", "badAlbum": "вы видите эту страницу из-за того, что эта песня не входит в альбом. скорее всего, вы видите эту ошибку, так как песня находится в корневой директории папки с музыкой. jellyfin группирует треки только по папкам.", "networkError": "возникла ошибка сети" @@ -271,29 +287,29 @@ "biography": "биография", "artist": "$t(entity.artist_one)", "duration": "длительность", - "fromYear": "из года", + "fromYear": "год", "criticRating": "рейтинг критиков", - "mostPlayed": "самое воспроизводимое", + "mostPlayed": "слушают чаще всего", "comment": "комментировать", - "playCount": "кол-во воспроизведений", - "recentlyUpdated": "недавно обновлено", + "playCount": "количество воспроизведений", + "recentlyUpdated": "обновленные недавно", "channels": "$t(common.channel_other)", - "recentlyPlayed": "недавно проиграно", + "recentlyPlayed": "недавно проигрывался", "owner": "$t(common.owner)", "title": "название", "rating": "рейтинг", "search": "поиск", "genre": "$t(entity.genre_one)", - "recentlyAdded": "недавно добавлено", + "recentlyAdded": "добавлен недавно", "note": "заметка", "name": "название", "releaseDate": "дата выхода", - "albumCount": "кол-во $t(entity.album_other)", + "albumCount": "количество $t(entity.album_many)", "path": "путь", - "isRecentlyPlayed": "недавно проигрывалась", + "isRecentlyPlayed": "недавно проигрывался", "releaseYear": "год выхода", "id": "№", - "songCount": "кол-во песен", + "songCount": "количество песен", "isPublic": "публичный", "random": "случайный", "lastPlayed": "последний раз проигрывалась", @@ -302,11 +318,12 @@ "trackNumber": "трек" }, "player": { - "repeat_all": "повтор всех", + "repeat_all": "повторять все", "stop": "остановить", - "repeat": "повтор", + "repeat": "повторять текущий", "queue_remove": "удалить выбранное", - "playRandom": "случайные песни", + "playRandom": "играть случайные песни", + "playSimilarSongs": "играть похожие песни", "skip": "пропустить", "previous": "предыдущий", "toggleFullscreenPlayer": "включить полноэкранный режим", @@ -316,10 +333,10 @@ "shuffle": "перемешать", "playbackFetchNoResults": "песни не найдены", "playbackFetchInProgress": "загрузка песен..", - "addNext": "добавить следующий", + "addNext": "воспроизвести следующим", "playbackSpeed": "скорость воспроизведения", - "playbackFetchCancel": "это занимает некоторое время... закрыть уведомление для отмены", - "play": "прослушать", + "playbackFetchCancel": "пожалуйста, подождите немного... закройте уведомление для отмены", + "play": "играть", "repeat_off": "повтор выключен", "pause": "пауза", "queue_clear": "очистить очередь", @@ -328,13 +345,14 @@ "queue_moveToTop": "переместить выделенное вниз", "queue_moveToBottom": "переместить выделенное вверх", "shuffle_off": "перемешивание выключено", - "addLast": "добавить последний", + "addLast": "воспроизвести после всех", "mute": "отключить звук", - "skip_forward": "вперёд" + "skip_forward": "вперёд", + "viewQueue": "показать очередь" }, "page": { "sidebar": { - "nowPlaying": "Cейчас проигрывается", + "nowPlaying": "сейчас проигрывается", "playlists": "$t(entity.playlist_other)", "search": "$t(common.search)", "tracks": "$t(entity.track_other)", @@ -354,30 +372,38 @@ "followCurrentLyric": "следовать за текущими словами песни", "opacity": "непрозрачность", "lyricSize": "размер слов", - "showLyricProvider": "показать провайдера слов", - "unsynchronized": "несинхронизировано", + "showLyricProvider": "показать источник слов", + "unsynchronized": "не синхронизировано", "lyricAlignment": "выравнивание слов песни", "useImageAspectRatio": "использовать соотношение сторон изображения", "lyricGap": "пробел между словами", "dynamicIsImage": "включить фоновое изображение", "dynamicImageBlur": "сила размытия изображения" }, - "upNext": "следующее", - "lyrics": "слова песни", - "related": "схожие" + "upNext": "играет", + "lyrics": "слова", + "related": "похожие" }, "appMenu": { - "selectServer": "выбрать сервер", + "selectServer": "список серверов", "version": "версия {{version}}", "settings": "$t(common.setting_other)", - "manageServers": "настроить список серверов", - "expandSidebar": "развернуть", + "manageServers": "редактировать список серверов", + "expandSidebar": "развернуть боковую панель", "collapseSidebar": "Скрыть боковую панель", "openBrowserDevtools": "открыть инструменты разработчика", "quit": "$t(common.quit)", "goBack": "назад", "goForward": "вперёд" }, + "manageServers": { + "title": "сервера", + "serverDetails": "информация о сервере", + "url": "адрес", + "username": "пользователь", + "editServerDetailsTooltip": "изменить настройки сервера", + "removeServer": "удалить сервер" + }, "contextMenu": { "addToPlaylist": "$t(action.addToPlaylist)", "addToFavorites": "$t(action.addToFavorites)", @@ -390,6 +416,7 @@ "removeFromFavorites": "$t(action.removeFromFavorites)", "addNext": "$t(player.addNext)", "deselectAll": "$t(action.deselectAll)", + "download": "скачать", "addLast": "$t(player.addLast)", "addFavorite": "$t(action.addToFavorites)", "play": "$t(player.play)", @@ -399,11 +426,11 @@ "shareItem": "поделиться" }, "home": { - "mostPlayed": "наибольшее кол-во воспроизведений", + "mostPlayed": "слушают чаще всего", "newlyAdded": "недавно добавленные релизы", "title": "$t(common.home)", - "explore": "изучите вашу медиатеку", - "recentlyPlayed": "недавно прослушано" + "explore": "откройте новое", + "recentlyPlayed": "игралось недавно" }, "albumDetail": { "moreFromArtist": "больше от $t(entity.artist_one)", @@ -420,8 +447,8 @@ }, "genreList": { "title": "$t(entity.genre_other)", - "showAlbums": "показать $t(entity.genre_one) $t(entity.album_other)", - "showTracks": "показать $t(entity.genre_one) $t(entity.track_other)" + "showAlbums": "показать $t(entity.genre_one) $t(entity.album_many)", + "showTracks": "показать $t(entity.genre_one) $t(entity.track_many)" }, "trackList": { "title": "$t(entity.track_other)", @@ -435,6 +462,9 @@ }, "title": "комманды" }, + "playlist": { + "reorder": "сортировка доступна только по ID" + }, "playlistList": { "title": "$t(entity.playlist_other)" }, @@ -464,7 +494,7 @@ "deletePlaylist": { "title": "удалить $t(entity.playlist_one)", "success": "$t(entity.playlist_one) успешно удалён", - "input_confirm": "напишите название $t(entity.playlist_one)а для подтверждения" + "input_confirm": "напишите название $t(entity.playlist_few) для подтверждения" }, "createPlaylist": { "input_description": "$t(common.description)", @@ -477,24 +507,24 @@ "addServer": { "title": "добавить сервер", "input_username": "пользователь", - "input_url": "url", + "input_url": "адрес", "input_password": "пароль", "input_legacyAuthentication": "включить старую авторизацию", "input_name": "название сервера", - "success": "сервер добавлен успешно", + "success": "сервер успешно добавлен", "input_savePassword": "сохранить пароль", - "ignoreSsl": "игнорирование ssl ($t(common.restartRequired))", - "ignoreCors": "игнорирование корсетов ($t(common.restartRequired))", - "error_savePassword": "произошла ошибка во время попытки сохранения пароля" + "ignoreSsl": "игнорировать ssl ($t(common.restartRequired))", + "ignoreCors": "игнорировать CORS ($t(common.restartRequired))", + "error_savePassword": "произошла ошибка при сохранении пароля" }, "addToPlaylist": { "success": "добавлено: $t(entity.trackWithCount, {\"count\": {{message}} }) в $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })", "title": "добавить в $t(entity.playlist_one)", - "input_skipDuplicates": "пропустить дубликаты", + "input_skipDuplicates": "не добавлять дубликаты", "input_playlists": "$t(entity.playlist_other)" }, "updateServer": { - "title": "обновить сервер", + "title": "обновление сервера", "success": "сервер успешно обновлён" }, "queryEditor": { @@ -512,7 +542,7 @@ "shareItem": { "success": "ссылка скопирована в буфер обмена (нажмите здесь, чтобы открыть)", "expireInvalid": "время истечения срока действия должно быть в будущем", - "createFailed": "не удалось создать ссылку для общего доступа (общий доступ включён?)", + "createFailed": "не удалось создать ссылку для общего доступа (проверьте, включен ли общий доступ?)", "allowDownloading": "разрешить скачивание", "setExpiration": "установить срок действия", "description": "описание" @@ -521,16 +551,22 @@ "setting": { "accentColor": "цвет акцента", "accentColor_description": "устанавливает цвет акцента для приложения", + "albumBackground": "фоновое изображение альбомов", + "albumBackground_description": "добавляет фоновое изображение для страниц альбомов, содержащих обложку", + "albumBackgroundBlur": "размытие фонового изображения альбома", + "albumBackgroundBlur_description": "определяет степень размытия фонового изображения на странице альбомов", "applicationHotkeys": "горячие клавиши приложения", "crossfadeStyle_description": "выберите вид эффекта crossfade для аудиоплеера", + "customCssEnable": "использовать кастомные css", + "customCssEnable_description": "разрешить использование кастомных css.", "enableRemote_description": "включает сервер удалённого управления для управления воспроизведением с помощью других устройств", "fontType_optionSystem": "системный", "mpvExecutablePath_description": "укажите папку, в которой находится исполняющий файл аудиоплеера MPV. если оставить пустым, будет использоваться путь по умолчанию", - "crossfadeStyle": "Вид эффекта crossfade", + "crossfadeStyle": "вид эффекта crossfade", "fontType_optionBuiltIn": "встроенный", - "disableLibraryUpdateOnStartup": "Отключить проверку новых версий при запуске приложения", - "minimizeToTray_description": "Сворачивать приложение в панель уведомлений", - "audioPlayer_description": "Укажите - какой аудиоплеер использовать для воспроизведения", + "disableLibraryUpdateOnStartup": "отключить проверку новых версий при запуске приложения", + "minimizeToTray_description": "сворачивать приложение в панель уведомлений", + "audioPlayer_description": "укажите, какой аудиоплеер использовать для воспроизведения", "disableAutomaticUpdates": "отключить проверку обновлений", "exitToTray_description": "При закрытии приложения - оно останется в панели уведомлений", "fontType_optionCustom": "пользовательский", @@ -544,7 +580,7 @@ "crossfadeDuration": "Длительность эффекта crossfade", "audioPlayer": "Аудиоплеер", "minimizeToTray": "сворачивать в панель уведомлений", - "font_description": "Выберите - какой шрифт использовать в приложении", + "font_description": "Выберите, какой шрифт использовать в приложении", "remoteUsername": "имя пользователя для доступа к серверу удалённого управления", "buttonSize_description": "размер кнопок в панели управления воспроизведением", "clearCache": "очистить кэш браузера", @@ -554,11 +590,11 @@ "buttonSize": "размер кнопок панели управления воспроизведением", "hotkey_volumeDown": "уменьшить громкость", "playButtonBehavior_optionAddLast": "$t(player.addLast)", - "theme_description": "устанавливает тему, которая будет использоваться приложением", + "theme_description": "устанавливает тему, которая будет использоваться в приложении", "passwordStore": "хранилище паролей/секретов", "sidebarPlaylistList": "список плейлистов в боковой панели", "windowBarStyle_description": "выберите стиль заголовка окна", - "followLyric": "следовать тексту трека", + "followLyric": "следовать за текстом трека", "volumeWheelStep": "шаг регулировки громкости колёсиком мыши", "windowBarStyle": "стиль заголовка окна", "hotkey_zoomOut": "уменьшить масштаб", @@ -567,7 +603,7 @@ "replayGainMode_optionAlbum": "$t(entity.album_one)", "replayGainMode_optionNone": "$t(common.none)", "replayGainMode_optionTrack": "$t(entity.track_one)", - "clearQueryCache_description": "\"мягкая очистка\" feishin. при выполнении обновляются плейлисты, метаданные треков, но сохранённые тексты треков сбрасываются. настройки, учётные данные и кэшированные изображения сохраняются", + "clearQueryCache_description": "так называемая \"мягкая очистка\" feishin: обновляются плейлисты, метаданные треков, но сохранённые тексты треков сбрасываются. настройки, учётные данные и кэшированные изображения сохраняются", "hotkey_favoriteCurrentSong": "добавить $t(common.currentSong) в избранное", "genreBehavior": "поведения страницы жанров", "globalMediaHotkeys": "глобальные мультимедийные горячие клавиши", @@ -576,11 +612,11 @@ "hotkey_globalSearch": "глобальный поиск", "hotkey_playbackNext": "следующий трек", "hotkey_playbackPause": "пауза", - "hotkey_playbackPlay": "прослушать", - "hotkey_playbackPlayPause": "прослушать / пауза", + "hotkey_playbackPlay": "играть", + "hotkey_playbackPlayPause": "играть / пауза", "hotkey_playbackPrevious": "предыдущий трек", "hotkey_playbackStop": "остановить", - "hotkey_rate0": "очистить оценку", + "hotkey_rate0": "убрать оценку", "hotkey_rate1": "оценить в 1 звезду", "hotkey_rate2": "оценить в 2 звезды", "hotkey_rate3": "оценить в 3 звезды", @@ -609,6 +645,8 @@ "playButtonBehavior_optionAddNext": "$t(player.addNext)", "playButtonBehavior_optionPlay": "$t(player.play)", "playerAlbumArtResolution_description": "разрешение большой версии обложки альбома в проигрывателе. при большем разрешении она выглядит более четкой, но может замедлить загрузку. по умолчанию равно 0 - устанавливает разрешение автоматически", + "playerbarOpenDrawer": "полноэкранный переключатель по панели проигрывателя", + "playerbarOpenDrawer_description": "позволяет перейти в полноэкранный режим воспроизведения нажатием на панель проигрывателя", "remotePort": "порт сервера удалённого управления", "remotePort_description": "устанавливает порт для сервера удалённого управления", "replayGainClipping": "{{ReplayGain}} клиппинг", @@ -622,11 +660,21 @@ "showSkipButtons": "показывать кнопки перемотки", "showSkipButtons_description": "показывать или скрывать кнопки перемотки на панели управления воспроизведением", "sidebarPlaylistList_description": "показать или скрыть список плейлистов на боковой панели", + "sidePlayQueueStyle": "вид отображения боковой очереди", + "sidePlayQueueStyle_description": "определяет вид отображения боковой очереди", + "sidePlayQueueStyle_optionAttached": "закрепленная", + "sidePlayQueueStyle_optionDetached": "плавающая", "skipDuration": "время перемотки", "skipDuration_description": "задает время перемотки при использовании кнопок перемотки на панели проигрывателя", "useSystemTheme": "использовать тему системы", "themeLight": "тема (светлая)", "themeLight_description": "устанавливает светлую тему приложения", + "transcodeNote": "эффект применяется после 1 (для веб) - 2 (для mpv) песни", + "transcode": "включить транскодинг", + "transcode_description": "активирует транскодинг в другие форматы", + "transcodeBitrate": "битрейт транскодинга", + "transcodeBitrate_description": "выберите битрейт транскодинга. 0 - автоматическое определение сервером", + "transcodeFormat": "формат транкодинга", "useSystemTheme_description": "использует тему, заданную в системе (светлую/тёмную)", "zoom": "процент масштабирования", "zoom_description": "устанавливает процент масштабирования приложения", @@ -634,13 +682,15 @@ "genreBehavior_description": "определяет, что отобразится при открытии на жанр — список треков или альбомов", "globalMediaHotkeys_description": "включить или отключить использование системных мультимедийных горячих клавиш для управления воспроизведением", "homeConfiguration_description": "позволяет настроить видимость и порядок элементов на домашней странице", + "homeFeature": "улучшенная карусель на главной", + "homeFeature_description": "определяет, показывать ли улучшенную карусель на главной странице", "hotkey_toggleQueue": "показать/скрыть очередь воспроизведения", "imageAspectRatio": "использовать оригинальное соотношение сторон обложки", "imageAspectRatio_description": "если эта опция включена, обложки будут отображаться в соответствии с их собственным соотношением сторон. для обложек не 1:1 оставшееся пространство будет пустым", "minimumScrobblePercentage": "минимальное время для скробблинга (в процентах)", "playbackStyle": "стиль воспроизведения", "playerAlbumArtResolution": "разрешение обложки альбома", - "remotePassword_description": "задает пароль для сервера удалённого управления. По умолчанию эти учетные данные передаются небезопасным способом, поэтому следует использовать уникальный пароль, который вам не важен", + "remotePassword_description": "задает пароль для сервера удалённого управления. По умолчанию эти учетные данные передаются небезопасным способом, поэтому следует использовать уникальный пароль, который вам неважен", "replayGainClipping_description": "Предотвращение клиппинга, вызванного {{ReplayGain}}, путём автоматического снижения усиления", "replayGainFallback_description": "усиление в db для применения, если у файла нет тегов {{ReplayGain}}", "replayGainMode_description": "регулировать усиление громкости в соответствии со значениями {{ReplayGain}}, хранящимися в метаданных файла", @@ -658,8 +708,10 @@ "startMinimized": "запуск в свёрнутом режиме", "themeDark_description": "устанавливает тёмную тему приложения", "hotkey_volumeMute": "отключить звук", - "clearCache_description": "\"жесткая очистка\" feishin. кроме очистки кэша feishin, также очищает кэш браузера (сохранённые картинки и другие ресурсы). учётные данные и настройки сохраняются", + "clearCache_description": "\"жесткая очистка\" feishin: кроме очистки кэша feishin, также очищает кэш браузера (сохранённые картинки и другие ресурсы). учётные данные и настройки сохраняются", "clearCacheSuccess": "кэш успешно удалён", + "contextMenu": "конфигурация контекстного меню (нажатие правой кнопкой мыши)", + "contextMenu_description": "позволяет скрыть элементы, отображаемые в меню, появляющемся при нажатии правой кнопки мыши на элемент. все, что не отмечено, будет скрыто", "customFontPath": "путь к пользовательскому шрифту", "customFontPath_description": "укажите путь к пользовательскому шрифту, который будет использоваться в приложении", "externalLinks_description": "включает отображение внешних ссылок (Last.fm, MusicBrainz) на страницах альбомов и артистов", @@ -681,6 +733,10 @@ "scrobble_description": "скробблинг треков на вашем медиасервере", "startMinimized_description": "запуск приложения в области уведомлений", "volumeWheelStep_description": "количество громкости, изменяемое при прокрутке колёсика мыши над ползунком громкости", + "volumeWidth": "ширина слайдера звука", + "volumeWidth_description": "ширина слайдера звука (в px)", + "webAudio": "использовать веб аудио", + "webAudio_description": "использование веб аудио. включение активирует продвинутые возможности (например, replaygain). отключите, если вам это не нужно", "discordRichPresence": "состояние профиля {{discord}}", "discordApplicationId": "{{discord}} application id", "discordApplicationId_description": "application id приложения {{discord}} которое будет отображаться в статусе профиля (по умолчанию {{defaultId}})", @@ -688,9 +744,13 @@ "discordIdleStatus_description": "если включено, то обновляет статус, когда пользователь бездействует", "discordUpdateInterval": "интервал обновления статуса профиля {{discord}}", "discordUpdateInterval_description": "время в секундах между каждым обновлением (минимум 15 секунд)", + "doubleClickBehavior": "добавить в очередь все найденные треки при двойном клике", + "doubleClickBehavior_description": "есть включено: все найденные в поиске треки будут добавлены в очередь при двойном клике (иначе - только выбранный)", "lyricOffset_description": "Смещение появления текста треков на указанное количество миллисекунд", - "skipPlaylistPage": "пропустить страницу плейлиста", - "applicationHotkeys_description": "настройка горячих клавиш приложения. включите чекбокс, чтобы сделать горячую клавишу глобальной (только для ПК)", + "skipPlaylistPage": "пропускать страницу плейлиста", + "applicationHotkeys_description": "настройка горячих клавиш приложения. поставьте галочку, чтобы сделать горячую клавишу глобальной (только для ПК)", + "artistConfiguration": "конфигурация страницы альбомов исполнителей", + "artistConfiguration_description": "позволяет настроить видимость и порядок элементов на странице альбомов исполнителей", "fontType_description": "встроенный позволяет выбрать один из шрифтов, предоставляемых Feishin. системный позволяет выбрать любой шрифт, предоставляемый вашей операционной системой. пользовательский позволяет выбрать свой собственный шрифт", "discordRichPresence_description": "включить статус воспроизведения в статус профиля в {{discord}}. Ключи изображений: {{icon}}, {{playing}} и {{paused}} ", "lyricOffset": "синхронизация текста треков (мс)" diff --git a/src/renderer/components/feature-carousel/index.tsx b/src/renderer/components/feature-carousel/index.tsx index ef19363d9..a06858837 100644 --- a/src/renderer/components/feature-carousel/index.tsx +++ b/src/renderer/components/feature-carousel/index.tsx @@ -207,7 +207,11 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => { ))} {currentItem?.releaseYear} - {currentItem?.songCount} tracks + + {t('entity.trackWithCount', { + count: currentItem?.songCount || 0, + })} + - Display type + + {t('table.config.general.displayType', { postProcess: 'sentenceCase' })} + } onClick={handleRefresh} > - Refresh + {t('common.refresh', { + postProcess: 'titleCase', + })} @@ -436,7 +438,9 @@ export const AlbumArtistListHeaderFilters = ({ - Display type + + {t('table.config.general.displayType', { postProcess: 'sentenceCase' })} + { }, ], id: 'setRating', - label: 'Set rating', + label: t('action.setRating', { postProcess: 'sentenceCase' }), leftIcon: , onClick: () => {}, rightIcon: , diff --git a/src/renderer/features/genres/components/genre-list-header-filters.tsx b/src/renderer/features/genres/components/genre-list-header-filters.tsx index e57b43a4b..4bfb7578f 100644 --- a/src/renderer/features/genres/components/genre-list-header-filters.tsx +++ b/src/renderer/features/genres/components/genre-list-header-filters.tsx @@ -367,7 +367,7 @@ export const GenreListHeaderFilters = ({ gridRef, tableRef }: GenreListHeaderFil - {t('table.config.general.displayType', { postProcess: 'titleCase' })} + {t('table.config.general.displayType', { postProcess: 'sentenceCase' })} {isGrid && ( <> - Item gap + + {t('table.config.general.itemGap', { + postProcess: 'sentenceCase', + })} + { {!isMinWidth ? ( } - tooltip={{ label: 'View queue', openDelay: 500 }} + tooltip={{ + label: t('player.viewQueue', { postProcess: 'titleCase' }), + openDelay: 500, + }} variant="secondary" onClick={handleToggleQueue} /> diff --git a/src/renderer/features/playlists/components/playlist-detail-song-list-header-filters.tsx b/src/renderer/features/playlists/components/playlist-detail-song-list-header-filters.tsx index 0389be810..4567a5598 100644 --- a/src/renderer/features/playlists/components/playlist-detail-song-list-header-filters.tsx +++ b/src/renderer/features/playlists/components/playlist-detail-song-list-header-filters.tsx @@ -522,7 +522,9 @@ export const PlaylistDetailSongListHeaderFilters = ({ - Display type + + {t('table.config.general.displayType', { postProcess: 'sentenceCase' })} + - {t('table.config.general.displayType', { postProcess: 'titleCase' })} + {t('table.config.general.displayType', { postProcess: 'sentenceCase' })} { + const { t } = useTranslation(); const [edit, editHandlers] = useDisclosure(false); const [savedPassword, setSavedPassword] = useState(''); const { deleteServer } = useAuthStoreActions(); @@ -54,7 +56,11 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { - Server details + + {t('page.manageServers.serverDetails', { + postProcess: 'sentenceCase', + })} + } > @@ -68,8 +74,16 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { - URL - Username + + {t('page.manageServers.url', { + postProcess: 'sentenceCase', + })} + + + {t('page.manageServers.username', { + postProcess: 'sentenceCase', + })} + {server.url} @@ -79,11 +93,15 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { @@ -95,7 +113,7 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { timeoutProps={{ callback: handleDeleteServer, duration: 1000 }} variant="subtle" > - Remove server + {t('page.manageServers.removeServer', { postProcess: 'sentenceCase' })} ); diff --git a/src/renderer/features/shared/components/order-toggle-button.tsx b/src/renderer/features/shared/components/order-toggle-button.tsx index 44fafd6cc..d223374bb 100644 --- a/src/renderer/features/shared/components/order-toggle-button.tsx +++ b/src/renderer/features/shared/components/order-toggle-button.tsx @@ -16,8 +16,8 @@ export const OrderToggleButton = ({ sortOrder, onToggle, buttonProps }: OrderTog