mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 12:30:12 +02:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bab80b89b | |||
| 066e5188f2 | |||
| 456f4d7f65 | |||
| 02f5a1bd94 | |||
| 4424e9ae33 |
+4
-12
@@ -1,4 +1,4 @@
|
||||
import { PostProcessorModule, TOptions } from 'i18next';
|
||||
import { PostProcessorModule } from 'i18next';
|
||||
import i18n from 'i18next';
|
||||
import { initReactI18next } from 'react-i18next';
|
||||
|
||||
@@ -203,25 +203,17 @@ const titleCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const ignoreSentenceCaseLanguages = ['de'];
|
||||
// const ignoreSentenceCaseLanguages = ['de'];
|
||||
|
||||
const sentenceCasePostProcessor: PostProcessorModule = {
|
||||
name: 'sentenceCase',
|
||||
process: (
|
||||
value: string,
|
||||
_key: string,
|
||||
_options: TOptions<Record<string, string>>,
|
||||
translator: any,
|
||||
) => {
|
||||
process: (value: string) => {
|
||||
const sentences = value.split('. ');
|
||||
|
||||
return sentences
|
||||
.map((sentence) => {
|
||||
return (
|
||||
sentence.charAt(0).toLocaleUpperCase() +
|
||||
(!ignoreSentenceCaseLanguages.includes(translator.language)
|
||||
? sentence.slice(1).toLocaleLowerCase()
|
||||
: sentence.slice(1))
|
||||
sentence.charAt(0).toLocaleUpperCase() + sentence.slice(1).toLocaleLowerCase()
|
||||
);
|
||||
})
|
||||
.join('. ');
|
||||
|
||||
+934
-937
File diff suppressed because it is too large
Load Diff
+929
-932
File diff suppressed because it is too large
Load Diff
+871
-871
File diff suppressed because it is too large
Load Diff
+413
-413
File diff suppressed because it is too large
Load Diff
+923
-925
File diff suppressed because it is too large
Load Diff
+500
-503
File diff suppressed because it is too large
Load Diff
+744
-785
File diff suppressed because it is too large
Load Diff
@@ -12,7 +12,7 @@
|
||||
"unfavorite": "حذف از موردعلاقهها",
|
||||
"shuffle_off": "پخش تصادفی غیر فعال",
|
||||
"skip_forward": "برو جلو",
|
||||
"queue_moveToTop": "جابجا کردن انتخاب شده به پایین",
|
||||
"queue_moveToTop": "جابجا کردن انتخاب شده به بالا",
|
||||
"queue_clear": "خالی کردن صف",
|
||||
"queue_remove": "حذف انتخاب شده",
|
||||
"addLast": "افزودن به پایان",
|
||||
@@ -24,7 +24,7 @@
|
||||
"mute": "بیصدا کردن",
|
||||
"playbackFetchCancel": "دارد طول میکشد... برای لفو کردن اعلان را ببندید",
|
||||
"playbackFetchInProgress": "بارگذاری قطعهها…",
|
||||
"queue_moveToBottom": "جابجا کردن انتخاب شده به بالا",
|
||||
"queue_moveToBottom": "جابجا کردن انتخاب شده به پایین",
|
||||
"addNext": "افزودن به پسین",
|
||||
"favorite": "مورد علاقه",
|
||||
"playSimilarSongs": "پخش آهنگهای همگون",
|
||||
@@ -70,7 +70,7 @@
|
||||
"hotkey_rate1": "امتیاز ۱ ستاره",
|
||||
"hotkey_skipForward": "برو جلو",
|
||||
"disableLibraryUpdateOnStartup": "غیرفعال کردن بررسی آخرین نسخه در آغاز به کار برنامه",
|
||||
"discordApplicationId_description": "the application id for {{discord}} rich presence (defaults to {{defaultId}})",
|
||||
"discordApplicationId_description": "the application ID for {{discord}} Rich Presence (defaults to {{defaultId}})",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"hotkey_playbackPlay": "پخش",
|
||||
"hotkey_volumeDown": "کم کردن صدا",
|
||||
@@ -109,7 +109,7 @@
|
||||
"customFontPath": "مسیر قلم سفارشی",
|
||||
"audioPlayer": "پخشکنندهٔ صدا",
|
||||
"hotkey_rate0": "حذف امتیاز",
|
||||
"discordApplicationId": "{{discord}} application id",
|
||||
"discordApplicationId": "{{discord}} application ID",
|
||||
"hotkey_volumeMute": "بستن صدا",
|
||||
"showSkipButton": "نمایش دکمهٔ رد کردن",
|
||||
"customFontPath_description": "مسیر قلم سفارشی را برای استفاده در اپلیکیشن مشخص کنید",
|
||||
@@ -132,7 +132,7 @@
|
||||
"buttonSize": "اندازهی دکمهی پخش نوار",
|
||||
"contextMenu": "پیکربندی فهرست زمینه (کلیک راست)",
|
||||
"buttonSize_description": "اندازهی دکمههای پخش نوار",
|
||||
"audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال میکند. در این حالت، سامانه معمولاً قفل است و فقط mpv میتواند خروجی صدا دهد",
|
||||
"audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال میکند. در این حالت، سامانه معمولاً قفل است و فقط MPV میتواند خروجی صدا دهد",
|
||||
"clearQueryCache_description": "یک 'پاکسازی نرم' از فیشین. این فهرستهای پخش و فرادادهی قطعهها را تازه میکند و متن شعرهای ذخیره شده را بازنشانی میکند. پیکربندیها، اعتبارنامههای سرویسدهنده و نگارههای کَش شده حفظ میشوند",
|
||||
"clearCache_description": "یک 'پاکسازی سخت' فیشین. افزون بر پاکسازی کَش فیشین، کَش مرورگر هم تهی میشود (نگارههای ذخیره شده و باقی داراییها). اعتبارنامهها و پیکربندیها حفظ میشوند",
|
||||
"contextMenu_description": "به شما اجازه میدهد که آیتمهای نمایش داده شده در فهرستی که وقتی روی یک آیتم کلیک راست میکنید پدیدار میشود، را پنهان کنید. آیتمهایی که منتخب نیستند پنهان میشوند",
|
||||
@@ -176,7 +176,7 @@
|
||||
"backward": "به عقب",
|
||||
"increase": "افزایش",
|
||||
"rating": "امتیاز",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"refresh": "تازهسازی",
|
||||
"unknown": "ناشناخته",
|
||||
"areYouSure": "مطمئنید؟",
|
||||
@@ -313,9 +313,9 @@
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "به تازگی پخش شده است",
|
||||
"isFavorited": "موردعلاقه است",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"releaseYear": "سال انتشار",
|
||||
"id": "id",
|
||||
"id": "ID",
|
||||
"disc": "دیسک",
|
||||
"biography": "زندگینامه",
|
||||
"songCount": "تعداد ترانه",
|
||||
|
||||
+753
-753
File diff suppressed because it is too large
Load Diff
+977
-977
File diff suppressed because it is too large
Load Diff
+728
-728
File diff suppressed because it is too large
Load Diff
+821
-821
File diff suppressed because it is too large
Load Diff
+734
-734
File diff suppressed because it is too large
Load Diff
@@ -22,8 +22,8 @@
|
||||
"queue_clear": "キューをクリア",
|
||||
"muted": "ミュート中",
|
||||
"unfavorite": "お気に入り解除",
|
||||
"queue_moveToTop": "選択項目を一番下に移動",
|
||||
"queue_moveToBottom": "選択項目を先頭に移動",
|
||||
"queue_moveToTop": "選択項目を先頭に移動",
|
||||
"queue_moveToBottom": "選択項目を一番下に移動",
|
||||
"shuffle_off": "シャッフル無効",
|
||||
"addLast": "最後",
|
||||
"mute": "ミュート",
|
||||
@@ -271,7 +271,7 @@
|
||||
"customCss": "カスタム CSS",
|
||||
"customCssEnable_description": "カスタム CSS の記述を許可します",
|
||||
"customCssEnable": "カスタム CSS を有効にする",
|
||||
"customCssNotice": "警告: ある程度のサニタイズ (url() と content: の禁止) はありますが、カスタム CSS を使用するとインターフェースの変更によりリスクが生じる可能性があります",
|
||||
"customCssNotice": "警告: ある程度のサニタイズ (URL() と content: の禁止) はありますが、カスタム CSS を使用するとインターフェースの変更によりリスクが生じる可能性があります",
|
||||
"releaseChannel_optionBeta": "ベータ",
|
||||
"releaseChannel_optionLatest": "最新",
|
||||
"releaseChannel": "リリースチャンネル",
|
||||
@@ -501,7 +501,7 @@
|
||||
"name": "名前",
|
||||
"maximize": "最大化",
|
||||
"decrease": "減少",
|
||||
"ok": "OK",
|
||||
"ok": "Ok",
|
||||
"description": "説明",
|
||||
"configure": "設定",
|
||||
"path": "パス",
|
||||
@@ -639,7 +639,7 @@
|
||||
"titleCombined": "$t(common.title) (結合)",
|
||||
"dateAdded": "追加日",
|
||||
"size": "$t(common.size)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"bpm": "$t(common.BPM)",
|
||||
"lastPlayed": "最後に再生",
|
||||
"trackNumber": "トラック番号",
|
||||
"rowIndex": "行インデックス",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"ascending": "오름차순",
|
||||
"areYouSure": "확실한가요?",
|
||||
"bitrate": "비트 전송률",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"biography": "바이오그래피",
|
||||
"center": "중앙",
|
||||
"channel_other": "채널",
|
||||
@@ -127,7 +127,7 @@
|
||||
"filters": "필터",
|
||||
"noResultsFromQuery": "쿼리 결과가 없습니다",
|
||||
"note": "노트",
|
||||
"ok": "OK",
|
||||
"ok": "Ok",
|
||||
"owner": "소유자",
|
||||
"sampleRate": "샘플레이트",
|
||||
"tags": "태그",
|
||||
@@ -224,7 +224,7 @@
|
||||
"biography": "바이오그래피",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"duration": "길이",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) 앨범수",
|
||||
"comment": "코멘트",
|
||||
"favorited": "즐겨찾기",
|
||||
@@ -251,7 +251,7 @@
|
||||
"input_name": "서버 이름",
|
||||
"input_password": "비밀번호",
|
||||
"input_savePassword": "비밀번호 저장하기",
|
||||
"input_url": "url",
|
||||
"input_url": "URL",
|
||||
"error_savePassword": "비밀번호를 저장하는 도중 오류가 발생했습니다",
|
||||
"ignoreCors": "CORS 무시 ($t(common.restartRequired))",
|
||||
"ignoreSsl": "SSL 무시 ($t(common.restartRequired))",
|
||||
@@ -458,8 +458,8 @@
|
||||
"playSimilarSongs": "비슷한 곡 재생",
|
||||
"previous": "이전",
|
||||
"queue_clear": "재생 대기열 지우기",
|
||||
"queue_moveToBottom": "선택한 곡을 가장 위로 이동",
|
||||
"queue_moveToTop": "선택한 곡을 가장 아래로 이동",
|
||||
"queue_moveToBottom": "선택한 곡을 가장 아래로 이동",
|
||||
"queue_moveToTop": "선택한 곡을 가장 위로 이동",
|
||||
"queue_remove": "선택한 항목 삭제",
|
||||
"repeat": "반복",
|
||||
"repeat_all": "모두 반복하기",
|
||||
|
||||
+471
-471
File diff suppressed because it is too large
Load Diff
+903
-909
File diff suppressed because it is too large
Load Diff
+911
-916
File diff suppressed because it is too large
Load Diff
+405
-405
File diff suppressed because it is too large
Load Diff
+352
-352
@@ -1,166 +1,166 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "adicionar a $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "adicionar a $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "limpar fila",
|
||||
"createPlaylist": "criar $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "apagar $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "desmarcar todos",
|
||||
"editPlaylist": "editar $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "vá para página",
|
||||
"moveToNext": "mover para o próximo",
|
||||
"moveToBottom": "mover para baixo",
|
||||
"moveToTop": "mover para o topo",
|
||||
"addToFavorites": "Adicionar a $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "Adicionar a $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "Limpar fila",
|
||||
"createPlaylist": "Criar $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "Apagar $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "Desmarcar todos",
|
||||
"editPlaylist": "Editar $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "Vá para página",
|
||||
"moveToNext": "Mover para o próximo",
|
||||
"moveToBottom": "Mover para baixo",
|
||||
"moveToTop": "Mover para o topo",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "remover de $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "remover da $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "remover da fila",
|
||||
"setRating": "definir classificação",
|
||||
"toggleSmartPlaylistEditor": "alternar editor $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "ver $t(entity.playlist, {\"count\": 2})",
|
||||
"removeFromFavorites": "Remover de $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "Remover da $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "Remover da fila",
|
||||
"setRating": "Definir classificação",
|
||||
"toggleSmartPlaylistEditor": "Alternar editor $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "Ver $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir em Last.fm",
|
||||
"musicbrainz": "Abrir em MusicBrainz"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"action_one": "ação",
|
||||
"action_one": "Ação",
|
||||
"action_many": "ações",
|
||||
"action_other": "ações",
|
||||
"add": "adicionar",
|
||||
"additionalParticipants": "participantes adicionais",
|
||||
"newVersion": "uma nova versão foi instalada ({{version}})",
|
||||
"viewReleaseNotes": "ver notas de lançamento",
|
||||
"albumGain": "ganho do álbum",
|
||||
"albumPeak": "pico do álbum",
|
||||
"areYouSure": "tem certeza?",
|
||||
"ascending": "ascendente",
|
||||
"backward": "para trás",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancelar",
|
||||
"center": "centro",
|
||||
"channel_one": "canal",
|
||||
"action_other": "Ações",
|
||||
"add": "Adicionar",
|
||||
"additionalParticipants": "Participantes adicionais",
|
||||
"newVersion": "Uma nova versão foi instalada ({{version}})",
|
||||
"viewReleaseNotes": "Ver notas de lançamento",
|
||||
"albumGain": "Ganho do álbum",
|
||||
"albumPeak": "Pico do álbum",
|
||||
"areYouSure": "Tem certeza?",
|
||||
"ascending": "Ascendente",
|
||||
"backward": "Para trás",
|
||||
"biography": "Biografia",
|
||||
"bitrate": "Taxa de bits",
|
||||
"bpm": "Bpm",
|
||||
"cancel": "Cancelar",
|
||||
"center": "Centro",
|
||||
"channel_one": "Canal",
|
||||
"channel_many": "canais",
|
||||
"channel_other": "canais",
|
||||
"clear": "limpar",
|
||||
"close": "fechar",
|
||||
"codec": "codec",
|
||||
"collapse": "minimizar",
|
||||
"comingSoon": "em breve…",
|
||||
"configure": "configurar",
|
||||
"confirm": "confirmar",
|
||||
"create": "criar",
|
||||
"channel_other": "Canais",
|
||||
"clear": "Limpar",
|
||||
"close": "Fechar",
|
||||
"codec": "Codec",
|
||||
"collapse": "Minimizar",
|
||||
"comingSoon": "Em breve…",
|
||||
"configure": "Configurar",
|
||||
"confirm": "Confirmar",
|
||||
"create": "Criar",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) atual",
|
||||
"decrease": "diminuir",
|
||||
"delete": "apagar",
|
||||
"descending": "abaixar",
|
||||
"description": "descrição",
|
||||
"disable": "desativar",
|
||||
"disc": "disco",
|
||||
"dismiss": "liberar",
|
||||
"duration": "duração",
|
||||
"edit": "editar",
|
||||
"enable": "ativar",
|
||||
"expand": "expandir",
|
||||
"favorite": "favorito",
|
||||
"filter_one": "filtro",
|
||||
"decrease": "Diminuir",
|
||||
"delete": "Apagar",
|
||||
"descending": "Abaixar",
|
||||
"description": "Descrição",
|
||||
"disable": "Desativar",
|
||||
"disc": "Disco",
|
||||
"dismiss": "Liberar",
|
||||
"duration": "Duração",
|
||||
"edit": "Editar",
|
||||
"enable": "Ativar",
|
||||
"expand": "Expandir",
|
||||
"favorite": "Favorito",
|
||||
"filter_one": "Filtro",
|
||||
"filter_many": "filtros",
|
||||
"filter_other": "filtros",
|
||||
"filters": "filtros",
|
||||
"forceRestartRequired": "reinicie para aplicar as alterações… feche a notificação para reiniciar",
|
||||
"forward": "para frente",
|
||||
"gap": "intervalo",
|
||||
"grouping": "agrupamento",
|
||||
"home": "início",
|
||||
"increase": "incrementar",
|
||||
"left": "esquerda",
|
||||
"limit": "limite",
|
||||
"manage": "gerir",
|
||||
"maximize": "maximizar",
|
||||
"menu": "menu",
|
||||
"minimize": "minimizar",
|
||||
"modified": "modificado",
|
||||
"filter_other": "Filtros",
|
||||
"filters": "Filtros",
|
||||
"forceRestartRequired": "Reinicie para aplicar as alterações… feche a notificação para reiniciar",
|
||||
"forward": "Para frente",
|
||||
"gap": "Intervalo",
|
||||
"grouping": "Agrupamento",
|
||||
"home": "Início",
|
||||
"increase": "Incrementar",
|
||||
"left": "Esquerda",
|
||||
"limit": "Limite",
|
||||
"manage": "Gerir",
|
||||
"maximize": "Maximizar",
|
||||
"menu": "Menu",
|
||||
"minimize": "Minimizar",
|
||||
"modified": "Modificado",
|
||||
"mbid": "ID no MusicBrainz",
|
||||
"name": "nome",
|
||||
"no": "não",
|
||||
"none": "nenhum",
|
||||
"noResultsFromQuery": "a consulta não retornou resultados",
|
||||
"note": "observação",
|
||||
"ok": "ok",
|
||||
"owner": "dono",
|
||||
"path": "caminho",
|
||||
"playerMustBePaused": "o player deve estar pausado",
|
||||
"preview": "pré-visualizar",
|
||||
"previousSong": "anterior $t(entity.track, {\"count\": 1})",
|
||||
"quit": "sair",
|
||||
"random": "aleatório",
|
||||
"rating": "classificação",
|
||||
"refresh": "atualizar",
|
||||
"reload": "recarregar",
|
||||
"reset": "reiniciar",
|
||||
"resetToDefault": "restaurar ao padrão",
|
||||
"restartRequired": "é necessário reiniciar",
|
||||
"right": "direita",
|
||||
"save": "gravar",
|
||||
"saveAndReplace": "gravar e substituir",
|
||||
"saveAs": "gravar como",
|
||||
"search": "procurar",
|
||||
"setting_one": "configuração",
|
||||
"name": "Nome",
|
||||
"no": "Não",
|
||||
"none": "Nenhum",
|
||||
"noResultsFromQuery": "A consulta não retornou resultados",
|
||||
"note": "Observação",
|
||||
"ok": "Ok",
|
||||
"owner": "Dono",
|
||||
"path": "Caminho",
|
||||
"playerMustBePaused": "O player deve estar pausado",
|
||||
"preview": "Pré-visualizar",
|
||||
"previousSong": "Anterior $t(entity.track, {\"count\": 1})",
|
||||
"quit": "Sair",
|
||||
"random": "Aleatório",
|
||||
"rating": "Classificação",
|
||||
"refresh": "Atualizar",
|
||||
"reload": "Recarregar",
|
||||
"reset": "Reiniciar",
|
||||
"resetToDefault": "Restaurar ao padrão",
|
||||
"restartRequired": "É necessário reiniciar",
|
||||
"right": "Direita",
|
||||
"save": "Gravar",
|
||||
"saveAndReplace": "Gravar e substituir",
|
||||
"saveAs": "Gravar como",
|
||||
"search": "Procurar",
|
||||
"setting_one": "Configuração",
|
||||
"setting_many": "",
|
||||
"setting_other": "",
|
||||
"share": "partilhar",
|
||||
"size": "tamanho",
|
||||
"sortOrder": "ordem",
|
||||
"tags": "tags",
|
||||
"title": "titulo",
|
||||
"trackNumber": "faixa",
|
||||
"trackGain": "ganho da faixa",
|
||||
"trackPeak": "pico da faixa",
|
||||
"translation": "tradução",
|
||||
"unknown": "desconhecido",
|
||||
"version": "versão",
|
||||
"year": "ano",
|
||||
"yes": "sim"
|
||||
"share": "Partilhar",
|
||||
"size": "Tamanho",
|
||||
"sortOrder": "Ordem",
|
||||
"tags": "Tags",
|
||||
"title": "Titulo",
|
||||
"trackNumber": "Faixa",
|
||||
"trackGain": "Ganho da faixa",
|
||||
"trackPeak": "Pico da faixa",
|
||||
"translation": "Tradução",
|
||||
"unknown": "Desconhecido",
|
||||
"version": "Versão",
|
||||
"year": "Ano",
|
||||
"yes": "Sim"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "álbum",
|
||||
"album_one": "Álbum",
|
||||
"album_many": "álbuns",
|
||||
"album_other": "álbuns",
|
||||
"albumArtist_one": "artista do álbum",
|
||||
"album_other": "Álbuns",
|
||||
"albumArtist_one": "Artista do álbum",
|
||||
"albumArtist_many": "artistas do álbum",
|
||||
"albumArtist_other": "artistas do álbum",
|
||||
"albumArtist_other": "Artistas do álbum",
|
||||
"albumArtistCount_one": "{{count}} artista do álbum",
|
||||
"albumArtistCount_many": "{{count}} artistas do álbum",
|
||||
"albumArtistCount_other": "{{count}} artistas do álbum",
|
||||
"albumWithCount_one": "{{count}} álbum",
|
||||
"albumWithCount_many": "{{count}} álbuns",
|
||||
"albumWithCount_other": "{{count}} álbuns",
|
||||
"artist_one": "artista",
|
||||
"artist_one": "Artista",
|
||||
"artist_many": "artistas",
|
||||
"artist_other": "artistas",
|
||||
"artist_other": "Artistas",
|
||||
"artistWithCount_one": "{{count}} artista",
|
||||
"artistWithCount_many": "{{count}} artistas",
|
||||
"artistWithCount_other": "{{count}} artistas",
|
||||
"favorite_one": "favorito",
|
||||
"favorite_one": "Favorito",
|
||||
"favorite_many": "favoritos",
|
||||
"favorite_other": "favoritos",
|
||||
"folder_one": "pasta",
|
||||
"favorite_other": "Favoritos",
|
||||
"folder_one": "Pasta",
|
||||
"folder_many": "pastas",
|
||||
"folder_other": "pastas",
|
||||
"folder_other": "Pastas",
|
||||
"folderWithCount_one": "{{count}} pasta",
|
||||
"folderWithCount_many": "{{count}} pastas",
|
||||
"folderWithCount_other": "{{count}} pastas",
|
||||
"genre_one": "gênero",
|
||||
"genre_one": "Gênero",
|
||||
"genre_many": "gêneros",
|
||||
"genre_other": "gêneros",
|
||||
"genre_other": "Gêneros",
|
||||
"genreWithCount_one": "{{count}} gênero",
|
||||
"genreWithCount_many": "{{count}} gêneros",
|
||||
"genreWithCount_other": "{{count}} gêneros",
|
||||
"playlist_one": "playlist",
|
||||
"playlist_one": "Playlist",
|
||||
"playlist_many": "playlists",
|
||||
"playlist_other": "playlists",
|
||||
"playlist_other": "Playlists",
|
||||
"play_one": "{{count}} reprodução",
|
||||
"play_many": "{{count}} reproduções",
|
||||
"play_other": "{{count}} reproduções",
|
||||
@@ -168,189 +168,189 @@
|
||||
"playlistWithCount_many": "{{count}} playlists",
|
||||
"playlistWithCount_other": "{{count}} playlists",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) inteligente",
|
||||
"track_one": "faixa",
|
||||
"track_one": "Faixa",
|
||||
"track_many": "faixas",
|
||||
"track_other": "faixas",
|
||||
"song_one": "música",
|
||||
"track_other": "Faixas",
|
||||
"song_one": "Música",
|
||||
"song_many": "músicas",
|
||||
"song_other": "músicas",
|
||||
"song_other": "Músicas",
|
||||
"trackWithCount_one": "{{count}} faixa",
|
||||
"trackWithCount_many": "{{count}} faixas",
|
||||
"trackWithCount_other": "{{count}} faixas"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "não é possível encaminhar a solicitação",
|
||||
"audioDeviceFetchError": "ocorreu um erro ao tentar obter dispositivos de áudio",
|
||||
"authenticationFailed": "falha na autenticação",
|
||||
"badAlbum": "está a ver este erro por que está música não é parte de algum album. um motivo comum para si estar a ver este erro é se a sua música estiver na raiz da sua pasta de músicas. o Jellyfin apenas agrupa as músicas se elas estiveram na mesma pasta",
|
||||
"badValue": "opção inválida \"{{value}}\". este valor não existe no momento",
|
||||
"credentialsRequired": "credenciais necessárias",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} não está implementado para {{serverType}}",
|
||||
"genericError": "um erro ocorreu",
|
||||
"invalidServer": "servidor inválido",
|
||||
"localFontAccessDenied": "acesso a fontes locais rejeitado",
|
||||
"loginRateError": "muitas tentativas de login, tente novamente em alguns segundos",
|
||||
"apiRouteError": "Não é possível encaminhar a solicitação",
|
||||
"audioDeviceFetchError": "Ocorreu um erro ao tentar obter dispositivos de áudio",
|
||||
"authenticationFailed": "Falha na autenticação",
|
||||
"badAlbum": "Está a ver este erro por que está música não é parte de algum album. um motivo comum para si estar a ver este erro é se a sua música estiver na raiz da sua pasta de músicas. o Jellyfin apenas agrupa as músicas se elas estiveram na mesma pasta",
|
||||
"badValue": "Opção inválida \"{{value}}\". este valor não existe no momento",
|
||||
"credentialsRequired": "Credenciais necessárias",
|
||||
"endpointNotImplementedError": "Endpoint {{endpoint}} não está implementado para {{serverType}}",
|
||||
"genericError": "Um erro ocorreu",
|
||||
"invalidServer": "Servidor inválido",
|
||||
"localFontAccessDenied": "Acesso a fontes locais rejeitado",
|
||||
"loginRateError": "Muitas tentativas de login, tente novamente em alguns segundos",
|
||||
"mpvRequired": "MPV necessário",
|
||||
"networkError": "ocorreu um erro na internet",
|
||||
"openError": "não foi possível abrir o ficheiro",
|
||||
"playbackError": "ocorreu um erro ao tentar reproduzir a média",
|
||||
"remoteDisableError": "ocorreu um erro ao tentar $t(common.disable) o servidor remoto",
|
||||
"remoteEnableError": "ocorreu um erro ao tentar $t(common.enable) o servidor remoto",
|
||||
"remotePortError": "ocorreu um erro ao tentar definir a porta do servidor remoto",
|
||||
"remotePortWarning": "reinicie o servidor para aplicar a nova porta",
|
||||
"serverNotSelectedError": "nenhum servidor selecionado",
|
||||
"serverRequired": "servidor necessário",
|
||||
"sessionExpiredError": "a sua sessão expirou",
|
||||
"systemFontError": "ocorreu um erro ao tentar obter fontes do sistema"
|
||||
"networkError": "Ocorreu um erro na internet",
|
||||
"openError": "Não foi possível abrir o ficheiro",
|
||||
"playbackError": "Ocorreu um erro ao tentar reproduzir a média",
|
||||
"remoteDisableError": "Ocorreu um erro ao tentar $t(common.disable) o servidor remoto",
|
||||
"remoteEnableError": "Ocorreu um erro ao tentar $t(common.enable) o servidor remoto",
|
||||
"remotePortError": "Ocorreu um erro ao tentar definir a porta do servidor remoto",
|
||||
"remotePortWarning": "Reinicie o servidor para aplicar a nova porta",
|
||||
"serverNotSelectedError": "Nenhum servidor selecionado",
|
||||
"serverRequired": "Servidor necessário",
|
||||
"sessionExpiredError": "A sua sessão expirou",
|
||||
"systemFontError": "Ocorreu um erro ao tentar obter fontes do sistema"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "número de $t(entity.album, {\"count\": 2})",
|
||||
"albumCount": "Número de $t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "bibliografia",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"biography": "Bibliografia",
|
||||
"bitrate": "Bitrate",
|
||||
"bpm": "Bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "comentário",
|
||||
"comment": "Comentário",
|
||||
"communityRating": "Nota da comunidade",
|
||||
"criticRating": "avaliação da crítica",
|
||||
"dateAdded": "data de adição",
|
||||
"disc": "disco",
|
||||
"duration": "duração",
|
||||
"favorited": "favoritado",
|
||||
"fromYear": "a partir do ano",
|
||||
"criticRating": "Avaliação da crítica",
|
||||
"dateAdded": "Data de adição",
|
||||
"disc": "Disco",
|
||||
"duration": "Duração",
|
||||
"favorited": "Favoritado",
|
||||
"fromYear": "A partir do ano",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "id",
|
||||
"isCompilation": "é compilação",
|
||||
"isFavorited": "é favoritado",
|
||||
"isPublic": "é público",
|
||||
"isRated": "possui avaliação",
|
||||
"isRecentlyPlayed": "foi tocado recentemente",
|
||||
"lastPlayed": "última tocada",
|
||||
"mostPlayed": "mais tocado",
|
||||
"name": "nome",
|
||||
"note": "nota",
|
||||
"id": "Id",
|
||||
"isCompilation": "É compilação",
|
||||
"isFavorited": "É favoritado",
|
||||
"isPublic": "É público",
|
||||
"isRated": "Possui avaliação",
|
||||
"isRecentlyPlayed": "Foi tocado recentemente",
|
||||
"lastPlayed": "Última tocada",
|
||||
"mostPlayed": "Mais tocado",
|
||||
"name": "Nome",
|
||||
"note": "Nota",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "caminho",
|
||||
"playCount": "contador de reproduções",
|
||||
"random": "aleatório",
|
||||
"rating": "avaliação",
|
||||
"recentlyAdded": "adicionado recentemente",
|
||||
"recentlyPlayed": "tocado recentemente",
|
||||
"recentlyUpdated": "atualizado recentemente",
|
||||
"releaseDate": "data de lançamento",
|
||||
"releaseYear": "ano de lançamento",
|
||||
"search": "buscar",
|
||||
"songCount": "contador de músicas",
|
||||
"title": "titulo",
|
||||
"toYear": "até o ano",
|
||||
"trackNumber": "faixa"
|
||||
"path": "Caminho",
|
||||
"playCount": "Contador de reproduções",
|
||||
"random": "Aleatório",
|
||||
"rating": "Avaliação",
|
||||
"recentlyAdded": "Adicionado recentemente",
|
||||
"recentlyPlayed": "Tocado recentemente",
|
||||
"recentlyUpdated": "Atualizado recentemente",
|
||||
"releaseDate": "Data de lançamento",
|
||||
"releaseYear": "Ano de lançamento",
|
||||
"search": "Buscar",
|
||||
"songCount": "Contador de músicas",
|
||||
"title": "Titulo",
|
||||
"toYear": "Até o ano",
|
||||
"trackNumber": "Faixa"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "um erro ocorreu ao tentar gravar a palavra-passe",
|
||||
"ignoreCors": "ignorar CORS ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ignorar ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "ativar autenticação legada",
|
||||
"input_name": "nome do servidor",
|
||||
"input_password": "palavra-passe",
|
||||
"input_savePassword": "gravar palavra-passe",
|
||||
"input_url": "url",
|
||||
"input_username": "nome de utilizador",
|
||||
"success": "servidor adicionado com sucesso",
|
||||
"title": "adicionar servidor"
|
||||
"error_savePassword": "Um erro ocorreu ao tentar gravar a palavra-passe",
|
||||
"ignoreCors": "Ignorar CORS ($t(common.restartRequired))",
|
||||
"ignoreSsl": "Ignorar ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "Ativar autenticação legada",
|
||||
"input_name": "Nome do servidor",
|
||||
"input_password": "Palavra-passe",
|
||||
"input_savePassword": "Gravar palavra-passe",
|
||||
"input_url": "Url",
|
||||
"input_username": "Nome de utilizador",
|
||||
"success": "Servidor adicionado com sucesso",
|
||||
"title": "Adicionar servidor"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "pular duplicadas",
|
||||
"success": "adicionado $t(entity.trackWithCount, {\"count\": {{message}} }) para $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "adicionar à $t(entity.playlist, {\"count\": 1})"
|
||||
"input_skipDuplicates": "Pular duplicadas",
|
||||
"success": "Adicionado $t(entity.trackWithCount, {\"count\": {{message}} }) para $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "Adicionar à $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "público",
|
||||
"input_public": "Público",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) criada com sucesso",
|
||||
"title": "criar $t(entity.playlist, {\"count\": 1})"
|
||||
"title": "Criar $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "escreva o nome da $t(entity.playlist, {\"count\": 1}) para confirmar",
|
||||
"input_confirm": "Escreva o nome da $t(entity.playlist, {\"count\": 1}) para confirmar",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) apagada com sucesso",
|
||||
"title": "apagar $t(entity.playlist, {\"count\": 1})"
|
||||
"title": "Apagar $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "O Jellyfin por algum motivo não expõe se uma playlist é pública ou não. Se deseja que ela permaneça pública, por favor selecione a seguinte entrada",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) atualizada com sucesso",
|
||||
"title": "editar $t(entity.playlist, {\"count\": 1})"
|
||||
"title": "Editar $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "pesquisa de letras"
|
||||
"title": "Pesquisa de letras"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "corresponder todos",
|
||||
"input_optionMatchAny": "corresponder qualquer um"
|
||||
"input_optionMatchAll": "Corresponder todos",
|
||||
"input_optionMatchAny": "Corresponder qualquer um"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "permitir descargas",
|
||||
"description": "descrição",
|
||||
"setExpiration": "definir expiração",
|
||||
"success": "ligação de compartilhamento copiado para a área de transferência (ou clique aqui para abrir)",
|
||||
"expireInvalid": "a expiração deve ser uma data futura",
|
||||
"createFailed": "falha ao criar compartilhamento (o compartilhamento está ativado?)"
|
||||
"allowDownloading": "Permitir descargas",
|
||||
"description": "Descrição",
|
||||
"setExpiration": "Definir expiração",
|
||||
"success": "Ligação de compartilhamento copiado para a área de transferência (ou clique aqui para abrir)",
|
||||
"expireInvalid": "A expiração deve ser uma data futura",
|
||||
"createFailed": "Falha ao criar compartilhamento (o compartilhamento está ativado?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "servidor atualizado com sucesso",
|
||||
"title": "atualizar servidor"
|
||||
"success": "Servidor atualizado com sucesso",
|
||||
"title": "Atualizar servidor"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "aparece em",
|
||||
"recentReleases": "lançamentos recentes",
|
||||
"viewDiscography": "ver discografia",
|
||||
"appearsOn": "Aparece em",
|
||||
"recentReleases": "Lançamentos recentes",
|
||||
"viewDiscography": "Ver discografia",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) relacionados",
|
||||
"topSongs": "músicas mais tocadas",
|
||||
"topSongsFrom": "músicas mais tocadas de {{title}}",
|
||||
"viewAll": "ver tudo",
|
||||
"viewAllTracks": "ver todas as $t(entity.track, {\"count\": 2})"
|
||||
"topSongs": "Músicas mais tocadas",
|
||||
"topSongsFrom": "Músicas mais tocadas de {{title}}",
|
||||
"viewAll": "Ver tudo",
|
||||
"viewAllTracks": "Ver todas as $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mais deste $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "mais que {{item}}",
|
||||
"released": "lançado"
|
||||
"moreFromArtist": "Mais deste $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "Mais que {{item}}",
|
||||
"released": "Lançado"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "álbuns de {{artist}}",
|
||||
"artistAlbums": "Álbuns de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "recolher barra lateral",
|
||||
"expandSidebar": "expandir barra lateral",
|
||||
"goBack": "voltar",
|
||||
"goForward": "avançar",
|
||||
"manageServers": "gerir servidores",
|
||||
"openBrowserDevtools": "abrir ferramentas do programador",
|
||||
"collapseSidebar": "Recolher barra lateral",
|
||||
"expandSidebar": "Expandir barra lateral",
|
||||
"goBack": "Voltar",
|
||||
"goForward": "Avançar",
|
||||
"manageServers": "Gerir servidores",
|
||||
"openBrowserDevtools": "Abrir ferramentas do programador",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "selecionar servidor",
|
||||
"selectServer": "Selecionar servidor",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "versão {{version}}"
|
||||
"version": "Versão {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "gerir servidores",
|
||||
"serverDetails": "pormenores do servidor",
|
||||
"title": "Gerir servidores",
|
||||
"serverDetails": "Pormenores do servidor",
|
||||
"url": "URL",
|
||||
"username": "nome de utilizador",
|
||||
"editServerDetailsTooltip": "editar pormenores do servidor",
|
||||
"removeServer": "remover servidor"
|
||||
"username": "Nome de utilizador",
|
||||
"editServerDetailsTooltip": "Editar pormenores do servidor",
|
||||
"removeServer": "Remover servidor"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
@@ -361,7 +361,7 @@
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "descarregar",
|
||||
"download": "Descarregar",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
@@ -373,69 +373,69 @@
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "partilhar elemento",
|
||||
"showDetails": "obter informações"
|
||||
"shareItem": "Partilhar elemento",
|
||||
"showDetails": "Obter informações"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "fundo dinâmico",
|
||||
"dynamicImageBlur": "tamanho do desfoque da imagem",
|
||||
"dynamicIsImage": "ativar imagem de fundo",
|
||||
"followCurrentLyric": "acompanhar letra",
|
||||
"lyricAlignment": "alinhamento da letra",
|
||||
"lyricOffset": "deslocamento da letra (ms)",
|
||||
"lyricGap": "espaçamento da letra",
|
||||
"lyricSize": "tamanho da letra",
|
||||
"opacity": "opacidade",
|
||||
"showLyricMatch": "exibir correspondência da letra",
|
||||
"showLyricProvider": "exibir origem da letra",
|
||||
"synchronized": "sincronizado",
|
||||
"unsynchronized": "não sincronizado",
|
||||
"useImageAspectRatio": "usar proporção da imagem"
|
||||
"dynamicBackground": "Fundo dinâmico",
|
||||
"dynamicImageBlur": "Tamanho do desfoque da imagem",
|
||||
"dynamicIsImage": "Ativar imagem de fundo",
|
||||
"followCurrentLyric": "Acompanhar letra",
|
||||
"lyricAlignment": "Alinhamento da letra",
|
||||
"lyricOffset": "Deslocamento da letra (ms)",
|
||||
"lyricGap": "Espaçamento da letra",
|
||||
"lyricSize": "Tamanho da letra",
|
||||
"opacity": "Opacidade",
|
||||
"showLyricMatch": "Exibir correspondência da letra",
|
||||
"showLyricProvider": "Exibir origem da letra",
|
||||
"synchronized": "Sincronizado",
|
||||
"unsynchronized": "Não sincronizado",
|
||||
"useImageAspectRatio": "Usar proporção da imagem"
|
||||
},
|
||||
"lyrics": "letra",
|
||||
"related": "relacionado",
|
||||
"upNext": "a seguir",
|
||||
"visualizer": "visualizador",
|
||||
"noLyrics": "nenhuma letra encontrada"
|
||||
"lyrics": "Letra",
|
||||
"related": "Relacionado",
|
||||
"upNext": "A seguir",
|
||||
"visualizer": "Visualizador",
|
||||
"noLyrics": "Nenhuma letra encontrada"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "mostrar $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "mostrar $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"showAlbums": "Mostrar $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "Mostrar $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "ir à página",
|
||||
"searchFor": "procurar {{query}}",
|
||||
"serverCommands": "comandos do servidor"
|
||||
"goToPage": "Ir à página",
|
||||
"searchFor": "Procurar {{query}}",
|
||||
"serverCommands": "Comandos do servidor"
|
||||
},
|
||||
"title": "comandos"
|
||||
"title": "Comandos"
|
||||
},
|
||||
"home": {
|
||||
"explore": "explore a sua biblioteca",
|
||||
"mostPlayed": "mais tocado",
|
||||
"newlyAdded": "lançamentos recém-adicionados",
|
||||
"recentlyPlayed": "tocado recentemente",
|
||||
"explore": "Explore a sua biblioteca",
|
||||
"mostPlayed": "Mais tocado",
|
||||
"newlyAdded": "Lançamentos recém-adicionados",
|
||||
"recentlyPlayed": "Tocado recentemente",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copiar caminho para a área de transferência",
|
||||
"copiedPath": "caminho copiado com sucesso",
|
||||
"openFile": "mostrar faixa no gestor de ficheiros"
|
||||
"copyPath": "Copiar caminho para a área de transferência",
|
||||
"copiedPath": "Caminho copiado com sucesso",
|
||||
"openFile": "Mostrar faixa no gestor de ficheiros"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "reordenar apenas disponível quando ordenado pelo id"
|
||||
"reorder": "Reordenar apenas disponível quando ordenado pelo ID"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "avançado",
|
||||
"generalTab": "geral",
|
||||
"hotkeysTab": "teclas de atalho",
|
||||
"playbackTab": "reprodução",
|
||||
"windowTab": "janela"
|
||||
"advanced": "Avançado",
|
||||
"generalTab": "Geral",
|
||||
"hotkeysTab": "Teclas de atalho",
|
||||
"playbackTab": "Reprodução",
|
||||
"windowTab": "Janela"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
@@ -444,8 +444,8 @@
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "a minha biblioteca",
|
||||
"nowPlaying": "agora a tocar",
|
||||
"myLibrary": "A minha biblioteca",
|
||||
"nowPlaying": "Agora a tocar",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
@@ -453,92 +453,92 @@
|
||||
"tracks": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "faixas de {{artist}}",
|
||||
"artistTracks": "Faixas de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "adicionar no final",
|
||||
"addNext": "adicionar a seguir",
|
||||
"favorite": "favorito",
|
||||
"mute": "mudo",
|
||||
"muted": "mudo",
|
||||
"next": "próximo",
|
||||
"play": "tocar",
|
||||
"playbackFetchCancel": "isto demora um pouco... feche a notificação para cancelar",
|
||||
"playbackFetchInProgress": "a carregar músicas…",
|
||||
"playbackFetchNoResults": "nenhuma música encontrada",
|
||||
"playbackSpeed": "velocidade de reprodução",
|
||||
"playRandom": "tocar aleatório",
|
||||
"playSimilarSongs": "tocar músicas similares",
|
||||
"previous": "anterior",
|
||||
"queue_clear": "limpar fila",
|
||||
"queue_moveToBottom": "mover selecionados para o topo",
|
||||
"queue_moveToTop": "mover selecionados para o fim",
|
||||
"queue_remove": "remover selecionados",
|
||||
"repeat": "repetir",
|
||||
"repeat_all": "repetir tudo",
|
||||
"repeat_off": "repetição desativada",
|
||||
"shuffle": "tocar aleatório",
|
||||
"shuffle_off": "aleatório desativado",
|
||||
"skip": "pular",
|
||||
"skip_back": "retroceder",
|
||||
"skip_forward": "avançar",
|
||||
"stop": "parar",
|
||||
"toggleFullscreenPlayer": "alternar player de ecrã cheio",
|
||||
"unfavorite": "remover favorito",
|
||||
"pause": "pausar",
|
||||
"viewQueue": "ver fila"
|
||||
"addLast": "Adicionar no final",
|
||||
"addNext": "Adicionar a seguir",
|
||||
"favorite": "Favorito",
|
||||
"mute": "Mudo",
|
||||
"muted": "Mudo",
|
||||
"next": "Próximo",
|
||||
"play": "Tocar",
|
||||
"playbackFetchCancel": "Isto demora um pouco... feche a notificação para cancelar",
|
||||
"playbackFetchInProgress": "A carregar músicas…",
|
||||
"playbackFetchNoResults": "Nenhuma música encontrada",
|
||||
"playbackSpeed": "Velocidade de reprodução",
|
||||
"playRandom": "Tocar aleatório",
|
||||
"playSimilarSongs": "Tocar músicas similares",
|
||||
"previous": "Anterior",
|
||||
"queue_clear": "Limpar fila",
|
||||
"queue_moveToBottom": "Mover selecionados para o fim",
|
||||
"queue_moveToTop": "Mover selecionados para o topo",
|
||||
"queue_remove": "Remover selecionados",
|
||||
"repeat": "Repetir",
|
||||
"repeat_all": "Repetir tudo",
|
||||
"repeat_off": "Repetição desativada",
|
||||
"shuffle": "Tocar aleatório",
|
||||
"shuffle_off": "Aleatório desativado",
|
||||
"skip": "Pular",
|
||||
"skip_back": "Retroceder",
|
||||
"skip_forward": "Avançar",
|
||||
"stop": "Parar",
|
||||
"toggleFullscreenPlayer": "Alternar player de ecrã cheio",
|
||||
"unfavorite": "Remover favorito",
|
||||
"pause": "Pausar",
|
||||
"viewQueue": "Ver fila"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "cor de realce",
|
||||
"accentColor_description": "define a cor de realce para a aplicação",
|
||||
"albumBackground": "imagem de fundo do álbum",
|
||||
"albumBackground_description": "adiciona uma imagem de fundo contendo a arte do álbum para a página de álbum",
|
||||
"albumBackgroundBlur": "tamanho de desfoque da imagem de fundo do álbum",
|
||||
"albumBackgroundBlur_description": "ajusta a quantidade de desfoque aplicada para a imagem de fundo do álbum",
|
||||
"applicationHotkeys": "teclas de atalho da aplicação",
|
||||
"applicationHotkeys_description": "configure as teclas de atalho da aplicação. clique na caixa de seleção para definir como tecla de atalho global (somente desktop)",
|
||||
"artistConfiguration": "configuração da página de artista de álbum",
|
||||
"artistConfiguration_description": "configure quais elementos serão mostrados, e em qual ordem, na página de artista de álbum",
|
||||
"audioDevice": "dispositivo de áudio",
|
||||
"audioDevice_description": "selecione o dispositivo de áudio usado para reprodução (somente player web)",
|
||||
"audioExclusiveMode": "modo de áudio exclusivo",
|
||||
"audioExclusiveMode_description": "ativar modo de saída exclusiva. Neste modo, o sistema é geralmente bloqueado, e apenas mpv terá saída de áudio",
|
||||
"audioPlayer": "player de áudio",
|
||||
"audioPlayer_description": "selecione o player de áudio usado para reprodução",
|
||||
"buttonSize": "tamanho do botão da barra de reprodução",
|
||||
"buttonSize_description": "o tamanho dos botões da barra de reprodução",
|
||||
"clearCache": "limpar cache do navegador",
|
||||
"clearCache_description": "uma 'limpeza geral' do feishin. em adição a limpar o cache do feishin, limpa o cache do navegador (imagens gravadas e outros recursos). as credenciais de servidor e as configurações serão mantidas",
|
||||
"clearQueryCache": "limpar cache do feishin",
|
||||
"clearQueryCache_description": "uma 'limpeza leve' do feishin. isto irá renovar playlists, metadados de faixas, e resetar letras gravadas. as configurações, as credenciais de servidor e o cache de imagens serão mantidos",
|
||||
"clearCacheSuccess": "cache limpo com sucesso",
|
||||
"contextMenu": "configuração do menu de contexto (clique do botão direito do rato)",
|
||||
"contextMenu_description": "permite esconder elementos exibidos no menu quando clica num elemento com o botão direito. elementos não selecionados serão escondidos",
|
||||
"crossfadeDuration": "duraçao de crossfade",
|
||||
"crossfadeDuration_description": "define a duração do efeito crossfade",
|
||||
"crossfadeStyle_description": "seleciona qual estilo de crossfade usado no player de áudio",
|
||||
"customCssEnable": "ativar css customizado",
|
||||
"customCssEnable_description": "permite escrever css customizado",
|
||||
"customCssNotice": "Aviso: apesar de existir alguma higienização (url() e content: não são permitidas), o uso de css personalizado ainda pode representar riscos ao alterar a interface",
|
||||
"customCss": "css customizado",
|
||||
"disableLibraryUpdateOnStartup": "desativar a verificação de novas versões na inicialização",
|
||||
"accentColor": "Cor de realce",
|
||||
"accentColor_description": "Define a cor de realce para a aplicação",
|
||||
"albumBackground": "Imagem de fundo do álbum",
|
||||
"albumBackground_description": "Adiciona uma imagem de fundo contendo a arte do álbum para a página de álbum",
|
||||
"albumBackgroundBlur": "Tamanho de desfoque da imagem de fundo do álbum",
|
||||
"albumBackgroundBlur_description": "Ajusta a quantidade de desfoque aplicada para a imagem de fundo do álbum",
|
||||
"applicationHotkeys": "Teclas de atalho da aplicação",
|
||||
"applicationHotkeys_description": "Configure as teclas de atalho da aplicação. clique na caixa de seleção para definir como tecla de atalho global (somente desktop)",
|
||||
"artistConfiguration": "Configuração da página de artista de álbum",
|
||||
"artistConfiguration_description": "Configure quais elementos serão mostrados, e em qual ordem, na página de artista de álbum",
|
||||
"audioDevice": "Dispositivo de áudio",
|
||||
"audioDevice_description": "Selecione o dispositivo de áudio usado para reprodução (somente player web)",
|
||||
"audioExclusiveMode": "Modo de áudio exclusivo",
|
||||
"audioExclusiveMode_description": "Ativar modo de saída exclusiva. Neste modo, o sistema é geralmente bloqueado, e apenas mpv terá saída de áudio",
|
||||
"audioPlayer": "Player de áudio",
|
||||
"audioPlayer_description": "Selecione o player de áudio usado para reprodução",
|
||||
"buttonSize": "Tamanho do botão da barra de reprodução",
|
||||
"buttonSize_description": "O tamanho dos botões da barra de reprodução",
|
||||
"clearCache": "Limpar cache do navegador",
|
||||
"clearCache_description": "Uma 'limpeza geral' do Feishin. Em adição a limpar o cache do Feishin, limpa o cache do navegador (imagens gravadas e outros recursos). As credenciais de servidor e as configurações serão mantidas",
|
||||
"clearQueryCache": "Limpar cache do Feishin",
|
||||
"clearQueryCache_description": "Uma 'limpeza leve' do Feishin. Isto irá renovar playlists, metadados de faixas, e resetar letras gravadas. As configurações, as credenciais de servidor e o cache de imagens serão mantidos",
|
||||
"clearCacheSuccess": "Cache limpo com sucesso",
|
||||
"contextMenu": "Configuração do menu de contexto (clique do botão direito do rato)",
|
||||
"contextMenu_description": "Permite esconder elementos exibidos no menu quando clica num elemento com o botão direito. elementos não selecionados serão escondidos",
|
||||
"crossfadeDuration": "Duraçao de crossfade",
|
||||
"crossfadeDuration_description": "Define a duração do efeito crossfade",
|
||||
"crossfadeStyle_description": "Seleciona qual estilo de crossfade usado no player de áudio",
|
||||
"customCssEnable": "Ativar CSS customizado",
|
||||
"customCssEnable_description": "Permite escrever CSS customizado",
|
||||
"customCssNotice": "Aviso: apesar de existir alguma higienização (URL() e content: não são permitidas), o uso de CSS personalizado ainda pode representar riscos ao alterar a interface",
|
||||
"customCss": "Css customizado",
|
||||
"disableLibraryUpdateOnStartup": "Desativar a verificação de novas versões na inicialização",
|
||||
"discordApplicationId": "{{discord}} ID da aplicação",
|
||||
"discordIdleStatus_description": "quando ativado, atualiza o estado enquanto o player está ocioso",
|
||||
"discordUpdateInterval_description": "o tempo em segundos entre cada atualização (mínimo 15 segundos)",
|
||||
"playButtonBehavior_description": "define o comportamento padrão do botão play ao adicionar músicas à fila"
|
||||
"discordIdleStatus_description": "Quando ativado, atualiza o estado enquanto o player está ocioso",
|
||||
"discordUpdateInterval_description": "O tempo em segundos entre cada atualização (mínimo 15 segundos)",
|
||||
"playButtonBehavior_description": "Define o comportamento padrão do botão play ao adicionar músicas à fila"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"discNumber": "disco",
|
||||
"discNumber": "Disco",
|
||||
"size": "$t(common.size)",
|
||||
"title": "titulo"
|
||||
"title": "Titulo"
|
||||
},
|
||||
"config": {
|
||||
"label": {
|
||||
"discNumber": "numero do disco",
|
||||
"discNumber": "Numero do disco",
|
||||
"titleCombined": "$t(common.title) (combinado)"
|
||||
}
|
||||
}
|
||||
|
||||
+13
-13
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"common": {
|
||||
"confirm": "confirmă",
|
||||
"create": "creează",
|
||||
"biography": "biografie",
|
||||
"areYouSure": "ești sigur?",
|
||||
"no": "nu",
|
||||
"name": "nume",
|
||||
"ok": "ok",
|
||||
"note": "notă",
|
||||
"yes": "da",
|
||||
"explicit": "explicit",
|
||||
"year": "an",
|
||||
"menu": "meniu"
|
||||
"confirm": "Confirmă",
|
||||
"create": "Creează",
|
||||
"biography": "Biografie",
|
||||
"areYouSure": "Ești sigur?",
|
||||
"no": "Nu",
|
||||
"name": "Nume",
|
||||
"ok": "Ok",
|
||||
"note": "Notă",
|
||||
"yes": "Da",
|
||||
"explicit": "Explicit",
|
||||
"year": "An",
|
||||
"menu": "Meniu"
|
||||
},
|
||||
"filter": {
|
||||
"biography": "biografie"
|
||||
"biography": "Biografie"
|
||||
}
|
||||
}
|
||||
|
||||
+776
-803
File diff suppressed because it is too large
Load Diff
+579
-579
File diff suppressed because it is too large
Load Diff
+438
-438
File diff suppressed because it is too large
Load Diff
+421
-421
File diff suppressed because it is too large
Load Diff
+341
-341
@@ -1,323 +1,323 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "redigera $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "gå till sida",
|
||||
"moveToTop": "flytta till toppen",
|
||||
"clearQueue": "rensa kö",
|
||||
"addToFavorites": "lägg till $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "lägg till $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "skapa $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "ta bort från $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "visa $t(entity.playlist, {\"count\": 2})",
|
||||
"editPlaylist": "Redigera $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "Gå till sida",
|
||||
"moveToTop": "Flytta till toppen",
|
||||
"clearQueue": "Rensa kö",
|
||||
"addToFavorites": "Lägg till $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "Lägg till $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "Skapa $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "Ta bort från $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "Visa $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "ta bort $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "ta bort från kö",
|
||||
"deselectAll": "avmarkera alla",
|
||||
"moveToBottom": "flytta till botten",
|
||||
"setRating": "sätt betyg",
|
||||
"toggleSmartPlaylistEditor": "växla $t(entity.smartPlaylist) redigerare",
|
||||
"removeFromFavorites": "ta bort från $t(entity.favorite, {\"count\": 2})",
|
||||
"downloadStarted": "startade nedladdning av {{count}} objekt",
|
||||
"moveToNext": "flytta till nästa",
|
||||
"moveUp": "flytta upp",
|
||||
"moveDown": "flytta ner",
|
||||
"holdToMoveToTop": "håll för att flytta till toppen",
|
||||
"holdToMoveToBottom": "håll för att flytta till botten",
|
||||
"moveItems": "flytta objekt",
|
||||
"shuffle": "slumpa",
|
||||
"shuffleAll": "slumpa alla",
|
||||
"shuffleSelected": "slumpa valda",
|
||||
"viewMore": "visa mer",
|
||||
"deletePlaylist": "Ta bort $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "Ta bort från kö",
|
||||
"deselectAll": "Avmarkera alla",
|
||||
"moveToBottom": "Flytta till botten",
|
||||
"setRating": "Sätt betyg",
|
||||
"toggleSmartPlaylistEditor": "Växla $t(entity.smartPlaylist) redigerare",
|
||||
"removeFromFavorites": "Ta bort från $t(entity.favorite, {\"count\": 2})",
|
||||
"downloadStarted": "Startade nedladdning av {{count}} objekt",
|
||||
"moveToNext": "Flytta till nästa",
|
||||
"moveUp": "Flytta upp",
|
||||
"moveDown": "Flytta ner",
|
||||
"holdToMoveToTop": "Håll för att flytta till toppen",
|
||||
"holdToMoveToBottom": "Håll för att flytta till botten",
|
||||
"moveItems": "Flytta objekt",
|
||||
"shuffle": "Slumpa",
|
||||
"shuffleAll": "Slumpa alla",
|
||||
"shuffleSelected": "Slumpa valda",
|
||||
"viewMore": "Visa mer",
|
||||
"openIn": {
|
||||
"lastfm": "Öppna i Last.fm",
|
||||
"musicbrainz": "Öppna i MusicBrainz"
|
||||
},
|
||||
"createRadioStation": "skapa $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "ta bort $t(entity.radioStation, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "lägg till eller ta bort från markerade",
|
||||
"selectRangeOfItems": "välj en mängd objekt",
|
||||
"selectAll": "markera alla",
|
||||
"openApplicationDirectory": "öppna applikationskatalog"
|
||||
"createRadioStation": "Skapa $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "Ta bort $t(entity.radioStation, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "Lägg till eller ta bort från markerade",
|
||||
"selectRangeOfItems": "Välj en mängd objekt",
|
||||
"selectAll": "Markera alla",
|
||||
"openApplicationDirectory": "Öppna applikationskatalog"
|
||||
},
|
||||
"common": {
|
||||
"backward": "bakåt",
|
||||
"increase": "öka",
|
||||
"rating": "betyg",
|
||||
"bpm": "bpm",
|
||||
"refresh": "laddaom",
|
||||
"unknown": "okänd",
|
||||
"areYouSure": "är du säker?",
|
||||
"edit": "redigera",
|
||||
"favorite": "favorit",
|
||||
"left": "vänster",
|
||||
"save": "spara",
|
||||
"right": "höger",
|
||||
"currentSong": "aktuell $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "kollaps",
|
||||
"trackNumber": "spår",
|
||||
"descending": "fallande",
|
||||
"add": "lägg till",
|
||||
"gap": "avstånd",
|
||||
"ascending": "stigande",
|
||||
"dismiss": "avskeda",
|
||||
"year": "år",
|
||||
"manage": "hantera",
|
||||
"limit": "gräns",
|
||||
"minimize": "minimera",
|
||||
"modified": "modifierad",
|
||||
"duration": "längd",
|
||||
"name": "namn",
|
||||
"maximize": "maximera",
|
||||
"decrease": "minska",
|
||||
"ok": "ok",
|
||||
"description": "beskrivning",
|
||||
"configure": "konfigurera",
|
||||
"path": "sökväg",
|
||||
"no": "nej",
|
||||
"owner": "ägare",
|
||||
"enable": "aktivera",
|
||||
"clear": "töm",
|
||||
"forward": "framåt",
|
||||
"delete": "ta bort",
|
||||
"cancel": "avbryt",
|
||||
"forceRestartRequired": "starta om för att tillämpa ändringar... Stäng meddelandet för att starta om",
|
||||
"setting_one": "inställning",
|
||||
"backward": "Bakåt",
|
||||
"increase": "Öka",
|
||||
"rating": "Betyg",
|
||||
"bpm": "Bpm",
|
||||
"refresh": "Laddaom",
|
||||
"unknown": "Okänd",
|
||||
"areYouSure": "Är du säker?",
|
||||
"edit": "Redigera",
|
||||
"favorite": "Favorit",
|
||||
"left": "Vänster",
|
||||
"save": "Spara",
|
||||
"right": "Höger",
|
||||
"currentSong": "Aktuell $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "Kollaps",
|
||||
"trackNumber": "Spår",
|
||||
"descending": "Fallande",
|
||||
"add": "Lägg till",
|
||||
"gap": "Avstånd",
|
||||
"ascending": "Stigande",
|
||||
"dismiss": "Avskeda",
|
||||
"year": "År",
|
||||
"manage": "Hantera",
|
||||
"limit": "Gräns",
|
||||
"minimize": "Minimera",
|
||||
"modified": "Modifierad",
|
||||
"duration": "Längd",
|
||||
"name": "Namn",
|
||||
"maximize": "Maximera",
|
||||
"decrease": "Minska",
|
||||
"ok": "Ok",
|
||||
"description": "Beskrivning",
|
||||
"configure": "Konfigurera",
|
||||
"path": "Sökväg",
|
||||
"no": "Nej",
|
||||
"owner": "Ägare",
|
||||
"enable": "Aktivera",
|
||||
"clear": "Töm",
|
||||
"forward": "Framåt",
|
||||
"delete": "Ta bort",
|
||||
"cancel": "Avbryt",
|
||||
"forceRestartRequired": "Starta om för att tillämpa ändringar... Stäng meddelandet för att starta om",
|
||||
"setting_one": "Inställning",
|
||||
"setting_other": "",
|
||||
"version": "version",
|
||||
"title": "titel",
|
||||
"filter_one": "filter",
|
||||
"filter_other": "filter",
|
||||
"filters": "filter",
|
||||
"create": "skapa",
|
||||
"bitrate": "bithastighet",
|
||||
"saveAndReplace": "spara och skrivöver",
|
||||
"action_one": "handling",
|
||||
"action_other": "handlingar",
|
||||
"playerMustBePaused": "spelaren måste pausas",
|
||||
"confirm": "bekräfta",
|
||||
"resetToDefault": "återställ till standard",
|
||||
"home": "hem",
|
||||
"comingSoon": "kommer snart…",
|
||||
"reset": "nollställ",
|
||||
"channel_one": "kanal",
|
||||
"channel_other": "kanaler",
|
||||
"disable": "inaktivera",
|
||||
"sortOrder": "ordning",
|
||||
"none": "ingen",
|
||||
"menu": "meny",
|
||||
"restartRequired": "omstart krävs",
|
||||
"previousSong": "föregående $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "frågan returnerade inga resultat",
|
||||
"quit": "avsluta",
|
||||
"expand": "expandera",
|
||||
"search": "sök",
|
||||
"saveAs": "spara som",
|
||||
"disc": "skiva",
|
||||
"yes": "ja",
|
||||
"random": "slumpmässig",
|
||||
"size": "storlek",
|
||||
"biography": "biografi",
|
||||
"note": "anteckning",
|
||||
"center": "center",
|
||||
"explicitStatus": "olämplig status",
|
||||
"additionalParticipants": "ytterligare medverkare",
|
||||
"newVersion": "en ny version har installerats {{version}}",
|
||||
"viewReleaseNotes": "se utgåveinformation",
|
||||
"bitDepth": "bitdjup",
|
||||
"close": "stäng",
|
||||
"codec": "kodek",
|
||||
"doNotShowAgain": "visa inte detta igen",
|
||||
"view": "visa",
|
||||
"externalLinks": "externa länkar",
|
||||
"faster": "snabbare",
|
||||
"version": "Version",
|
||||
"title": "Titel",
|
||||
"filter_one": "Filter",
|
||||
"filter_other": "Filter",
|
||||
"filters": "Filter",
|
||||
"create": "Skapa",
|
||||
"bitrate": "Bithastighet",
|
||||
"saveAndReplace": "Spara och skrivöver",
|
||||
"action_one": "Handling",
|
||||
"action_other": "Handlingar",
|
||||
"playerMustBePaused": "Spelaren måste pausas",
|
||||
"confirm": "Bekräfta",
|
||||
"resetToDefault": "Återställ till standard",
|
||||
"home": "Hem",
|
||||
"comingSoon": "Kommer snart…",
|
||||
"reset": "Nollställ",
|
||||
"channel_one": "Kanal",
|
||||
"channel_other": "Kanaler",
|
||||
"disable": "Inaktivera",
|
||||
"sortOrder": "Ordning",
|
||||
"none": "Ingen",
|
||||
"menu": "Meny",
|
||||
"restartRequired": "Omstart krävs",
|
||||
"previousSong": "Föregående $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "Frågan returnerade inga resultat",
|
||||
"quit": "Avsluta",
|
||||
"expand": "Expandera",
|
||||
"search": "Sök",
|
||||
"saveAs": "Spara som",
|
||||
"disc": "Skiva",
|
||||
"yes": "Ja",
|
||||
"random": "Slumpmässig",
|
||||
"size": "Storlek",
|
||||
"biography": "Biografi",
|
||||
"note": "Anteckning",
|
||||
"center": "Center",
|
||||
"explicitStatus": "Olämplig status",
|
||||
"additionalParticipants": "Ytterligare medverkare",
|
||||
"newVersion": "En ny version har installerats {{version}}",
|
||||
"viewReleaseNotes": "Se utgåveinformation",
|
||||
"bitDepth": "Bitdjup",
|
||||
"close": "Stäng",
|
||||
"codec": "Kodek",
|
||||
"doNotShowAgain": "Visa inte detta igen",
|
||||
"view": "Visa",
|
||||
"externalLinks": "Externa länkar",
|
||||
"faster": "Snabbare",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"noFilters": "inga filter konfigurerade",
|
||||
"preview": "förhandsvisa",
|
||||
"private": "privat",
|
||||
"public": "allmän",
|
||||
"recordLabel": "skivbolag",
|
||||
"releaseType": "utgåvetyp",
|
||||
"reload": "ladda om",
|
||||
"sampleRate": "samplingstakt",
|
||||
"slower": "långsammare",
|
||||
"share": "dela",
|
||||
"sort": "sortera",
|
||||
"tags": "taggar",
|
||||
"translation": "översättning",
|
||||
"explicit": "olämplig",
|
||||
"clean": "städad",
|
||||
"gridRows": "rutnätsrader",
|
||||
"tableColumns": "tabellkolumner",
|
||||
"noFilters": "Inga filter konfigurerade",
|
||||
"preview": "Förhandsvisa",
|
||||
"private": "Privat",
|
||||
"public": "Allmän",
|
||||
"recordLabel": "Skivbolag",
|
||||
"releaseType": "Utgåvetyp",
|
||||
"reload": "Ladda om",
|
||||
"sampleRate": "Samplingstakt",
|
||||
"slower": "Långsammare",
|
||||
"share": "Dela",
|
||||
"sort": "Sortera",
|
||||
"tags": "Taggar",
|
||||
"translation": "Översättning",
|
||||
"explicit": "Olämplig",
|
||||
"clean": "Städad",
|
||||
"gridRows": "Rutnätsrader",
|
||||
"tableColumns": "Tabellkolumner",
|
||||
"itemsMore": "{{count}} fler",
|
||||
"countSelected": "{{count}} markerade"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "starta om servern för att tillämpa den nya porten",
|
||||
"systemFontError": "ett fel uppstod vid försök att hämta systemteckensnitt",
|
||||
"playbackError": "ett fel uppstod vid försök att spela upp media",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} är inte implementerad för {{serverType}}",
|
||||
"remotePortError": "ett fel uppstod vid försök att ange serverporten",
|
||||
"serverRequired": "server krävs",
|
||||
"authenticationFailed": "autentiseringen misslyckades",
|
||||
"apiRouteError": "det går inte att dirigera begäran",
|
||||
"genericError": "ett fel uppstod",
|
||||
"credentialsRequired": "autentiseringsuppgifter som krävs",
|
||||
"sessionExpiredError": "din session har löpt ut",
|
||||
"remotePortWarning": "Starta om servern för att tillämpa den nya porten",
|
||||
"systemFontError": "Ett fel uppstod vid försök att hämta systemteckensnitt",
|
||||
"playbackError": "Ett fel uppstod vid försök att spela upp media",
|
||||
"endpointNotImplementedError": "Endpoint {{endpoint}} är inte implementerad för {{serverType}}",
|
||||
"remotePortError": "Ett fel uppstod vid försök att ange serverporten",
|
||||
"serverRequired": "Server krävs",
|
||||
"authenticationFailed": "Autentiseringen misslyckades",
|
||||
"apiRouteError": "Det går inte att dirigera begäran",
|
||||
"genericError": "Ett fel uppstod",
|
||||
"credentialsRequired": "Autentiseringsuppgifter som krävs",
|
||||
"sessionExpiredError": "Din session har löpt ut",
|
||||
"remoteEnableError": "Ett fel uppstod vid försök att $t(common.enable) servern",
|
||||
"localFontAccessDenied": "åtkomst nekad till lokala teckensnitt",
|
||||
"serverNotSelectedError": "ingen server vald",
|
||||
"remoteDisableError": "ett fel uppstod vid försök av $t(common.disable) servern",
|
||||
"localFontAccessDenied": "Åtkomst nekad till lokala teckensnitt",
|
||||
"serverNotSelectedError": "Ingen server vald",
|
||||
"remoteDisableError": "Ett fel uppstod vid försök av $t(common.disable) servern",
|
||||
"mpvRequired": "MPV krävs",
|
||||
"audioDeviceFetchError": "ett fel uppstod vid hämtning av ljudenheter",
|
||||
"invalidServer": "ogiltig server",
|
||||
"loginRateError": "för många inloggningsförsök, försök igen om några sekunder",
|
||||
"badAlbum": "du ser denna sidan eftersom denna låten inte är en del av ett album. du ser troligtvis detta problemet för att du har en låt på toppnivån i din musikmapp. Jellyfin grupperar bara låtar om de finns i en mapp",
|
||||
"badValue": "felaktigt alternativ \"{{value}}\". detta värde existerar inte längre",
|
||||
"multipleServerSaveQueueError": "spelningskön har en eller flera låtar som inte är från den nuvarande valda servern. detta är inte stöttat",
|
||||
"networkError": "en nätverksfel uppstod",
|
||||
"notificationDenied": "åtkomst till notifieringarna var nekad. inställningen har ingen verkan",
|
||||
"openError": "kunde inte öppna filen",
|
||||
"settingsSyncError": "diskrepans hittades mellan inställningarna för renderingsprocessen och huvudprocessen. starta om applikationen för att ändringarna ska tillämpas"
|
||||
"audioDeviceFetchError": "Ett fel uppstod vid hämtning av ljudenheter",
|
||||
"invalidServer": "Ogiltig server",
|
||||
"loginRateError": "För många inloggningsförsök, försök igen om några sekunder",
|
||||
"badAlbum": "Du ser denna sidan eftersom denna låten inte är en del av ett album. du ser troligtvis detta problemet för att du har en låt på toppnivån i din musikmapp. Jellyfin grupperar bara låtar om de finns i en mapp",
|
||||
"badValue": "Felaktigt alternativ \"{{value}}\". detta värde existerar inte längre",
|
||||
"multipleServerSaveQueueError": "Spelningskön har en eller flera låtar som inte är från den nuvarande valda servern. detta är inte stöttat",
|
||||
"networkError": "En nätverksfel uppstod",
|
||||
"notificationDenied": "Åtkomst till notifieringarna var nekad. inställningen har ingen verkan",
|
||||
"openError": "Kunde inte öppna filen",
|
||||
"settingsSyncError": "Diskrepans hittades mellan inställningarna för renderingsprocessen och huvudprocessen. starta om applikationen för att ändringarna ska tillämpas"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "mest spelade",
|
||||
"comment": "kommentar",
|
||||
"playCount": "antal spelningar",
|
||||
"recentlyUpdated": "nyligen uppdaterad",
|
||||
"mostPlayed": "Mest spelade",
|
||||
"comment": "Kommentar",
|
||||
"playCount": "Antal spelningar",
|
||||
"recentlyUpdated": "Nyligen uppdaterad",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"isCompilation": "är kompilering",
|
||||
"recentlyPlayed": "nyligen spelad",
|
||||
"isRated": "är betygsatt",
|
||||
"isCompilation": "Är kompilering",
|
||||
"recentlyPlayed": "Nyligen spelad",
|
||||
"isRated": "Är betygsatt",
|
||||
"owner": "$t(common.owner)",
|
||||
"title": "titel",
|
||||
"rating": "betyg",
|
||||
"search": "sök",
|
||||
"bitrate": "bithastighet",
|
||||
"title": "Titel",
|
||||
"rating": "Betyg",
|
||||
"search": "Sök",
|
||||
"bitrate": "Bithastighet",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "nyligen tillagda",
|
||||
"note": "anteckning",
|
||||
"name": "namn",
|
||||
"dateAdded": "datum tillagt",
|
||||
"releaseDate": "utgivningsdag",
|
||||
"communityRating": "betyg från communityn",
|
||||
"path": "sökväg",
|
||||
"favorited": "favoritmärkt",
|
||||
"recentlyAdded": "Nyligen tillagda",
|
||||
"note": "Anteckning",
|
||||
"name": "Namn",
|
||||
"dateAdded": "Datum tillagt",
|
||||
"releaseDate": "Utgivningsdag",
|
||||
"communityRating": "Betyg från communityn",
|
||||
"path": "Sökväg",
|
||||
"favorited": "Favoritmärkt",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "spelas nyligen",
|
||||
"isFavorited": "är favoritmärkt",
|
||||
"bpm": "bpm",
|
||||
"releaseYear": "utgivningsår",
|
||||
"id": "id",
|
||||
"disc": "skiva",
|
||||
"biography": "biografi",
|
||||
"isRecentlyPlayed": "Spelas nyligen",
|
||||
"isFavorited": "Är favoritmärkt",
|
||||
"bpm": "Bpm",
|
||||
"releaseYear": "Utgivningsår",
|
||||
"id": "Id",
|
||||
"disc": "Skiva",
|
||||
"biography": "Biografi",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "längd",
|
||||
"isPublic": "är offentlig",
|
||||
"random": "slumpmässig",
|
||||
"lastPlayed": "senast spelad",
|
||||
"toYear": "till år",
|
||||
"fromYear": "från år",
|
||||
"duration": "Längd",
|
||||
"isPublic": "Är offentlig",
|
||||
"random": "Slumpmässig",
|
||||
"lastPlayed": "Senast spelad",
|
||||
"toYear": "Till år",
|
||||
"fromYear": "Från år",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "spår",
|
||||
"songCount": "sångräkning",
|
||||
"criticRating": "kritikerbetyg",
|
||||
"trackNumber": "Spår",
|
||||
"songCount": "Sångräkning",
|
||||
"criticRating": "Kritikerbetyg",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) antal",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "ta bort $t(entity.playlist, {\"count\": 1})",
|
||||
"title": "Ta bort $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) har tagits bort",
|
||||
"input_confirm": "Skriv namnet på $t(entity.playlist, {\"count\": 1}) för att bekräfta"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "skapa $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "offentlig",
|
||||
"title": "Skapa $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "Offentlig",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) skapad",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
"title": "lägg till server",
|
||||
"input_username": "användarnamn",
|
||||
"input_url": "länk",
|
||||
"input_password": "lösenord",
|
||||
"input_legacyAuthentication": "aktivera äldre autentisering",
|
||||
"input_name": "server namn",
|
||||
"success": "servern har lagts till",
|
||||
"input_savePassword": "spara lösenord",
|
||||
"ignoreSsl": "ignorera ssl ($t(common.restartRequired))",
|
||||
"ignoreCors": "ignorera cors ($t(common.restartRequired))",
|
||||
"error_savePassword": "ett fel uppstod när lösenordet skulle sparas",
|
||||
"input_preferInstantMix": "föredra instant mixning",
|
||||
"input_preferInstantMixDescription": "använd bara instant mixning för att få liknande låtar. användbar om du har plugin för att förändra detta beteendet"
|
||||
"title": "Lägg till server",
|
||||
"input_username": "Användarnamn",
|
||||
"input_url": "Länk",
|
||||
"input_password": "Lösenord",
|
||||
"input_legacyAuthentication": "Aktivera äldre autentisering",
|
||||
"input_name": "Server namn",
|
||||
"success": "Servern har lagts till",
|
||||
"input_savePassword": "Spara lösenord",
|
||||
"ignoreSsl": "Ignorera ssl ($t(common.restartRequired))",
|
||||
"ignoreCors": "Ignorera cors ($t(common.restartRequired))",
|
||||
"error_savePassword": "Ett fel uppstod när lösenordet skulle sparas",
|
||||
"input_preferInstantMix": "Föredra instant mixning",
|
||||
"input_preferInstantMixDescription": "Använd bara instant mixning för att få liknande låtar. användbar om du har plugin för att förändra detta beteendet"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "lade till $t(entity.trackWithCount, {\"count\": {{message}} }) till $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "lägg till i $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "hoppa över dubbletter",
|
||||
"success": "Lade till $t(entity.trackWithCount, {\"count\": {{message}} }) till $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "Lägg till i $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "Hoppa över dubbletter",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "skapa $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "sök $t(entity.playlist, {\"count\": 2}) eller skriv för att skapa en ny"
|
||||
"create": "Skapa $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "Sök $t(entity.playlist, {\"count\": 2}) eller skriv för att skapa en ny"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "uppdatera server",
|
||||
"success": "servern har uppdaterats"
|
||||
"title": "Uppdatera server",
|
||||
"success": "Servern har uppdaterats"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "matcha alla",
|
||||
"input_optionMatchAny": "matcha något"
|
||||
"input_optionMatchAll": "Matcha alla",
|
||||
"input_optionMatchAny": "Matcha något"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "sångtext sök"
|
||||
"title": "Sångtext sök"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "redigera $t(entity.playlist, {\"count\": 1})",
|
||||
"title": "Redigera $t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "Jellyfin visar av någon anledning inte om en spellista är publik eller inte. Om du önskar att denna ska förbli publik, så får du ha följande indata markerade"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "lägg till objekt till kön",
|
||||
"title": "Lägg till objekt till kön",
|
||||
"description": "Åtgärden kommer att lägga till alla objekt till den nuvarande filtrerade vyn"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "radiostation skapades",
|
||||
"title": "skapa radiostation",
|
||||
"input_homepageUrl": "hemside-URL",
|
||||
"input_name": "namn",
|
||||
"input_streamUrl": "stream url"
|
||||
"success": "Radiostation skapades",
|
||||
"title": "Skapa radiostation",
|
||||
"input_homepageUrl": "Hemside-URL",
|
||||
"input_name": "Namn",
|
||||
"input_streamUrl": "Stream url"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"showLyricMatch": "Visa låttext matchning",
|
||||
"dynamicBackground": "dynamisk bakgrund",
|
||||
"followCurrentLyric": "följ aktuell låttext",
|
||||
"opacity": "ogenomskinlighet",
|
||||
"lyricSize": "låttext storlek",
|
||||
"lyricAlignment": "låttext justering",
|
||||
"lyricGap": "låttext mellanrum",
|
||||
"synchronized": "synkroniserad",
|
||||
"showLyricProvider": "visa sångtextleverantör",
|
||||
"unsynchronized": "osynkroniserad"
|
||||
"dynamicBackground": "Dynamisk bakgrund",
|
||||
"followCurrentLyric": "Följ aktuell låttext",
|
||||
"opacity": "Ogenomskinlighet",
|
||||
"lyricSize": "Låttext storlek",
|
||||
"lyricAlignment": "Låttext justering",
|
||||
"lyricGap": "Låttext mellanrum",
|
||||
"synchronized": "Synkroniserad",
|
||||
"showLyricProvider": "Visa sångtextleverantör",
|
||||
"unsynchronized": "Osynkroniserad"
|
||||
},
|
||||
"lyrics": "sångtext",
|
||||
"related": "relaterad"
|
||||
"lyrics": "Sångtext",
|
||||
"related": "Relaterad"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "välj server",
|
||||
"version": "version {{version}}",
|
||||
"selectServer": "Välj server",
|
||||
"version": "Version {{version}}",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "hantera servrar",
|
||||
"expandSidebar": "expandera sidofältet",
|
||||
"openBrowserDevtools": "öppna webbläsarens utvecklingsverktyg",
|
||||
"manageServers": "Hantera servrar",
|
||||
"expandSidebar": "Expandera sidofältet",
|
||||
"openBrowserDevtools": "Öppna webbläsarens utvecklingsverktyg",
|
||||
"quit": "$t(common.quit)",
|
||||
"goBack": "gå tillbaka",
|
||||
"goForward": "gå framåt",
|
||||
"collapseSidebar": "växla sidofältet"
|
||||
"goBack": "Gå tillbaka",
|
||||
"goForward": "Gå framåt",
|
||||
"collapseSidebar": "Växla sidofältet"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
@@ -336,20 +336,20 @@
|
||||
"play": "$t(player.play)",
|
||||
"numberSelected": "{{count}} vald",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"download": "ladda ner",
|
||||
"download": "Ladda ner",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "dela objekt",
|
||||
"goTo": "gå till",
|
||||
"goToAlbum": "gå till $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "gå till $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "hämta information"
|
||||
"shareItem": "Dela objekt",
|
||||
"goTo": "Gå till",
|
||||
"goToAlbum": "Gå till $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "Gå till $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "Hämta information"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mer från $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "mer från {{item}}"
|
||||
"moreFromArtist": "Mer från $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "Mer från {{item}}"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
@@ -358,124 +358,124 @@
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "nu spelas"
|
||||
"nowPlaying": "Nu spelas"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "mest spelade",
|
||||
"newlyAdded": "nytillkomna utgåvor",
|
||||
"explore": "utforska från ditt bibliotek",
|
||||
"recentlyPlayed": "nyligen spelat"
|
||||
"mostPlayed": "Mest spelade",
|
||||
"newlyAdded": "Nytillkomna utgåvor",
|
||||
"explore": "Utforska från ditt bibliotek",
|
||||
"recentlyPlayed": "Nyligen spelat"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "uppspelning",
|
||||
"generalTab": "allmänt",
|
||||
"hotkeysTab": "snabbtangenter",
|
||||
"windowTab": "fönster"
|
||||
"playbackTab": "Uppspelning",
|
||||
"generalTab": "Allmänt",
|
||||
"hotkeysTab": "Snabbtangenter",
|
||||
"windowTab": "Fönster"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"serverCommands": "serverkommandon",
|
||||
"goToPage": "gå till sidan",
|
||||
"searchFor": "sök efter {{query}}"
|
||||
"serverCommands": "Serverkommandon",
|
||||
"goToPage": "Gå till sidan",
|
||||
"searchFor": "Sök efter {{query}}"
|
||||
},
|
||||
"title": "kommandon"
|
||||
"title": "Kommandon"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URL",
|
||||
"username": "användarnamn",
|
||||
"editServerDetailsTooltip": "redigera serverinställningar",
|
||||
"removeServer": "ta bort server"
|
||||
"username": "Användarnamn",
|
||||
"editServerDetailsTooltip": "Redigera serverinställningar",
|
||||
"removeServer": "Ta bort server"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"playlist_one": "spellista",
|
||||
"playlist_other": "spellistor",
|
||||
"artist_one": "artist",
|
||||
"artist_other": "artister",
|
||||
"albumArtist_one": "albumartist",
|
||||
"albumArtist_other": "albumartister",
|
||||
"albumArtistCount_one": "{{count}} Albumartist",
|
||||
"albumArtistCount_other": "{{count}} Albumartister",
|
||||
"playlist_one": "Spellista",
|
||||
"playlist_other": "Spellistor",
|
||||
"artist_one": "Artist",
|
||||
"artist_other": "Artister",
|
||||
"albumArtist_one": "Albumartist",
|
||||
"albumArtist_other": "Albumartister",
|
||||
"albumArtistCount_one": "{{count}} albumartist",
|
||||
"albumArtistCount_other": "{{count}} albumartister",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_other": "{{count}} album",
|
||||
"favorite_one": "favorit",
|
||||
"favorite_other": "favoriter",
|
||||
"folder_one": "mapp",
|
||||
"folder_other": "mappar",
|
||||
"album_one": "album",
|
||||
"album_other": "album",
|
||||
"favorite_one": "Favorit",
|
||||
"favorite_other": "Favoriter",
|
||||
"folder_one": "Mapp",
|
||||
"folder_other": "Mappar",
|
||||
"album_one": "Album",
|
||||
"album_other": "Album",
|
||||
"playlistWithCount_one": "{{count}} spellista",
|
||||
"playlistWithCount_other": "{{count}} spellistor",
|
||||
"folderWithCount_one": "{{count}} mapp",
|
||||
"folderWithCount_other": "{{count}} mappar",
|
||||
"track_one": "spår",
|
||||
"track_other": "spår",
|
||||
"track_one": "Spår",
|
||||
"track_other": "Spår",
|
||||
"trackWithCount_one": "{{count}} spår",
|
||||
"trackWithCount_other": "{{count}} spår",
|
||||
"artistWithCount_one": "{{count}} artist",
|
||||
"artistWithCount_other": "{{count}} artister",
|
||||
"genre_one": "genre",
|
||||
"genre_other": "genrer",
|
||||
"genre_one": "Genre",
|
||||
"genre_other": "Genrer",
|
||||
"genreWithCount_one": "{{count}} genre",
|
||||
"genreWithCount_other": "{{count}} genrer",
|
||||
"play_one": "{{count}} spelning",
|
||||
"play_other": "{{count}} spelningar",
|
||||
"smartPlaylist": "smart $t(entity.playlist, {\"count\": 1})",
|
||||
"song_one": "låt",
|
||||
"song_other": "låtar",
|
||||
"radioStation_one": "radiostation",
|
||||
"radioStation_other": "radiostationer",
|
||||
"smartPlaylist": "Smart $t(entity.playlist, {\"count\": 1})",
|
||||
"song_one": "Låt",
|
||||
"song_other": "Låtar",
|
||||
"radioStation_one": "Radiostation",
|
||||
"radioStation_other": "Radiostationer",
|
||||
"radioStationWithCount_one": "{{count}} radiostation",
|
||||
"radioStationWithCount_other": "{{count}} radiostationer"
|
||||
},
|
||||
"player": {
|
||||
"repeat_all": "repetera alla",
|
||||
"repeat": "repetera",
|
||||
"queue_remove": "ta bort markerad",
|
||||
"playRandom": "spela slumpmässigt",
|
||||
"previous": "föregående",
|
||||
"favorite": "favorit",
|
||||
"next": "nästa",
|
||||
"shuffle": "blanda",
|
||||
"playbackFetchNoResults": "inga låtar hittades",
|
||||
"playbackFetchInProgress": "laddar låtar…",
|
||||
"addNext": "lägg till nästa",
|
||||
"playbackSpeed": "uppspelningshastighet",
|
||||
"playbackFetchCancel": "det här tar ett tag... stäng aviseringen för att avbryta",
|
||||
"play": "spela",
|
||||
"repeat_off": "repetera inaktiverad",
|
||||
"queue_clear": "rensa kö",
|
||||
"muted": "mutad",
|
||||
"queue_moveToTop": "flytta markerad till botten",
|
||||
"queue_moveToBottom": "flytta markerad till toppen",
|
||||
"addLast": "lägg till sist",
|
||||
"mute": "muta"
|
||||
"repeat_all": "Repetera alla",
|
||||
"repeat": "Repetera",
|
||||
"queue_remove": "Ta bort markerad",
|
||||
"playRandom": "Spela slumpmässigt",
|
||||
"previous": "Föregående",
|
||||
"favorite": "Favorit",
|
||||
"next": "Nästa",
|
||||
"shuffle": "Blanda",
|
||||
"playbackFetchNoResults": "Inga låtar hittades",
|
||||
"playbackFetchInProgress": "Laddar låtar…",
|
||||
"addNext": "Lägg till nästa",
|
||||
"playbackSpeed": "Uppspelningshastighet",
|
||||
"playbackFetchCancel": "Det här tar ett tag... stäng aviseringen för att avbryta",
|
||||
"play": "Spela",
|
||||
"repeat_off": "Repetera inaktiverad",
|
||||
"queue_clear": "Rensa kö",
|
||||
"muted": "Mutad",
|
||||
"queue_moveToTop": "Flytta markerad till toppen",
|
||||
"queue_moveToBottom": "Flytta markerad till botten",
|
||||
"addLast": "Lägg till sist",
|
||||
"mute": "Muta"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "min",
|
||||
"secondShort": "sek",
|
||||
"hourShort": "h",
|
||||
"dayShort": "dag"
|
||||
"minuteShort": "Min",
|
||||
"secondShort": "Sek",
|
||||
"hourShort": "H",
|
||||
"dayShort": "Dag"
|
||||
},
|
||||
"filterOperator": {
|
||||
"after": "är efter",
|
||||
"afterDate": "är efter (datum)",
|
||||
"before": "är före",
|
||||
"beforeDate": "är före (datum)",
|
||||
"contains": "innehåller",
|
||||
"endsWith": "slutar med",
|
||||
"inPlaylist": "är inom",
|
||||
"inTheLast": "är i den sista",
|
||||
"inTheRange": "är i spannet",
|
||||
"inTheRangeDate": "är i spannet (datum)",
|
||||
"is": "är",
|
||||
"isNot": "är inte",
|
||||
"isGreaterThan": "är större än",
|
||||
"isLessThan": "är mindre än",
|
||||
"matchesRegex": "matchar regex",
|
||||
"notContains": "innehåller inte",
|
||||
"notInPlaylist": "är inte inom",
|
||||
"notInTheLast": "är inte inom den sista",
|
||||
"startsWith": "startar med"
|
||||
"after": "Är efter",
|
||||
"afterDate": "Är efter (datum)",
|
||||
"before": "Är före",
|
||||
"beforeDate": "Är före (datum)",
|
||||
"contains": "Innehåller",
|
||||
"endsWith": "Slutar med",
|
||||
"inPlaylist": "Är inom",
|
||||
"inTheLast": "Är i den sista",
|
||||
"inTheRange": "Är i spannet",
|
||||
"inTheRangeDate": "Är i spannet (datum)",
|
||||
"is": "Är",
|
||||
"isNot": "Är inte",
|
||||
"isGreaterThan": "Är större än",
|
||||
"isLessThan": "Är mindre än",
|
||||
"matchesRegex": "Matchar regex",
|
||||
"notContains": "Innehåller inte",
|
||||
"notInPlaylist": "Är inte inom",
|
||||
"notInTheLast": "Är inte inom den sista",
|
||||
"startsWith": "Startar med"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -627,8 +627,8 @@
|
||||
"playbackFetchNoResults": "பாடல்கள் எதுவும் கிடைக்கவில்லை",
|
||||
"playbackSpeed": "பிளேபேக் விரைவு",
|
||||
"playRandom": "சீரற்ற முறையில் விளையாடுங்கள்",
|
||||
"queue_moveToBottom": "மேலே தேர்ந்தெடுக்கப்பட்ட நகர்த்து",
|
||||
"queue_moveToTop": "தேர்ந்தெடுக்கப்பட்டதை கீழே நகர்த்தவும்",
|
||||
"queue_moveToBottom": "தேர்ந்தெடுக்கப்பட்டதை கீழே நகர்த்தவும்",
|
||||
"queue_moveToTop": "மேலே தேர்ந்தெடுக்கப்பட்ட நகர்த்து",
|
||||
"skip_back": "பின்னோக்கி தவிர்க்கவும்",
|
||||
"skip_forward": "முன்னோக்கி தவிர்க்கவும்",
|
||||
"stop": "நிறுத்து",
|
||||
@@ -800,7 +800,7 @@
|
||||
"enableRemote": "ரிமோட் கண்ட்ரோல் சேவையகத்தை இயக்கவும்",
|
||||
"enableRemote_description": "பயன்பாட்டைக் கட்டுப்படுத்த மற்ற சாதனங்களை அனுமதிக்க ரிமோட் கண்ட்ரோல் சேவையகத்தை இயக்குகிறது",
|
||||
"externalLinks": "வெளிப்புற இணைப்புகளைக் காட்டு",
|
||||
"externalLinks_description": "கலைஞர்/ஆல்பம் பக்கங்களில் வெளிப்புற இணைப்புகளை (last.fm, மியூசிக் ப்ரெய்ன்ச்) காண்பிக்க உதவுகிறது",
|
||||
"externalLinks_description": "கலைஞர்/ஆல்பம் பக்கங்களில் வெளிப்புற இணைப்புகளை (Last.fm, மியூசிக் ப்ரெய்ன்ச்) காண்பிக்க உதவுகிறது",
|
||||
"exitToTray": "தட்டில் வெளியேறவும்",
|
||||
"globalMediaHotkeys": "உலகளாவிய மீடியா ஆட்கீச்",
|
||||
"discordUpdateInterval": "{{discord}} பணக்கார இருப்பு புதுப்பிப்பு இடைவெளி",
|
||||
@@ -872,7 +872,7 @@
|
||||
"discordServeImage_description": "சேவையகத்திலிருந்தே {{discord}} சிறந்த இருப்புக்கான கவர் ஆர்ட்டைப் பகிரவும், செல்லிஃபின் மற்றும் நவிட்ரோமுக்கு மட்டுமே கிடைக்கும். படங்களைப் பெற {{discord}} ஒரு போட்டைப் பயன்படுத்துகிறது, எனவே உங்கள் சர்வர் பொது இணையத்திலிருந்து அணுகக்கூடியதாக இருக்க வேண்டும்",
|
||||
"preferLocalLyrics": "உள்ளக பாடல்களை விரும்புங்கள்",
|
||||
"preferLocalLyrics_description": "கிடைக்கும்போது தொலைநிலை பாடல்களை விட உள்ளக பாடல்களை விரும்புங்கள்",
|
||||
"lastfm": "last.fm இணைப்புகளைக் காட்டு",
|
||||
"lastfm": "Last.fm இணைப்புகளைக் காட்டு",
|
||||
"lastfm_description": "கலைஞர்/ஆல்பம் பக்கங்களில் Last.fm க்கான இணைப்புகளைக் காட்டு",
|
||||
"musicbrainz": "மியூசிக் பிரேன்ச் இணைப்புகளைக் காட்டு",
|
||||
"musicbrainz_description": "கலைஞர்/ஆல்பம் பக்கங்களில் மியூசிக் பிரைன்ச் இணைப்புகளைக் காட்டு, அங்கு மியூசிக் பிரைன்ச் ID உள்ளது",
|
||||
@@ -925,7 +925,7 @@
|
||||
"exportImportSettings_control_title": "இறக்குமதி / ஏற்றுமதி அமைப்புகள்",
|
||||
"exportImportSettings_destructiveWarning": "அமைப்புகளை இறக்குமதி செய்வது அழிவுகரமானது, கீழே உள்ள \"இறக்குமதி\" என்பதைக் சொடுக்கு செய்வதற்கு முன் மேலே உள்ளவற்றை மதிப்பாய்வு செய்யவும்!",
|
||||
"exportImportSettings_importBtn": "இறக்குமதி அமைப்புகள்",
|
||||
"exportImportSettings_importModalTitle": "feishin அமைப்புகளை இறக்குமதி செய்யவும்",
|
||||
"exportImportSettings_importModalTitle": "Feishin அமைப்புகளை இறக்குமதி செய்யவும்",
|
||||
"exportImportSettings_importSuccess": "அமைப்புகள் வெற்றிகரமாக இறக்குமதி செய்யப்பட்டன!",
|
||||
"exportImportSettings_notValidJSON": "அனுப்பப்பட்ட கோப்பு சாதொபொகு செல்லுபடியாகாது",
|
||||
"exportImportSettings_offendingKeyError": "\"{{offendingKey}}\" தவறானது - {{reason}}",
|
||||
@@ -948,8 +948,8 @@
|
||||
"logLevel_optionError": "பிழை",
|
||||
"logLevel_optionInfo": "தகவல்",
|
||||
"logLevel_optionWarn": "முன்னறிவிப்பு",
|
||||
"mpvExtraParameters": "mpv கூடுதல் அளவுருக்கள்",
|
||||
"mpvExtraParameters_description": "mpv க்கு அனுப்ப கூடுதல் வாதங்கள்",
|
||||
"mpvExtraParameters": "MPV கூடுதல் அளவுருக்கள்",
|
||||
"mpvExtraParameters_description": "MPV க்கு அனுப்ப கூடுதல் வாதங்கள்",
|
||||
"notify": "பாடல் அறிவிப்புகளை இயக்கவும்",
|
||||
"notify_description": "தற்போதைய பாடலை மாற்றும்போது அறிவிப்புகளைக் காட்டு",
|
||||
"pathReplace": "கோப்பு பாதை மாற்று",
|
||||
@@ -1015,7 +1015,7 @@
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"bpm": "$t(common.BPM)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"codec": "$t(common.codec)",
|
||||
"dateAdded": "தேதி சேர்க்கப்பட்டது",
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
+554
-554
File diff suppressed because it is too large
Load Diff
+389
-389
@@ -1,39 +1,39 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "додати до $t(entity.favorite, {\"count\": 2})",
|
||||
"addOrRemoveFromSelection": "додати або видалити з вибору",
|
||||
"selectRangeOfItems": "вибрати діапазон елементів",
|
||||
"addToPlaylist": "додати до $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "очистити чергу",
|
||||
"createPlaylist": "створити $t(entity.playlist, {\"count\": 1})",
|
||||
"createRadioStation": "створити $t(entity.radioStation, {\"count\": 1})",
|
||||
"deletePlaylist": "видалити $t(entity.playlist, {\"count\": 1})",
|
||||
"deleteRadioStation": "видалити $t(entity.radioStation, {\"count\": 1})",
|
||||
"selectAll": "вибрати все",
|
||||
"deselectAll": "скасувати вибір усього",
|
||||
"downloadStarted": "почато завантаження {{count}} елементів",
|
||||
"editPlaylist": "редагувати $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "перейти на сторінку",
|
||||
"moveToNext": "перейти до наступного",
|
||||
"moveToBottom": "перемістити вниз",
|
||||
"moveToTop": "перемістити вгору",
|
||||
"moveUp": "перемістити вище",
|
||||
"moveDown": "перемістити нижче",
|
||||
"holdToMoveToTop": "утримуйте, щоб перемістити вгору",
|
||||
"holdToMoveToBottom": "утримувати, щоб перемістити вниз",
|
||||
"moveItems": "перемістити елементи",
|
||||
"shuffle": "перемішати",
|
||||
"shuffleAll": "все випадково",
|
||||
"shuffleSelected": "вибране випадково",
|
||||
"addToFavorites": "Додати до $t(entity.favorite, {\"count\": 2})",
|
||||
"addOrRemoveFromSelection": "Додати або видалити з вибору",
|
||||
"selectRangeOfItems": "Вибрати діапазон елементів",
|
||||
"addToPlaylist": "Додати до $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "Очистити чергу",
|
||||
"createPlaylist": "Створити $t(entity.playlist, {\"count\": 1})",
|
||||
"createRadioStation": "Створити $t(entity.radioStation, {\"count\": 1})",
|
||||
"deletePlaylist": "Видалити $t(entity.playlist, {\"count\": 1})",
|
||||
"deleteRadioStation": "Видалити $t(entity.radioStation, {\"count\": 1})",
|
||||
"selectAll": "Вибрати все",
|
||||
"deselectAll": "Скасувати вибір усього",
|
||||
"downloadStarted": "Почато завантаження {{count}} елементів",
|
||||
"editPlaylist": "Редагувати $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "Перейти на сторінку",
|
||||
"moveToNext": "Перейти до наступного",
|
||||
"moveToBottom": "Перемістити вниз",
|
||||
"moveToTop": "Перемістити вгору",
|
||||
"moveUp": "Перемістити вище",
|
||||
"moveDown": "Перемістити нижче",
|
||||
"holdToMoveToTop": "Утримуйте, щоб перемістити вгору",
|
||||
"holdToMoveToBottom": "Утримувати, щоб перемістити вниз",
|
||||
"moveItems": "Перемістити елементи",
|
||||
"shuffle": "Перемішати",
|
||||
"shuffleAll": "Все випадково",
|
||||
"shuffleSelected": "Вибране випадково",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "видалити з $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "видалити з $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "видалити з черги",
|
||||
"setRating": "встановити рейтинг",
|
||||
"toggleSmartPlaylistEditor": "перемикати редактор $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "показати $t(entity.playlist, {\"count\": 2})",
|
||||
"viewMore": "переглянути більше",
|
||||
"openApplicationDirectory": "відкрити каталог додатків",
|
||||
"removeFromFavorites": "Видалити з $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "Видалити з $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "Видалити з черги",
|
||||
"setRating": "Встановити рейтинг",
|
||||
"toggleSmartPlaylistEditor": "Перемикати редактор $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "Показати $t(entity.playlist, {\"count\": 2})",
|
||||
"viewMore": "Переглянути більше",
|
||||
"openApplicationDirectory": "Відкрити каталог додатків",
|
||||
"openIn": {
|
||||
"lastfm": "Відкрити в Last.fm",
|
||||
"musicbrainz": "Відкрити в MusicBrainz",
|
||||
@@ -43,139 +43,139 @@
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"countSelected": "вибрано {{count}}",
|
||||
"explicitStatus": "явний статус",
|
||||
"action_one": "дія",
|
||||
"countSelected": "Вибрано {{count}}",
|
||||
"explicitStatus": "Явний статус",
|
||||
"action_one": "Дія",
|
||||
"action_few": "дії",
|
||||
"action_many": "дій",
|
||||
"add": "додати",
|
||||
"additionalParticipants": "додаткові учасники",
|
||||
"newVersion": "встановлено нову версію ({{version}})",
|
||||
"viewReleaseNotes": "переглянути список змін",
|
||||
"albumGain": "підсилення альбому",
|
||||
"albumPeak": "піковий рівень альбому",
|
||||
"areYouSure": "ви впевнені?",
|
||||
"ascending": "зростаючи",
|
||||
"backward": "назад",
|
||||
"biography": "біографія",
|
||||
"bitDepth": "розрядність",
|
||||
"bitrate": "бітрейт",
|
||||
"bpm": "уд/хв",
|
||||
"cancel": "скасувати",
|
||||
"center": "посередині",
|
||||
"channel_one": "канал",
|
||||
"add": "Додати",
|
||||
"additionalParticipants": "Додаткові учасники",
|
||||
"newVersion": "Встановлено нову версію ({{version}})",
|
||||
"viewReleaseNotes": "Переглянути список змін",
|
||||
"albumGain": "Підсилення альбому",
|
||||
"albumPeak": "Піковий рівень альбому",
|
||||
"areYouSure": "Ви впевнені?",
|
||||
"ascending": "Зростаючи",
|
||||
"backward": "Назад",
|
||||
"biography": "Біографія",
|
||||
"bitDepth": "Розрядність",
|
||||
"bitrate": "Бітрейт",
|
||||
"bpm": "Уд/хв",
|
||||
"cancel": "Скасувати",
|
||||
"center": "Посередині",
|
||||
"channel_one": "Канал",
|
||||
"channel_few": "канали",
|
||||
"channel_many": "каналів",
|
||||
"clear": "очистити",
|
||||
"close": "закрити",
|
||||
"codec": "кодек",
|
||||
"collapse": "згорнути",
|
||||
"comingSoon": "скоро…",
|
||||
"configure": "налаштувати",
|
||||
"confirm": "підтвердити",
|
||||
"create": "створити",
|
||||
"currentSong": "поточний $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "знизити",
|
||||
"delete": "видалити",
|
||||
"descending": "за спаданням",
|
||||
"description": "опис",
|
||||
"disable": "вимкнути",
|
||||
"disc": "диск",
|
||||
"dismiss": "відхилити",
|
||||
"doNotShowAgain": "не показувати це знову",
|
||||
"duration": "тривалість",
|
||||
"view": "показати",
|
||||
"edit": "змінити",
|
||||
"enable": "увімкнути",
|
||||
"expand": "розширити",
|
||||
"example": "приклад",
|
||||
"externalLinks": "зовнішні посилання",
|
||||
"faster": "швидше",
|
||||
"favorite": "улюблений",
|
||||
"filter_one": "фільтр",
|
||||
"clear": "Очистити",
|
||||
"close": "Закрити",
|
||||
"codec": "Кодек",
|
||||
"collapse": "Згорнути",
|
||||
"comingSoon": "Скоро…",
|
||||
"configure": "Налаштувати",
|
||||
"confirm": "Підтвердити",
|
||||
"create": "Створити",
|
||||
"currentSong": "Поточний $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "Знизити",
|
||||
"delete": "Видалити",
|
||||
"descending": "За спаданням",
|
||||
"description": "Опис",
|
||||
"disable": "Вимкнути",
|
||||
"disc": "Диск",
|
||||
"dismiss": "Відхилити",
|
||||
"doNotShowAgain": "Не показувати це знову",
|
||||
"duration": "Тривалість",
|
||||
"view": "Показати",
|
||||
"edit": "Змінити",
|
||||
"enable": "Увімкнути",
|
||||
"expand": "Розширити",
|
||||
"example": "Приклад",
|
||||
"externalLinks": "Зовнішні посилання",
|
||||
"faster": "Швидше",
|
||||
"favorite": "Улюблений",
|
||||
"filter_one": "Фільтр",
|
||||
"filter_few": "фільтри",
|
||||
"filter_many": "фільтрів",
|
||||
"filters": "фільтри",
|
||||
"filter_single": "одиночний",
|
||||
"filter_multiple": "кілька",
|
||||
"forceRestartRequired": "перезапустіть, щоб застосувати зміни… закрийте повідомлення, щоб перезапустити",
|
||||
"forward": "уперед",
|
||||
"gap": "прогалина",
|
||||
"grouping": "групування",
|
||||
"home": "додому",
|
||||
"increase": "збільшити",
|
||||
"left": "ліво",
|
||||
"limit": "ліміт",
|
||||
"manage": "управління",
|
||||
"maximize": "максимізувати",
|
||||
"menu": "меню",
|
||||
"minimize": "мінімізувати",
|
||||
"modified": "відредаговано",
|
||||
"filters": "Фільтри",
|
||||
"filter_single": "Одиночний",
|
||||
"filter_multiple": "Кілька",
|
||||
"forceRestartRequired": "Перезапустіть, щоб застосувати зміни… закрийте повідомлення, щоб перезапустити",
|
||||
"forward": "Уперед",
|
||||
"gap": "Прогалина",
|
||||
"grouping": "Групування",
|
||||
"home": "Додому",
|
||||
"increase": "Збільшити",
|
||||
"left": "Ліво",
|
||||
"limit": "Ліміт",
|
||||
"manage": "Управління",
|
||||
"maximize": "Максимізувати",
|
||||
"menu": "Меню",
|
||||
"minimize": "Мінімізувати",
|
||||
"modified": "Відредаговано",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"mood": "настрій",
|
||||
"name": "назва",
|
||||
"no": "ні",
|
||||
"none": "жоден",
|
||||
"noResultsFromQuery": "запит не дав результатів",
|
||||
"noFilters": "фільтри не налаштовані",
|
||||
"note": "примітка",
|
||||
"ok": "ок",
|
||||
"owner": "власник",
|
||||
"path": "шлях",
|
||||
"playerMustBePaused": "плеєр повинен бути призупинений",
|
||||
"preview": "перегляд",
|
||||
"previousSong": "минулий $t(entity.track, {\"count\": 1})",
|
||||
"private": "приватний",
|
||||
"public": "публічний",
|
||||
"quit": "вийти",
|
||||
"random": "випадково",
|
||||
"rating": "рейтинг",
|
||||
"retry": "повторити спробу",
|
||||
"recordLabel": "лейбл звукозапису",
|
||||
"releaseType": "тип випуску",
|
||||
"refresh": "оновити",
|
||||
"reload": "перезавантажити",
|
||||
"rename": "перейменувати",
|
||||
"reset": "скинути",
|
||||
"resetToDefault": "скинути до заводських налаштувань",
|
||||
"restartRequired": "необхідний перезапуск",
|
||||
"right": "право",
|
||||
"clean": "чистo",
|
||||
"sampleRate": "частота дискретизації",
|
||||
"save": "зберегти",
|
||||
"saveAndReplace": "зберегти та замінити",
|
||||
"saveAs": "зберегти як",
|
||||
"search": "пошук",
|
||||
"setting_one": "налаштування",
|
||||
"mood": "Настрій",
|
||||
"name": "Назва",
|
||||
"no": "Ні",
|
||||
"none": "Жоден",
|
||||
"noResultsFromQuery": "Запит не дав результатів",
|
||||
"noFilters": "Фільтри не налаштовані",
|
||||
"note": "Примітка",
|
||||
"ok": "Ок",
|
||||
"owner": "Власник",
|
||||
"path": "Шлях",
|
||||
"playerMustBePaused": "Плеєр повинен бути призупинений",
|
||||
"preview": "Перегляд",
|
||||
"previousSong": "Минулий $t(entity.track, {\"count\": 1})",
|
||||
"private": "Приватний",
|
||||
"public": "Публічний",
|
||||
"quit": "Вийти",
|
||||
"random": "Випадково",
|
||||
"rating": "Рейтинг",
|
||||
"retry": "Повторити спробу",
|
||||
"recordLabel": "Лейбл звукозапису",
|
||||
"releaseType": "Тип випуску",
|
||||
"refresh": "Оновити",
|
||||
"reload": "Перезавантажити",
|
||||
"rename": "Перейменувати",
|
||||
"reset": "Скинути",
|
||||
"resetToDefault": "Скинути до заводських налаштувань",
|
||||
"restartRequired": "Необхідний перезапуск",
|
||||
"right": "Право",
|
||||
"clean": "Чистo",
|
||||
"sampleRate": "Частота дискретизації",
|
||||
"save": "Зберегти",
|
||||
"saveAndReplace": "Зберегти та замінити",
|
||||
"saveAs": "Зберегти як",
|
||||
"search": "Пошук",
|
||||
"setting_one": "Налаштування",
|
||||
"setting_few": "налаштування",
|
||||
"setting_many": "налаштувань",
|
||||
"slower": "повільніше",
|
||||
"share": "поділитися",
|
||||
"size": "розмір",
|
||||
"sort": "впорядкувати",
|
||||
"sortOrder": "порядок",
|
||||
"tags": "теги",
|
||||
"title": "назва",
|
||||
"trackNumber": "трек",
|
||||
"trackGain": "підсилення треку",
|
||||
"trackPeak": "піковий рівень треку",
|
||||
"translation": "переклад",
|
||||
"unknown": "невідомий",
|
||||
"version": "версія",
|
||||
"year": "рік",
|
||||
"yes": "так",
|
||||
"slower": "Повільніше",
|
||||
"share": "Поділитися",
|
||||
"size": "Розмір",
|
||||
"sort": "Впорядкувати",
|
||||
"sortOrder": "Порядок",
|
||||
"tags": "Теги",
|
||||
"title": "Назва",
|
||||
"trackNumber": "Трек",
|
||||
"trackGain": "Підсилення треку",
|
||||
"trackPeak": "Піковий рівень треку",
|
||||
"translation": "Переклад",
|
||||
"unknown": "Невідомий",
|
||||
"version": "Версія",
|
||||
"year": "Рік",
|
||||
"yes": "Так",
|
||||
"explicit": "Експліцитний зміст",
|
||||
"gridRows": "рядки сітки",
|
||||
"tableColumns": "стовпці таблиці",
|
||||
"gridRows": "Рядки сітки",
|
||||
"tableColumns": "Стовпці таблиці",
|
||||
"itemsMore": "{{count}} більше",
|
||||
"numberOfResults": "{{numberOfResults}} результатів",
|
||||
"newVersionAvailable": "доступна нова версія"
|
||||
"newVersionAvailable": "Доступна нова версія"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "альбом",
|
||||
"album_one": "Альбом",
|
||||
"album_few": "альбоми",
|
||||
"album_many": "альбомів",
|
||||
"albumArtist_one": "виконавець альбому",
|
||||
"albumArtist_one": "Виконавець альбому",
|
||||
"albumArtist_few": "виконавці альбому",
|
||||
"albumArtist_many": "виконавців альбому",
|
||||
"albumArtistCount_one": "{{count}} виконавець альбому",
|
||||
@@ -184,34 +184,34 @@
|
||||
"albumWithCount_one": "{{count}} альбом",
|
||||
"albumWithCount_few": "{{count}} альбоми",
|
||||
"albumWithCount_many": "{{count}} альбомів",
|
||||
"radioStation_one": "радіостанція",
|
||||
"radioStation_one": "Радіостанція",
|
||||
"radioStation_few": "радіостанції",
|
||||
"radioStation_many": "радіостанцій",
|
||||
"radioStationWithCount_one": "{{count}} радіостанція",
|
||||
"radioStationWithCount_few": "{{count}} радіостанції",
|
||||
"radioStationWithCount_many": "{{count}} радіостанцій",
|
||||
"artist_one": "виконавець",
|
||||
"artist_one": "Виконавець",
|
||||
"artist_few": "виконавці",
|
||||
"artist_many": "виконавців",
|
||||
"artistWithCount_one": "{{count}} виконавець",
|
||||
"artistWithCount_few": "{{count}} виконавці",
|
||||
"artistWithCount_many": "{{count}} виконавців",
|
||||
"favorite_one": "улюблений",
|
||||
"favorite_one": "Улюблений",
|
||||
"favorite_few": "улюблені",
|
||||
"favorite_many": "улюблених",
|
||||
"folder_one": "папка",
|
||||
"folder_one": "Папка",
|
||||
"folder_few": "папки",
|
||||
"folder_many": "папок",
|
||||
"folderWithCount_one": "{{count}} папка",
|
||||
"folderWithCount_few": "{{count}} папки",
|
||||
"folderWithCount_many": "{{count}} папок",
|
||||
"genre_one": "жанр",
|
||||
"genre_one": "Жанр",
|
||||
"genre_few": "жанри",
|
||||
"genre_many": "жанрів",
|
||||
"genreWithCount_one": "{{count}} жанр",
|
||||
"genreWithCount_few": "{{count}} жанри",
|
||||
"genreWithCount_many": "{{count}} жанрів",
|
||||
"playlist_one": "плейлист",
|
||||
"playlist_one": "Плейлист",
|
||||
"playlist_few": "плейлисти",
|
||||
"playlist_many": "плейлистів",
|
||||
"play_one": "{{count}} відтворення",
|
||||
@@ -220,11 +220,11 @@
|
||||
"playlistWithCount_one": "{{count}} плейлист",
|
||||
"playlistWithCount_few": "{{count}} плейлисти",
|
||||
"playlistWithCount_many": "{{count}} плейлистів",
|
||||
"smartPlaylist": "розумний $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "трек",
|
||||
"smartPlaylist": "Розумний $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "Трек",
|
||||
"track_few": "треки",
|
||||
"track_many": "треків",
|
||||
"song_one": "пісня",
|
||||
"song_one": "Пісня",
|
||||
"song_few": "пісні",
|
||||
"song_many": "пісень",
|
||||
"trackWithCount_one": "{{count}} трек",
|
||||
@@ -232,266 +232,266 @@
|
||||
"trackWithCount_many": "{{count}} треків"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "неможливо виконати запит",
|
||||
"audioDeviceFetchError": "сталася помилка під час спроби отримати аудіопристрої",
|
||||
"authenticationFailed": "аутентифікація не вдалася",
|
||||
"badAlbum": "ви бачите цю сторінку, тому що ця пісня не входить до альбому. найімовірніше, ця проблема виникає, якщо у верхньому рівні вашої музичної папки знаходиться пісня. Jellyfin групує треки тільки в тому випадку, якщо вони знаходяться в папці",
|
||||
"badValue": "недійсний параметр \"{{value}}\". це значення більше не існує",
|
||||
"credentialsRequired": "необхідні дані для входу",
|
||||
"endpointNotImplementedError": "кінцева точка {{endpoint}} не реалізована для {{serverType}}",
|
||||
"genericError": "сталася помилка",
|
||||
"invalidServer": "недійсний сервер",
|
||||
"localFontAccessDenied": "відмова в доступі до локальних шрифтів",
|
||||
"loginRateError": "занадто багато спроб входу, спробуйте ще раз через кілька секунд",
|
||||
"mpvRequired": "необхідний MPV",
|
||||
"multipleServerSaveQueueError": "у черзі відтворення є одна або кілька пісень, які не належать до поточного сервера. це не підтримується",
|
||||
"networkError": "сталася мережева помилка",
|
||||
"noNetwork": "сервер недоступний",
|
||||
"noNetworkDescription": "не вдалося підключитися до цього сервера",
|
||||
"notificationDenied": "дозвіл на сповіщення було відхилено. це налаштування не має впливу",
|
||||
"openError": "не вдалося відкрити файл",
|
||||
"playbackError": "сталася помилка під час спроби відтворити медіафайл",
|
||||
"remoteDisableError": "сталася помилка під час спроби $t(common.disable) віддаленого сервера",
|
||||
"remoteEnableError": "сталася помилка під час спроби $t(common.enable) віддаленого сервера",
|
||||
"remotePortError": "сталася помилка під час спроби налаштувати порт віддаленого сервера",
|
||||
"remotePortWarning": "перезапустіть сервер щоб застосувати новий порт",
|
||||
"saveQueueFailed": "не вдалося зберегти чергу",
|
||||
"serverNotSelectedError": "не вибрано жодного сервера",
|
||||
"serverRequired": "потрібен сервер",
|
||||
"sessionExpiredError": "ваша сесія закінчилася",
|
||||
"systemFontError": "сталася помилка під час спроби отримати системні шрифти",
|
||||
"settingsSyncError": "виявлено розбіжності між налаштуваннями в рендерері та основним процесом. перезапустіть програму, щоб застосувати зміни",
|
||||
"invalidJson": "недійсний JSON",
|
||||
"playbackPausedDueToError": "відтворення було призупинено через помилку"
|
||||
"apiRouteError": "Неможливо виконати запит",
|
||||
"audioDeviceFetchError": "Сталася помилка під час спроби отримати аудіопристрої",
|
||||
"authenticationFailed": "Аутентифікація не вдалася",
|
||||
"badAlbum": "Ви бачите цю сторінку, тому що ця пісня не входить до альбому. найімовірніше, ця проблема виникає, якщо у верхньому рівні вашої музичної папки знаходиться пісня. Jellyfin групує треки тільки в тому випадку, якщо вони знаходяться в папці",
|
||||
"badValue": "Недійсний параметр \"{{value}}\". це значення більше не існує",
|
||||
"credentialsRequired": "Необхідні дані для входу",
|
||||
"endpointNotImplementedError": "Кінцева точка {{endpoint}} не реалізована для {{serverType}}",
|
||||
"genericError": "Сталася помилка",
|
||||
"invalidServer": "Недійсний сервер",
|
||||
"localFontAccessDenied": "Відмова в доступі до локальних шрифтів",
|
||||
"loginRateError": "Занадто багато спроб входу, спробуйте ще раз через кілька секунд",
|
||||
"mpvRequired": "Необхідний MPV",
|
||||
"multipleServerSaveQueueError": "У черзі відтворення є одна або кілька пісень, які не належать до поточного сервера. це не підтримується",
|
||||
"networkError": "Сталася мережева помилка",
|
||||
"noNetwork": "Сервер недоступний",
|
||||
"noNetworkDescription": "Не вдалося підключитися до цього сервера",
|
||||
"notificationDenied": "Дозвіл на сповіщення було відхилено. це налаштування не має впливу",
|
||||
"openError": "Не вдалося відкрити файл",
|
||||
"playbackError": "Сталася помилка під час спроби відтворити медіафайл",
|
||||
"remoteDisableError": "Сталася помилка під час спроби $t(common.disable) віддаленого сервера",
|
||||
"remoteEnableError": "Сталася помилка під час спроби $t(common.enable) віддаленого сервера",
|
||||
"remotePortError": "Сталася помилка під час спроби налаштувати порт віддаленого сервера",
|
||||
"remotePortWarning": "Перезапустіть сервер щоб застосувати новий порт",
|
||||
"saveQueueFailed": "Не вдалося зберегти чергу",
|
||||
"serverNotSelectedError": "Не вибрано жодного сервера",
|
||||
"serverRequired": "Потрібен сервер",
|
||||
"sessionExpiredError": "Ваша сесія закінчилася",
|
||||
"systemFontError": "Сталася помилка під час спроби отримати системні шрифти",
|
||||
"settingsSyncError": "Виявлено розбіжності між налаштуваннями в рендерері та основним процесом. перезапустіть програму, щоб застосувати зміни",
|
||||
"invalidJson": "Недійсний JSON",
|
||||
"playbackPausedDueToError": "Відтворення було призупинено через помилку"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "кількість $t(entity.album, {\"count\": 2})",
|
||||
"albumCount": "Кількість $t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "біографія",
|
||||
"bitrate": "бітрейт",
|
||||
"bpm": "уд/хв",
|
||||
"biography": "Біографія",
|
||||
"bitrate": "Бітрейт",
|
||||
"bpm": "Уд/хв",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"comment": "коментар",
|
||||
"communityRating": "рейтинг спільноти",
|
||||
"criticRating": "рейтинг критиків",
|
||||
"dateAdded": "дата додавання",
|
||||
"disc": "диск",
|
||||
"duration": "тривалість",
|
||||
"favorited": "улюблене",
|
||||
"fromYear": "з року",
|
||||
"comment": "Коментар",
|
||||
"communityRating": "Рейтинг спільноти",
|
||||
"criticRating": "Рейтинг критиків",
|
||||
"dateAdded": "Дата додавання",
|
||||
"disc": "Диск",
|
||||
"duration": "Тривалість",
|
||||
"favorited": "Улюблене",
|
||||
"fromYear": "З року",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "id",
|
||||
"isCompilation": "є компіляцією",
|
||||
"isFavorited": "є улюбленим",
|
||||
"isPublic": "є публічним",
|
||||
"isRated": "є оціненим",
|
||||
"isRecentlyPlayed": "нещодавно відтворено",
|
||||
"lastPlayed": "останнє відтворене",
|
||||
"mostPlayed": "найбільш відтворювані",
|
||||
"name": "назва",
|
||||
"note": "примітка",
|
||||
"id": "Id",
|
||||
"isCompilation": "Є компіляцією",
|
||||
"isFavorited": "Є улюбленим",
|
||||
"isPublic": "Є публічним",
|
||||
"isRated": "Є оціненим",
|
||||
"isRecentlyPlayed": "Нещодавно відтворено",
|
||||
"lastPlayed": "Останнє відтворене",
|
||||
"mostPlayed": "Найбільш відтворювані",
|
||||
"name": "Назва",
|
||||
"note": "Примітка",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "шлях",
|
||||
"playCount": "кількість відтворень",
|
||||
"random": "випадково",
|
||||
"rating": "рейтинг",
|
||||
"recentlyAdded": "нещодавно додано",
|
||||
"recentlyPlayed": "нещодавно відтворено",
|
||||
"recentlyUpdated": "нещодавно оновлено",
|
||||
"releaseDate": "дата випуску",
|
||||
"releaseYear": "рік випуску",
|
||||
"search": "шукати",
|
||||
"songCount": "кількість пісень",
|
||||
"sortName": "сортування за назвою",
|
||||
"title": "назва",
|
||||
"toYear": "до року",
|
||||
"trackNumber": "трек",
|
||||
"path": "Шлях",
|
||||
"playCount": "Кількість відтворень",
|
||||
"random": "Випадково",
|
||||
"rating": "Рейтинг",
|
||||
"recentlyAdded": "Нещодавно додано",
|
||||
"recentlyPlayed": "Нещодавно відтворено",
|
||||
"recentlyUpdated": "Нещодавно оновлено",
|
||||
"releaseDate": "Дата випуску",
|
||||
"releaseYear": "Рік випуску",
|
||||
"search": "Шукати",
|
||||
"songCount": "Кількість пісень",
|
||||
"sortName": "Сортування за назвою",
|
||||
"title": "Назва",
|
||||
"toYear": "До року",
|
||||
"trackNumber": "Трек",
|
||||
"explicitStatus": "$t(common.explicitStatus)",
|
||||
"matchAnd": "і",
|
||||
"matchOr": "або"
|
||||
"matchAnd": "І",
|
||||
"matchOr": "Або"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "хв.",
|
||||
"secondShort": "сек.",
|
||||
"hourShort": "год",
|
||||
"dayShort": "дн."
|
||||
"minuteShort": "Хв.",
|
||||
"secondShort": "Сек.",
|
||||
"hourShort": "Год",
|
||||
"dayShort": "Дн."
|
||||
},
|
||||
"filterOperator": {
|
||||
"after": "є після",
|
||||
"afterDate": "після (дата)",
|
||||
"before": "є перед",
|
||||
"beforeDate": "є перед (дата)",
|
||||
"contains": "містить",
|
||||
"endsWith": "закінчується на",
|
||||
"inPlaylist": "є в",
|
||||
"inTheLast": "є в останньому",
|
||||
"inTheRange": "є в межах",
|
||||
"inTheRangeDate": "є в межах (дата)",
|
||||
"is": "є",
|
||||
"isNot": "не є",
|
||||
"isGreaterThan": "більше ніж",
|
||||
"isLessThan": "менше ніж",
|
||||
"matchesRegex": "відповідає регулярному виразу",
|
||||
"notContains": "не містить",
|
||||
"notInPlaylist": "немає в",
|
||||
"notInTheLast": "не є в останньому",
|
||||
"startsWith": "починається з"
|
||||
"after": "Є після",
|
||||
"afterDate": "Після (дата)",
|
||||
"before": "Є перед",
|
||||
"beforeDate": "Є перед (дата)",
|
||||
"contains": "Містить",
|
||||
"endsWith": "Закінчується на",
|
||||
"inPlaylist": "Є в",
|
||||
"inTheLast": "Є в останньому",
|
||||
"inTheRange": "Є в межах",
|
||||
"inTheRangeDate": "Є в межах (дата)",
|
||||
"is": "Є",
|
||||
"isNot": "Не є",
|
||||
"isGreaterThan": "Більше ніж",
|
||||
"isLessThan": "Менше ніж",
|
||||
"matchesRegex": "Відповідає регулярному виразу",
|
||||
"notContains": "Не містить",
|
||||
"notInPlaylist": "Немає в",
|
||||
"notInTheLast": "Не є в останньому",
|
||||
"startsWith": "Починається з"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "сталася помилка під час спроби зберегти пароль",
|
||||
"ignoreCors": "ігнорувати cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ігнорувати ssl ($t(common.restartRequired)}",
|
||||
"input_legacyAuthentication": "увімкнути застарілу автентифікацію",
|
||||
"input_name": "назва сервера",
|
||||
"input_password": "пароль",
|
||||
"input_preferInstantMix": "віддавати перевагу миттєвому міксу",
|
||||
"input_preferInstantMixDescription": "використовувати тільки миттєвий мікс щоб отримати подібні пісні. корисно, коли у вас є плагіни, які змінюють цю поведінку",
|
||||
"input_preferRemoteUrl": "віддавати перевагу публічній URL-адресі",
|
||||
"input_remoteUrl": "публічна URL-адреса",
|
||||
"input_remoteUrlPlaceholder": "опціонально: публічна URL-адреса для зовнішніх функцій",
|
||||
"input_savePassword": "зберегти пароль",
|
||||
"error_savePassword": "Сталася помилка під час спроби зберегти пароль",
|
||||
"ignoreCors": "Ігнорувати cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "Ігнорувати ssl ($t(common.restartRequired)}",
|
||||
"input_legacyAuthentication": "Увімкнути застарілу автентифікацію",
|
||||
"input_name": "Назва сервера",
|
||||
"input_password": "Пароль",
|
||||
"input_preferInstantMix": "Віддавати перевагу миттєвому міксу",
|
||||
"input_preferInstantMixDescription": "Використовувати тільки миттєвий мікс щоб отримати подібні пісні. корисно, коли у вас є плагіни, які змінюють цю поведінку",
|
||||
"input_preferRemoteUrl": "Віддавати перевагу публічній URL-адресі",
|
||||
"input_remoteUrl": "Публічна URL-адреса",
|
||||
"input_remoteUrlPlaceholder": "Опціонально: публічна URL-адреса для зовнішніх функцій",
|
||||
"input_savePassword": "Зберегти пароль",
|
||||
"input_url": "URL-адреса",
|
||||
"input_username": "Ім'я користувача",
|
||||
"success": "сервер додано успішно",
|
||||
"title": "додати сервер"
|
||||
"success": "Сервер додано успішно",
|
||||
"title": "Додати сервер"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "додати елементи до черги",
|
||||
"title": "Додати елементи до черги",
|
||||
"description": "Ця дія додасть усі елементи в поточний відфільтрований перегляд"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"create": "створити $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"create": "Створити $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "пропустити дублікати",
|
||||
"searchOrCreate": "шукайте $t(entity.playlist, {\"count\": 2}) або пишіть, щоб створити новий",
|
||||
"success": "додано $t(entity.trackWithCount, {\"count\": {{message}} }) до $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "додати до $t(entity.playlist, {\"count\": 1})"
|
||||
"input_skipDuplicates": "Пропустити дублікати",
|
||||
"searchOrCreate": "Шукайте $t(entity.playlist, {\"count\": 2}) або пишіть, щоб створити новий",
|
||||
"success": "Додано $t(entity.trackWithCount, {\"count\": {{message}} }) до $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "Додати до $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "публічний",
|
||||
"input_public": "Публічний",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) стрворено успішно",
|
||||
"title": "створити $t(entity.playlist, {\"count\": 1})"
|
||||
"title": "Створити $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "радіостанція створена успішно",
|
||||
"title": "створити радіостанцію",
|
||||
"input_homepageUrl": "адреса домашньої сторінки",
|
||||
"input_name": "назва",
|
||||
"success": "Радіостанція створена успішно",
|
||||
"title": "Створити радіостанцію",
|
||||
"input_homepageUrl": "Адреса домашньої сторінки",
|
||||
"input_name": "Назва",
|
||||
"input_streamUrl": "URL-адреса потоку"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "введіть ім'я $t(entity.playlist, {\"count\": 1}) для підтвердження",
|
||||
"input_confirm": "Введіть ім'я $t(entity.playlist, {\"count\": 1}) для підтвердження",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) успішно видалено",
|
||||
"title": "видалити $t(entity.playlist, {\"count\": 1})"
|
||||
"title": "Видалити $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin з якоїсь причини не показує, чи є плейлист публічним чи ні. Якщо ви хочете, щоб він залишався публічним, виберіть варіант нижче",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) успішно оновлено",
|
||||
"title": "змінити $t(entity.playlist, {\"count\": 1})"
|
||||
"title": "Змінити $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "експортувати тексти пісень",
|
||||
"input_synced": "експортувати синхронізовані тексти пісень",
|
||||
"export": "Експортувати тексти пісень",
|
||||
"input_synced": "Експортувати синхронізовані тексти пісень",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "шукати тексти пісень"
|
||||
"title": "Шукати тексти пісень"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "редактор запитів",
|
||||
"input_optionMatchAll": "збіг за всіма",
|
||||
"input_optionMatchAny": "збіг за будь-яким",
|
||||
"addRuleGroup": "додати групу правил",
|
||||
"removeRuleGroup": "видалити групу правил",
|
||||
"resetToDefault": "скинути до заводських налаштувань",
|
||||
"clearFilters": "очистити фільтри"
|
||||
"title": "Редактор запитів",
|
||||
"input_optionMatchAll": "Збіг за всіма",
|
||||
"input_optionMatchAny": "Збіг за будь-яким",
|
||||
"addRuleGroup": "Додати групу правил",
|
||||
"removeRuleGroup": "Видалити групу правил",
|
||||
"resetToDefault": "Скинути до заводських налаштувань",
|
||||
"clearFilters": "Очистити фільтри"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "черга відтворення збережена на сервері"
|
||||
"success": "Черга відтворення збережена на сервері"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "дозволити завантаження",
|
||||
"description": "опис",
|
||||
"setExpiration": "встановити термін дії",
|
||||
"success": "посилання для спільного використання скопійовано в буфер обміну (натисніть тут, щоб відкрити)",
|
||||
"expireInvalid": "термін дії повинен бути в майбутньому",
|
||||
"createFailed": "не вдалося створити спільний доступ (чи ввімкнено спільний доступ?)",
|
||||
"copyToClipboard": "Скопіювати до буфера обміну: Ctrl+C, Enter",
|
||||
"successMustClick": "посилання успішно створено, натисніть сюди, щоб відкрити"
|
||||
"allowDownloading": "Дозволити завантаження",
|
||||
"description": "Опис",
|
||||
"setExpiration": "Встановити термін дії",
|
||||
"success": "Посилання для спільного використання скопійовано в буфер обміну (натисніть тут, щоб відкрити)",
|
||||
"expireInvalid": "Термін дії повинен бути в майбутньому",
|
||||
"createFailed": "Не вдалося створити спільний доступ (чи ввімкнено спільний доступ?)",
|
||||
"copyToClipboard": "Скопіювати до буфера обміну: Ctrl+C, enter",
|
||||
"successMustClick": "Посилання успішно створено, натисніть сюди, щоб відкрити"
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "відтворити випадково",
|
||||
"title": "Відтворити випадково",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "скільки пісень?",
|
||||
"input_minYear": "від року",
|
||||
"input_maxYear": "до року",
|
||||
"input_played": "відтворити фільтр",
|
||||
"input_played_optionAll": "всі треки",
|
||||
"input_played_optionUnplayed": "тільки не відтворені треки",
|
||||
"input_played_optionPlayed": "тільки відтворені треки"
|
||||
"input_limit": "Скільки пісень?",
|
||||
"input_minYear": "Від року",
|
||||
"input_maxYear": "До року",
|
||||
"input_played": "Відтворити фільтр",
|
||||
"input_played_optionAll": "Всі треки",
|
||||
"input_played_optionUnplayed": "Тільки не відтворені треки",
|
||||
"input_played_optionPlayed": "Тільки відтворені треки"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "сервер успішно оновлено",
|
||||
"title": "оновити сервер"
|
||||
"success": "Сервер успішно оновлено",
|
||||
"title": "Оновити сервер"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "приватний режим увімкнено, стан відтворення тепер приховано від зовнішніх інтеграцій",
|
||||
"disabled": "приватний режим вимкнено, стан відтворення тепер видно для увімкнених зовнішніх інтеграцій",
|
||||
"title": "приватний режим"
|
||||
"enabled": "Приватний режим увімкнено, стан відтворення тепер приховано від зовнішніх інтеграцій",
|
||||
"disabled": "Приватний режим вимкнено, стан відтворення тепер видно для увімкнених зовнішніх інтеграцій",
|
||||
"title": "Приватний режим"
|
||||
},
|
||||
"editRadioStation": {
|
||||
"success": "радіо станція успішно оновлена"
|
||||
"success": "Радіо станція успішно оновлена"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"skip": "пропустити"
|
||||
"skip": "Пропустити"
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "Про {{artist}}",
|
||||
"appearsOn": "з'являється на",
|
||||
"favoriteSongs": "улюблені пісні",
|
||||
"groupingTypeAll": "всі типи випуску",
|
||||
"groupingTypePrimary": "основні типи випуску",
|
||||
"recentReleases": "останні випуски",
|
||||
"viewDiscography": "переглянути дискографію",
|
||||
"relatedArtists": "подібні $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "найкращі пісні",
|
||||
"topSongsCommunity": "спільнота",
|
||||
"topSongsFrom": "найкращі пісні від {{title}}",
|
||||
"topSongsPersonal": "особисте",
|
||||
"favoriteSongsFrom": "улюблені пісні від {{title}}",
|
||||
"viewAll": "показати все",
|
||||
"viewAllTracks": "показати усі $t(entity.track, {\"count\": 2})"
|
||||
"appearsOn": "З'являється на",
|
||||
"favoriteSongs": "Улюблені пісні",
|
||||
"groupingTypeAll": "Всі типи випуску",
|
||||
"groupingTypePrimary": "Основні типи випуску",
|
||||
"recentReleases": "Останні випуски",
|
||||
"viewDiscography": "Переглянути дискографію",
|
||||
"relatedArtists": "Подібні $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "Найкращі пісні",
|
||||
"topSongsCommunity": "Спільнота",
|
||||
"topSongsFrom": "Найкращі пісні від {{title}}",
|
||||
"topSongsPersonal": "Особисте",
|
||||
"favoriteSongsFrom": "Улюблені пісні від {{title}}",
|
||||
"viewAll": "Показати все",
|
||||
"viewAllTracks": "Показати усі $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "більше від цього $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "більше від {{item}}",
|
||||
"released": "видано"
|
||||
"moreFromArtist": "Більше від цього $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "Більше від {{item}}",
|
||||
"released": "Видано"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "альбоми виконавця {{artist}}",
|
||||
"artistAlbums": "Альбоми виконавця {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "радіостанції"
|
||||
"title": "Радіостанції"
|
||||
},
|
||||
"releasenotes": {
|
||||
"commitsSinceStable": "комміти від {{stable}}",
|
||||
"noNewCommits": "немає нових коммітів у цьому періоді",
|
||||
"noStableReleaseToCompare": "немає доступної стабільної версії для порівняння"
|
||||
"commitsSinceStable": "Комміти від {{stable}}",
|
||||
"noNewCommits": "Немає нових коммітів у цьому періоді",
|
||||
"noStableReleaseToCompare": "Немає доступної стабільної версії для порівняння"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
@@ -501,30 +501,30 @@
|
||||
"privateMode": "(Приватний режим)"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "згорнути бічну панель",
|
||||
"commandPalette": "відкрити палітру команд",
|
||||
"expandSidebar": "розгорнути бічну панель",
|
||||
"goBack": "повернутися назад",
|
||||
"goForward": "перейти вперед",
|
||||
"manageServers": "управління серверами",
|
||||
"privateModeOff": "вимкнути приватний режим",
|
||||
"privateModeOn": "увімкнути приватний режим",
|
||||
"openBrowserDevtools": "відкрити інструменти розробника",
|
||||
"collapseSidebar": "Згорнути бічну панель",
|
||||
"commandPalette": "Відкрити палітру команд",
|
||||
"expandSidebar": "Розгорнути бічну панель",
|
||||
"goBack": "Повернутися назад",
|
||||
"goForward": "Перейти вперед",
|
||||
"manageServers": "Управління серверами",
|
||||
"privateModeOff": "Вимкнути приватний режим",
|
||||
"privateModeOn": "Увімкнути приватний режим",
|
||||
"openBrowserDevtools": "Відкрити інструменти розробника",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "вибрати сервер",
|
||||
"selectMusicFolder": "вибрати папку з музикою",
|
||||
"noMusicFolder": "не вибрано папку з музикою",
|
||||
"selectServer": "Вибрати сервер",
|
||||
"selectMusicFolder": "Вибрати папку з музикою",
|
||||
"noMusicFolder": "Не вибрано папку з музикою",
|
||||
"multipleMusicFolders": "Вибрано {{count}} папок з музикою",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "версія {{version}}"
|
||||
"version": "Версія {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "управління серверами",
|
||||
"serverDetails": "інформація про сервер",
|
||||
"title": "Управління серверами",
|
||||
"serverDetails": "Інформація про сервер",
|
||||
"url": "URL-адреса",
|
||||
"username": "Ім'я користувача",
|
||||
"editServerDetailsTooltip": "редагувати дані сервера",
|
||||
"removeServer": "видалити сервер"
|
||||
"editServerDetailsTooltip": "Редагувати дані сервера",
|
||||
"removeServer": "Видалити сервер"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
@@ -535,7 +535,7 @@
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "завантажити",
|
||||
"download": "Завантажити",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
@@ -548,38 +548,38 @@
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "поділитися елементом",
|
||||
"goTo": "перейти до",
|
||||
"goToAlbum": "перейти до $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "перейти до $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "отримати інформацію"
|
||||
"shareItem": "Поділитися елементом",
|
||||
"goTo": "Перейти до",
|
||||
"goToAlbum": "Перейти до $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "Перейти до $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "Отримати інформацію"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "динамічний фон",
|
||||
"dynamicImageBlur": "розмір розмиття зображення",
|
||||
"dynamicIsImage": "включити фонове зображення",
|
||||
"followCurrentLyric": "слідкувати за поточним рядком",
|
||||
"lyricAlignment": "вирівнювання тексту",
|
||||
"lyricOffset": "затримка тексту (мс)",
|
||||
"lyricGap": "розмір між рядками",
|
||||
"lyricSize": "розмір тексту",
|
||||
"opacity": "непрозорість",
|
||||
"showLyricMatch": "показувати збіг тексту пісень",
|
||||
"showLyricProvider": "показувати джерело тексту пісень",
|
||||
"synchronized": "синхронізовано",
|
||||
"unsynchronized": "несинхронізовано",
|
||||
"useImageAspectRatio": "використовувати співвідношення сторін зображення"
|
||||
"dynamicBackground": "Динамічний фон",
|
||||
"dynamicImageBlur": "Розмір розмиття зображення",
|
||||
"dynamicIsImage": "Включити фонове зображення",
|
||||
"followCurrentLyric": "Слідкувати за поточним рядком",
|
||||
"lyricAlignment": "Вирівнювання тексту",
|
||||
"lyricOffset": "Затримка тексту (мс)",
|
||||
"lyricGap": "Розмір між рядками",
|
||||
"lyricSize": "Розмір тексту",
|
||||
"opacity": "Непрозорість",
|
||||
"showLyricMatch": "Показувати збіг тексту пісень",
|
||||
"showLyricProvider": "Показувати джерело тексту пісень",
|
||||
"synchronized": "Синхронізовано",
|
||||
"unsynchronized": "Несинхронізовано",
|
||||
"useImageAspectRatio": "Використовувати співвідношення сторін зображення"
|
||||
},
|
||||
"lyrics": "текст пісні",
|
||||
"related": "пов'язані",
|
||||
"upNext": "далі",
|
||||
"visualizer": "візуалізатор",
|
||||
"noLyrics": "текст пісні не знайдено"
|
||||
"lyrics": "Текст пісні",
|
||||
"related": "Пов'язані",
|
||||
"upNext": "Далі",
|
||||
"visualizer": "Візуалізатор",
|
||||
"noLyrics": "Текст пісні не знайдено"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "показати $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "показати $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"showAlbums": "Показати $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "Показати $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
@@ -587,18 +587,18 @@
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "перейти до сторінки",
|
||||
"searchFor": "шукати на {{query}}",
|
||||
"serverCommands": "команди сервера"
|
||||
"goToPage": "Перейти до сторінки",
|
||||
"searchFor": "Шукати на {{query}}",
|
||||
"serverCommands": "Команди сервера"
|
||||
},
|
||||
"title": "команди"
|
||||
"title": "Команди"
|
||||
},
|
||||
"home": {
|
||||
"explore": "дослідити з вашої бібліотеки",
|
||||
"explore": "Дослідити з вашої бібліотеки",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"mostPlayed": "найбільш відтворені",
|
||||
"newlyAdded": "нещодавно додані релізи",
|
||||
"recentlyPlayed": "нещодавно відтворені"
|
||||
"mostPlayed": "Найбільш відтворені",
|
||||
"newlyAdded": "Нещодавно додані релізи",
|
||||
"recentlyPlayed": "Нещодавно відтворені"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
"common": {
|
||||
"increase": "增高",
|
||||
"rating": "评分",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"refresh": "刷新",
|
||||
"unknown": "未知",
|
||||
"edit": "编辑",
|
||||
@@ -208,8 +208,8 @@
|
||||
"queue_clear": "清空播放队列",
|
||||
"muted": "已静音",
|
||||
"unfavorite": "取消收藏",
|
||||
"queue_moveToTop": "将所选项移至底部",
|
||||
"queue_moveToBottom": "将所选项移至顶部",
|
||||
"queue_moveToTop": "将所选项移至顶部",
|
||||
"queue_moveToBottom": "将所选项移至底部",
|
||||
"shuffle_off": "禁用随机播放",
|
||||
"addLast": "最后",
|
||||
"mute": "静音",
|
||||
@@ -240,12 +240,12 @@
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "选择用于音频播放器的淡入淡出风格",
|
||||
"hotkey_favoriteCurrentSong": "收藏$t(common.currentSong)",
|
||||
"audioExclusiveMode_description": "启用独占输出模式。在此模式下,系统通常被锁定为只有 mpv 能够输出音频",
|
||||
"audioExclusiveMode_description": "启用独占输出模式。在此模式下,系统通常被锁定为只有 MPV 能够输出音频",
|
||||
"disableLibraryUpdateOnStartup": "禁用启动时查询新版本",
|
||||
"gaplessAudio": "无缝音频",
|
||||
"audioPlayer_description": "选择用于播放的音频播放器",
|
||||
"globalMediaHotkeys": "全局媒体快捷键",
|
||||
"gaplessAudio_description": "调整 mpv 无缝音频设置",
|
||||
"gaplessAudio_description": "调整 MPV 无缝音频设置",
|
||||
"followLyric_description": "滚动歌词到当前播放位置",
|
||||
"audioExclusiveMode": "音频独占模式",
|
||||
"font": "字体",
|
||||
@@ -261,7 +261,7 @@
|
||||
"followLyric": "跟随当前歌词",
|
||||
"crossfadeDuration": "淡入淡出持续时间",
|
||||
"audioPlayer": "音频播放器",
|
||||
"discordApplicationId": "{{discord}} 应用 id",
|
||||
"discordApplicationId": "{{discord}} 应用 ID",
|
||||
"applicationHotkeys_description": "配置应用快捷键。勾选设为全局快捷键(仅桌面端)",
|
||||
"customFontPath_description": "设置应用使用的自定义字体路径",
|
||||
"gaplessAudio_optionWeak": "弱(推荐)",
|
||||
@@ -285,7 +285,7 @@
|
||||
"scrobble": "记录播放信息",
|
||||
"skipDuration_description": "设置每次按下跳过按钮将会跳过的时长",
|
||||
"fontType_optionSystem": "系统字体",
|
||||
"mpvExecutablePath_description": "设置 mpv 可执行文件的路径。如果留空,则使用默认路径",
|
||||
"mpvExecutablePath_description": "设置 MPV 可执行文件的路径。如果留空,则使用默认路径",
|
||||
"sampleRate": "采样率",
|
||||
"sidePlayQueueStyle_optionAttached": "吸附",
|
||||
"sidebarConfiguration": "侧边栏设定",
|
||||
@@ -334,7 +334,7 @@
|
||||
"hotkey_toggleShuffle": "切换随机",
|
||||
"theme": "主题",
|
||||
"playbackStyle_description": "选择音频播放器的播放风格",
|
||||
"mpvExecutablePath": "mpv 可执行文件路径",
|
||||
"mpvExecutablePath": "MPV 可执行文件路径",
|
||||
"hotkey_rate2": "评为 2 星",
|
||||
"playButtonBehavior_description": "设置将歌曲添加到播放队列时播放按钮的默认行为",
|
||||
"minimumScrobblePercentage_description": "歌曲被记录为已播放所需的最小播放百分比",
|
||||
@@ -344,7 +344,7 @@
|
||||
"savePlayQueue": "保存播放队列",
|
||||
"minimumScrobbleSeconds_description": "歌曲被记录为已播放所需的最小播放时间",
|
||||
"skipPlaylistPage_description": "打开歌单时,直接查看歌曲列表而非查看默认页面",
|
||||
"fontType_description": "内置字体可以选择 feishin 提供的字体之一。系统字体允许您选择操作系统提供的任何字体。自定义选项允许您使用自己的字体",
|
||||
"fontType_description": "内置字体可以选择 Feishin 提供的字体之一。系统字体允许您选择操作系统提供的任何字体。自定义选项允许您使用自己的字体",
|
||||
"playButtonBehavior": "播放按钮行为",
|
||||
"volumeWheelStep": "音量滚轮分度",
|
||||
"sidebarPlaylistList_description": "显示或隐藏侧边栏歌单列表",
|
||||
@@ -385,20 +385,20 @@
|
||||
"replayGainClipping_description": "自动降低增益以防止{{ReplayGain}}造成削波",
|
||||
"replayGainPreamp": "{{ReplayGain}}前置放大(分贝)",
|
||||
"replayGainClipping": "{{ReplayGain}}削波",
|
||||
"discordUpdateInterval": "{{discord}} rich presence 更新间隔",
|
||||
"discordApplicationId_description": "{{discord}} rich presence 应用 id(默认为 {{defaultId}})",
|
||||
"discordUpdateInterval": "{{discord}} Rich Presence 更新间隔",
|
||||
"discordApplicationId_description": "{{discord}} Rich Presence 应用 ID(默认为 {{defaultId}})",
|
||||
"discordUpdateInterval_description": "更新间隔秒数(至少 15 秒)",
|
||||
"discordRichPresence_description": "在 {{discord}} rich presence 中显示播放状态。图片键为:{{icon}}、{{playing}} 和 {{paused}}",
|
||||
"discordRichPresence_description": "在 {{discord}} Rich Presence 中显示播放状态。图片键为:{{icon}}、{{playing}} 和 {{paused}}",
|
||||
"accentColor": "强调色",
|
||||
"accentColor_description": "设置应用的强调色",
|
||||
"replayGainPreamp_description": "调整应用在{{ReplayGain}}值上的前置放大增益",
|
||||
"discordIdleStatus": "显示 rich presence 闲置状态",
|
||||
"discordIdleStatus": "显示 Rich Presence 闲置状态",
|
||||
"clearCache": "清除浏览器缓存",
|
||||
"buttonSize": "播放器栏按钮大小",
|
||||
"buttonSize_description": "播放器栏按钮大小",
|
||||
"clearCache_description": "feishin的“硬清除”。除了清除feishin的缓存,清空浏览器缓存(保存的图像和其他资源)。服务器凭据和设置会被保留",
|
||||
"clearQueryCache_description": "feishin的“软清除”。这将会刷新播放列表、元数据并重置保存的歌词。设置、服务器凭据和缓存图像会被保留",
|
||||
"clearQueryCache": "清除feishin缓存",
|
||||
"clearCache_description": "Feishin的“硬清除”。除了清除Feishin的缓存,清空浏览器缓存(保存的图像和其他资源)。服务器凭据和设置会被保留",
|
||||
"clearQueryCache_description": "Feishin的“软清除”。这将会刷新播放列表、元数据并重置保存的歌词。设置、服务器凭据和缓存图像会被保留",
|
||||
"clearQueryCache": "清除Feishin缓存",
|
||||
"externalLinks": "显示外部链接",
|
||||
"externalLinks_description": "允许在艺术家/专辑页面上显示外部链接(Last.fm、MusicBrainz)",
|
||||
"mpvExtraParameters_help": "每行一个",
|
||||
@@ -420,10 +420,10 @@
|
||||
"contextMenu_description": "允许您隐藏右键单击项目时显示在菜单中的项目。未选中的项目将被隐藏",
|
||||
"customCssEnable_description": "允许编写自定义 css",
|
||||
"customCss": "自定义css",
|
||||
"customCss_description": "自定义css内容。注意:内容和远程url是不允许的属性。内容预览展示如下。出于安全考虑,您未设置的其它字段也会显示",
|
||||
"customCss_description": "自定义css内容。注意:内容和远程URL是不允许的属性。内容预览展示如下。出于安全考虑,您未设置的其它字段也会显示",
|
||||
"contextMenu": "上下文菜单(右键单击)配置",
|
||||
"customCssEnable": "启用自定义 css",
|
||||
"customCssNotice": "警告:虽然预设了一些安全限制(不允许 url() 和 content:),但使用自定义 css 仍然会因更改界面而带来风险",
|
||||
"customCssNotice": "警告:虽然预设了一些安全限制(不允许 URL() 和 content:),但使用自定义 css 仍然会因更改界面而带来风险",
|
||||
"transcode_description": "可以转码为不同的格式",
|
||||
"transcodeBitrate": "转码比特率",
|
||||
"albumBackground": "专辑背景图片",
|
||||
@@ -451,14 +451,14 @@
|
||||
"lastfmApiKey": "{{lastfm}} API 密钥",
|
||||
"lastfmApiKey_description": "{{lastfm}} 的 API 密钥。封面艺术图所需",
|
||||
"discordServeImage": "从服务器提供 {{discord}} 图像",
|
||||
"discordServeImage_description": "从服务器本身分享 {{discord}} rich presence 的封面艺术,仅适用于 Jellyfin 和 Navidrome。 {{discord}} 使用机器人来获取图像,因此您的服务器必须可通过公共互联网访问",
|
||||
"discordServeImage_description": "从服务器本身分享 {{discord}} Rich Presence 的封面艺术,仅适用于 Jellyfin 和 Navidrome。 {{discord}} 使用机器人来获取图像,因此您的服务器必须可通过公共互联网访问",
|
||||
"musicbrainz": "显示 MusicBrainz 链接",
|
||||
"musicbrainz_description": "在艺术家/专辑页面上显示 MusicBrainz 链接(如果存在 MusicBrainz ID)",
|
||||
"lastfm": "显示 last.fm 链接",
|
||||
"lastfm": "显示 Last.fm 链接",
|
||||
"lastfm_description": "在艺术家/专辑页面上显示 Last.fm 的链接",
|
||||
"preferLocalLyrics_description": "优先选择本地歌词(如有),而不是远程歌词",
|
||||
"preferLocalLyrics": "首选本地歌词",
|
||||
"discordPausedStatus": "暂停时显示rich presence",
|
||||
"discordPausedStatus": "暂停时显示Rich Presence",
|
||||
"discordPausedStatus_description": "启用后将在播放器暂停时显示状态",
|
||||
"preservePitch": "保持音高",
|
||||
"preservePitch_description": "在调整播放速度时保持音高",
|
||||
@@ -489,7 +489,7 @@
|
||||
"exportImportSettings_control_title": "导入/导出设置",
|
||||
"exportImportSettings_destructiveWarning": "导入设置会破坏现有设置,请在点击下方“导入”按钮前仔细阅读以上内容!",
|
||||
"exportImportSettings_importBtn": "导入设置",
|
||||
"exportImportSettings_importModalTitle": "导入 feishin 设置",
|
||||
"exportImportSettings_importModalTitle": "导入 Feishin 设置",
|
||||
"exportImportSettings_importSuccess": "设置已成功导入!",
|
||||
"exportImportSettings_notValidJSON": "传递的文件不是有效的 JSON 文件",
|
||||
"exportImportSettings_offendingKeyError": "\"{{offendingKey}}\" 不正确 - {{reason}}",
|
||||
@@ -510,14 +510,14 @@
|
||||
"combinedLyricsAndVisualizer": "在播放器侧边栏合并歌词和可视化界面",
|
||||
"autoDJ_description": "自动添加相似歌曲到队列中",
|
||||
"notify_description": "歌曲变更时显示通知",
|
||||
"mpvExtraParameters_description": "向mpv传递额外参数",
|
||||
"mpvExtraParameters_description": "向MPV传递额外参数",
|
||||
"audioFadeOnStatusChange": "音频改变时淡入淡出",
|
||||
"showVisualizerInSidebar": "在播放器侧边栏显示可视化效果",
|
||||
"showLyricsInSidebar": "在播放器侧边栏显示歌词",
|
||||
"analyticsDisable": "退出使用情况的分析",
|
||||
"artistReleaseTypeConfiguration": "艺术家发行类型设置",
|
||||
"useThemeAccentColor": "使用主题强调色",
|
||||
"mpvExtraParameters": "mpv额外参数",
|
||||
"mpvExtraParameters": "MPV额外参数",
|
||||
"showRatings": "显示星级评分",
|
||||
"followCurrentSong": "跟随当前歌曲",
|
||||
"logLevel": "日志等级",
|
||||
@@ -552,7 +552,7 @@
|
||||
"autoDJ_timing": "定时",
|
||||
"autoDJ_timing_description": "自动 DJ 触发前队列中剩余的歌曲数量",
|
||||
"crossfadeStyle": "交叉渐变风格",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"discordRichPresence": "{{discord}} Rich Presence",
|
||||
"homeFeatureStyle_description": "控制首页特色轮播图的样式",
|
||||
"homeFeatureStyle": "首页特色旋转样式",
|
||||
"homeFeatureStyle_optionMultiple": "多样",
|
||||
@@ -586,7 +586,7 @@
|
||||
"automaticUpdates_description": "自动检查并安装更新",
|
||||
"releaseChannel_optionAlpha": "alpha(每日构建版)",
|
||||
"discordStateIcon": "显示播放图标",
|
||||
"discordStateIcon_description": "在 rich presence 状态中显示一个小的播放图标。启用“暂停时显示 rich presence 在线状态”后,暂停图标始终显示",
|
||||
"discordStateIcon_description": "在 Rich Presence 状态中显示一个小的播放图标。启用“暂停时显示 Rich Presence 在线状态”后,暂停图标始终显示",
|
||||
"blurExplicitImages": "模糊显式图片",
|
||||
"blurExplicitImages_description": "专辑和歌曲封面若被标记为不雅内容,将会进行模糊处理",
|
||||
"autosave": "自动保存播放队列",
|
||||
@@ -673,7 +673,7 @@
|
||||
"fromYear": "起始年份",
|
||||
"criticRating": "评论家评分",
|
||||
"trackNumber": "曲目",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"comment": "评论",
|
||||
"isCompilation": "为合辑",
|
||||
@@ -687,7 +687,7 @@
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"note": "注释",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})数",
|
||||
"id": "id",
|
||||
"id": "ID",
|
||||
"disc": "碟片",
|
||||
"duration": "时长",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
@@ -925,12 +925,12 @@
|
||||
"ignoreSsl": "忽略 ssl $t(common.restartRequired)",
|
||||
"ignoreCors": "忽略 cors $t(common.restartRequired)",
|
||||
"error_savePassword": "保存密码时出现错误",
|
||||
"input_url": "url",
|
||||
"input_url": "URL",
|
||||
"input_preferInstantMixDescription": "仅使用即时混音来获取类似的歌曲。如果您有修改此行为的插件,则很有用",
|
||||
"input_preferInstantMix": "首选即时混音",
|
||||
"input_preferRemoteUrl": "首选公共 url",
|
||||
"input_remoteUrl": "公共 url",
|
||||
"input_remoteUrlPlaceholder": "可选:对外功能的公共 url"
|
||||
"input_preferRemoteUrl": "首选公共 URL",
|
||||
"input_remoteUrl": "公共 URL",
|
||||
"input_remoteUrlPlaceholder": "可选:对外功能的公共 URL"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "添加$t(entity.trackWithCount, {\"count\": {{message}} })到$t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
@@ -1066,7 +1066,7 @@
|
||||
"duration": "$t(common.duration)",
|
||||
"dateAdded": "添加日期",
|
||||
"size": "$t(common.size)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"bpm": "$t(common.BPM)",
|
||||
"lastPlayed": "最后播放",
|
||||
"trackNumber": "音轨编号",
|
||||
"rowIndex": "行索引",
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"releaseDate": "发布日期",
|
||||
"bitrate": "比特率",
|
||||
"title": "标题",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"dateAdded": "添加日期",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"backward": "返回",
|
||||
"biography": "簡介",
|
||||
"bitrate": "位元率",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"clear": "清空",
|
||||
"collapse": "折疊",
|
||||
"comingSoon": "即將推出…",
|
||||
@@ -396,8 +396,8 @@
|
||||
"next": "下一首",
|
||||
"play": "播放",
|
||||
"playbackFetchCancel": "請稍等…關閉通知以取消",
|
||||
"queue_moveToBottom": "使所選置頂",
|
||||
"queue_moveToTop": "使所選置底",
|
||||
"queue_moveToBottom": "使所選置底",
|
||||
"queue_moveToTop": "使所選置頂",
|
||||
"playSimilarSongs": "播放相似歌曲",
|
||||
"viewQueue": "檢視佇列",
|
||||
"addLastShuffled": "新增至尾端 (隨機)",
|
||||
@@ -426,7 +426,7 @@
|
||||
"hotkey_volumeDown": "音量降低",
|
||||
"hotkey_volumeMute": "靜音",
|
||||
"minimumScrobblePercentage": "最小紀錄時長(百分比)",
|
||||
"minimumScrobblePercentage_description": "歌曲被記錄為已播放(scrobble)所需的最小播放百分比",
|
||||
"minimumScrobblePercentage_description": "歌曲被記錄為已播放(Scrobble)所需的最小播放百分比",
|
||||
"theme_description": "設定應用程式的主題",
|
||||
"accentColor": "強調色",
|
||||
"accentColor_description": "設定應用程式的強調色",
|
||||
@@ -435,7 +435,7 @@
|
||||
"audioDevice": "音訊設備",
|
||||
"audioDevice_description": "選擇用於播放的音訊設備",
|
||||
"audioExclusiveMode": "音訊獨佔模式",
|
||||
"audioExclusiveMode_description": "啟用獨佔輸出模式。在此模式下,系統通常被鎖定,只有 mpv 能夠輸出音訊。視覺化音訊截取在此選項啟用時不會作用",
|
||||
"audioExclusiveMode_description": "啟用獨佔輸出模式。在此模式下,系統通常被鎖定,只有 MPV 能夠輸出音訊。視覺化音訊截取在此選項啟用時不會作用",
|
||||
"audioPlayer": "音訊播放器",
|
||||
"crossfadeDuration": "淡入淡出持續時間",
|
||||
"crossfadeDuration_description": "設定淡入淡出持續時間",
|
||||
@@ -443,12 +443,12 @@
|
||||
"customFontPath": "自定字體路徑",
|
||||
"customFontPath_description": "設定應用程式使用的自定字體路徑",
|
||||
"disableLibraryUpdateOnStartup": "禁用啟動時檢查新版本",
|
||||
"discordApplicationId": "{{discord}} 應用程式 id",
|
||||
"discordApplicationId_description": "{{discord}} rich presence 應用程式 id(預設為 {{defaultId}})",
|
||||
"discordIdleStatus": "顯示 rich presence 閒置狀態",
|
||||
"discordApplicationId": "{{discord}} 應用程式 ID",
|
||||
"discordApplicationId_description": "{{discord}} Rich Presence 應用程式 ID(預設為 {{defaultId}})",
|
||||
"discordIdleStatus": "顯示 Rich Presence 閒置狀態",
|
||||
"discordIdleStatus_description": "啟用後將會在播放器閒置時更新狀態",
|
||||
"discordRichPresence_description": "在 {{discord}} rich presence 中顯示播放狀態。圖片鍵為:{{icon}}、{{playing}} 和 {{paused}}",
|
||||
"discordUpdateInterval": "{{discord}} rich presence 更新間隔",
|
||||
"discordRichPresence_description": "在 {{discord}} Rich Presence 中顯示播放狀態。圖片鍵為:{{icon}}、{{playing}} 和 {{paused}}",
|
||||
"discordUpdateInterval": "{{discord}} Rich Presence 更新間隔",
|
||||
"discordUpdateInterval_description": "更新間隔秒數(至少 15 秒)",
|
||||
"enableRemote": "啟用遠端控制伺服器",
|
||||
"enableRemote_description": "啟用遠端控制伺服器,以允許其他設備控制此應用程式",
|
||||
@@ -456,12 +456,12 @@
|
||||
"followLyric": "跟隨目前歌詞",
|
||||
"font_description": "設定應用程式使用的字體",
|
||||
"fontType": "字體類型",
|
||||
"fontType_description": "內建字體可以選擇 feishin 提供的字體之一。系統字體允許您選擇作業系統提供的任何字體。自定選項允許您使用自己的字體",
|
||||
"fontType_description": "內建字體可以選擇 Feishin 提供的字體之一。系統字體允許您選擇作業系統提供的任何字體。自定選項允許您使用自己的字體",
|
||||
"fontType_optionBuiltIn": "內建字體",
|
||||
"fontType_optionCustom": "自定字體",
|
||||
"fontType_optionSystem": "系統字體",
|
||||
"gaplessAudio": "無間隔音訊",
|
||||
"gaplessAudio_description": "調整 mpv 無間隔音訊設定",
|
||||
"gaplessAudio_description": "調整 MPV 無間隔音訊設定",
|
||||
"gaplessAudio_optionWeak": "弱(建議)",
|
||||
"globalMediaHotkeys": "全域媒體快捷鍵",
|
||||
"hotkey_browserForward": "瀏覽器往前",
|
||||
@@ -500,8 +500,8 @@
|
||||
"minimizeToTray": "最小化到系統匣",
|
||||
"minimizeToTray_description": "將應用程式最小化到系統匣",
|
||||
"minimumScrobbleSeconds": "最小紀錄時間(秒)",
|
||||
"minimumScrobbleSeconds_description": "歌曲被記錄為已播放(scrobble)所需的最小播放時間",
|
||||
"mpvExecutablePath": "mpv 執行檔路徑",
|
||||
"minimumScrobbleSeconds_description": "歌曲被記錄為已播放(Scrobble)所需的最小播放時間",
|
||||
"mpvExecutablePath": "MPV 執行檔路徑",
|
||||
"playbackStyle_optionCrossFade": "淡入淡出",
|
||||
"playbackStyle_optionNormal": "一般",
|
||||
"playButtonBehavior": "播放按鈕動作",
|
||||
@@ -563,7 +563,7 @@
|
||||
"hotkey_favoriteCurrentSong": "收藏 $t(common.currentSong)",
|
||||
"hotkey_playbackStop": "停止",
|
||||
"hotkey_rate0": "清除評分",
|
||||
"mpvExecutablePath_description": "設定 mpv 執行檔的路徑。如果留空,則使用預設路徑",
|
||||
"mpvExecutablePath_description": "設定 MPV 執行檔的路徑。如果留空,則使用預設路徑",
|
||||
"playbackStyle_description": "選擇播放器的播放風格",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"remotePassword": "遠端控制伺服器密碼",
|
||||
@@ -590,10 +590,10 @@
|
||||
"contextMenu_description": "允許您隱藏在右鍵選單項目時顯示的項目。未選取的項目將被隱藏",
|
||||
"customCssEnable": "啟用自訂CSS",
|
||||
"customCssEnable_description": "允許撰寫自訂CSS",
|
||||
"customCssNotice": "警告:即使已限制某些用法(不允許 url() 和 content:),但使用自訂 CSS 仍然會透過更改介面帶來風險",
|
||||
"customCssNotice": "警告:即使已限制某些用法(不允許 URL() 和 content:),但使用自訂 CSS 仍然會透過更改介面帶來風險",
|
||||
"customCss": "自訂CSS",
|
||||
"customCss_description": "自訂 CSS 內容。注意:內容和遠端 URL 是不允許使用的屬性。您的內容預覽如下所示。由於需要進行清理,因此存在一些您未設定的其他欄位",
|
||||
"discordPausedStatus": "暫停時顯示 rich presence",
|
||||
"discordPausedStatus": "暫停時顯示 Rich Presence",
|
||||
"discordPausedStatus_description": "啟用後,播放器暫停時將顯示狀態",
|
||||
"discordListening": "將狀態設為\"正在聽\"",
|
||||
"discordListening_description": "將狀態顯示為\"正在聽\"而不是\"正在玩\"",
|
||||
@@ -609,7 +609,7 @@
|
||||
"homeFeature_description": "控制是否在首頁上顯示大型特色輪播",
|
||||
"imageAspectRatio": "使用原生封面照長寬比",
|
||||
"imageAspectRatio_description": "如果啟用,封面照將使用其原始長寬比顯示。對於非 1:1 的封面,剩餘空間將為空",
|
||||
"lastfm": "顯示 last.fm 連結",
|
||||
"lastfm": "顯示 Last.fm 連結",
|
||||
"lastfm_description": "在藝人/專輯頁面顯示 Last.fm 連結",
|
||||
"lastfmApiKey": "{{lastfm}} API金鑰",
|
||||
"lastfmApiKey_description": "{{lastfm}}的API金鑰。用於封面照",
|
||||
@@ -770,7 +770,7 @@
|
||||
"automaticUpdates": "自動更新",
|
||||
"automaticUpdates_description": "自動檢查並安裝更新",
|
||||
"discordStateIcon": "顯示播放中圖示",
|
||||
"discordStateIcon_description": "在 rich presence 狀態中顯示一個小的播放圖示。啟用「暫停時顯示 rich presence」時,會始終顯示暫停的圖示",
|
||||
"discordStateIcon_description": "在 Rich Presence 狀態中顯示一個小的播放圖示。啟用「暫停時顯示 Rich Presence」時,會始終顯示暫停的圖示",
|
||||
"useThemePrimaryShade": "套用主題主色調",
|
||||
"useThemePrimaryShade_description": "使用所選主題中定義的主色調作為主色變體",
|
||||
"primaryShade": "主要色調",
|
||||
@@ -796,9 +796,7 @@
|
||||
"waveformLoadingDelay": "波形載入延遲",
|
||||
"waveformLoadingDelay_description": "載入波形前的延遲(以秒為單位)。如果您在使用網頁播放器時遇到卡頓,請增加此值。",
|
||||
"playerbarWaveformStretch": "波形拉伸",
|
||||
"playerbarWaveformStretch_description": "拉伸波形來填補可用空間",
|
||||
"preventSuspendOnPlayback_description": "音樂播放時防止應用程式進入休眠",
|
||||
"preventSuspendOnPlayback": "在播放時防止應用程式暫停"
|
||||
"playerbarWaveformStretch_description": "拉伸波形來填補可用空間"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -839,7 +837,7 @@
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"bpm": "$t(common.BPM)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
@@ -898,7 +896,7 @@
|
||||
"releaseDate": "發布日期",
|
||||
"releaseYear": "年份",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "標題",
|
||||
"trackNumber": "曲目編號",
|
||||
@@ -980,7 +978,7 @@
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "個人簡介",
|
||||
"bitrate": "位元率",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"comment": "評論",
|
||||
"communityRating": "社群評分",
|
||||
@@ -988,7 +986,7 @@
|
||||
"dateAdded": "已新增日期",
|
||||
"disc": "光碟",
|
||||
"duration": "時長",
|
||||
"id": "id",
|
||||
"id": "ID",
|
||||
"fromYear": "從年份",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"isCompilation": "為合輯",
|
||||
@@ -1029,7 +1027,7 @@
|
||||
"input_name": "伺服器名稱",
|
||||
"input_password": "密碼",
|
||||
"input_savePassword": "儲存密碼",
|
||||
"input_url": "url",
|
||||
"input_url": "URL",
|
||||
"input_username": "使用者名稱",
|
||||
"success": "伺服器新增成功",
|
||||
"title": "新增伺服器",
|
||||
@@ -1048,8 +1046,7 @@
|
||||
"success": "新增 $t(entity.trackWithCount, {\"count\": {{message}} }) 到 $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "新增到$t(entity.playlist, {\"count\": 1})",
|
||||
"create": "建立 $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "搜尋$t(entity.playlist, {\"count\": 2}) 或輸入內容以建立新項目",
|
||||
"noneAdded": "沒有曲目新增到 $t(entity.playlist, {\"count\": 1}) '{{playlist}}'"
|
||||
"searchOrCreate": "搜尋$t(entity.playlist, {\"count\": 2}) 或輸入內容以建立新項目"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
|
||||
+2
-4
@@ -931,14 +931,12 @@ ipcMain.on(
|
||||
},
|
||||
);
|
||||
|
||||
ipcMain.handle('power-save-blocker-start', (_event, { full }: { full: boolean }) => {
|
||||
ipcMain.handle('power-save-blocker-start', () => {
|
||||
if (powerSaveBlockerId !== null) {
|
||||
return powerSaveBlockerId;
|
||||
}
|
||||
|
||||
powerSaveBlockerId = powerSaveBlocker.start(
|
||||
full ? 'prevent-display-sleep' : 'prevent-app-suspension',
|
||||
);
|
||||
powerSaveBlockerId = powerSaveBlocker.start('prevent-display-sleep');
|
||||
return powerSaveBlockerId;
|
||||
});
|
||||
|
||||
|
||||
+63
-183
@@ -34,10 +34,8 @@ const apiController = <K extends keyof ControllerEndpoint>(
|
||||
|
||||
if (!serverType) {
|
||||
toast.error({
|
||||
message: i18n.t('error.serverNotSelectedError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
title: i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' }) as string,
|
||||
message: i18n.t('error.serverNotSelectedError') as string,
|
||||
title: i18n.t('error.apiRouteError') as string,
|
||||
});
|
||||
throw new Error(`No server selected`);
|
||||
}
|
||||
@@ -47,13 +45,13 @@ const apiController = <K extends keyof ControllerEndpoint>(
|
||||
if (typeof controllerFn !== 'function') {
|
||||
toast.error({
|
||||
message: `Endpoint ${endpoint} is not implemented for ${serverType}`,
|
||||
title: i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' }) as string,
|
||||
title: i18n.t('error.apiRouteError') as string,
|
||||
});
|
||||
|
||||
throw new Error(
|
||||
i18n.t('error.endpointNotImplementedError', {
|
||||
endpoint,
|
||||
postProcess: 'sentenceCase',
|
||||
|
||||
serverType,
|
||||
}) as string,
|
||||
);
|
||||
@@ -92,9 +90,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: addToPlaylist`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: addToPlaylist`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -109,9 +105,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: createFavorite`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: createFavorite`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -123,9 +117,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: createInternetRadioStation`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: createInternetRadioStation`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -137,9 +129,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: createPlaylist`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: createPlaylist`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -151,9 +141,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: deleteArtistImage`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: deleteArtistImage`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -165,9 +153,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: deleteFavorite`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: deleteFavorite`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -179,9 +165,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: deleteInternetRadioStation`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: deleteInternetRadioStation`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -193,9 +177,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: deleteInternetRadioStationImage`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: deleteInternetRadioStationImage`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -207,9 +189,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: deletePlaylist`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: deletePlaylist`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -221,9 +201,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: deletePlaylistImage`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: deletePlaylistImage`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -235,9 +213,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumArtistDetail`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumArtistDetail`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -261,9 +237,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumArtistList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumArtistList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -281,9 +255,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumArtistListCount`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumArtistListCount`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -301,9 +273,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumDetail`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumDetail`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -315,9 +285,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumInfo`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumInfo`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -329,9 +297,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -349,9 +315,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumListCount`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumListCount`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -369,9 +333,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getAlbumRadio`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getAlbumRadio`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -383,9 +345,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getArtistList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getArtistList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -403,9 +363,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getArtistListCount`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getArtistListCount`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -423,9 +381,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getArtistRadio`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getArtistRadio`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -437,9 +393,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getDownloadUrl`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getDownloadUrl`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -451,9 +405,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getFolder`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getFolder`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -471,9 +423,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getGenreList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getGenreList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -529,9 +479,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getInternetRadioStations`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getInternetRadioStations`);
|
||||
}
|
||||
return apiController(
|
||||
'getInternetRadioStations',
|
||||
@@ -542,9 +490,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getLyrics`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getLyrics`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -556,9 +502,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getMusicFolderList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getMusicFolderList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -570,9 +514,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getPlaylistDetail`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getPlaylistDetail`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -584,9 +526,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getPlaylistList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getPlaylistList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -598,9 +538,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getPlaylistListCount`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getPlaylistListCount`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -612,9 +550,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getPlaylistSongList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getPlaylistSongList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -626,9 +562,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getPlayQueue`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getPlayQueue`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -640,9 +574,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getRandomSongList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getRandomSongList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -660,9 +592,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getRoles`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getRoles`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -674,9 +604,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getServerInfo`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getServerInfo`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -688,9 +616,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getSimilarSongs`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getSimilarSongs`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -708,9 +634,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getSongDetail`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getSongDetail`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -722,9 +646,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getSongList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getSongList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -742,9 +664,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getSongListCount`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getSongListCount`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -762,9 +682,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getStreamUrl`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getStreamUrl`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -776,9 +694,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getStructuredLyrics`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getStructuredLyrics`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -790,9 +706,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getTags`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getTags`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -804,9 +718,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getTopSongs`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getTopSongs`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -818,9 +730,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getUserInfo`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getUserInfo`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -832,9 +742,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getUserList`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: getUserList`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -846,9 +754,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: movePlaylistItem`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: movePlaylistItem`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -860,9 +766,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: removeFromPlaylist`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: removeFromPlaylist`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -874,9 +778,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: replacePlaylist`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: replacePlaylist`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -888,9 +790,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: savePlayQueue`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: savePlayQueue`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -902,9 +802,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: scrobble`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: scrobble`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -916,9 +814,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: search`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: search`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -936,9 +832,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: setPlaylistSongs`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: setPlaylistSongs`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -950,9 +844,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: setRating`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: setRating`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -964,9 +856,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: shareItem`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: shareItem`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -978,9 +868,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: updateInternetRadioStation`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: updateInternetRadioStation`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -992,9 +880,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: updatePlaylist`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: updatePlaylist`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -1006,9 +892,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: uploadArtistImage`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: uploadArtistImage`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -1020,9 +904,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: uploadInternetRadioStationImage`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: uploadInternetRadioStationImage`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
@@ -1034,9 +916,7 @@ export const controller: GeneralController = {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: uploadPlaylistImage`,
|
||||
);
|
||||
throw new Error(`${i18n.t('error.apiRouteError')}: uploadPlaylistImage`);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
|
||||
@@ -447,11 +447,7 @@ export const jfApiClient = (args: {
|
||||
} catch (e: any | AxiosError | Error) {
|
||||
if (isAxiosError(e)) {
|
||||
if (e.code === 'ERR_NETWORK') {
|
||||
throw new Error(
|
||||
i18n.t('error.networkError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
);
|
||||
throw new Error(i18n.t('error.networkError') as string);
|
||||
}
|
||||
|
||||
const error = e as AxiosError;
|
||||
|
||||
@@ -405,12 +405,8 @@ axiosClient.interceptors.response.use(
|
||||
|
||||
if (res.status === 429) {
|
||||
toast.error({
|
||||
message: i18n.t('error.loginRateError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
title: i18n.t('error.sessionExpiredError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
message: i18n.t('error.loginRateError') as string,
|
||||
title: i18n.t('error.sessionExpiredError') as string,
|
||||
});
|
||||
|
||||
const serverId = currentServer.id;
|
||||
@@ -425,11 +421,7 @@ axiosClient.interceptors.response.use(
|
||||
throw TIMEOUT_ERROR;
|
||||
}
|
||||
if (res.status !== 200) {
|
||||
throw new Error(
|
||||
i18n.t('error.authenticatedFailed', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
);
|
||||
throw new Error(i18n.t('error.authenticatedFailed') as string);
|
||||
}
|
||||
|
||||
const newCredential = res.data.token;
|
||||
@@ -522,11 +514,7 @@ export const ndApiClient = (args: {
|
||||
} catch (e: any | AxiosError | Error) {
|
||||
if (isAxiosError(e)) {
|
||||
if (e.code === 'ERR_NETWORK') {
|
||||
throw new Error(
|
||||
i18n.t('error.networkError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
);
|
||||
throw new Error(i18n.t('error.networkError') as string);
|
||||
}
|
||||
|
||||
const error = e as AxiosError;
|
||||
|
||||
@@ -361,7 +361,7 @@ axiosClient.interceptors.response.use(
|
||||
if (data['subsonic-response'].error.code !== 0) {
|
||||
toast.error({
|
||||
message: data['subsonic-response'].error.message,
|
||||
title: i18n.t('error.genericError', { postProcess: 'sentenceCase' }) as string,
|
||||
title: i18n.t('error.genericError') as string,
|
||||
});
|
||||
|
||||
// Since we do status === 200, override this value with the error code
|
||||
@@ -523,11 +523,7 @@ export const ssApiClient = (args: {
|
||||
} catch (e: any | AxiosError | Error) {
|
||||
if (isAxiosError(e)) {
|
||||
if (e.code === 'ERR_NETWORK') {
|
||||
throw new Error(
|
||||
i18n.t('error.networkError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}) as string,
|
||||
);
|
||||
throw new Error(i18n.t('error.networkError') as string);
|
||||
}
|
||||
|
||||
const error = e as AxiosError;
|
||||
|
||||
+4
-8
@@ -313,12 +313,10 @@ const PlaylistReorderColumnBase = (props: ItemTableListInnerColumn) => {
|
||||
<>
|
||||
<Stack gap="xs" justify="center">
|
||||
<Text fw={500} ta="center">
|
||||
{t('action.moveUp', { postProcess: 'sentenceCase' })}
|
||||
{t('action.moveUp')}
|
||||
</Text>
|
||||
<Text fw={500} isMuted size="xs" ta="center">
|
||||
{t('action.holdToMoveToTop', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('action.holdToMoveToTop')}
|
||||
</Text>
|
||||
</Stack>
|
||||
</>
|
||||
@@ -336,12 +334,10 @@ const PlaylistReorderColumnBase = (props: ItemTableListInnerColumn) => {
|
||||
<>
|
||||
<Stack gap="xs" justify="center">
|
||||
<Text fw={500} ta="center">
|
||||
{t('action.moveDown', { postProcess: 'sentenceCase' })}
|
||||
{t('action.moveDown')}
|
||||
</Text>
|
||||
<Text fw={500} isMuted size="xs" ta="center">
|
||||
{t('action.holdToMoveToBottom', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('action.holdToMoveToBottom')}
|
||||
</Text>
|
||||
</Stack>
|
||||
</>
|
||||
|
||||
@@ -17,7 +17,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.albumGroup', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.albumGroup'),
|
||||
pinned: 'left',
|
||||
value: TableColumn.ALBUM_GROUP,
|
||||
width: 200,
|
||||
@@ -26,7 +26,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.rowIndex', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rowIndex'),
|
||||
pinned: null,
|
||||
value: TableColumn.ROW_INDEX,
|
||||
width: 60,
|
||||
@@ -35,7 +35,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.image', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.image'),
|
||||
pinned: null,
|
||||
value: TableColumn.IMAGE,
|
||||
width: 70,
|
||||
@@ -44,7 +44,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.title', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.title'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE,
|
||||
width: 300,
|
||||
@@ -53,7 +53,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.titleCombined', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.titleCombined'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE_COMBINED,
|
||||
width: 300,
|
||||
@@ -62,7 +62,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.titleArtist', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.titleArtist'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE_ARTIST,
|
||||
width: 300,
|
||||
@@ -71,7 +71,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.duration', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.duration'),
|
||||
pinned: null,
|
||||
value: TableColumn.DURATION,
|
||||
width: 100,
|
||||
@@ -80,7 +80,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.album', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.album'),
|
||||
pinned: null,
|
||||
value: TableColumn.ALBUM,
|
||||
width: 300,
|
||||
@@ -89,7 +89,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: true,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.albumArtist', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.albumArtist'),
|
||||
pinned: null,
|
||||
value: TableColumn.ALBUM_ARTIST,
|
||||
width: 300,
|
||||
@@ -98,7 +98,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.artist', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.artist'),
|
||||
pinned: null,
|
||||
value: TableColumn.ARTIST,
|
||||
width: 300,
|
||||
@@ -107,7 +107,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.composer', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.composer'),
|
||||
pinned: null,
|
||||
value: TableColumn.COMPOSER,
|
||||
width: 300,
|
||||
@@ -116,7 +116,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.genre', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.genre'),
|
||||
pinned: null,
|
||||
value: TableColumn.GENRE,
|
||||
width: 300,
|
||||
@@ -125,7 +125,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.genreBadge', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.genreBadge'),
|
||||
pinned: null,
|
||||
value: TableColumn.GENRE_BADGE,
|
||||
width: 300,
|
||||
@@ -134,7 +134,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.year', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.year'),
|
||||
pinned: null,
|
||||
value: TableColumn.YEAR,
|
||||
width: 200,
|
||||
@@ -143,7 +143,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.releaseDate', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.releaseDate'),
|
||||
pinned: null,
|
||||
value: TableColumn.RELEASE_DATE,
|
||||
width: 240,
|
||||
@@ -152,7 +152,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.discNumber', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.discNumber'),
|
||||
pinned: null,
|
||||
value: TableColumn.DISC_NUMBER,
|
||||
width: 100,
|
||||
@@ -161,7 +161,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.trackNumber', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.trackNumber'),
|
||||
pinned: null,
|
||||
value: TableColumn.TRACK_NUMBER,
|
||||
width: 100,
|
||||
@@ -170,7 +170,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.bitDepth', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.bitDepth'),
|
||||
pinned: null,
|
||||
value: TableColumn.BIT_DEPTH,
|
||||
width: 100,
|
||||
@@ -179,7 +179,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.bitrate', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.bitrate'),
|
||||
pinned: null,
|
||||
value: TableColumn.BIT_RATE,
|
||||
width: 100,
|
||||
@@ -188,7 +188,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.codec', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.codec'),
|
||||
pinned: null,
|
||||
value: TableColumn.CODEC,
|
||||
width: 100,
|
||||
@@ -197,7 +197,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.sampleRate', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.sampleRate'),
|
||||
pinned: null,
|
||||
value: TableColumn.SAMPLE_RATE,
|
||||
width: 100,
|
||||
@@ -206,7 +206,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.lastPlayed', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.lastPlayed'),
|
||||
pinned: null,
|
||||
value: TableColumn.LAST_PLAYED,
|
||||
width: 150,
|
||||
@@ -215,7 +215,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.note', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.note'),
|
||||
pinned: null,
|
||||
value: TableColumn.COMMENT,
|
||||
width: 300,
|
||||
@@ -224,7 +224,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.channels', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.channels'),
|
||||
pinned: null,
|
||||
value: TableColumn.CHANNELS,
|
||||
width: 100,
|
||||
@@ -233,7 +233,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.bpm', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.bpm'),
|
||||
pinned: null,
|
||||
value: TableColumn.BPM,
|
||||
width: 100,
|
||||
@@ -242,7 +242,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.dateAdded', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.dateAdded'),
|
||||
pinned: null,
|
||||
value: TableColumn.DATE_ADDED,
|
||||
width: 120,
|
||||
@@ -251,7 +251,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.path', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.path'),
|
||||
pinned: null,
|
||||
value: TableColumn.PATH,
|
||||
width: 300,
|
||||
@@ -260,7 +260,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.playCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.playCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.PLAY_COUNT,
|
||||
width: 100,
|
||||
@@ -269,7 +269,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.size', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.size'),
|
||||
pinned: null,
|
||||
value: TableColumn.SIZE,
|
||||
width: 100,
|
||||
@@ -278,7 +278,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.favorite', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.favorite'),
|
||||
pinned: null,
|
||||
value: TableColumn.USER_FAVORITE,
|
||||
width: 60,
|
||||
@@ -287,7 +287,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.rating', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rating'),
|
||||
pinned: null,
|
||||
value: TableColumn.USER_RATING,
|
||||
width: 100,
|
||||
@@ -296,7 +296,7 @@ export const SONG_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.actions', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.actions'),
|
||||
pinned: null,
|
||||
value: TableColumn.ACTIONS,
|
||||
width: 60,
|
||||
@@ -310,7 +310,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.rowIndex', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rowIndex'),
|
||||
pinned: null,
|
||||
value: TableColumn.ROW_INDEX,
|
||||
width: 60,
|
||||
@@ -319,7 +319,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.image', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.image'),
|
||||
pinned: null,
|
||||
value: TableColumn.IMAGE,
|
||||
width: 70,
|
||||
@@ -328,7 +328,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.title', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.title'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE,
|
||||
width: 300,
|
||||
@@ -337,7 +337,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.titleCombined', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.titleCombined'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE_COMBINED,
|
||||
width: 300,
|
||||
@@ -346,7 +346,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.titleArtist', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.titleArtist'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE_ARTIST,
|
||||
width: 300,
|
||||
@@ -355,7 +355,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.duration', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.duration'),
|
||||
pinned: null,
|
||||
value: TableColumn.DURATION,
|
||||
width: 100,
|
||||
@@ -364,7 +364,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: true,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.albumArtist', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.albumArtist'),
|
||||
pinned: null,
|
||||
value: TableColumn.ALBUM_ARTIST,
|
||||
width: 300,
|
||||
@@ -373,7 +373,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.artist', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.artist'),
|
||||
pinned: null,
|
||||
value: TableColumn.ARTIST,
|
||||
width: 300,
|
||||
@@ -382,7 +382,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.composer', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.composer'),
|
||||
pinned: null,
|
||||
value: TableColumn.COMPOSER,
|
||||
width: 300,
|
||||
@@ -391,7 +391,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.songCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.songCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.SONG_COUNT,
|
||||
width: 100,
|
||||
@@ -400,7 +400,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.genre', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.genre'),
|
||||
pinned: null,
|
||||
value: TableColumn.GENRE,
|
||||
width: 300,
|
||||
@@ -409,7 +409,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.genreBadge', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.genreBadge'),
|
||||
pinned: null,
|
||||
value: TableColumn.GENRE_BADGE,
|
||||
width: 300,
|
||||
@@ -418,7 +418,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.year', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.year'),
|
||||
pinned: null,
|
||||
value: TableColumn.YEAR,
|
||||
width: 200,
|
||||
@@ -427,7 +427,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.releaseDate', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.releaseDate'),
|
||||
pinned: null,
|
||||
value: TableColumn.RELEASE_DATE,
|
||||
width: 240,
|
||||
@@ -436,7 +436,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.lastPlayed', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.lastPlayed'),
|
||||
pinned: null,
|
||||
value: TableColumn.LAST_PLAYED,
|
||||
width: 150,
|
||||
@@ -445,7 +445,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.dateAdded', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.dateAdded'),
|
||||
pinned: null,
|
||||
value: TableColumn.DATE_ADDED,
|
||||
width: 120,
|
||||
@@ -454,7 +454,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.playCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.playCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.PLAY_COUNT,
|
||||
width: 100,
|
||||
@@ -463,7 +463,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.favorite', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.favorite'),
|
||||
pinned: null,
|
||||
value: TableColumn.USER_FAVORITE,
|
||||
width: 60,
|
||||
@@ -472,7 +472,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.rating', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rating'),
|
||||
pinned: null,
|
||||
value: TableColumn.USER_RATING,
|
||||
width: 100,
|
||||
@@ -481,7 +481,7 @@ export const ALBUM_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.actions', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.actions'),
|
||||
pinned: null,
|
||||
value: TableColumn.ACTIONS,
|
||||
width: 60,
|
||||
@@ -493,7 +493,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.rowIndex', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rowIndex'),
|
||||
pinned: null,
|
||||
value: TableColumn.ROW_INDEX,
|
||||
width: 60,
|
||||
@@ -502,7 +502,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.image', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.image'),
|
||||
pinned: null,
|
||||
value: TableColumn.IMAGE,
|
||||
width: 70,
|
||||
@@ -511,7 +511,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.title', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.title'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE,
|
||||
width: 300,
|
||||
@@ -520,7 +520,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.duration', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.duration'),
|
||||
pinned: null,
|
||||
value: TableColumn.DURATION,
|
||||
width: 100,
|
||||
@@ -529,7 +529,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.biography', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.biography'),
|
||||
pinned: null,
|
||||
value: TableColumn.BIOGRAPHY,
|
||||
width: 300,
|
||||
@@ -538,7 +538,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.genre', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.genre'),
|
||||
pinned: null,
|
||||
value: TableColumn.GENRE,
|
||||
width: 300,
|
||||
@@ -547,7 +547,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.lastPlayed', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.lastPlayed'),
|
||||
pinned: null,
|
||||
value: TableColumn.LAST_PLAYED,
|
||||
width: 150,
|
||||
@@ -556,7 +556,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.playCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.playCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.PLAY_COUNT,
|
||||
width: 100,
|
||||
@@ -565,7 +565,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('filter.albumCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('filter.albumCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.ALBUM_COUNT,
|
||||
width: 100,
|
||||
@@ -574,7 +574,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.songCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.songCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.SONG_COUNT,
|
||||
width: 100,
|
||||
@@ -583,7 +583,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.favorite', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.favorite'),
|
||||
pinned: null,
|
||||
value: TableColumn.USER_FAVORITE,
|
||||
width: 60,
|
||||
@@ -592,7 +592,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.rating', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rating'),
|
||||
pinned: null,
|
||||
value: TableColumn.USER_RATING,
|
||||
width: 100,
|
||||
@@ -601,7 +601,7 @@ export const ALBUM_ARTIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.actions', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.actions'),
|
||||
pinned: null,
|
||||
value: TableColumn.ACTIONS,
|
||||
width: 60,
|
||||
@@ -613,7 +613,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.rowIndex', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rowIndex'),
|
||||
pinned: null,
|
||||
value: TableColumn.ROW_INDEX,
|
||||
width: 60,
|
||||
@@ -622,7 +622,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.image', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.image'),
|
||||
pinned: null,
|
||||
value: TableColumn.IMAGE,
|
||||
width: 70,
|
||||
@@ -631,7 +631,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.title', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.title'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE,
|
||||
width: 300,
|
||||
@@ -640,7 +640,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.titleCombined', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.titleCombined'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE_COMBINED,
|
||||
width: 300,
|
||||
@@ -649,7 +649,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.duration', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.duration'),
|
||||
pinned: null,
|
||||
value: TableColumn.DURATION,
|
||||
width: 100,
|
||||
@@ -658,7 +658,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.owner', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.owner'),
|
||||
pinned: null,
|
||||
value: TableColumn.OWNER,
|
||||
width: 150,
|
||||
@@ -667,7 +667,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.songCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.songCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.SONG_COUNT,
|
||||
width: 100,
|
||||
@@ -676,7 +676,7 @@ export const PLAYLIST_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.actions', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.actions'),
|
||||
pinned: null,
|
||||
value: TableColumn.ACTIONS,
|
||||
width: 60,
|
||||
@@ -688,7 +688,7 @@ export const GENRE_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.rowIndex', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.rowIndex'),
|
||||
pinned: null,
|
||||
value: TableColumn.ROW_INDEX,
|
||||
width: 60,
|
||||
@@ -697,7 +697,7 @@ export const GENRE_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'start',
|
||||
autoSize: true,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.title', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.title'),
|
||||
pinned: null,
|
||||
value: TableColumn.TITLE,
|
||||
width: 300,
|
||||
@@ -706,7 +706,7 @@ export const GENRE_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.songCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.songCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.SONG_COUNT,
|
||||
width: 100,
|
||||
@@ -715,7 +715,7 @@ export const GENRE_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: true,
|
||||
label: i18n.t('table.config.label.albumCount', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.albumCount'),
|
||||
pinned: null,
|
||||
value: TableColumn.ALBUM_COUNT,
|
||||
width: 100,
|
||||
@@ -724,7 +724,7 @@ export const GENRE_TABLE_COLUMNS: DefaultTableColumn[] = [
|
||||
align: 'center',
|
||||
autoSize: false,
|
||||
isEnabled: false,
|
||||
label: i18n.t('table.config.label.actions', { postProcess: 'titleCase' }),
|
||||
label: i18n.t('table.config.label.actions'),
|
||||
pinned: null,
|
||||
value: TableColumn.ACTIONS,
|
||||
width: 60,
|
||||
|
||||
@@ -22,17 +22,17 @@ const controls = [
|
||||
{
|
||||
control1: <Kbd>CTRL</Kbd>,
|
||||
control2: <Kbd>A</Kbd>,
|
||||
label: i18n.t('action.selectAll', { postProcess: 'sentenceCase' }),
|
||||
label: i18n.t('action.selectAll'),
|
||||
},
|
||||
{
|
||||
control1: <Kbd>CTRL</Kbd>,
|
||||
control2: <Icon fill="default" icon="mouseLeftClick" />,
|
||||
label: i18n.t('action.addOrRemoveFromSelection', { postProcess: 'sentenceCase' }),
|
||||
label: i18n.t('action.addOrRemoveFromSelection'),
|
||||
},
|
||||
{
|
||||
control1: <Kbd>SHIFT</Kbd>,
|
||||
control2: <Icon fill="default" icon="mouseLeftClick" />,
|
||||
label: i18n.t('action.selectRangeOfItems', { postProcess: 'sentenceCase' }),
|
||||
label: i18n.t('action.selectRangeOfItems'),
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@@ -79,14 +79,12 @@ export const QueryBuilder = ({
|
||||
{
|
||||
label: t('form.queryEditor.input', {
|
||||
context: 'optionMatchAll',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
value: 'all',
|
||||
},
|
||||
{
|
||||
label: t('form.queryEditor.input', {
|
||||
context: 'optionMatchAny',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
value: 'any',
|
||||
},
|
||||
@@ -146,9 +144,7 @@ export const QueryBuilder = ({
|
||||
leftSection={<Icon icon="add" />}
|
||||
onClick={handleAddRuleGroup}
|
||||
>
|
||||
{t('form.queryEditor.addRuleGroup', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('form.queryEditor.addRuleGroup')}
|
||||
</DropdownMenu.Item>
|
||||
|
||||
{level > 0 && (
|
||||
@@ -156,9 +152,7 @@ export const QueryBuilder = ({
|
||||
leftSection={<Icon icon="delete" />}
|
||||
onClick={handleDeleteRuleGroup}
|
||||
>
|
||||
{t('form.queryEditor.removeRuleGroup', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('form.queryEditor.removeRuleGroup')}
|
||||
</DropdownMenu.Item>
|
||||
)}
|
||||
{level === 0 && (
|
||||
@@ -169,18 +163,14 @@ export const QueryBuilder = ({
|
||||
leftSection={<Icon color="error" icon="refresh" />}
|
||||
onClick={onResetFilters}
|
||||
>
|
||||
{t('form.queryEditor.resetToDefault', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('form.queryEditor.resetToDefault')}
|
||||
</DropdownMenu.Item>
|
||||
<DropdownMenu.Item
|
||||
isDanger
|
||||
leftSection={<Icon color="error" icon="delete" />}
|
||||
onClick={onClearFilters}
|
||||
>
|
||||
{t('form.queryEditor.clearFilters', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('form.queryEditor.clearFilters')}
|
||||
</DropdownMenu.Item>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -28,11 +28,7 @@ export const SelectWithInvalidData = ({ data, defaultValue, ...props }: SelectPr
|
||||
<Select
|
||||
data={fullData}
|
||||
defaultValue={defaultValue}
|
||||
error={
|
||||
hasError
|
||||
? t('error.badValue', { postProcess: 'sentenceCase', value: defaultValue })
|
||||
: undefined
|
||||
}
|
||||
error={hasError ? t('error.badValue', { value: defaultValue }) : undefined}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
@@ -74,10 +70,7 @@ export const MultiSelectWithInvalidData = ({
|
||||
}, [data, currentValue]);
|
||||
|
||||
const error = useMemo(
|
||||
() =>
|
||||
missing.length
|
||||
? t('error.badValue', { postProcess: 'sentenceCase', value: missing })
|
||||
: undefined,
|
||||
() => (missing.length ? t('error.badValue', { value: missing }) : undefined),
|
||||
[missing, t],
|
||||
);
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ function ServerSelector() {
|
||||
/>
|
||||
),
|
||||
size: 'sm',
|
||||
title: t('form.updateServer.title', { postProcess: 'titleCase' }),
|
||||
title: t('form.updateServer.title'),
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -31,12 +31,12 @@ const ActionRequiredRoute = () => {
|
||||
const checks = [
|
||||
{
|
||||
component: <ServerCredentialRequired />,
|
||||
title: t('error.credentialsRequired', { postProcess: 'sentenceCase' }),
|
||||
title: t('error.credentialsRequired'),
|
||||
valid: !isCredentialRequired,
|
||||
},
|
||||
{
|
||||
component: <ServerRequired />,
|
||||
title: t('error.serverRequired', { postProcess: 'serverRequired' }),
|
||||
title: t('error.serverRequired'),
|
||||
valid: !isServerRequired,
|
||||
},
|
||||
];
|
||||
@@ -47,7 +47,7 @@ const ActionRequiredRoute = () => {
|
||||
const handleManageServersModal = () => {
|
||||
openModal({
|
||||
children: <ServerList />,
|
||||
title: t('page.appMenu.manageServers', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.appMenu.manageServers'),
|
||||
});
|
||||
};
|
||||
|
||||
@@ -79,9 +79,7 @@ const ActionRequiredRoute = () => {
|
||||
onClick={handleManageServersModal}
|
||||
variant="filled"
|
||||
>
|
||||
{t('page.appMenu.manageServers', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.appMenu.manageServers')}
|
||||
</Button>
|
||||
</Group>
|
||||
)}
|
||||
|
||||
@@ -21,9 +21,7 @@ const InvalidRoute = () => {
|
||||
<Stack>
|
||||
<Group justify="center" wrap="nowrap">
|
||||
<Icon color="warn" icon="error" />
|
||||
<Text size="xl">
|
||||
{t('error.apiRouteError', { postProcess: 'sentenceCase' })}
|
||||
</Text>
|
||||
<Text size="xl">{t('error.apiRouteError')}</Text>
|
||||
</Group>
|
||||
<Text>{location.pathname}</Text>
|
||||
<ActionIcon icon="arrowLeftS" onClick={() => navigate(-1)} variant="filled" />
|
||||
|
||||
@@ -28,12 +28,10 @@ const NoNetworkRoute = () => {
|
||||
<Icon icon="wifiOff" size="4rem" />
|
||||
<Stack gap="md">
|
||||
<Text size="xl" weight={600}>
|
||||
{t('error.noNetwork', { postProcess: 'sentenceCase' })}
|
||||
{t('error.noNetwork')}
|
||||
</Text>
|
||||
<Text c="dimmed" size="sm">
|
||||
{t('error.noNetworkDescription', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('error.noNetworkDescription')}
|
||||
</Text>
|
||||
</Stack>
|
||||
<Button
|
||||
@@ -41,7 +39,7 @@ const NoNetworkRoute = () => {
|
||||
onClick={handleRetry}
|
||||
variant="filled"
|
||||
>
|
||||
{t('common.retry', { postProcess: 'sentenceCase' })}
|
||||
{t('common.retry')}
|
||||
</Button>
|
||||
</Stack>
|
||||
</Center>
|
||||
|
||||
@@ -127,9 +127,7 @@ const AlbumMetadataTags = ({ album }: AlbumMetadataTagsProps) => {
|
||||
...releaseTypes,
|
||||
{
|
||||
id: 'isCompilation',
|
||||
value: album?.isCompilation
|
||||
? t('filter.isCompilation', { postProcess: 'sentenceCase' })
|
||||
: undefined,
|
||||
value: album?.isCompilation ? t('filter.isCompilation') : undefined,
|
||||
},
|
||||
...releaseCountries,
|
||||
...releaseStatuses,
|
||||
@@ -137,9 +135,9 @@ const AlbumMetadataTags = ({ album }: AlbumMetadataTagsProps) => {
|
||||
id: 'explicitStatus',
|
||||
value:
|
||||
album.explicitStatus === ExplicitStatus.EXPLICIT
|
||||
? t('common.explicit', { postProcess: 'sentenceCase' })
|
||||
? t('common.explicit')
|
||||
: album.explicitStatus === ExplicitStatus.CLEAN
|
||||
? t('common.clean', { postProcess: 'sentenceCase' })
|
||||
? t('common.clean')
|
||||
: undefined,
|
||||
},
|
||||
);
|
||||
@@ -210,15 +208,12 @@ const AlbumMetadataTags = ({ album }: AlbumMetadataTagsProps) => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<MetadataPillGroup
|
||||
items={defaultTagItems}
|
||||
title={t('common.tags', { postProcess: 'sentenceCase' })}
|
||||
/>
|
||||
<MetadataPillGroup items={defaultTagItems} title={t('common.tags')} />
|
||||
|
||||
{recordLabels.length > 0 && (
|
||||
<Stack align="center" className={styles.metadataPillGroup} gap="xs">
|
||||
<Text fw={600} isNoSelect size="sm" tt="uppercase">
|
||||
{t('common.recordLabel', { postProcess: 'sentenceCase' })}
|
||||
{t('common.recordLabel')}
|
||||
</Text>
|
||||
<div className={styles['pill-group-wrapper']}>
|
||||
<Pill.Group>
|
||||
@@ -242,15 +237,12 @@ const AlbumMetadataTags = ({ album }: AlbumMetadataTagsProps) => {
|
||||
</Stack>
|
||||
)}
|
||||
|
||||
<MetadataPillGroup
|
||||
items={moodTagItems}
|
||||
title={t('common.mood', { postProcess: 'sentenceCase' })}
|
||||
/>
|
||||
<MetadataPillGroup items={moodTagItems} title={t('common.mood')} />
|
||||
|
||||
{groupingItems.length > 0 && (
|
||||
<Stack align="center" className={styles.metadataPillGroup} gap="xs">
|
||||
<Text fw={600} isNoSelect size="sm" tt="uppercase">
|
||||
{t('common.grouping', { postProcess: 'sentenceCase' })}
|
||||
{t('common.grouping')}
|
||||
</Text>
|
||||
<div className={styles['pill-group-wrapper']}>
|
||||
<Pill.Group>
|
||||
@@ -402,9 +394,7 @@ const AlbumMetadataExternalLinks = ({
|
||||
return (
|
||||
<Stack gap="xs">
|
||||
<Text fw={600} isNoSelect size="sm" tt="uppercase">
|
||||
{t('common.externalLinks', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('common.externalLinks')}
|
||||
</Text>
|
||||
<Group className={styles.externalLinksGroup} gap="xs">
|
||||
{lastFM && (
|
||||
@@ -634,7 +624,7 @@ const DiscGroupRow = ({ discGroup, groupItems, internalState, t }: DiscGroupRowP
|
||||
id={`disc-${discGroup.discNumber}`}
|
||||
label={
|
||||
<Text component="label" size="sm" truncate>
|
||||
{t('common.disc', { postProcess: 'sentenceCase' })} {discGroup.discNumber}
|
||||
{t('common.disc')} {discGroup.discNumber}
|
||||
{discGroup.discSubtitle && ` - ${discGroup.discSubtitle}`}
|
||||
</Text>
|
||||
}
|
||||
@@ -691,7 +681,7 @@ function AlbumDetailCarousels({ data }: { data: Album }) {
|
||||
rowCount: 1,
|
||||
sortBy: AlbumListSort.YEAR,
|
||||
sortOrder: SortOrder.DESC,
|
||||
title: t('page.albumDetail.moreFromArtist', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.albumDetail.moreFromArtist'),
|
||||
uniqueId: moreFromArtistUniqueId,
|
||||
},
|
||||
...genreCarousels,
|
||||
@@ -878,7 +868,7 @@ const AlbumDetailSongsTable = ({ songs }: AlbumDetailSongsTableProps) => {
|
||||
flex={1}
|
||||
leftSection={<Icon icon="search" />}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
placeholder={t('common.search', { postProcess: 'sentenceCase' })}
|
||||
placeholder={t('common.search')}
|
||||
radius="xl"
|
||||
ref={searchInputRef}
|
||||
rightSection={
|
||||
|
||||
@@ -138,12 +138,10 @@ export const AlbumDetailHeader = forwardRef<HTMLDivElement>((_props, ref) => {
|
||||
|
||||
const playCount = album?.playCount;
|
||||
|
||||
const releasePrefix = originalDifferentFromRelease
|
||||
? t('page.albumDetail.released', { postProcess: 'sentenceCase' })
|
||||
: '♫';
|
||||
const releasePrefix = originalDifferentFromRelease ? t('page.albumDetail.released') : '♫';
|
||||
|
||||
const releaseYearPrefix = originalYearDifferentFromRelease
|
||||
? t('page.albumDetail.released', { postProcess: 'sentenceCase' })
|
||||
? t('page.albumDetail.released')
|
||||
: '♫';
|
||||
|
||||
if (album.originalDate) {
|
||||
|
||||
@@ -38,8 +38,8 @@ export const AlbumListHeaderFilters = ({ toggleGenreTarget }: { toggleGenreTarge
|
||||
|
||||
const choice = useMemo(() => {
|
||||
return target === GenreTarget.ALBUM
|
||||
? t('entity.album', { count: 2, postProcess: 'titleCase' })
|
||||
: t('entity.track', { count: 2, postProcess: 'titleCase' });
|
||||
? t('entity.album', { count: 2 })
|
||||
: t('entity.track', { count: 2 });
|
||||
}, [target, t]);
|
||||
|
||||
const handleToggleGenreTarget = useCallback(() => {
|
||||
|
||||
@@ -55,7 +55,7 @@ const AlbumListHeaderBadge = () => {
|
||||
const PageTitle = ({ title }: { title?: string }) => {
|
||||
const { t } = useTranslation();
|
||||
const { pageKey } = useListContext();
|
||||
const pageTitle = title || t('page.albumList.title', { postProcess: 'titleCase' });
|
||||
const pageTitle = title || t('page.albumList.title');
|
||||
|
||||
switch (pageKey) {
|
||||
case ItemListKey.ALBUM_ARTIST_ALBUM:
|
||||
|
||||
@@ -80,7 +80,7 @@ export const JellyfinAlbumFilters = ({
|
||||
const yesNoFilter = useMemo(() => {
|
||||
const filters = [
|
||||
{
|
||||
label: t('filter.isFavorited', { postProcess: 'sentenceCase' }),
|
||||
label: t('filter.isFavorited'),
|
||||
onChange: (favoriteValue?: boolean) => {
|
||||
setFavorite(favoriteValue ?? null);
|
||||
},
|
||||
@@ -90,7 +90,7 @@ export const JellyfinAlbumFilters = ({
|
||||
|
||||
if (query.artistIds?.length) {
|
||||
filters.push({
|
||||
label: t('filter.isCompilation', { postProcess: 'sentenceCase' }),
|
||||
label: t('filter.isCompilation'),
|
||||
onChange: (compilationValue?: boolean) => {
|
||||
setCompilation(compilationValue ?? null);
|
||||
},
|
||||
@@ -228,16 +228,16 @@ export const JellyfinAlbumFilters = ({
|
||||
return (
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Text fw={500} size="sm">
|
||||
{t('entity.artist', { count: 2, postProcess: 'sentenceCase' })}
|
||||
{t('entity.artist', { count: 2 })}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{
|
||||
label: t('common.filter_single', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_single'),
|
||||
value: 'single',
|
||||
},
|
||||
{
|
||||
label: t('common.filter_multiple', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_multiple'),
|
||||
value: 'multi',
|
||||
},
|
||||
]}
|
||||
@@ -253,16 +253,16 @@ export const JellyfinAlbumFilters = ({
|
||||
return (
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Text fw={500} size="sm">
|
||||
{t('entity.genre', { count: 2, postProcess: 'sentenceCase' })}
|
||||
{t('entity.genre', { count: 2 })}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{
|
||||
label: t('common.filter_single', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_single'),
|
||||
value: 'single',
|
||||
},
|
||||
{
|
||||
label: t('common.filter_multiple', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_multiple'),
|
||||
value: 'multi',
|
||||
},
|
||||
]}
|
||||
@@ -320,7 +320,7 @@ export const JellyfinAlbumFilters = ({
|
||||
<Group grow>
|
||||
<NumberInput
|
||||
hideControls={false}
|
||||
label={t('filter.fromYear', { postProcess: 'sentenceCase' })}
|
||||
label={t('filter.fromYear')}
|
||||
max={2300}
|
||||
min={1700}
|
||||
onChange={(e) => debouncedHandleMinYearFilter(e)}
|
||||
@@ -329,7 +329,7 @@ export const JellyfinAlbumFilters = ({
|
||||
/>
|
||||
<NumberInput
|
||||
hideControls={false}
|
||||
label={t('filter.toYear', { postProcess: 'sentenceCase' })}
|
||||
label={t('filter.toYear')}
|
||||
max={2300}
|
||||
min={1700}
|
||||
onChange={(e) => debouncedHandleMaxYearFilter(e)}
|
||||
|
||||
@@ -101,15 +101,15 @@ export const NavidromeAlbumFilters = ({
|
||||
const segmentedControlData = useMemo(
|
||||
() => [
|
||||
{
|
||||
label: t('common.none', { postProcess: 'titleCase' }),
|
||||
label: t('common.none'),
|
||||
value: 'none',
|
||||
},
|
||||
{
|
||||
label: t('common.yes', { postProcess: 'titleCase' }),
|
||||
label: t('common.yes'),
|
||||
value: 'true',
|
||||
},
|
||||
{
|
||||
label: t('common.no', { postProcess: 'titleCase' }),
|
||||
label: t('common.no'),
|
||||
value: 'false',
|
||||
},
|
||||
],
|
||||
@@ -119,7 +119,7 @@ export const NavidromeAlbumFilters = ({
|
||||
const toggleFilters = useMemo(
|
||||
() => [
|
||||
{
|
||||
label: t('filter.isRecentlyPlayed', { postProcess: 'sentenceCase' }),
|
||||
label: t('filter.isRecentlyPlayed'),
|
||||
onChange: (e: ChangeEvent<HTMLInputElement>) => {
|
||||
const recentlyPlayed = e.currentTarget.checked ? true : undefined;
|
||||
setRecentlyPlayed(recentlyPlayed ?? null);
|
||||
@@ -239,16 +239,16 @@ export const NavidromeAlbumFilters = ({
|
||||
return (
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Text fw={500} size="sm">
|
||||
{t('entity.artist', { count: 2, postProcess: 'sentenceCase' })}
|
||||
{t('entity.artist', { count: 2 })}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{
|
||||
label: t('common.filter_single', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_single'),
|
||||
value: 'single',
|
||||
},
|
||||
{
|
||||
label: t('common.filter_multiple', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_multiple'),
|
||||
value: 'multi',
|
||||
},
|
||||
]}
|
||||
@@ -264,16 +264,16 @@ export const NavidromeAlbumFilters = ({
|
||||
return (
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Text fw={500} size="sm">
|
||||
{t('entity.genre', { count: 2, postProcess: 'sentenceCase' })}
|
||||
{t('entity.genre', { count: 2 })}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{
|
||||
label: t('common.filter_single', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_single'),
|
||||
value: 'single',
|
||||
},
|
||||
{
|
||||
label: t('common.filter_multiple', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_multiple'),
|
||||
value: 'multi',
|
||||
},
|
||||
]}
|
||||
@@ -289,7 +289,7 @@ export const NavidromeAlbumFilters = ({
|
||||
<Stack px="md" py="md">
|
||||
<Stack gap="xs">
|
||||
<Text size="sm" weight={500}>
|
||||
{t('filter.isFavorited', { postProcess: 'sentenceCase' })}
|
||||
{t('filter.isFavorited')}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={segmentedControlData}
|
||||
@@ -303,7 +303,7 @@ export const NavidromeAlbumFilters = ({
|
||||
</Stack>
|
||||
<Stack gap="xs">
|
||||
<Text size="sm" weight={500}>
|
||||
{t('filter.isRated', { postProcess: 'sentenceCase' })}
|
||||
{t('filter.isRated')}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={segmentedControlData}
|
||||
@@ -317,7 +317,7 @@ export const NavidromeAlbumFilters = ({
|
||||
</Stack>
|
||||
<Stack gap="xs">
|
||||
<Text size="sm" weight={500}>
|
||||
{t('filter.isCompilation', { postProcess: 'sentenceCase' })}
|
||||
{t('filter.isCompilation')}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={segmentedControlData}
|
||||
@@ -370,7 +370,7 @@ export const NavidromeAlbumFilters = ({
|
||||
<Divider my="md" />
|
||||
<NumberInput
|
||||
hideControls={false}
|
||||
label={t('common.year', { postProcess: 'titleCase' })}
|
||||
label={t('common.year')}
|
||||
max={5000}
|
||||
min={0}
|
||||
onChange={(e) => debouncedHandleYearFilter(e)}
|
||||
|
||||
@@ -137,7 +137,7 @@ export const SubsonicAlbumFilters = ({
|
||||
const genreFilterLabel = useMemo(() => {
|
||||
return (
|
||||
<Text fw={500} size="sm">
|
||||
{t('entity.genre', { count: 1, postProcess: 'sentenceCase' })}
|
||||
{t('entity.genre', { count: 1 })}
|
||||
</Text>
|
||||
);
|
||||
}, [t]);
|
||||
@@ -145,7 +145,7 @@ export const SubsonicAlbumFilters = ({
|
||||
const toggleFilters = useMemo(
|
||||
() => [
|
||||
{
|
||||
label: t('filter.isFavorited', { postProcess: 'sentenceCase' }),
|
||||
label: t('filter.isFavorited'),
|
||||
onChange: (e: ChangeEvent<HTMLInputElement>) => {
|
||||
if (isFavoriteDisabled && e.target.checked) return; // Prevent setting if disabled
|
||||
const favoriteValue = e.target.checked ? true : undefined;
|
||||
@@ -229,16 +229,16 @@ export const SubsonicAlbumFilters = ({
|
||||
return (
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Text fw={500} size="sm">
|
||||
{t('entity.artist', { count: 2, postProcess: 'sentenceCase' })}
|
||||
{t('entity.artist', { count: 2 })}
|
||||
</Text>
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{
|
||||
label: t('common.filter_single', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_single'),
|
||||
value: 'single',
|
||||
},
|
||||
{
|
||||
label: t('common.filter_multiple', { postProcess: 'titleCase' }),
|
||||
label: t('common.filter_multiple'),
|
||||
value: 'multi',
|
||||
},
|
||||
]}
|
||||
@@ -302,7 +302,7 @@ export const SubsonicAlbumFilters = ({
|
||||
<NumberInput
|
||||
disabled={isYearDisabled}
|
||||
hideControls={false}
|
||||
label={t('filter.fromYear', { postProcess: 'sentenceCase' })}
|
||||
label={t('filter.fromYear')}
|
||||
max={5000}
|
||||
min={0}
|
||||
onChange={(e) => debouncedHandleMinYearFilter(e)}
|
||||
@@ -311,7 +311,7 @@ export const SubsonicAlbumFilters = ({
|
||||
<NumberInput
|
||||
disabled={isYearDisabled}
|
||||
hideControls={false}
|
||||
label={t('filter.toYear', { postProcess: 'sentenceCase' })}
|
||||
label={t('filter.toYear')}
|
||||
max={5000}
|
||||
min={0}
|
||||
onChange={(e) => debouncedHandleMaxYearFilter(e)}
|
||||
|
||||
@@ -234,7 +234,7 @@ const DummyAlbumDetailRoute = () => {
|
||||
<Group mr={5}>
|
||||
<Icon fill="error" icon="error" size={30} />
|
||||
</Group>
|
||||
<h2>{t('error.badAlbum', { postProcess: 'sentenceCase' })}</h2>
|
||||
<h2>{t('error.badAlbum')}</h2>
|
||||
</Center>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
@@ -142,11 +142,7 @@ const AlbumArtistActionButtons = ({
|
||||
size="compact-md"
|
||||
variant="transparent"
|
||||
>
|
||||
{String(
|
||||
t('player.artistRadio', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
).toUpperCase()}
|
||||
{String(t('player.artistRadio')).toUpperCase()}
|
||||
</Button>
|
||||
)}
|
||||
</Group>
|
||||
@@ -414,9 +410,7 @@ const AlbumArtistMetadataTopSongsContent = ({
|
||||
<div className={styles.albumSectionTitle}>
|
||||
<Group>
|
||||
<TextTitle fw={700} order={3}>
|
||||
{t('page.albumArtistDetail.topSongs', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.topSongs')}
|
||||
</TextTitle>
|
||||
{!isLoading && <Badge>{songs.length}</Badge>}
|
||||
</Group>
|
||||
@@ -431,9 +425,7 @@ const AlbumArtistMetadataTopSongsContent = ({
|
||||
uppercase
|
||||
variant="subtle"
|
||||
>
|
||||
{t('page.albumArtistDetail.viewAll', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.viewAll')}
|
||||
</Button>
|
||||
{songs.length > 0 && (
|
||||
<ActionIconGroup>
|
||||
@@ -485,9 +477,7 @@ const AlbumArtistMetadataTopSongsContent = ({
|
||||
flex={1}
|
||||
leftSection={<Icon icon="search" />}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
placeholder={t('common.search', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
placeholder={t('common.search')}
|
||||
radius="xl"
|
||||
rightSection={
|
||||
searchTerm ? (
|
||||
@@ -510,15 +500,11 @@ const AlbumArtistMetadataTopSongsContent = ({
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{
|
||||
label: t('page.albumArtistDetail.topSongsCommunity', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
label: t('page.albumArtistDetail.topSongsCommunity'),
|
||||
value: 'community',
|
||||
},
|
||||
{
|
||||
label: t('page.albumArtistDetail.topSongsPersonal', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
label: t('page.albumArtistDetail.topSongsPersonal'),
|
||||
value: 'personal',
|
||||
},
|
||||
]}
|
||||
@@ -716,9 +702,7 @@ const AlbumArtistMetadataFavoriteSongs = ({
|
||||
<div className={styles.albumSectionTitle}>
|
||||
<Group>
|
||||
<TextTitle fw={700} order={3}>
|
||||
{t('page.albumArtistDetail.favoriteSongs', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.favoriteSongs')}
|
||||
</TextTitle>
|
||||
{!isLoading && <Badge>{songs.length}</Badge>}
|
||||
</Group>
|
||||
@@ -736,9 +720,7 @@ const AlbumArtistMetadataFavoriteSongs = ({
|
||||
uppercase
|
||||
variant="subtle"
|
||||
>
|
||||
{t('page.albumArtistDetail.viewAll', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.viewAll')}
|
||||
</Button>
|
||||
{songs.length > 0 && (
|
||||
<ActionIconGroup>
|
||||
@@ -790,9 +772,7 @@ const AlbumArtistMetadataFavoriteSongs = ({
|
||||
flex={1}
|
||||
leftSection={<Icon icon="search" />}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
placeholder={t('common.search', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
placeholder={t('common.search')}
|
||||
radius="xl"
|
||||
rightSection={
|
||||
searchTerm ? (
|
||||
@@ -941,9 +921,7 @@ const AlbumArtistMetadataExternalLinks = ({
|
||||
<Grid.Col order={order} span={12}>
|
||||
<Stack gap="xs">
|
||||
<Text fw={600} isNoSelect size="sm" tt="uppercase">
|
||||
{t('common.externalLinks', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('common.externalLinks')}
|
||||
</Text>
|
||||
<Group gap="xs">
|
||||
{lastFM && (
|
||||
@@ -1092,9 +1070,7 @@ const AlbumArtistMetadataSimilarArtists = ({
|
||||
() => (
|
||||
<div className={styles.similarArtistsTitle}>
|
||||
<TextTitle fw={700} order={3}>
|
||||
{t('page.albumArtistDetail.relatedArtists', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.relatedArtists')}
|
||||
</TextTitle>
|
||||
<div className={styles.albumSectionDividerContainer}>
|
||||
<div className={styles.albumSectionDivider} />
|
||||
@@ -1432,7 +1408,7 @@ const AlbumSection = memo(function AlbumSection({
|
||||
{hasMoreAlbums && !showAll && (
|
||||
<Group justify="center" w="100%">
|
||||
<Button onClick={() => setShowAll(true)} variant="subtle">
|
||||
{t('action.viewMore', { postProcess: 'sentenceCase' })}
|
||||
{t('action.viewMore')}
|
||||
</Button>
|
||||
</Group>
|
||||
)}
|
||||
@@ -1521,7 +1497,7 @@ const ArtistAlbums = ({ albumsQuery, order }: ArtistAlbumsProps) => {
|
||||
flex={1}
|
||||
leftSection={<Icon icon="search" />}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
placeholder={t('common.search', { postProcess: 'sentenceCase' })}
|
||||
placeholder={t('common.search')}
|
||||
radius="xl"
|
||||
ref={searchInputRef}
|
||||
rightSection={
|
||||
@@ -1585,17 +1561,13 @@ function GroupingTypeSelector() {
|
||||
isSelected={groupingType === 'all'}
|
||||
onClick={() => setAlbumArtistDetailGroupingType('all')}
|
||||
>
|
||||
{t('page.albumArtistDetail.groupingTypeAll', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.groupingTypeAll')}
|
||||
</DropdownMenu.Item>
|
||||
<DropdownMenu.Item
|
||||
isSelected={groupingType === 'primary'}
|
||||
onClick={() => setAlbumArtistDetailGroupingType('primary')}
|
||||
>
|
||||
{t('page.albumArtistDetail.groupingTypePrimary', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.albumArtistDetail.groupingTypePrimary')}
|
||||
</DropdownMenu.Item>
|
||||
</DropdownMenu.Dropdown>
|
||||
</DropdownMenu>
|
||||
|
||||
+1
-4
@@ -24,10 +24,7 @@ export const AlbumArtistDetailFavoriteSongsListHeader = ({
|
||||
<LibraryHeaderBar ignoreMaxWidth>
|
||||
<LibraryHeaderBar.PlayButton itemType={LibraryItem.SONG} songs={data} />
|
||||
<LibraryHeaderBar.Title order={2}>
|
||||
{t('page.albumArtistDetail.favoriteSongsFrom', {
|
||||
postProcess: 'titleCase',
|
||||
title,
|
||||
})}
|
||||
{t('page.albumArtistDetail.favoriteSongsFrom', { title })}
|
||||
</LibraryHeaderBar.Title>
|
||||
<Badge>
|
||||
{itemCount === null || itemCount === undefined ? <SpinnerIcon /> : itemCount}
|
||||
|
||||
+1
-4
@@ -24,10 +24,7 @@ export const AlbumArtistDetailTopSongsListHeader = ({
|
||||
<LibraryHeaderBar ignoreMaxWidth>
|
||||
<LibraryHeaderBar.PlayButton itemType={LibraryItem.SONG} songs={data} />
|
||||
<LibraryHeaderBar.Title order={2}>
|
||||
{t('page.albumArtistDetail.topSongsFrom', {
|
||||
postProcess: 'titleCase',
|
||||
title,
|
||||
})}
|
||||
{t('page.albumArtistDetail.topSongsFrom', { title })}
|
||||
</LibraryHeaderBar.Title>
|
||||
<Badge>
|
||||
{itemCount === null || itemCount === undefined ? <SpinnerIcon /> : itemCount}
|
||||
|
||||
@@ -19,7 +19,7 @@ interface AlbumArtistListHeaderProps {
|
||||
export const AlbumArtistListHeader = ({ title }: AlbumArtistListHeaderProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const pageTitle = title || t('page.albumArtistList.title', { postProcess: 'titleCase' });
|
||||
const pageTitle = title || t('page.albumArtistList.title');
|
||||
|
||||
return (
|
||||
<Stack gap={0}>
|
||||
|
||||
@@ -19,7 +19,7 @@ interface ArtistListHeaderProps {
|
||||
export const ArtistListHeader = ({ title }: ArtistListHeaderProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const pageTitle = title || t('entity.artist', { count: 2, postProcess: 'titleCase' });
|
||||
const pageTitle = title || t('entity.artist', { count: 2 });
|
||||
|
||||
return (
|
||||
<Stack gap={0}>
|
||||
|
||||
@@ -182,77 +182,43 @@ export const getArtistAlbumsGrouped = (
|
||||
const getDisplayNameForType = (releaseType: string): string => {
|
||||
switch (releaseType) {
|
||||
case 'album':
|
||||
return t('releaseType.primary.album', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.primary.album');
|
||||
case 'appears-on':
|
||||
return t('page.albumArtistDetail.appearsOn', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('page.albumArtistDetail.appearsOn');
|
||||
case 'audiobook':
|
||||
return t('releaseType.secondary.audiobook', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.audiobook');
|
||||
case 'audio drama':
|
||||
return t('releaseType.secondary.audioDrama', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.audioDrama');
|
||||
case 'broadcast':
|
||||
return t('releaseType.primary.broadcast', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.primary.broadcast');
|
||||
case 'compilation':
|
||||
return t('releaseType.secondary.compilation', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.compilation');
|
||||
case 'demo':
|
||||
return t('releaseType.secondary.demo', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.demo');
|
||||
case 'dj-mix':
|
||||
return t('releaseType.secondary.djMix', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.djMix');
|
||||
case 'ep':
|
||||
return t('releaseType.primary.ep', {
|
||||
postProcess: 'upperCase',
|
||||
});
|
||||
case 'field recording':
|
||||
return t('releaseType.secondary.fieldRecording', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.fieldRecording');
|
||||
case 'interview':
|
||||
return t('releaseType.secondary.interview', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.interview');
|
||||
case 'live':
|
||||
return t('releaseType.secondary.live', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.live');
|
||||
case 'mixtape/street':
|
||||
return t('releaseType.secondary.mixtape', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.mixtape');
|
||||
case 'other':
|
||||
return t('releaseType.primary.other', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.primary.other');
|
||||
case 'remix':
|
||||
return t('releaseType.secondary.remix', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.remix');
|
||||
case 'single':
|
||||
return t('releaseType.primary.single', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.primary.single');
|
||||
case 'soundtrack':
|
||||
return t('releaseType.secondary.soundtrack', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.soundtrack');
|
||||
case 'spokenword':
|
||||
return t('releaseType.secondary.spokenWord', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('releaseType.secondary.spokenWord');
|
||||
default:
|
||||
return titleCase(releaseType);
|
||||
}
|
||||
|
||||
@@ -203,10 +203,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
|
||||
if (allSongIds.length === 0) {
|
||||
toast.info({
|
||||
message: t('form.addToPlaylist.noneAdded', {
|
||||
playlist: playlistName,
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
message: t('form.addToPlaylist.noneAdded', { playlist: playlistName }),
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -245,10 +242,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
|
||||
if (songsToAdd.length === 0) {
|
||||
toast.info({
|
||||
message: t('form.addToPlaylist.noneAdded', {
|
||||
playlist: playlistName,
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
message: t('form.addToPlaylist.noneAdded', { playlist: playlistName }),
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -267,7 +261,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
onError: (err) => {
|
||||
toast.error({
|
||||
message: err.message,
|
||||
title: t('error.genericError', { postProcess: 'sentenceCase' }),
|
||||
title: t('error.genericError'),
|
||||
});
|
||||
},
|
||||
onSuccess: () => {},
|
||||
@@ -278,13 +272,12 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
message: t('form.addToPlaylist.success', {
|
||||
message: songsToAdd.length,
|
||||
numOfPlaylists: 1,
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
});
|
||||
} catch (error) {
|
||||
toast.error({
|
||||
message: (error as Error).message,
|
||||
title: t('error.genericError', { postProcess: 'sentenceCase' }),
|
||||
title: t('error.genericError'),
|
||||
});
|
||||
}
|
||||
},
|
||||
@@ -347,7 +340,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
},
|
||||
modal: 'addToPlaylist',
|
||||
size: 'lg',
|
||||
title: t('page.contextMenu.addToPlaylist', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.contextMenu.addToPlaylist'),
|
||||
});
|
||||
}, [itemType, items, t]);
|
||||
|
||||
@@ -361,12 +354,11 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
onKeyDown={(e) => e.stopPropagation()}
|
||||
onPointerDown={(e) => e.stopPropagation()}
|
||||
pb="xs"
|
||||
placeholder={t('common.search', { postProcess: 'sentenceCase' })}
|
||||
placeholder={t('common.search')}
|
||||
rightSection={
|
||||
<Tooltip
|
||||
label={t('form.addToPlaylist.input', {
|
||||
context: 'skipDuplicates',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
>
|
||||
<Checkbox
|
||||
@@ -393,7 +385,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
onSelect={handleOpenModal}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('page.contextMenu.addToPlaylist', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.addToPlaylist')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent stickyContent={searchInput}>
|
||||
@@ -403,9 +395,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
</ContextMenu.Item>
|
||||
)}
|
||||
{playlistsQuery.isError && (
|
||||
<ContextMenu.Item disabled>
|
||||
{t('error.genericError', { postProcess: 'sentenceCase' })}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item disabled>{t('error.genericError')}</ContextMenu.Item>
|
||||
)}
|
||||
{recentPlaylist && (
|
||||
<>
|
||||
@@ -421,9 +411,7 @@ export const AddToPlaylistAction = ({ items, itemType }: AddToPlaylistActionProp
|
||||
</>
|
||||
)}
|
||||
{filteredPlaylists.length === 0 && !playlistsQuery.isLoading && (
|
||||
<ContextMenu.Item disabled>
|
||||
{t('common.noResultsFromQuery', { postProcess: 'sentenceCase' })}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item disabled>{t('common.noResultsFromQuery')}</ContextMenu.Item>
|
||||
)}
|
||||
{filteredPlaylists.map((playlist) => (
|
||||
<ContextMenu.Item
|
||||
|
||||
@@ -38,12 +38,12 @@ export const DeletePlaylistAction = ({ disabled, items }: DeletePlaylistActionPr
|
||||
|
||||
navigate(AppRoute.PLAYLISTS, { replace: true });
|
||||
toast.success({
|
||||
message: t('action.deletePlaylist', { postProcess: 'sentenceCase' }),
|
||||
message: t('action.deletePlaylist'),
|
||||
});
|
||||
} catch (err: any) {
|
||||
toast.error({
|
||||
message: err.message,
|
||||
title: t('error.genericError', { postProcess: 'sentenceCase' }),
|
||||
title: t('error.genericError'),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -56,10 +56,10 @@ export const DeletePlaylistAction = ({ disabled, items }: DeletePlaylistActionPr
|
||||
openModal({
|
||||
children: (
|
||||
<ConfirmModal onConfirm={handleDeletePlaylist}>
|
||||
<Text>{t('common.areYouSure', { postProcess: 'sentenceCase' })}</Text>
|
||||
<Text>{t('common.areYouSure')}</Text>
|
||||
</ConfirmModal>
|
||||
),
|
||||
title: t('form.deletePlaylist.title', { postProcess: 'sentenceCase' }),
|
||||
title: t('form.deletePlaylist.title'),
|
||||
});
|
||||
}, [handleDeletePlaylist, items.length, t]);
|
||||
|
||||
@@ -67,7 +67,7 @@ export const DeletePlaylistAction = ({ disabled, items }: DeletePlaylistActionPr
|
||||
|
||||
return (
|
||||
<ContextMenu.Item disabled={disabled} leftIcon="remove" onSelect={openDeletePlaylistModal}>
|
||||
{t('action.deletePlaylist', { postProcess: 'sentenceCase' })}
|
||||
{t('action.deletePlaylist')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -37,7 +37,7 @@ export const DownloadAction = ({ ids }: DownloadActionProps) => {
|
||||
|
||||
return (
|
||||
<ContextMenu.Item disabled={ids.length > 1} leftIcon="download" onSelect={onSelect}>
|
||||
{t('page.contextMenu.download', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.download')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -27,7 +27,7 @@ export const EditPlaylistAction = ({ disabled, items }: EditPlaylistActionProps)
|
||||
|
||||
return (
|
||||
<ContextMenu.Item disabled={disabled} leftIcon="edit" onSelect={handleEditPlaylist}>
|
||||
{t('action.editPlaylist', { postProcess: 'sentenceCase' })}
|
||||
{t('action.editPlaylist')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -35,15 +35,14 @@ export const GetInfoAction = ({ disabled, items }: GetInfoActionProps) => {
|
||||
},
|
||||
title:
|
||||
filteredItems.length === 1
|
||||
? filteredItems[0]?.name ||
|
||||
t('page.contextMenu.showDetails', { postProcess: 'sentenceCase' })
|
||||
: t('page.contextMenu.showDetails', { postProcess: 'sentenceCase' }),
|
||||
? filteredItems[0]?.name || t('page.contextMenu.showDetails')
|
||||
: t('page.contextMenu.showDetails'),
|
||||
});
|
||||
}, [items, server, t]);
|
||||
|
||||
return (
|
||||
<ContextMenu.Item disabled={disabled} leftIcon="info" onSelect={onSelect}>
|
||||
{t('page.contextMenu.showDetails', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.showDetails')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -72,13 +72,13 @@ export const GoToAction = ({ items }: GoToActionProps) => {
|
||||
onSelect={(e) => e.preventDefault()}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('page.contextMenu.goTo', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.goTo')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
{hasAlbum && (
|
||||
<ContextMenu.Item leftIcon="album" onSelect={handleGoToAlbum}>
|
||||
{t('page.contextMenu.goToAlbum', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.goToAlbum')}
|
||||
</ContextMenu.Item>
|
||||
)}
|
||||
{albumArtists.map((albumArtist) => (
|
||||
@@ -87,7 +87,7 @@ export const GoToAction = ({ items }: GoToActionProps) => {
|
||||
leftIcon="artist"
|
||||
onSelect={() => handleGoToAlbumArtist(albumArtist.id)}
|
||||
>
|
||||
{`${t('page.contextMenu.goTo', { postProcess: 'sentenceCase' })} ${albumArtist.name}`}
|
||||
{`${t('page.contextMenu.goTo')} ${albumArtist.name}`}
|
||||
</ContextMenu.Item>
|
||||
))}
|
||||
</ContextMenu.SubmenuContent>
|
||||
|
||||
@@ -33,18 +33,18 @@ export const MoveQueueItemsAction = ({ items }: MoveQueueItemsActionProps) => {
|
||||
onSelect={(e) => e.preventDefault()}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('page.contextMenu.moveItems', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.moveItems')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item leftIcon="arrowUpToLine" onSelect={handleMoveToTop}>
|
||||
{t('page.contextMenu.moveToTop', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.moveToTop')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayNext" onSelect={handleMoveToNext}>
|
||||
{t('page.contextMenu.moveToNext', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.moveToNext')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="arrowDownToLine" onSelect={handleMoveToBottom}>
|
||||
{t('page.contextMenu.moveToBottom', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.moveToBottom')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -75,28 +75,28 @@ export const PlayAction = ({ ids, itemType, songs }: PlayActionProps) => {
|
||||
onSelect={defaultPlayAction}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('player.play', { postProcess: 'sentenceCase' })}
|
||||
{t('player.play')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item leftIcon="mediaPlay" onSelect={handlePlayNow}>
|
||||
{t('player.play', { postProcess: 'sentenceCase' })}
|
||||
{t('player.play')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayNext" onSelect={handlePlayNext}>
|
||||
{t('player.addNext', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addNext')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayLast" onSelect={handlePlayLast}>
|
||||
{t('player.addLast', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addLast')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Divider />
|
||||
<ContextMenu.Item leftIcon="mediaShuffle" onSelect={handlePlayShuffled}>
|
||||
{t('player.shuffle', { postProcess: 'sentenceCase' })}
|
||||
{t('player.shuffle')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayNext" onSelect={handlePlayNextShuffled}>
|
||||
{t('player.addNextShuffled', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addNextShuffled')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayLast" onSelect={handlePlayLastShuffled}>
|
||||
{t('player.addLastShuffled', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addLastShuffled')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -73,18 +73,18 @@ export const PlayAlbumRadioAction = ({ album, disabled }: PlayAlbumRadioActionPr
|
||||
onSelect={defaultPlayAlbumRadioAction}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('player.albumRadio', { postProcess: 'sentenceCase' })}
|
||||
{t('player.albumRadio')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item leftIcon="mediaPlay" onSelect={handlePlayAlbumRadioNow}>
|
||||
{t('player.play', { postProcess: 'sentenceCase' })}
|
||||
{t('player.play')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayNext" onSelect={handlePlayAlbumRadioNext}>
|
||||
{t('player.addNext', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addNext')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayLast" onSelect={handlePlayAlbumRadioLast}>
|
||||
{t('player.addLast', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addLast')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -73,18 +73,18 @@ export const PlayArtistRadioAction = ({ artist, disabled }: PlayArtistRadioActio
|
||||
onSelect={defaultPlayArtistRadioAction}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('player.artistRadio', { postProcess: 'sentenceCase' })}
|
||||
{t('player.artistRadio')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item leftIcon="mediaPlay" onSelect={handlePlayArtistRadioNow}>
|
||||
{t('player.play', { postProcess: 'sentenceCase' })}
|
||||
{t('player.play')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayNext" onSelect={handlePlayArtistRadioNext}>
|
||||
{t('player.addNext', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addNext')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayLast" onSelect={handlePlayArtistRadioLast}>
|
||||
{t('player.addLast', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addLast')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -72,18 +72,18 @@ export const PlayTrackRadioAction = ({ disabled, song }: PlayTrackRadioActionPro
|
||||
onSelect={defaultPlayTrackRadioAction}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('player.trackRadio', { postProcess: 'sentenceCase' })}
|
||||
{t('player.trackRadio')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item leftIcon="mediaPlay" onSelect={handlePlayTrackRadioNow}>
|
||||
{t('player.play', { postProcess: 'sentenceCase' })}
|
||||
{t('player.play')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayNext" onSelect={handlePlayTrackRadioNext}>
|
||||
{t('player.addNext', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addNext')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="mediaPlayLast" onSelect={handlePlayTrackRadioLast}>
|
||||
{t('player.addLast', { postProcess: 'sentenceCase' })}
|
||||
{t('player.addLast')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -39,12 +39,12 @@ export const RemoveFromPlaylistAction = ({ items }: RemoveFromPlaylistActionProp
|
||||
});
|
||||
|
||||
toast.success({
|
||||
message: t('action.removeFromPlaylist', { postProcess: 'sentenceCase' }),
|
||||
message: t('action.removeFromPlaylist'),
|
||||
});
|
||||
} catch (err: any) {
|
||||
toast.error({
|
||||
message: err.message,
|
||||
title: t('error.genericError', { postProcess: 'sentenceCase' }),
|
||||
title: t('error.genericError'),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -57,10 +57,10 @@ export const RemoveFromPlaylistAction = ({ items }: RemoveFromPlaylistActionProp
|
||||
openModal({
|
||||
children: (
|
||||
<ConfirmModal onConfirm={handleRemoveFromPlaylist}>
|
||||
<Text>{t('common.areYouSure', { postProcess: 'sentenceCase' })}</Text>
|
||||
<Text>{t('common.areYouSure')}</Text>
|
||||
</ConfirmModal>
|
||||
),
|
||||
title: t('action.removeFromPlaylist', { postProcess: 'sentenceCase' }),
|
||||
title: t('action.removeFromPlaylist'),
|
||||
});
|
||||
}, [handleRemoveFromPlaylist, ids, playlistId, t]);
|
||||
|
||||
@@ -68,7 +68,7 @@ export const RemoveFromPlaylistAction = ({ items }: RemoveFromPlaylistActionProp
|
||||
|
||||
return (
|
||||
<ContextMenu.Item leftIcon="remove" onSelect={openRemoveFromPlaylistModal}>
|
||||
{t('action.removeFromPlaylist', { postProcess: 'sentenceCase' })}
|
||||
{t('action.removeFromPlaylist')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@ export const RemoveFromQueueAction = ({ items }: RemoveFromQueueActionProps) =>
|
||||
|
||||
return (
|
||||
<ContextMenu.Item leftIcon="remove" onSelect={onSelect}>
|
||||
{t('action.removeFromQueue', { postProcess: 'sentenceCase' })}
|
||||
{t('action.removeFromQueue')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -51,15 +51,15 @@ export const SetFavoriteAction = ({ ids, itemType }: SetFavoriteActionProps) =>
|
||||
onSelect={(e) => e.preventDefault()}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('common.favorite', { postProcess: 'sentenceCase' })}
|
||||
{t('common.favorite')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item leftIcon="favorite" onSelect={handleAddToFavorites}>
|
||||
{t('action.addToFavorites', { postProcess: 'sentenceCase' })}
|
||||
{t('action.addToFavorites')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item leftIcon="unfavorite" onSelect={handleRemoveFromFavorites}>
|
||||
{t('action.removeFromFavorites', { postProcess: 'sentenceCase' })}
|
||||
{t('action.removeFromFavorites')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -41,7 +41,7 @@ export const SetRatingAction = ({ ids, itemType }: SetRatingActionProps) => {
|
||||
onSelect={(e) => e.preventDefault()}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('action.setRating', { postProcess: 'sentenceCase' })}
|
||||
{t('action.setRating')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
|
||||
@@ -37,13 +37,13 @@ export const ShareAction = ({ ids, itemType }: ShareActionProps) => {
|
||||
resourceType,
|
||||
},
|
||||
modal: 'shareItem',
|
||||
title: t('page.contextMenu.shareItem', { postProcess: 'titleCase' }),
|
||||
title: t('page.contextMenu.shareItem'),
|
||||
});
|
||||
}, [ids, resourceType, t]);
|
||||
|
||||
return (
|
||||
<ContextMenu.Item leftIcon="share" onSelect={onSelect}>
|
||||
{t('page.contextMenu.shareItem', { postProcess: 'sentenceCase' })}
|
||||
{t('page.contextMenu.shareItem')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -30,9 +30,7 @@ export const ShowInFileExplorerAction = ({ items }: ShowInFileExplorerActionProp
|
||||
} catch (error) {
|
||||
toast.error({
|
||||
message: (error as Error).message,
|
||||
title: t('error.openError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t('error.openError'),
|
||||
});
|
||||
}
|
||||
}, [items, t]);
|
||||
@@ -47,7 +45,7 @@ export const ShowInFileExplorerAction = ({ items }: ShowInFileExplorerActionProp
|
||||
|
||||
return (
|
||||
<ContextMenu.Item disabled={isDisabled} leftIcon="folder" onSelect={onSelect}>
|
||||
{t('page.itemDetail.openFile', { postProcess: 'sentenceCase' })}
|
||||
{t('page.itemDetail.openFile')}
|
||||
</ContextMenu.Item>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -29,15 +29,15 @@ export const ShuffleItemsAction = ({ items }: ShuffleItemsActionProps) => {
|
||||
onSelect={(e) => e.preventDefault()}
|
||||
rightIcon="arrowRightS"
|
||||
>
|
||||
{t('action.shuffle', { postProcess: 'sentenceCase' })}
|
||||
{t('action.shuffle')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuTarget>
|
||||
<ContextMenu.SubmenuContent>
|
||||
<ContextMenu.Item onSelect={handleShuffleSelected}>
|
||||
{t('action.shuffleSelected', { postProcess: 'sentenceCase' })}
|
||||
{t('action.shuffleSelected')}
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Item onSelect={handleShuffleAll}>
|
||||
{t('action.shuffleAll', { postProcess: 'sentenceCase' })}
|
||||
{t('action.shuffleAll')}
|
||||
</ContextMenu.Item>
|
||||
</ContextMenu.SubmenuContent>
|
||||
</ContextMenu.Submenu>
|
||||
|
||||
@@ -79,9 +79,7 @@ export const FavoritesHeader = ({ itemType }: FavoritesHeaderProps) => {
|
||||
<Stack gap={0} style={{ cursor: 'pointer' }}>
|
||||
<Group>
|
||||
<TextTitle isNoSelect order={3}>
|
||||
{t('page.favorites.title', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.favorites.title')}
|
||||
</TextTitle>
|
||||
<Icon icon="dropdown" size="xl" />
|
||||
</Group>
|
||||
@@ -89,17 +87,14 @@ export const FavoritesHeader = ({ itemType }: FavoritesHeaderProps) => {
|
||||
{itemType === LibraryItem.ALBUM &&
|
||||
t('entity.album', {
|
||||
count: 2,
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{itemType === LibraryItem.ALBUM_ARTIST &&
|
||||
t('entity.artist', {
|
||||
count: 2,
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{itemType === LibraryItem.SONG &&
|
||||
t('entity.track', {
|
||||
count: 2,
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
</Text>
|
||||
</Stack>
|
||||
@@ -112,7 +107,6 @@ export const FavoritesHeader = ({ itemType }: FavoritesHeaderProps) => {
|
||||
>
|
||||
{t('entity.track', {
|
||||
count: 2,
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
</DropdownMenu.Item>
|
||||
<DropdownMenu.Item
|
||||
@@ -122,7 +116,6 @@ export const FavoritesHeader = ({ itemType }: FavoritesHeaderProps) => {
|
||||
>
|
||||
{t('entity.album', {
|
||||
count: 2,
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
</DropdownMenu.Item>
|
||||
<DropdownMenu.Item
|
||||
@@ -134,7 +127,6 @@ export const FavoritesHeader = ({ itemType }: FavoritesHeaderProps) => {
|
||||
>
|
||||
{t('entity.artist', {
|
||||
count: 2,
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
</DropdownMenu.Item>
|
||||
</DropdownMenu.Dropdown>
|
||||
|
||||
@@ -56,7 +56,7 @@ export const FolderListHeaderFilters = () => {
|
||||
onClick: () => void;
|
||||
}> = [];
|
||||
|
||||
const homeLabel = t('common.home', { postProcess: 'titleCase' });
|
||||
const homeLabel = t('common.home');
|
||||
items.push({
|
||||
fullLabel: homeLabel,
|
||||
id: 'folder-root',
|
||||
|
||||
@@ -18,7 +18,7 @@ interface FolderListHeaderProps {
|
||||
export const FolderListHeader = ({ title }: FolderListHeaderProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const pageTitle = title || t('page.folderList.title', { postProcess: 'titleCase' });
|
||||
const pageTitle = title || t('page.folderList.title');
|
||||
|
||||
return (
|
||||
<Stack gap={0}>
|
||||
|
||||
@@ -23,7 +23,7 @@ export const GenreDetailHeader = ({ title }: GenreDetailHeaderProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { itemCount } = useListContext();
|
||||
const pageTitle = title || t('page.genreList.title', { postProcess: 'titleCase' });
|
||||
const pageTitle = title || t('page.genreList.title');
|
||||
|
||||
const genreTarget = useGenreTarget();
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ interface GenreListHeaderProps {
|
||||
export const GenreListHeader = ({ title }: GenreListHeaderProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const pageTitle = title || t('page.genreList.title', { postProcess: 'titleCase' });
|
||||
const pageTitle = title || t('page.genreList.title');
|
||||
|
||||
return (
|
||||
<Stack gap={0}>
|
||||
|
||||
@@ -120,7 +120,7 @@ export const FeaturedGenres = () => {
|
||||
<>
|
||||
<Group align="flex-end" justify="space-between">
|
||||
<TextTitle fw={700} isNoSelect order={3}>
|
||||
{t('entity.genre', { count: 2, postProcess: 'titleCase' })}
|
||||
{t('entity.genre', { count: 2 })}
|
||||
</TextTitle>
|
||||
<Button
|
||||
component={Link}
|
||||
@@ -128,7 +128,7 @@ export const FeaturedGenres = () => {
|
||||
to={AppRoute.LIBRARY_GENRES}
|
||||
variant="subtle"
|
||||
>
|
||||
{t('action.viewMore', { postProcess: 'sentenceCase' })}
|
||||
{t('action.viewMore')}
|
||||
</Button>
|
||||
</Group>
|
||||
<div className={styles.grid}>
|
||||
|
||||
@@ -50,35 +50,35 @@ const HomeRoute = () => {
|
||||
itemType: isJellyfin ? LibraryItem.SONG : LibraryItem.ALBUM,
|
||||
sortBy: isJellyfin ? SongListSort.PLAY_COUNT : AlbumListSort.PLAY_COUNT,
|
||||
sortOrder: SortOrder.DESC,
|
||||
title: t('page.home.mostPlayed', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.home.mostPlayed'),
|
||||
},
|
||||
[HomeItem.RANDOM]: {
|
||||
enableRefresh: true,
|
||||
itemType: LibraryItem.ALBUM,
|
||||
sortBy: AlbumListSort.RANDOM,
|
||||
sortOrder: SortOrder.ASC,
|
||||
title: t('page.home.explore', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.home.explore'),
|
||||
},
|
||||
[HomeItem.RECENTLY_ADDED]: {
|
||||
enableRefresh: true,
|
||||
itemType: LibraryItem.ALBUM,
|
||||
sortBy: AlbumListSort.RECENTLY_ADDED,
|
||||
sortOrder: SortOrder.DESC,
|
||||
title: t('page.home.newlyAdded', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.home.newlyAdded'),
|
||||
},
|
||||
[HomeItem.RECENTLY_PLAYED]: {
|
||||
enableRefresh: true,
|
||||
itemType: isJellyfin ? LibraryItem.SONG : LibraryItem.ALBUM,
|
||||
sortBy: isJellyfin ? SongListSort.RECENTLY_PLAYED : AlbumListSort.RECENTLY_PLAYED,
|
||||
sortOrder: SortOrder.DESC,
|
||||
title: t('page.home.recentlyPlayed', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.home.recentlyPlayed'),
|
||||
},
|
||||
[HomeItem.RECENTLY_RELEASED]: {
|
||||
enableRefresh: true,
|
||||
itemType: LibraryItem.ALBUM,
|
||||
sortBy: AlbumListSort.RELEASE_DATE,
|
||||
sortOrder: SortOrder.DESC,
|
||||
title: t('page.home.recentlyReleased', { postProcess: 'sentenceCase' }),
|
||||
title: t('page.home.recentlyReleased'),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -98,9 +98,7 @@ const HomeRoute = () => {
|
||||
backgroundColor: 'var(--theme-colors-background)',
|
||||
children: (
|
||||
<LibraryHeaderBar>
|
||||
<LibraryHeaderBar.Title>
|
||||
{t('page.home.title', { postProcess: 'titleCase' })}
|
||||
</LibraryHeaderBar.Title>
|
||||
<LibraryHeaderBar.Title>{t('page.home.title')}</LibraryHeaderBar.Title>
|
||||
</LibraryHeaderBar>
|
||||
),
|
||||
offset: 200,
|
||||
|
||||
@@ -155,9 +155,9 @@ const AlbumPropertyMapping: ItemDetailRow<Album>[] = [
|
||||
label: 'filter.explicitStatus',
|
||||
render: (album, t) =>
|
||||
album.explicitStatus === ExplicitStatus.EXPLICIT
|
||||
? t('common.explicit', { postProcess: 'sentenceCase' })
|
||||
? t('common.explicit')
|
||||
: album.explicitStatus === ExplicitStatus.CLEAN
|
||||
? t('common.clean', { postProcess: 'sentenceCase' })
|
||||
? t('common.clean')
|
||||
: null,
|
||||
},
|
||||
{ label: 'filter.isCompilation', render: (album) => BoolField(album.isCompilation || false) },
|
||||
@@ -309,9 +309,9 @@ const SongPropertyMapping: ItemDetailRow<Song>[] = [
|
||||
label: 'filter.explicitStatus',
|
||||
render: (song, t) =>
|
||||
song.explicitStatus === ExplicitStatus.EXPLICIT
|
||||
? t('common.explicit', { postProcess: 'sentenceCase' })
|
||||
? t('common.explicit')
|
||||
: song.explicitStatus === ExplicitStatus.CLEAN
|
||||
? t('common.clean', { postProcess: 'sentenceCase' })
|
||||
? t('common.clean')
|
||||
: null,
|
||||
},
|
||||
{ count: 2, label: 'entity.genre', render: FormatGenre },
|
||||
@@ -379,7 +379,7 @@ const handleTags = (item: Album | Song, t: TFunction) => {
|
||||
if (tags.length) {
|
||||
return [
|
||||
<Table.Tr key="tags">
|
||||
<Table.Th>{t('common.tags', { postProcess: 'sentenceCase' })}</Table.Th>
|
||||
<Table.Th>{t('common.tags')}</Table.Th>
|
||||
<Table.Td>{tags.length}</Table.Td>
|
||||
</Table.Tr>,
|
||||
].concat(tags);
|
||||
@@ -406,11 +406,7 @@ const handleParticipants = (item: Album | Song, t: TFunction) => {
|
||||
if (participants.length) {
|
||||
return [
|
||||
<Table.Tr key="participants">
|
||||
<Table.Th>
|
||||
{t('common.additionalParticipants', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
</Table.Th>
|
||||
<Table.Th>{t('common.additionalParticipants')}</Table.Th>
|
||||
<Table.Td>{participants.length}</Table.Td>
|
||||
</Table.Tr>,
|
||||
].concat(participants);
|
||||
@@ -431,9 +427,7 @@ export const ItemDetailsModal = ({ item, items }: ItemDetailsModalProps) => {
|
||||
|
||||
const selectData = useMemo(() => {
|
||||
return allItems.map((it, index) => ({
|
||||
label:
|
||||
it.name ||
|
||||
`${t('common.item', { defaultValue: 'Item', postProcess: 'sentenceCase' })} ${index + 1}`,
|
||||
label: it.name || `${t('common.item', { defaultValue: 'Item' })} ${index + 1}`,
|
||||
value: String(index),
|
||||
}));
|
||||
}, [allItems, t]);
|
||||
|
||||
@@ -27,9 +27,7 @@ export const SongPath = ({ path }: SongPathProps) => {
|
||||
<Tooltip
|
||||
label={t(
|
||||
copied ? 'page.itemDetail.copiedPath' : 'page.itemDetail.copyPath',
|
||||
{
|
||||
postProcess: 'sentenceCase',
|
||||
},
|
||||
{},
|
||||
)}
|
||||
withinPortal
|
||||
>
|
||||
@@ -40,19 +38,14 @@ export const SongPath = ({ path }: SongPathProps) => {
|
||||
)}
|
||||
</CopyButton>
|
||||
{util && (
|
||||
<Tooltip
|
||||
label={t('page.itemDetail.openFile', { postProcess: 'sentenceCase' })}
|
||||
withinPortal
|
||||
>
|
||||
<Tooltip label={t('page.itemDetail.openFile')} withinPortal>
|
||||
<ActionIcon
|
||||
icon="externalLink"
|
||||
onClick={() => {
|
||||
util.openItem(path).catch((error) => {
|
||||
toast.error({
|
||||
message: (error as Error).message,
|
||||
title: t('error.openError', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t('error.openError'),
|
||||
});
|
||||
});
|
||||
}}
|
||||
|
||||
@@ -115,12 +115,8 @@ const LoginRoute = () => {
|
||||
<PageHeader />
|
||||
<Center style={{ height: '100%', width: '100vw' }}>
|
||||
<Stack>
|
||||
<TextTitle fw={600}>
|
||||
{t('error.genericError', { postProcess: 'sentenceCase' })}
|
||||
</TextTitle>
|
||||
<Text fw={500}>
|
||||
{t('error.serverNotSelectedError', { postProcess: 'sentenceCase' })}
|
||||
</Text>
|
||||
<TextTitle fw={600}>{t('error.genericError')}</TextTitle>
|
||||
<Text fw={500}>{t('error.serverNotSelectedError')}</Text>
|
||||
<Code block>{JSON.stringify(config, null, 2)}</Code>
|
||||
</Stack>
|
||||
</Center>
|
||||
@@ -133,7 +129,7 @@ const LoginRoute = () => {
|
||||
|
||||
if (!authFunction) {
|
||||
return toast.error({
|
||||
message: t('error.invalidServer', { postProcess: 'sentenceCase' }),
|
||||
message: t('error.invalidServer'),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -151,7 +147,7 @@ const LoginRoute = () => {
|
||||
|
||||
if (!data) {
|
||||
return toast.error({
|
||||
message: t('error.authenticationFailed', { postProcess: 'sentenceCase' }),
|
||||
message: t('error.authenticationFailed'),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -195,7 +191,7 @@ const LoginRoute = () => {
|
||||
}
|
||||
|
||||
toast.success({
|
||||
message: t('form.addServer.success', { postProcess: 'sentenceCase' }),
|
||||
message: t('form.addServer.success'),
|
||||
});
|
||||
|
||||
if (localSettings && values.password) {
|
||||
@@ -204,7 +200,6 @@ const LoginRoute = () => {
|
||||
toast.error({
|
||||
message: t('form.addServer.error', {
|
||||
context: 'savePassword',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
});
|
||||
}
|
||||
@@ -250,7 +245,6 @@ const LoginRoute = () => {
|
||||
data-autofocus
|
||||
label={t('form.addServer.input', {
|
||||
context: 'username',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
required
|
||||
variant="filled"
|
||||
@@ -259,7 +253,6 @@ const LoginRoute = () => {
|
||||
<PasswordInput
|
||||
label={t('form.addServer.input', {
|
||||
context: 'password',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
required
|
||||
variant="filled"
|
||||
@@ -277,7 +270,6 @@ const LoginRoute = () => {
|
||||
>
|
||||
{t('common.login', {
|
||||
defaultValue: 'Login',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
</Button>
|
||||
</Stack>
|
||||
|
||||
@@ -85,7 +85,6 @@ ${contents}
|
||||
data-autofocus
|
||||
label={t('form.lyricsExport.input', {
|
||||
context: 'synced',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
{...form.getInputProps('synced', { type: 'checkbox' })}
|
||||
/>
|
||||
@@ -93,7 +92,6 @@ ${contents}
|
||||
data-autofocus
|
||||
label={t('form.lyricsExport.input', {
|
||||
context: 'offset',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
{...form.getInputProps('offsetMs')}
|
||||
/>
|
||||
@@ -104,10 +102,10 @@ ${contents}
|
||||
<Divider />
|
||||
<Group justify="flex-end">
|
||||
<Button onClick={() => closeAllModals()} variant="default">
|
||||
{t('common.close', { postProcess: 'titleCase' })}
|
||||
{t('common.close')}
|
||||
</Button>
|
||||
<Button onClick={exportLyrics} variant="filled">
|
||||
{t('form.lyricsExport.export', { postProcess: 'titleCase' })}
|
||||
{t('form.lyricsExport.export')}
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
@@ -123,6 +121,6 @@ export const openLyricsExportModal = ({ lyrics, offsetMs, synced }: LyricsExport
|
||||
height: '600px',
|
||||
},
|
||||
},
|
||||
title: i18n.t('form.lyricSearch.title', { postProcess: 'titleCase' }) as string,
|
||||
title: i18n.t('form.lyricSearch.title') as string,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -57,17 +57,13 @@ const SearchResult = ({ data, isSelected, onClick }: SearchResultProps) => {
|
||||
|
||||
const syncStatus = useMemo(() => {
|
||||
if (isSync === true) {
|
||||
return t('page.fullscreenPlayer.config.synchronized', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('page.fullscreenPlayer.config.synchronized');
|
||||
}
|
||||
if (isSync === false) {
|
||||
return t('page.fullscreenPlayer.config.unsynchronized', {
|
||||
postProcess: 'sentenceCase',
|
||||
});
|
||||
return t('page.fullscreenPlayer.config.unsynchronized');
|
||||
}
|
||||
|
||||
return t('common.unknown', { postProcess: 'titleCase' });
|
||||
return t('common.unknown');
|
||||
}, [isSync, t]);
|
||||
|
||||
return (
|
||||
@@ -186,7 +182,6 @@ export const LyricsSearchForm = ({ artist, name, onSearchOverride }: LyricSearch
|
||||
data-autofocus
|
||||
label={t('form.lyricSearch.input', {
|
||||
context: 'name',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
rightSection={
|
||||
form.values.name ? (
|
||||
@@ -203,7 +198,6 @@ export const LyricsSearchForm = ({ artist, name, onSearchOverride }: LyricSearch
|
||||
<TextInput
|
||||
label={t('form.lyricSearch.input', {
|
||||
context: 'artist',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
rightSection={
|
||||
form.values.artist ? (
|
||||
@@ -288,11 +282,7 @@ export const LyricsSearchForm = ({ artist, name, onSearchOverride }: LyricSearch
|
||||
</div>
|
||||
) : (
|
||||
<Center>
|
||||
<Text isMuted>
|
||||
{t('page.fullscreenPlayer.noLyrics', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
</Text>
|
||||
<Text isMuted>{t('page.fullscreenPlayer.noLyrics')}</Text>
|
||||
</Center>
|
||||
)}
|
||||
</ScrollArea>
|
||||
@@ -302,17 +292,17 @@ export const LyricsSearchForm = ({ artist, name, onSearchOverride }: LyricSearch
|
||||
<Divider />
|
||||
<Group justify="flex-end">
|
||||
<Button onClick={() => closeAllModals()} variant="default">
|
||||
{t('common.cancel', { postProcess: 'titleCase' })}
|
||||
{t('common.cancel')}
|
||||
</Button>
|
||||
<Button
|
||||
disabled={!selectedResult || !previewData}
|
||||
onClick={handleExport}
|
||||
variant="default"
|
||||
>
|
||||
{t('form.lyricsExport.export', { postProcess: 'titleCase' })}
|
||||
{t('form.lyricsExport.export')}
|
||||
</Button>
|
||||
<Button disabled={!selectedResult} onClick={handleApply} variant="filled">
|
||||
{t('common.confirm', { postProcess: 'titleCase' })}
|
||||
{t('common.confirm')}
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
@@ -330,6 +320,6 @@ export const openLyricSearchModal = ({ artist, name, onSearchOverride }: LyricSe
|
||||
height: '600px',
|
||||
},
|
||||
},
|
||||
title: i18n.t('form.lyricSearch.title', { postProcess: 'titleCase' }) as string,
|
||||
title: i18n.t('form.lyricSearch.title') as string,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -79,7 +79,6 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
description: '',
|
||||
title: t(
|
||||
`${t('page.fullscreenPlayer.config.lyricSize')} (${t('page.fullscreenPlayer.config.synchronized')})`,
|
||||
{ postProcess: 'sentenceCase' },
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -102,7 +101,6 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
description: '',
|
||||
title: t(
|
||||
`${t('page.fullscreenPlayer.config.lyricSize')} (${t('page.fullscreenPlayer.config.unsynchronized')})`,
|
||||
{ postProcess: 'sentenceCase' },
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -125,7 +123,6 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
description: '',
|
||||
title: t(
|
||||
`${t('page.fullscreenPlayer.config.lyricGap')} (${t('page.fullscreenPlayer.config.synchronized')})`,
|
||||
{ postProcess: 'sentenceCase' },
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -148,19 +145,18 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
description: '',
|
||||
title: t(
|
||||
`${t('page.fullscreenPlayer.config.lyricGap')} (${t('page.fullscreenPlayer.config.unsynchronized')})`,
|
||||
{ postProcess: 'sentenceCase' },
|
||||
),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
<SegmentedControl
|
||||
data={[
|
||||
{ label: t('common.left', { postProcess: 'titleCase' }), value: 'left' },
|
||||
{ label: t('common.left'), value: 'left' },
|
||||
{
|
||||
label: t('common.center', { postProcess: 'titleCase' }),
|
||||
label: t('common.center'),
|
||||
value: 'center',
|
||||
},
|
||||
{ label: t('common.right', { postProcess: 'titleCase' }), value: 'right' },
|
||||
{ label: t('common.right'), value: 'right' },
|
||||
]}
|
||||
onChange={(value) =>
|
||||
updateLyricsSetting({ alignment: value as 'center' | 'left' | 'right' })
|
||||
@@ -169,9 +165,7 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
/>
|
||||
),
|
||||
description: '',
|
||||
title: t('page.fullscreenPlayer.config.lyricAlignment', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t('page.fullscreenPlayer.config.lyricAlignment'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -182,9 +176,7 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
/>
|
||||
),
|
||||
description: '',
|
||||
title: t('page.fullscreenPlayer.config.followCurrentLyric', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t('page.fullscreenPlayer.config.followCurrentLyric'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -203,9 +195,7 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
/>
|
||||
),
|
||||
description: '',
|
||||
title: t(`${t('page.fullscreenPlayer.config.lyricOpacityNonActive')}`, {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t(`${t('page.fullscreenPlayer.config.lyricOpacityNonActive')}`, {}),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -224,9 +214,7 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
/>
|
||||
),
|
||||
description: '',
|
||||
title: t(`${t('page.fullscreenPlayer.config.lyricScaleNonActive')}`, {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t(`${t('page.fullscreenPlayer.config.lyricScaleNonActive')}`, {}),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -237,9 +225,7 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
/>
|
||||
),
|
||||
description: '',
|
||||
title: t('page.fullscreenPlayer.config.showLyricMatch', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t('page.fullscreenPlayer.config.showLyricMatch'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -250,9 +236,7 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
/>
|
||||
),
|
||||
description: '',
|
||||
title: t('page.fullscreenPlayer.config.showLyricProvider', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
title: t('page.fullscreenPlayer.config.showLyricProvider'),
|
||||
},
|
||||
];
|
||||
|
||||
@@ -269,10 +253,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.preferLocalLyrics', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.preferLocalLyrics', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.preferLocalLyrics'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -284,10 +267,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.lyricFetch', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.lyricFetch', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.lyricFetch'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -305,10 +287,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.lyricFetchProvider', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.lyricFetchProvider', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.lyricFetchProvider'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -324,10 +305,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.neteaseTranslation', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.neteaseTranslation', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.neteaseTranslation'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -343,10 +323,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.lyricOffset', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.lyricOffset', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.lyricOffset'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -360,10 +339,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.translationTargetLanguage', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.translationTargetLanguage', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.translationTargetLanguage'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -378,10 +356,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.translationApiProvider', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.translationApiProvider', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.translationApiProvider'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -394,10 +371,9 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.translationApiKey', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.translationApiKey', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.translationApiKey'),
|
||||
},
|
||||
{
|
||||
control: (
|
||||
@@ -411,19 +387,18 @@ export const LyricsSettingsForm = ({ settingsKey }: LyricsSettingsFormProps) =>
|
||||
),
|
||||
description: t('setting.enableAutoTranslation', {
|
||||
context: 'description',
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
isHidden: !isElectron(),
|
||||
title: t('setting.enableAutoTranslation', { postProcess: 'sentenceCase' }),
|
||||
title: t('setting.enableAutoTranslation'),
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<Stack gap="md" p="md">
|
||||
<Fieldset legend={t('page.setting.lyricsDisplay', { postProcess: 'sentenceCase' })}>
|
||||
<Fieldset legend={t('page.setting.lyricsDisplay')}>
|
||||
<SettingsSection options={displayOptions} />
|
||||
</Fieldset>
|
||||
<Fieldset legend={t('page.setting.lyrics', { postProcess: 'sentenceCase' })}>
|
||||
<Fieldset legend={t('page.setting.lyrics')}>
|
||||
<SettingsSection options={lyricOptions} />
|
||||
</Fieldset>
|
||||
</Stack>
|
||||
|
||||
@@ -70,7 +70,7 @@ export const LyricsActions = ({
|
||||
uppercase
|
||||
variant="subtle"
|
||||
>
|
||||
{t('form.lyricsExport.export', { postProcess: 'sentenceCase ' })}
|
||||
{t('form.lyricsExport.export')}
|
||||
</Button>
|
||||
</Center>
|
||||
)}
|
||||
@@ -89,7 +89,7 @@ export const LyricsActions = ({
|
||||
uppercase
|
||||
variant="subtle"
|
||||
>
|
||||
{t('common.search', { postProcess: 'titleCase' })}
|
||||
{t('common.search')}
|
||||
</Button>
|
||||
) : null}
|
||||
<ActionIcon
|
||||
@@ -97,15 +97,12 @@ export const LyricsActions = ({
|
||||
icon="minus"
|
||||
onClick={() => handleLyricOffset(offsetMs - 50)}
|
||||
tooltip={{
|
||||
label: t('common.slower', { postProcess: 'sentenceCase' }),
|
||||
label: t('common.slower'),
|
||||
openDelay: 0,
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
<Tooltip
|
||||
label={t('setting.lyricOffset', { postProcess: 'sentenceCase' })}
|
||||
openDelay={0}
|
||||
>
|
||||
<Tooltip label={t('setting.lyricOffset')} openDelay={0}>
|
||||
<NumberInput
|
||||
aria-label="Lyric offset"
|
||||
onChange={handleLyricOffset}
|
||||
@@ -119,7 +116,7 @@ export const LyricsActions = ({
|
||||
icon="plus"
|
||||
onClick={() => handleLyricOffset(offsetMs + 50)}
|
||||
tooltip={{
|
||||
label: t('common.faster', { postProcess: 'sentenceCase' }),
|
||||
label: t('common.faster'),
|
||||
openDelay: 0,
|
||||
}}
|
||||
variant="subtle"
|
||||
@@ -131,9 +128,7 @@ export const LyricsActions = ({
|
||||
uppercase
|
||||
variant="subtle"
|
||||
>
|
||||
{hasLyrics
|
||||
? t('common.clear', { postProcess: 'sentenceCase' })
|
||||
: t('common.refresh', { postProcess: 'sentenceCase' })}
|
||||
{hasLyrics ? t('common.clear') : t('common.refresh')}
|
||||
</Button>
|
||||
) : null}
|
||||
</Group>
|
||||
@@ -146,7 +141,7 @@ export const LyricsActions = ({
|
||||
uppercase
|
||||
variant="subtle"
|
||||
>
|
||||
{t('common.translation', { postProcess: 'sentenceCase' })}
|
||||
{t('common.translation')}
|
||||
</Button>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
@@ -318,9 +318,7 @@ export const Lyrics = ({ fadeOutNoLyricsMessage = true, settingsKey = 'default'
|
||||
>
|
||||
<Group>
|
||||
<Text fw={500} isMuted isNoSelect>
|
||||
{t('page.fullscreenPlayer.noLyrics', {
|
||||
postProcess: 'sentenceCase',
|
||||
})}
|
||||
{t('page.fullscreenPlayer.noLyrics')}
|
||||
</Text>
|
||||
</Group>
|
||||
</motion.div>
|
||||
|
||||
@@ -95,20 +95,18 @@ export const SynchronizedLyrics = ({
|
||||
const programmaticScrollRef = useRef(false);
|
||||
|
||||
const getCurrentLyric = (timeInMs: number) => {
|
||||
const activeLyrics = lyricRef.current;
|
||||
if (!activeLyrics?.length) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
let index = -1;
|
||||
for (let idx = 0; idx < activeLyrics.length; idx += 1) {
|
||||
if (timeInMs < activeLyrics[idx][0]) {
|
||||
break;
|
||||
if (lyricRef.current) {
|
||||
const activeLyrics = lyricRef.current;
|
||||
for (let idx = 0; idx < activeLyrics.length; idx += 1) {
|
||||
if (timeInMs <= activeLyrics[idx][0]) {
|
||||
return idx === 0 ? idx : idx - 1;
|
||||
}
|
||||
}
|
||||
index = idx;
|
||||
|
||||
return activeLyrics.length - 1;
|
||||
}
|
||||
|
||||
return index;
|
||||
return -1;
|
||||
};
|
||||
|
||||
const setCurrentLyricRef = useRef<
|
||||
@@ -143,20 +141,7 @@ export const SynchronizedLyrics = ({
|
||||
.forEach((node) => node.classList.remove('active'));
|
||||
|
||||
if (index === -1) {
|
||||
const activeLyrics = lyricRef.current;
|
||||
if (!activeLyrics?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
const firstTime = activeLyrics[0][0];
|
||||
if (timeInMs < firstTime) {
|
||||
const elapsed = performance.now() - start;
|
||||
const delay = Math.max(0, firstTime - timeInMs - elapsed);
|
||||
lyricTimer.current = setTimeout(() => {
|
||||
setCurrentLyricRef.current(firstTime, nextEpoch, 0);
|
||||
}, delay);
|
||||
}
|
||||
|
||||
lyricRef.current = null;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -168,6 +153,7 @@ export const SynchronizedLyrics = ({
|
||||
const offsetTop = currentLyric?.offsetTop - doc?.clientHeight / 2 || 0;
|
||||
|
||||
if (currentLyric === null) {
|
||||
lyricRef.current = null;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ export const openLyricsSettingsModal = (settingsKey: string = 'default') => {
|
||||
width: '100%',
|
||||
},
|
||||
},
|
||||
title: i18n.t('common.setting', { count: 2, postProcess: 'titleCase' }),
|
||||
title: i18n.t('common.setting', { count: 2 }),
|
||||
transitionProps: {
|
||||
transition: 'pop',
|
||||
},
|
||||
|
||||
@@ -9,9 +9,7 @@ export const NowPlayingHeader = () => {
|
||||
return (
|
||||
<PageHeader>
|
||||
<LibraryHeaderBar ignoreMaxWidth>
|
||||
<LibraryHeaderBar.Title>
|
||||
{t('page.sidebar.nowPlaying', { postProcess: 'titleCase' })}
|
||||
</LibraryHeaderBar.Title>
|
||||
<LibraryHeaderBar.Title>{t('page.sidebar.nowPlaying')}</LibraryHeaderBar.Title>
|
||||
</LibraryHeaderBar>
|
||||
</PageHeader>
|
||||
);
|
||||
|
||||
@@ -108,21 +108,21 @@ const QueuePlaybackIcons = ({ tableRef }: { tableRef: RefObject<ItemListHandle |
|
||||
icon="mediaShuffle"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handleShuffleQueue}
|
||||
tooltip={{ label: t('player.shuffle', { postProcess: 'sentenceCase' }) }}
|
||||
tooltip={{ label: t('player.shuffle') }}
|
||||
variant="subtle"
|
||||
/>
|
||||
<ActionIcon
|
||||
icon="x"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handleClearQueue}
|
||||
tooltip={{ label: t('action.clearQueue', { postProcess: 'sentenceCase' }) }}
|
||||
tooltip={{ label: t('action.clearQueue') }}
|
||||
variant="subtle"
|
||||
/>
|
||||
<ActionIcon
|
||||
icon="goToItem"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handleJumpToCurrent}
|
||||
tooltip={{ label: t('action.goToCurrent', { postProcess: 'sentenceCase' }) }}
|
||||
tooltip={{ label: t('action.goToCurrent') }}
|
||||
variant="subtle"
|
||||
/>
|
||||
</>
|
||||
@@ -152,9 +152,7 @@ const QueueRestoreActions = () => {
|
||||
loading={isSavingQueue}
|
||||
onClick={() => handleSaveQueue()}
|
||||
tooltip={{
|
||||
label: t('player.saveQueueToServer', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
label: t('player.saveQueueToServer'),
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
@@ -165,9 +163,7 @@ const QueueRestoreActions = () => {
|
||||
loading={Boolean(isFetching)}
|
||||
onClick={handleRestoreQueue}
|
||||
tooltip={{
|
||||
label: t('player.restoreQueueFromServer', {
|
||||
postProcess: 'sentenceCase',
|
||||
}),
|
||||
label: t('player.restoreQueueFromServer'),
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
|
||||
@@ -51,7 +51,7 @@ export const PopoverPlayQueue = ({
|
||||
onClick={handleToggle}
|
||||
size="sm"
|
||||
tooltip={{
|
||||
label: t('player.viewQueue', { postProcess: 'titleCase' }),
|
||||
label: t('player.viewQueue'),
|
||||
openDelay: 0,
|
||||
}}
|
||||
variant="subtle"
|
||||
|
||||
@@ -313,7 +313,7 @@ const PanelReorderControls = ({ panelType }: { panelType: 'lyrics' | 'visualizer
|
||||
onClick={handleMoveUp}
|
||||
size="xs"
|
||||
tooltip={{
|
||||
label: t('action.moveUp', { postProcess: 'sentenceCase' }),
|
||||
label: t('action.moveUp'),
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
@@ -324,7 +324,7 @@ const PanelReorderControls = ({ panelType }: { panelType: 'lyrics' | 'visualizer
|
||||
onClick={handleMoveDown}
|
||||
size="xs"
|
||||
tooltip={{
|
||||
label: t('action.moveDown', { postProcess: 'sentenceCase' }),
|
||||
label: t('action.moveDown'),
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
@@ -334,7 +334,7 @@ const PanelReorderControls = ({ panelType }: { panelType: 'lyrics' | 'visualizer
|
||||
onClick={handleClose}
|
||||
size="xs"
|
||||
tooltip={{
|
||||
label: t('common.close', { postProcess: 'sentenceCase' }),
|
||||
label: t('common.close'),
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user