Compare commits

...

13 Commits

Author SHA1 Message Date
713217b488 fix(deps): update dependency @ffmpeg.wasm/core-mt to v0.13.2 2026-02-12 13:44:53 +00:00
e2f1ff50dd feat(synced-lyrics): Added Hindi & Bengali romanization support for lyrics (#3933)
Co-authored-by: pranjol <pranjol@pranjols-iMac-Pro.local>
2026-02-11 08:00:36 +09:00
3f1ceca39c chore(i18n): Translated using Weblate (Telugu)
Currently translated at 2.7% (13 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/te/
2026-02-10 10:09:44 +00:00
37277b2764 chore(i18n): Added translation using Weblate (Telugu) 2026-02-09 11:03:37 +01:00
ba89772b09 chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (469 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2026-02-07 19:09:44 +00:00
13a0e8e2ab chore(i18n): Translated using Weblate (Italian)
Currently translated at 99.7% (468 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2026-02-05 18:01:49 +01:00
faddaea403 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (469 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2026-02-04 14:02:00 +00:00
f50025f1f6 fix: pin deps 2026-02-03 19:06:04 +09:00
0f3a01718c fix: fix deps 2026-02-03 19:01:36 +09:00
3b4a1444f1 chore(deps): update deps 2026-02-03 19:00:19 +09:00
f403700bf7 refactor(music-together): Removed delay dependency (#4201) 2026-02-03 18:55:51 +09:00
eab9f8ebcb chore(i18n): Translated using Weblate (French)
Currently translated at 100.0% (469 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2026-02-03 05:18:43 +00:00
8a074a6f37 chore(i18n): Translated using Weblate (Slovak)
Currently translated at 87.2% (409 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/sk/
2026-02-03 05:18:41 +00:00
12 changed files with 600 additions and 590 deletions

View File

@ -46,7 +46,7 @@
"pnpm": { "pnpm": {
"overrides": { "overrides": {
"vite": "npm:rolldown-vite@7.3.1", "vite": "npm:rolldown-vite@7.3.1",
"node-gyp": "11.5.0", "node-gyp": "12.2.0",
"xml2js": "0.6.2", "xml2js": "0.6.2",
"node-fetch": "3.3.2", "node-fetch": "3.3.2",
"@electron/universal": "3.0.2", "@electron/universal": "3.0.2",
@ -64,9 +64,9 @@
}, },
"dependencies": { "dependencies": {
"@dehoist/romanize-thai": "1.0.0", "@dehoist/romanize-thai": "1.0.0",
"@electron-toolkit/tsconfig": "1.0.1", "@electron-toolkit/tsconfig": "2.0.0",
"@electron/remote": "2.1.3", "@electron/remote": "2.1.3",
"@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/core-mt": "0.13.2",
"@ffmpeg.wasm/main": "0.12.0", "@ffmpeg.wasm/main": "0.12.0",
"@floating-ui/dom": "1.7.5", "@floating-ui/dom": "1.7.5",
"@foobar404/wave": "2.0.5", "@foobar404/wave": "2.0.5",
@ -75,13 +75,14 @@
"@hono/node-server": "1.19.9", "@hono/node-server": "1.19.9",
"@hono/node-ws": "1.3.0", "@hono/node-ws": "1.3.0",
"@hono/swagger-ui": "0.5.3", "@hono/swagger-ui": "0.5.3",
"@hono/zod-openapi": "1.2.0", "@hono/zod-openapi": "1.2.1",
"@hono/zod-validator": "0.7.6", "@hono/zod-validator": "0.7.6",
"@indic-transliteration/sanscript": "1.3.3",
"@jellybrick/dbus-next": "0.10.3", "@jellybrick/dbus-next": "0.10.3",
"@jellybrick/electron-better-web-request": "2.0.0", "@jellybrick/electron-better-web-request": "2.0.0",
"@jellybrick/mpris-service": "2.1.5", "@jellybrick/mpris-service": "2.1.5",
"@jimp/plugin-color": "1.6.0", "@jimp/plugin-color": "1.6.0",
"@mdui/icons": "^1.0.3", "@mdui/icons": "1.0.3",
"@skyra/jaro-winkler": "1.1.1", "@skyra/jaro-winkler": "1.1.1",
"@xhayper/discord-rpc": "1.3.0", "@xhayper/discord-rpc": "1.3.0",
"async-mutex": "0.5.0", "async-mutex": "0.5.0",
@ -89,27 +90,26 @@
"butterchurn": "3.0.0-beta.5", "butterchurn": "3.0.0-beta.5",
"butterchurn-presets": "3.0.0-beta.4", "butterchurn-presets": "3.0.0-beta.4",
"color": "5.0.3", "color": "5.0.3",
"conf": "14.0.0", "conf": "15.0.2",
"custom-electron-prompt": "1.6.1", "custom-electron-prompt": "1.6.1",
"deepmerge-ts": "7.1.5", "deepmerge-ts": "7.1.5",
"delay": "6.0.0",
"electron-debug": "4.1.0", "electron-debug": "4.1.0",
"electron-is": "3.0.0", "electron-is": "3.0.0",
"electron-localshortcut": "3.2.1", "electron-localshortcut": "3.2.1",
"electron-store": "10.1.0", "electron-store": "11.0.2",
"electron-unhandled": "5.0.0", "electron-unhandled": "5.0.0",
"electron-updater": "6.7.3", "electron-updater": "6.7.3",
"es-hangul": "2.3.8", "es-hangul": "2.3.8",
"fast-average-color": "9.5.0", "fast-average-color": "9.5.0",
"fast-equals": "5.4.0", "fast-equals": "6.0.0",
"fflate": "0.8.2", "fflate": "0.8.2",
"filenamify": "6.0.0", "filenamify": "7.0.1",
"hanja": "1.1.5", "hanja": "1.1.5",
"happy-dom": "20.4.0", "happy-dom": "20.5.0",
"hono": "4.11.7", "hono": "4.11.7",
"howler": "2.2.4", "howler": "2.2.4",
"html-to-text": "9.0.5", "html-to-text": "9.0.5",
"i18next": "25.5.2", "i18next": "25.8.0",
"jimp": "1.6.0", "jimp": "1.6.0",
"keyboardevent-from-electron-accelerator": "2.0.0", "keyboardevent-from-electron-accelerator": "2.0.0",
"keyboardevents-areequal": "0.2.2", "keyboardevents-areequal": "0.2.2",
@ -134,14 +134,14 @@
"virtua": "0.48.5", "virtua": "0.48.5",
"vudio": "2.1.1", "vudio": "2.1.1",
"x11": "2.3.0", "x11": "2.3.0",
"youtubei.js": "^16.0.1", "youtubei.js": "16.0.1",
"zod": "4.2.1" "zod": "4.3.6"
}, },
"devDependencies": { "devDependencies": {
"@electron-toolkit/tsconfig": "1.0.1", "@electron-toolkit/tsconfig": "1.0.1",
"@eslint/js": "9.39.2", "@eslint/js": "9.39.2",
"@malept/flatpak-bundler": "0.4.0", "@malept/flatpak-bundler": "0.4.0",
"@playwright/test": "1.58.0", "@playwright/test": "1.58.1",
"@stylistic/eslint-plugin": "5.7.1", "@stylistic/eslint-plugin": "5.7.1",
"@total-typescript/ts-reset": "0.6.1", "@total-typescript/ts-reset": "0.6.1",
"@types/electron-localshortcut": "3.1.3", "@types/electron-localshortcut": "3.1.3",
@ -152,11 +152,11 @@
"bufferutil": "4.1.0", "bufferutil": "4.1.0",
"builtin-modules": "5.0.0", "builtin-modules": "5.0.0",
"cross-env": "10.1.0", "cross-env": "10.1.0",
"del-cli": "6.0.0", "del-cli": "7.0.0",
"discord-api-types": "0.38.37", "discord-api-types": "0.38.38",
"electron": "40.1.0", "electron": "40.1.0",
"electron-builder": "26.4.0", "electron-builder": "26.7.0",
"electron-builder-squirrel-windows": "26.4.0", "electron-builder-squirrel-windows": "26.7.0",
"electron-devtools-installer": "4.0.0", "electron-devtools-installer": "4.0.0",
"electron-vite": "5.0.0", "electron-vite": "5.0.0",
"eslint": "9.39.2", "eslint": "9.39.2",
@ -166,11 +166,11 @@
"eslint-plugin-import": "2.32.0", "eslint-plugin-import": "2.32.0",
"eslint-plugin-prettier": "5.5.5", "eslint-plugin-prettier": "5.5.5",
"eslint-plugin-solid": "0.14.5", "eslint-plugin-solid": "0.14.5",
"glob": "11.1.0", "glob": "13.0.0",
"node-gyp": "11.5.0", "node-gyp": "12.2.0",
"ts-morph": "27.0.2", "ts-morph": "27.0.2",
"typescript": "5.9.3", "typescript": "5.9.3",
"typescript-eslint": "8.53.1", "typescript-eslint": "8.54.0",
"utf-8-validate": "6.0.6", "utf-8-validate": "6.0.6",
"vite": "npm:rolldown-vite@7.3.1", "vite": "npm:rolldown-vite@7.3.1",
"vite-plugin-inspect": "11.3.3", "vite-plugin-inspect": "11.3.3",

875
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -161,7 +161,8 @@
"default": "Par défaut", "default": "Par défaut",
"force-show": "Forcer à apparaître", "force-show": "Forcer à apparaître",
"hide": "Cacher", "hide": "Cacher",
"label": "Boutons « J'aime »" "label": "Boutons « J'aime »",
"swap": "Inverser l'order des boutons like"
}, },
"remove-upgrade-button": "Supprimer le bouton de mise à niveau", "remove-upgrade-button": "Supprimer le bouton de mise à niveau",
"theme": { "theme": {
@ -412,6 +413,17 @@
"no-captions": "Aucun sous-titres disponibles pour cette chanson" "no-captions": "Aucun sous-titres disponibles pour cette chanson"
} }
}, },
"clock": {
"description": "Ajoute une horloge a la barre de navigation",
"menu": {
"format": {
"24-hour-format": "Format 24 heures",
"display-seconds": "Afficher les secondes",
"label": "Format"
}
},
"name": "Horloge"
},
"compact-sidebar": { "compact-sidebar": {
"description": "Toujours définir la barre latérale en mode compact", "description": "Toujours définir la barre latérale en mode compact",
"name": "Barre latérale compacte" "name": "Barre latérale compacte"

View File

@ -161,7 +161,8 @@
"default": "Predefinito", "default": "Predefinito",
"force-show": "Forza la visualizzazione", "force-show": "Forza la visualizzazione",
"hide": "Nascondi", "hide": "Nascondi",
"label": "Pulsanti Like" "label": "Pulsanti Like",
"swap": "Scambia l'ordine dei pulsanti like"
}, },
"remove-upgrade-button": "Rimuovi il pulsante aggiorna", "remove-upgrade-button": "Rimuovi il pulsante aggiorna",
"theme": { "theme": {
@ -412,6 +413,17 @@
"no-captions": "Nessun sottotitolo disponibile per questa canzone" "no-captions": "Nessun sottotitolo disponibile per questa canzone"
} }
}, },
"clock": {
"description": "Aggiungi un orologio alla barra di navigazione",
"menu": {
"format": {
"24-hour-format": "Formato in 24 ore",
"display-seconds": "Mostra Secondi",
"label": "Formato"
}
},
"name": "Orologio"
},
"compact-sidebar": { "compact-sidebar": {
"description": "Imposta sempre la barra laterale in modalità compatta", "description": "Imposta sempre la barra laterale in modalità compatta",
"name": "Barra laterale compatta" "name": "Barra laterale compatta"

View File

@ -2,13 +2,13 @@
"common": { "common": {
"console": { "console": {
"plugins": { "plugins": {
"execute-failed": "확장 {{pluginName}}::{{contextName}}을(를) 실행하지 못했습니다", "execute-failed": "확장 {{pluginName}}::{{contextName}}을(를) 실행 실패함",
"executed-at-ms": "확장 {{pluginName}}::{{contextName}}이 {{ms}}ms 만에 실행됨", "executed-at-ms": "확장 {{pluginName}}::{{contextName}}이 {{ms}}ms 만에 실행됨",
"initialize-failed": "확장 \"{{pluginName}}\"을(를) 초기화하지 못했습니다", "initialize-failed": "확장 \"{{pluginName}}\"을(를) 초기화 실패함",
"load-all": "모든 확장 로드 중", "load-all": "모든 확장 로드 중",
"load-failed": "확장 \"{{pluginName}}\"을(를) 로드하지 못했습니다", "load-failed": "확장 \"{{pluginName}}\"을(를) 로드하지 못했습니다",
"loaded": "확장 \"{{pluginName}}\" 로드됨", "loaded": "확장 \"{{pluginName}}\" 로드됨",
"unload-failed": "확장 \"{{pluginName}}\"을(를) 언로드하지 못했습니다", "unload-failed": "확장 \"{{pluginName}}\"을(를) 언로드 실패함",
"unloaded": "확장 \"{{pluginName}}\" 언로드 됨" "unloaded": "확장 \"{{pluginName}}\" 언로드 됨"
} }
} }
@ -21,7 +21,7 @@
"main": { "main": {
"console": { "console": {
"did-finish-load": { "did-finish-load": {
"dev-tools": "로드 완료되었습니다. 개발자 도구가 열렸습니다" "dev-tools": "로드 완료. 개발자 도구 실행됨"
}, },
"i18n": { "i18n": {
"loaded": "국제화 로드됨" "loaded": "국제화 로드됨"
@ -30,32 +30,32 @@
"receive-command": "프로토콜을 통해 명령을 받았습니다: \"{{command}}\"" "receive-command": "프로토콜을 통해 명령을 받았습니다: \"{{command}}\""
}, },
"theme": { "theme": {
"css-file-not-found": "CSS 파일 \"{{cssFile}}\"이(가) 존재하지 않습니다. 무시합니다" "css-file-not-found": "CSS 파일 \"{{cssFile}}\"이(가) 존재하지 않. 무시"
}, },
"unresponsive": { "unresponsive": {
"details": "응답 없음 오류!\n{{error}}" "details": "응답 없음 오류!\n{{error}}"
}, },
"when-ready": { "when-ready": {
"clearing-cache-after-20s": "앱 캐시 지우" "clearing-cache-after-20s": "앱 캐시 지우는 중"
}, },
"window": { "window": {
"tried-to-render-offscreen": "창이 오프스크린 렌더링을 시도했습니다. windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}" "tried-to-render-offscreen": "창이 오프스크린 렌더링을 시도했습니다, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
} }
}, },
"dialog": { "dialog": {
"hide-menu-enabled": { "hide-menu-enabled": {
"detail": "'Alt' 키를 눌러 숨겨진 메뉴를 표시할 수 있습니다 (인앱 메뉴를 사용하는 경우 'Esc' 키를 사용)", "detail": "'Alt' 키를 눌러 숨겨진 메뉴를 표시할 수 있습니다 (인앱 메뉴를 사용하는 경우 'Esc' 키를 사용)",
"message": "메뉴 숨기기가 활성화되어 있습니다", "message": "메뉴 숨기기가 활성화되어 있",
"title": "메뉴 숨기기 활성화됨" "title": "메뉴 숨기기 활성화됨"
}, },
"need-to-restart": { "need-to-restart": {
"buttons": { "buttons": {
"later": "나중에 하기", "later": "나중에",
"restart-now": "지금 재시작하기" "restart-now": "지금 재시작하기"
}, },
"detail": "\"{{pluginName}}\" 확장을 적용하려면 재시작해야 합니다", "detail": "\"{{pluginName}}\" 확장을 적용하려면 재시작해야 합니다",
"message": "\"{{pluginName}}\"은(는) 재시작이 필요합니다", "message": "\"{{pluginName}}\"은(는) 재시작이 필요합니다",
"title": "재시작 필요" "title": "재시작 필요"
}, },
"unresponsive": { "unresponsive": {
"buttons": { "buttons": {
@ -63,17 +63,17 @@
"relaunch": "재시작", "relaunch": "재시작",
"wait": "기다리기" "wait": "기다리기"
}, },
"detail": "불편을 드려 죄송합니다! 방법을 선택해 주세요:", "detail": "불편을 드려 죄송합니다! 다음 중 하나를 선택해 주세요.",
"message": "애플리케이션이 응답하지 않습니다", "message": "애플리케이션이 응답하지 않습니다",
"title": "창이 응답하지 않음" "title": "창이 응답하지 않음"
}, },
"update-available": { "update-available": {
"buttons": { "buttons": {
"disable": "업데이트 비활성화", "disable": "업데이트 비활성화하기",
"download": "다운로드", "download": "다운로드",
"ok": "확인" "ok": "확인"
}, },
"detail": "새 버전이 출시되었습니다. {{downloadLink}}에서 다운로드할 수 있습니다", "detail": "새 버전 {{downloadLink}}에서 설치할 수 있습니다",
"message": "새 버전을 사용할 수 있습니다", "message": "새 버전을 사용할 수 있습니다",
"title": "업데이트 사용 가능" "title": "업데이트 사용 가능"
} }
@ -96,23 +96,23 @@
"advanced-options": { "advanced-options": {
"label": "고급 설정", "label": "고급 설정",
"submenu": { "submenu": {
"auto-reset-app-cache": "앱 시작 시 앱 캐시 초기화", "auto-reset-app-cache": "앱 시작 시 앱 캐시 초기화하기",
"disable-hardware-acceleration": "하드웨어 가속 비활성화", "disable-hardware-acceleration": "하드웨어 가속 비활성화",
"edit-config-json": "config.json 편집", "edit-config-json": "config.json 편집",
"override-user-agent": "User-Agent 재정의", "override-user-agent": "User-Agent 재정의하기",
"restart-on-config-changes": "설정 변경 시 재시작", "restart-on-config-changes": "설정 변경 시 재시작하기",
"set-proxy": { "set-proxy": {
"label": "프록시 설정", "label": "프록시 설정하기",
"prompt": { "prompt": {
"label": "프록시 주소를 입력하세요: (비워두면 비활성화됨)", "label": "프록시 주소를 입력하세요: (비어있을 시 비활성화됨)",
"placeholder": "예제: SOCKS5://127.0.0.1:9999", "placeholder": "예제: SOCKS5://127.0.0.1:9999",
"title": "프록시 설정" "title": "프록시 설정하기"
} }
}, },
"toggle-dev-tools": "DevTools 열기" "toggle-dev-tools": "DevTools 열기"
} }
}, },
"always-on-top": "항상 최상단에 표시", "always-on-top": "항상 최상단에 표시하기",
"auto-update": "자동 업데이트", "auto-update": "자동 업데이트",
"hide-menu": { "hide-menu": {
"dialog": { "dialog": {
@ -153,15 +153,16 @@
"custom-window-title": { "custom-window-title": {
"label": "사용자 정의 앱 제목", "label": "사용자 정의 앱 제목",
"prompt": { "prompt": {
"label": "앱 제목으로 표시할 내용 : (빈 칸 일시 비활성화)", "label": "앱 제목으로 표시할 내용: (빈칸일 시 비활성화)",
"placeholder": "예: {{applicationName}}" "placeholder": "예: {{applicationName}}"
} }
}, },
"like-buttons": { "like-buttons": {
"default": "기본", "default": "기본",
"force-show": "강제로 표시", "force-show": "강제로 표시하기",
"hide": "숨기기", "hide": "숨기기",
"label": "좋아요 버튼" "label": "좋아요 버튼",
"swap": "\"좋아요\" 버튼 순서 변경하기"
}, },
"remove-upgrade-button": "업그레이드 버튼 제거", "remove-upgrade-button": "업그레이드 버튼 제거",
"theme": { "theme": {
@ -186,7 +187,7 @@
"plugins": { "plugins": {
"enabled": "활성화", "enabled": "활성화",
"label": "확장", "label": "확장",
"new": "NEW" "new": "새 플러그인"
}, },
"view": { "view": {
"label": "보기", "label": "보기",
@ -215,7 +216,7 @@
}, },
"plugins": { "plugins": {
"ad-speedup": { "ad-speedup": {
"description": "광고가 재생될 때, 오디오가 음소거고 재생 속도 16배로 설정니다", "description": "광고가 재생될 때 소리를 음소거고 재생 속도 16배로 설정니다",
"name": "광고 배속" "name": "광고 배속"
}, },
"adblocker": { "adblocker": {
@ -243,7 +244,7 @@
"name": "앨범 컬러 기반 테마" "name": "앨범 컬러 기반 테마"
}, },
"ambient-mode": { "ambient-mode": {
"description": "영상의 간접 조명을 화면 배경에 투사합니다", "description": "영상의 간접 조명을 화면 배경에 투사하여 조명 효과를 적용합니다",
"menu": { "menu": {
"blur-amount": { "blur-amount": {
"label": "흐림 효과 강도", "label": "흐림 효과 강도",
@ -252,7 +253,7 @@
} }
}, },
"buffer": { "buffer": {
"label": "버퍼", "label": "버퍼",
"submenu": { "submenu": {
"buffer": "{{buffer}}" "buffer": "{{buffer}}"
} }
@ -289,7 +290,7 @@
}, },
"amuse": { "amuse": {
"description": "6K Labs Amuse의 'now playing' 위젯에 {{applicationName}} 지원 추가", "description": "6K Labs Amuse의 'now playing' 위젯에 {{applicationName}} 지원 추가",
"name": "Amuseio AB", "name": "Amuse (어뮤즈)",
"response": { "response": {
"query": "Amuse API 서버가 실행 중입니다. GET /query로 노래 정보를 가져오세요." "query": "Amuse API 서버가 실행 중입니다. GET /query로 노래 정보를 가져오세요."
} }
@ -358,10 +359,10 @@
"name": "오디오 컴프레서" "name": "오디오 컴프레서"
}, },
"auth-proxy-adapter": { "auth-proxy-adapter": {
"description": "아이디/패스워드가 필요한 프록시를 지원합니다", "description": "인증이 필요한 프록시를 지원합니다",
"menu": { "menu": {
"disable": "프록시 어댑터 차단", "disable": "프록시 어댑터 비활성화",
"enable": "프록시 어댑터 허용", "enable": "프록시 어댑터 활성화",
"hostname": { "hostname": {
"label": "호스트 명" "label": "호스트 명"
}, },
@ -372,11 +373,11 @@
"name": "권한 프록시 어댑터", "name": "권한 프록시 어댑터",
"prompt": { "prompt": {
"hostname": { "hostname": {
"label": "로컬 프록시 서버의 호스트명 을 입력 해주세요 (재시이 필요합니다):", "label": "로컬 프록시 서버의 호스트명을 입력해주세요 (재시이 필요합니다):",
"title": "프록시 호스트명" "title": "프록시 호스트명"
}, },
"port": { "port": {
"label": "로컬 프록시 서버의 포트를 입력 해주세요 (재시이 필요합니다):", "label": "로컬 프록시 서버의 포트를 입력 해주세요 (재시이 필요합니다):",
"title": "프록시 포트" "title": "프록시 포트"
} }
} }
@ -386,7 +387,7 @@
"name": "탐색 바 흐림 효과" "name": "탐색 바 흐림 효과"
}, },
"bypass-age-restrictions": { "bypass-age-restrictions": {
"description": "음악 플레이어의 연령 확인 우회합니다", "description": "플레이어의 연령 확인 인증 우회",
"name": "나이 제한 우회" "name": "나이 제한 우회"
}, },
"captions-selector": { "captions-selector": {
@ -408,10 +409,21 @@
}, },
"toast": { "toast": {
"caption-changed": "자막 언어가 {{language}}(으)로 변경되었습니다", "caption-changed": "자막 언어가 {{language}}(으)로 변경되었습니다",
"caption-disabled": "자막 비활성화 되었습니다", "caption-disabled": "자막 비활성화",
"no-captions": "이 곡에는 자막이 없습니다" "no-captions": "이 곡에는 자막이 없습니다"
} }
}, },
"clock": {
"description": "네비게이션 바 옆 시계 추가하기",
"menu": {
"format": {
"24-hour-format": "24시간 형식",
"display-seconds": "초 표시하기",
"label": "형식"
}
},
"name": "시계"
},
"compact-sidebar": { "compact-sidebar": {
"description": "사이드바를 항상 컴팩트 모드로 설정합니다", "description": "사이드바를 항상 컴팩트 모드로 설정합니다",
"name": "컴팩트 사이드바" "name": "컴팩트 사이드바"
@ -439,9 +451,9 @@
} }
}, },
"custom-output-device": { "custom-output-device": {
"description": "미디어 출력 장치 구성", "description": "미디어 출력할­ 장치 구성하기",
"menu": { "menu": {
"device-selector": "장치 선택" "device-selector": "장치 선택하세요"
}, },
"name": "출력 장치 커스텀", "name": "출력 장치 커스텀",
"prompt": { "prompt": {
@ -461,16 +473,16 @@
"discord": { "discord": {
"backend": { "backend": {
"already-connected": "활성화 된 연결에 연결을 시도했습니다", "already-connected": "활성화 된 연결에 연결을 시도했습니다",
"connected": "디스코드에 연결됨", "connected": "Discord에 연결됨",
"disconnected": "디스코드에서 연결이 끊김" "disconnected": "Discord에서 연결이 끊김"
}, },
"description": "활동 상태를 사용하여 친구들에게 내가 듣는 음악을 보여주세요", "description": "Rich Presence를 사용하여 친구들에게 내가 듣는 음악을 보여주세요",
"menu": { "menu": {
"auto-reconnect": "자동 연결", "auto-reconnect": "자동 연결",
"clear-activity": "활동 제거", "clear-activity": "활동 제거",
"clear-activity-after-timeout": "시간 초과 시 활동 제거", "clear-activity-after-timeout": "시간 초과 시 활동 제거",
"connected": "연결 됨", "connected": "연결됨",
"disconnected": "연결 해제 됨", "disconnected": "연결 해제됨",
"hide-duration-left": "남은 재생 시간 숨기기", "hide-duration-left": "남은 재생 시간 숨기기",
"hide-github-button": "GitHub 링크 버튼 숨기기", "hide-github-button": "GitHub 링크 버튼 숨기기",
"play-on-application": "{{applicationName}} 에서 재생", "play-on-application": "{{applicationName}} 에서 재생",
@ -484,7 +496,7 @@
} }
} }
}, },
"name": "디스코드 활동 상태", "name": "Discord 활동 상태",
"prompt": { "prompt": {
"set-inactivity-timeout": { "set-inactivity-timeout": {
"label": "비활성 시간 제한을 초 단위로 입력하세요:", "label": "비활성 시간 제한을 초 단위로 입력하세요:",
@ -499,7 +511,7 @@
"buttons": { "buttons": {
"ok": "확인" "ok": "확인"
}, },
"message": "죄송합니다. 다운로드가 실패했습니다…", "message": "앗! 죄송합니다. 다운로드가 실패했습니다…",
"title": "다운로드 중 오류 발생!" "title": "다운로드 중 오류 발생!"
}, },
"start-download-playlist": { "start-download-playlist": {
@ -512,7 +524,7 @@
} }
}, },
"feedback": { "feedback": {
"conversion-progress": "변환: {{percent}}%", "conversion-progress": "변환: {{percent}}%",
"converting": "변환 중…", "converting": "변환 중…",
"done": "완료: {{filePath}}", "done": "완료: {{filePath}}",
"download-info": "{{artist}} - {{title}} [{{videoId}} 다운로드 중", "download-info": "{{artist}} - {{title}} [{{videoId}} 다운로드 중",
@ -527,7 +539,7 @@
"playlist-has-only-one-song": "재생목록에 한 항목만 존재합니다. 직접 다운로드합니다", "playlist-has-only-one-song": "재생목록에 한 항목만 존재합니다. 직접 다운로드합니다",
"playlist-id-not-found": "재생목록 ID를 찾을 수 없습니다", "playlist-id-not-found": "재생목록 ID를 찾을 수 없습니다",
"playlist-is-empty": "재생목록이 비어있습니다", "playlist-is-empty": "재생목록이 비어있습니다",
"playlist-is-mix-or-private": "재생목록 정보 가져오는 중 오류 발생: 비공개 재생목록 또는 '유튜브 Mix' 재생목록이 아닌지 확인하세요\n\n{{error}}", "playlist-is-mix-or-private": "재생목록 정보 가져오는 중 오류 발생: 비공개 재생목록 또는 \"나만을 위한 맞춤 믹스\" 재생목록이 아닌지 확인하세요\n\n{{error}}",
"preparing-file": "파일 준비 중…", "preparing-file": "파일 준비 중…",
"saving": "저장 중…", "saving": "저장 중…",
"trying-to-get-playlist-id": "재생목록 ID를 가져오는 중: {{playlistId}}", "trying-to-get-playlist-id": "재생목록 ID를 가져오는 중: {{playlistId}}",

View File

@ -396,6 +396,17 @@
"no-captions": "Pre túto skladbu nie sú dostupné žiadne titulky" "no-captions": "Pre túto skladbu nie sú dostupné žiadne titulky"
} }
}, },
"clock": {
"description": "Pridať hodiny do navigačnej lišty",
"menu": {
"format": {
"24-hour-format": "24-hodinový formát",
"display-seconds": "Zobraz sekundy",
"label": "Formát"
}
},
"name": "Hodiny"
},
"compact-sidebar": { "compact-sidebar": {
"description": "Vždy nastaviť bočný panel do kompaktného režimu", "description": "Vždy nastaviť bočný panel do kompaktného režimu",
"name": "Kompaktný bočný panel" "name": "Kompaktný bočný panel"
@ -462,8 +473,8 @@
"set-status-display-type": { "set-status-display-type": {
"label": "Text stavu", "label": "Text stavu",
"submenu": { "submenu": {
"artist": "Aktuálne si prehráva {artist}",
"application": "Počúvať {{applicationName}}", "application": "Počúvať {{applicationName}}",
"artist": "Aktuálne si prehráva {artist}",
"title": "Aktuálne si prehráva {song title}" "title": "Aktuálne si prehráva {song title}"
} }
} }

View File

@ -0,0 +1,31 @@
{
"common": {
"console": {
"plugins": {
"execute-failed": "{{pluginName}}::{{contextName}} ప్లగిన్‌ను అమలు చేయడంలో విఫలమైంది",
"executed-at-ms": "{{pluginName}}::{{contextName}} ప్లగిన్ అమలు చేయబడిన సమయం {{ms}} మిల్లీసెకను",
"initialize-failed": "\"{{pluginName}}\" ప్లగిన్‌ను ప్రారంభించడంలో విఫలమైంది",
"load-all": "అన్నీ ప్లగిన్లను లోడ్ చెయ్యబడుతోంది",
"load-failed": "\"{{pluginName}}\" ప్లగిన్ లోడ్ చేయడంలో విఫలమైంది",
"loaded": "ప్లగిన్ \"{{pluginName}}\" లోడ్ చేయబడింది",
"unload-failed": "“{{pluginName}}” ప్లగిన్‌ను అన్‌లోడ్ చేయడంలో విఫలమైంది",
"unloaded": "\"{{pluginName}}\" ప్లగిన్ అన్‌లోడ్ చేయబడింది"
}
}
},
"language": {
"code": "te",
"local-name": "తెలుగు",
"name": "Telugu"
},
"main": {
"console": {
"did-finish-load": {
"dev-tools": "లోడ్ చేయడం పూర్తయింది. డెవ్‌టూల్స్ తెరవబడ్డాయి"
},
"i18n": {
"loaded": "i18n లోడ్ చేయబడింది"
}
}
}
}

View File

@ -53,9 +53,9 @@
"later": "Daha Sonra", "later": "Daha Sonra",
"restart-now": "Şimdi yeniden başlat" "restart-now": "Şimdi yeniden başlat"
}, },
"detail": "\"{{pluginName}}\" eklentisinin çalışabilmesi için yeniden başlatman gerekiyor", "detail": "\"{{pluginName}}\" eklentisinin çalışması için uygulamanın yeniden başlatılması gerekiyor",
"message": "\"{{pluginName}}\" için yeniden başlatman gerekiyor", "message": "\"{{pluginName}}\" eklentisi için uygulamanın yeniden başlatılması gerekiyor",
"title": "Uygulamayı yeniden başlatman gerekiyor" "title": "Uygulamanın yeniden başlatılması gerekiyor"
}, },
"unresponsive": { "unresponsive": {
"buttons": { "buttons": {
@ -161,7 +161,8 @@
"default": "Varsayılan", "default": "Varsayılan",
"force-show": "Zorla göster", "force-show": "Zorla göster",
"hide": "Gizle", "hide": "Gizle",
"label": "Beğenme düğmeleri" "label": "Beğenme düğmeleri",
"swap": "Beğenme butonlarının sıralamasını değiştir"
}, },
"remove-upgrade-button": "Yükseltme düğmesini kaldır", "remove-upgrade-button": "Yükseltme düğmesini kaldır",
"theme": { "theme": {
@ -412,6 +413,17 @@
"no-captions": "Bu şarkı için altyazı mevcut değil" "no-captions": "Bu şarkı için altyazı mevcut değil"
} }
}, },
"clock": {
"description": "Navigasyon barına bir saat ekle",
"menu": {
"format": {
"24-hour-format": "24-Saat Formatı, Biçimi",
"display-seconds": "Saniyeleri göster",
"label": "Format, Biçim"
}
},
"name": "Saat"
},
"compact-sidebar": { "compact-sidebar": {
"description": "Her zaman kompakt kenar çubugu", "description": "Her zaman kompakt kenar çubugu",
"name": "Kompakt Kenar Çubuğu" "name": "Kompakt Kenar Çubuğu"

View File

@ -1,15 +1,9 @@
import { import { type DataConnection, Peer, type PeerError } from 'peerjs';
type DataConnection,
Peer,
type PeerError,
PeerErrorType,
} from 'peerjs';
import delay from 'delay';
import type { Permission, Profile, VideoData } from './types'; import type { Permission, Profile, VideoData } from './types';
export type ConnectionEventMap = { export type ConnectionEventMap = {
CLEAR_QUEUE: {}; CLEAR_QUEUE: null;
ADD_SONGS: { videoList: VideoData[]; index?: number }; ADD_SONGS: { videoList: VideoData[]; index?: number };
REMOVE_SONG: { index: number }; REMOVE_SONG: { index: number };
MOVE_SONG: { fromIndex: number; toIndex: number }; MOVE_SONG: { fromIndex: number; toIndex: number };
@ -104,16 +98,14 @@ export class Connection {
this.peer.disconnect(); this.peer.disconnect();
this.peer.destroy(); this.peer.destroy();
}); });
this.peer.on('error', async (err) => { this.peer.on('error', (err) => {
if (err.type === PeerErrorType.Network) { if (err.type === 'network') {
// retrying after 10 seconds setTimeout(() => {
await delay(10000);
try { try {
this.peer.reconnect(); this.peer.reconnect();
} catch {}
}, 10000);
return; return;
} catch {
//ignored
}
} }
this.waitOpen.reject(err); this.waitOpen.reject(err);
@ -176,7 +168,9 @@ export class Connection {
after?: ConnectionEventUnion[], after?: ConnectionEventUnion[],
) { ) {
await Promise.all( await Promise.all(
this.getConnections().map((conn) => conn.send({ type, payload, after })), this.getConnections().map(
(conn) => conn.send({ type, payload, after }) ?? Promise.resolve(),
),
); );
} }

View File

@ -224,7 +224,7 @@ export default createPlugin<
} }
this.queue?.clear(); this.queue?.clear();
await this.connection?.broadcast('CLEAR_QUEUE', {}); await this.connection?.broadcast('CLEAR_QUEUE', null);
break; break;
} }
case 'SET_INDEX': { case 'SET_INDEX': {
@ -413,7 +413,7 @@ export default createPlugin<
this.ignoreChange = true; this.ignoreChange = true;
switch (event.type) { switch (event.type) {
case 'CLEAR_QUEUE': { case 'CLEAR_QUEUE': {
await this.connection?.broadcast('CLEAR_QUEUE', {}); await this.connection?.broadcast('CLEAR_QUEUE', null);
break; break;
} }
case 'SET_INDEX': { case 'SET_INDEX': {

View File

@ -316,7 +316,7 @@ export class Queue {
this.ignoreFlag = true; this.ignoreFlag = true;
this.broadcast({ this.broadcast({
type: 'CLEAR_QUEUE', type: 'CLEAR_QUEUE',
payload: {}, payload: null,
}); });
return; return;
} }

View File

@ -7,6 +7,7 @@ import * as pinyin from 'tiny-pinyin';
import { romanize as romanizeThaiFrag } from '@dehoist/romanize-thai'; import { romanize as romanizeThaiFrag } from '@dehoist/romanize-thai';
import { lazy } from 'lazy-var'; import { lazy } from 'lazy-var';
import { detect } from 'tinyld'; import { detect } from 'tinyld';
import Sanscript from '@indic-transliteration/sanscript';
import { waitForElement } from '@/utils/wait-for-element'; import { waitForElement } from '@/utils/wait-for-element';
import { LyricsRenderer, setIsVisible } from './renderer'; import { LyricsRenderer, setIsVisible } from './renderer';
@ -155,6 +156,12 @@ const hasChinese = (lines: string[]) =>
const hasThai = (lines: string[]) => const hasThai = (lines: string[]) =>
lines.some((line) => /[\u0E00-\u0E7F]+/.test(line)); lines.some((line) => /[\u0E00-\u0E7F]+/.test(line));
const hasBengali = (lines: string[]) =>
lines.some((line) => /[\u0980-\u09FF]+/.test(line));
const hasHindi = (lines: string[]) =>
lines.some((line) => /[\u0900-\u097F]+/.test(line));
export const romanizeJapanese = async (line: string) => export const romanizeJapanese = async (line: string) =>
(await kuroshiro.get()).convert(line, { (await kuroshiro.get()).convert(line, {
to: 'romaji', to: 'romaji',
@ -190,11 +197,35 @@ export const romanizeThai = (line: string) => {
return latin; return latin;
}; };
export const romanizeBengali = (line: string) => {
try {
let out = Sanscript.t(line, 'bengali', 'iast');
out = out.normalize('NFD');
out = out.replace(/[\u0300-\u036f]/g, '');
out = out.replace(/[\u09BC\u09BE-\u09CD]/g, '');
return out.toLowerCase();
} catch {
return line;
}
};
export const romanizeHindi = (line: string) => {
try {
let out = Sanscript.t(line, 'devanagari', 'iast');
out = out.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); // strip accents
return out.replace(/[^a-zA-Z\s]/g, '') || line; // remove any remaining symbols
} catch {
return line;
}
};
const handlers: Record<string, (line: string) => Promise<string> | string> = { const handlers: Record<string, (line: string) => Promise<string> | string> = {
ja: romanizeJapanese, ja: romanizeJapanese,
ko: romanizeHangul, ko: romanizeHangul,
zh: romanizeChinese, zh: romanizeChinese,
th: romanizeThai, th: romanizeThai,
bn: romanizeBengali,
hi: romanizeHindi,
}; };
export const romanize = async (line: string) => { export const romanize = async (line: string) => {
@ -210,6 +241,8 @@ export const romanize = async (line: string) => {
if (hasKorean([line])) line = romanizeHangul(line); if (hasKorean([line])) line = romanizeHangul(line);
if (hasChinese([line])) line = romanizeChinese(line); if (hasChinese([line])) line = romanizeChinese(line);
if (hasThai([line])) line = romanizeThai(line); if (hasThai([line])) line = romanizeThai(line);
if (hasBengali([line])) line = romanizeBengali(line);
if (hasHindi([line])) line = romanizeHindi(line);
return line; return line;
}; };