mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 18:41:47 +00:00
Compare commits
123 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f99ca53a6d | |||
| 8700c1a110 | |||
| c5e37b791c | |||
| 307f6387ab | |||
| 652a150a0a | |||
| 2c59badb46 | |||
| 69087bbf1f | |||
| af78f1596a | |||
| fca936a698 | |||
| 54b70f6b3e | |||
| 62f7d440fa | |||
| 752ccbf482 | |||
| a8bc53912d | |||
| ed700c2916 | |||
| 97695444af | |||
| 85e5e1814a | |||
| 88c84a50d0 | |||
| 0004fb3fc8 | |||
| 9cbaf5797b | |||
| 1df75ae82f | |||
| 4d86af5437 | |||
| ba0876fd8b | |||
| a3a3fca694 | |||
| de4396936d | |||
| 164575296f | |||
| 7e8cbfc4c0 | |||
| 679938ccf7 | |||
| 5a6d681bf4 | |||
| 62304b723e | |||
| c89bb4606f | |||
| 14c50e0d57 | |||
| f7e9cf9a29 | |||
| 4bb3f41828 | |||
| e4759ebe25 | |||
| ce33a92f02 | |||
| dd44c07450 | |||
| 15a5b7a820 | |||
| 41b7e095eb | |||
| f34a297fcf | |||
| 9b2c1a320b | |||
| 70ed6f8e6c | |||
| 5a2489f0bf | |||
| a7d035022a | |||
| b879a70b24 | |||
| ec4e9a1d47 | |||
| d9c52c0a7f | |||
| 81ecf18231 | |||
| b0b12a075d | |||
| 54c428083c | |||
| 60228a387a | |||
| 3e04baef00 | |||
| 573bcba1a0 | |||
| ae2fad5db3 | |||
| c8fc12569c | |||
| df8efe3fa4 | |||
| 251131b9b5 | |||
| 35fb61087a | |||
| cbec88ff47 | |||
| f4319616a6 | |||
| 1534b7a67f | |||
| cbfcc9d140 | |||
| 60d10a9222 | |||
| 17e090d5c5 | |||
| fa6b4fa83b | |||
| e4b5244d95 | |||
| 04dc5d6314 | |||
| 33ccb03f90 | |||
| 80011ed3aa | |||
| 3e43cf5959 | |||
| bbd590dde8 | |||
| 0975a951e4 | |||
| 8b78f227a7 | |||
| 5a93a04b61 | |||
| b971eb4191 | |||
| 403e825b8d | |||
| 9164eba88c | |||
| bb83bbac38 | |||
| 651a641b22 | |||
| 441b5fc8dd | |||
| 4fba9445d1 | |||
| 3fb5e01ca5 | |||
| 09b2b0d507 | |||
| a9be35481a | |||
| c871506a69 | |||
| 8e6790d366 | |||
| 46620c5ec9 | |||
| 5f090169da | |||
| 2205150b86 | |||
| 3c4bb8a8fc | |||
| 77d0e71529 | |||
| cf974e2d62 | |||
| ee03db4745 | |||
| efd2061058 | |||
| e7ed20f62f | |||
| 36d4c08a56 | |||
| 2a939e615c | |||
| 9825165286 | |||
| 55c934ac7c | |||
| c7715115ee | |||
| e93b5e8135 | |||
| fd6ba1eda1 | |||
| 34f5411aec | |||
| 2b74ec2ef8 | |||
| 14dd0e8e03 | |||
| b0156261b7 | |||
| 05d520f1c1 | |||
| ccd44c79e8 | |||
| 7be48ab05e | |||
| 2d40b410b5 | |||
| f54df86eec | |||
| 1be476de54 | |||
| 82fa8719a9 | |||
| 7600620c4a | |||
| c5217f3e1e | |||
| 706279852a | |||
| 3a6274504f | |||
| 3aa9398481 | |||
| 7cca435b1d | |||
| 241b5800d1 | |||
| 8abb8acdd3 | |||
| ef8226c091 | |||
| 7484e1bf9a | |||
| 2919fd54b7 |
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -29,7 +29,7 @@ body:
|
|||||||
label: Checklists
|
label: Checklists
|
||||||
options:
|
options:
|
||||||
- label: I use the portable version of the YouTube Music Application.
|
- label: I use the portable version of the YouTube Music Application.
|
||||||
- label: I can reproduce this issue in the [official YTM web version](https://music.youtube.com).
|
- label: I can reproduce this issue in the [official version of (WEB) YTM](https://music.youtube.com).
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
attributes:
|
attributes:
|
||||||
label: What operating system are you using?
|
label: What operating system are you using?
|
||||||
|
|||||||
153
README.md
153
README.md
@ -1,7 +1,7 @@
|
|||||||
# YouTube Music
|
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
|
# YouTube Music
|
||||||
|
|
||||||
[](https://github.com/th-ch/youtube-music/releases/)
|
[](https://github.com/th-ch/youtube-music/releases/)
|
||||||
[](https://github.com/th-ch/youtube-music/blob/master/LICENSE)
|
[](https://github.com/th-ch/youtube-music/blob/master/LICENSE)
|
||||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||||
@ -21,7 +21,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Read this in other languages: [🇰🇷](./docs/readme/README-ko.md)
|
Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸](./docs/readme/README-is.md)
|
||||||
|
|
||||||
**Electron wrapper around YouTube Music featuring:**
|
**Electron wrapper around YouTube Music featuring:**
|
||||||
|
|
||||||
@ -35,69 +35,26 @@ Read this in other languages: [🇰🇷](./docs/readme/README-ko.md)
|
|||||||
|:---------------------------------------------------------------------------------------------------------:|
|
|:---------------------------------------------------------------------------------------------------------:|
|
||||||
||
|
||
|
||||||
|
|
||||||
## Translation
|
## Content
|
||||||
|
|
||||||
You can help with translation on [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
- [Features](#features)
|
||||||
|
- [Available plugins](#available-plugins)
|
||||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
- [Translation](#translation)
|
||||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="translation status" />
|
- [Download](#download)
|
||||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
- [Arch Linux](#arch-linux)
|
||||||
</a>
|
- [MacOS](#macos)
|
||||||
|
- [Windows](#windows)
|
||||||
## Download
|
- [How to install without a network connection? (in Windows)](#how-to-install-without-a-network-connection-in-windows)
|
||||||
|
- [Themes](#themes)
|
||||||
You can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the
|
- [Dev](#dev)
|
||||||
latest version.
|
- [Build your own plugins](#build-your-own-plugins)
|
||||||
|
- [Creating a plugin](#creating-a-plugin)
|
||||||
### Arch Linux
|
- [Common use cases](#common-use-cases)
|
||||||
|
- [Build](#build)
|
||||||
Install the `youtube-music-bin` package from the AUR. For AUR installation instructions, take a look at
|
- [Production Preview](#production-preview)
|
||||||
this [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
- [Tests](#tests)
|
||||||
|
- [License](#license)
|
||||||
### MacOS
|
- [FAQ](#faq)
|
||||||
|
|
||||||
You can install the app using Homebrew (see the [cask definition](https://github.com/th-ch/homebrew-youtube-music)):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
brew install th-ch/youtube-music/youtube-music
|
|
||||||
```
|
|
||||||
|
|
||||||
If you install the app manually and get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
xattr -cr /Applications/YouTube\ Music.app
|
|
||||||
```
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
You can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from
|
|
||||||
the [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
scoop bucket add extras
|
|
||||||
scoop install extras/youtube-music
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s
|
|
||||||
official CLI package manager to install the `th-ch.YouTubeMusic` package.
|
|
||||||
|
|
||||||
*Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also
|
|
||||||
true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same
|
|
||||||
file).*
|
|
||||||
|
|
||||||
```bash
|
|
||||||
winget install th-ch.YouTubeMusic
|
|
||||||
```
|
|
||||||
|
|
||||||
#### How to install without a network connection? (in Windows)
|
|
||||||
|
|
||||||
- Download the `*.nsis.7z` file for _your device architecture_ in [release page](https://github.com/th-ch/youtube-music/releases/latest).
|
|
||||||
- `x64` for 64-bit Windows
|
|
||||||
- `ia32` for 32-bit Windows
|
|
||||||
- `arm64` for ARM64 Windows
|
|
||||||
- Download installer in release page. (`*-Setup.exe`)
|
|
||||||
- Place them in the **same directory**.
|
|
||||||
- Run the installer.
|
|
||||||
|
|
||||||
## Features:
|
## Features:
|
||||||
|
|
||||||
@ -202,6 +159,70 @@ winget install th-ch.YouTubeMusic
|
|||||||
|
|
||||||
- **Visualizer**: Different music visualizers
|
- **Visualizer**: Different music visualizers
|
||||||
|
|
||||||
|
## Translation
|
||||||
|
|
||||||
|
You can help with translation on [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||||
|
|
||||||
|
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||||
|
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="translation status" />
|
||||||
|
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Download
|
||||||
|
|
||||||
|
You can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the
|
||||||
|
latest version.
|
||||||
|
|
||||||
|
### Arch Linux
|
||||||
|
|
||||||
|
Install the [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) package from the AUR. For AUR installation instructions, take a look at
|
||||||
|
this [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||||
|
|
||||||
|
### MacOS
|
||||||
|
|
||||||
|
You can install the app using Homebrew (see the [cask definition](https://github.com/th-ch/homebrew-youtube-music)):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install th-ch/youtube-music/youtube-music
|
||||||
|
```
|
||||||
|
|
||||||
|
If you install the app manually and get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
xattr -cr /Applications/YouTube\ Music.app
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
You can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from
|
||||||
|
the [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scoop bucket add extras
|
||||||
|
scoop install extras/youtube-music
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s
|
||||||
|
official CLI package manager to install the `th-ch.YouTubeMusic` package.
|
||||||
|
|
||||||
|
*Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also
|
||||||
|
true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same
|
||||||
|
file).*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
winget install th-ch.YouTubeMusic
|
||||||
|
```
|
||||||
|
|
||||||
|
#### How to install without a network connection? (in Windows)
|
||||||
|
|
||||||
|
- Download the `*.nsis.7z` file for _your device architecture_ in [release page](https://github.com/th-ch/youtube-music/releases/latest).
|
||||||
|
- `x64` for 64-bit Windows
|
||||||
|
- `ia32` for 32-bit Windows
|
||||||
|
- `arm64` for ARM64 Windows
|
||||||
|
- Download installer in release page. (`*-Setup.exe`)
|
||||||
|
- Place them in the **same directory**.
|
||||||
|
- Run the installer.
|
||||||
|
|
||||||
## Themes
|
## Themes
|
||||||
|
|
||||||
You can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).
|
You can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).
|
||||||
@ -368,7 +389,7 @@ Uses [Playwright](https://playwright.dev/) to test the app.
|
|||||||
|
|
||||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||||
|
|
||||||
## Most asked questions
|
## FAQ
|
||||||
|
|
||||||
### Why apps menu isn't showing up?
|
### Why apps menu isn't showing up?
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.1 KiB |
92
changelog.md
92
changelog.md
@ -2,8 +2,100 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
|
#### [v3.3.4](https://github.com/th-ch/youtube-music/compare/v3.3.3...v3.3.4)
|
||||||
|
|
||||||
|
- Update changelog for v3.3.3 [`9769544`](https://github.com/th-ch/youtube-music/commit/97695444affbacb71dd73ae7107d4c987e285a37)
|
||||||
|
- fix(style): fix fullscreen style and in-app-menu [`ed700c2`](https://github.com/th-ch/youtube-music/commit/ed700c2916cc7e6ccd2010d0c552364af116eb4f)
|
||||||
|
- fix(style): fix miniplayer style [`a8bc539`](https://github.com/th-ch/youtube-music/commit/a8bc53912d1f4137008ecb2d9d5d9d9eb06ee2a8)
|
||||||
|
|
||||||
|
#### [v3.3.3](https://github.com/th-ch/youtube-music/compare/v3.3.2...v3.3.3)
|
||||||
|
|
||||||
|
> 24 March 2024
|
||||||
|
|
||||||
|
- chore(deps): update dependency electron to v29.1.5 [`#1876`](https://github.com/th-ch/youtube-music/pull/1876)
|
||||||
|
- chore(deps): update dependency typescript to v5.4.3 [`#1877`](https://github.com/th-ch/youtube-music/pull/1877)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.37.76 [`#1878`](https://github.com/th-ch/youtube-music/pull/1878)
|
||||||
|
- chore(deps): update dependency vite to v5.2.4 [`#1881`](https://github.com/th-ch/youtube-music/pull/1881)
|
||||||
|
- Ambient Plugin cleanup [`#1880`](https://github.com/th-ch/youtube-music/pull/1880)
|
||||||
|
- chore(deps): update dependency vite to v5.2.2 [`#1875`](https://github.com/th-ch/youtube-music/pull/1875)
|
||||||
|
- fix(deps): update dependency solid-js to v1.8.16 [`#1873`](https://github.com/th-ch/youtube-music/pull/1873)
|
||||||
|
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.3.1 [`#1868`](https://github.com/th-ch/youtube-music/pull/1868)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.37.75 [`#1867`](https://github.com/th-ch/youtube-music/pull/1867)
|
||||||
|
- chore(deps): update pnpm to v8.15.5 [`#1865`](https://github.com/th-ch/youtube-music/pull/1865)
|
||||||
|
- fix: Fix Miniplayer image size [`#1863`](https://github.com/th-ch/youtube-music/pull/1863)
|
||||||
|
- fix(style): fixed image/video alignment when toggle is active [`#1862`](https://github.com/th-ch/youtube-music/pull/1862)
|
||||||
|
- chore: Update README-is.md [`#1858`](https://github.com/th-ch/youtube-music/pull/1858)
|
||||||
|
- chore(deps): update dependency vite-plugin-solid to v2.10.2 [`#1859`](https://github.com/th-ch/youtube-music/pull/1859)
|
||||||
|
- fix: Ambient Mode intialization improvement [`#1857`](https://github.com/th-ch/youtube-music/pull/1857)
|
||||||
|
- chore(deps): bump follow-redirects from 1.15.5 to 1.15.6 [`#1856`](https://github.com/th-ch/youtube-music/pull/1856)
|
||||||
|
- chore(README): Nicer Readme 2.0 [`#1833`](https://github.com/th-ch/youtube-music/pull/1833)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.37.74 [`#1854`](https://github.com/th-ch/youtube-music/pull/1854)
|
||||||
|
- chore(deps): update dependency esbuild to v0.20.2 [`#1855`](https://github.com/th-ch/youtube-music/pull/1855)
|
||||||
|
- Improve ambient mode [`#1853`](https://github.com/th-ch/youtube-music/pull/1853)
|
||||||
|
- chore(deps): update dependency electron to v29.1.4 [`#1852`](https://github.com/th-ch/youtube-music/pull/1852)
|
||||||
|
- chore(deps): update dependency electron to v29.1.3 [`#1851`](https://github.com/th-ch/youtube-music/pull/1851)
|
||||||
|
- chore(deps): update dependency rollup to v4.13.0 [`#1850`](https://github.com/th-ch/youtube-music/pull/1850)
|
||||||
|
- fix(deps): update dependency electron-store to v8.2.0 [`#1843`](https://github.com/th-ch/youtube-music/pull/1843)
|
||||||
|
- chore(deps): update dependency electron to v29.1.1 [`#1841`](https://github.com/th-ch/youtube-music/pull/1841)
|
||||||
|
- fix(deps): update dependency i18next to v23.10.1 [`#1842`](https://github.com/th-ch/youtube-music/pull/1842)
|
||||||
|
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.2.0 [`#1848`](https://github.com/th-ch/youtube-music/pull/1848)
|
||||||
|
- chore(deps): update dependency vite to v5.1.6 [`#1847`](https://github.com/th-ch/youtube-music/pull/1847)
|
||||||
|
- fix(deps): update dependency async-mutex to v0.5.0 [`#1849`](https://github.com/th-ch/youtube-music/pull/1849)
|
||||||
|
- fix(deps): update dependency ts-morph to v22 [`#1846`](https://github.com/th-ch/youtube-music/pull/1846)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.37.73 [`#1840`](https://github.com/th-ch/youtube-music/pull/1840)
|
||||||
|
- chore(deps): update dependency rollup to v4.12.1 [`#1837`](https://github.com/th-ch/youtube-music/pull/1837)
|
||||||
|
- chore: Changed a single word (README-is.md) [`#1836`](https://github.com/th-ch/youtube-music/pull/1836)
|
||||||
|
- chore(deps): update dependency typescript to v5.4.2 [`#1838`](https://github.com/th-ch/youtube-music/pull/1838)
|
||||||
|
- chore(deps): update dependency electron-vite to v2.1.0 [`#1823`](https://github.com/th-ch/youtube-music/pull/1823)
|
||||||
|
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.1.1 [`#1829`](https://github.com/th-ch/youtube-music/pull/1829)
|
||||||
|
- chore(deps): update dependency vite to v5.1.5 [`#1831`](https://github.com/th-ch/youtube-music/pull/1831)
|
||||||
|
- Revert "chore(deps): update dependency electron-builder to v24.13.3" [`#1818`](https://github.com/th-ch/youtube-music/pull/1818)
|
||||||
|
- chore(deps): update dependency electron-builder to v24.13.3 [`#1774`](https://github.com/th-ch/youtube-music/pull/1774)
|
||||||
|
- chore(deps): update playwright monorepo to v1.42.1 [`#1816`](https://github.com/th-ch/youtube-music/pull/1816)
|
||||||
|
- fix: Add scale ratio for tray icons [`#1811`](https://github.com/th-ch/youtube-music/pull/1811)
|
||||||
|
- Icelandic translation of the readme file [`#1806`](https://github.com/th-ch/youtube-music/pull/1806)
|
||||||
|
- chore(deps): update dependency electron to v29.1.0 [`#1808`](https://github.com/th-ch/youtube-music/pull/1808)
|
||||||
|
- chore(deps): update playwright monorepo to v1.42.0 [`#1805`](https://github.com/th-ch/youtube-music/pull/1805)
|
||||||
|
- chore(deps): update dependency eslint to v8.57.0 [`#1793`](https://github.com/th-ch/youtube-music/pull/1793)
|
||||||
|
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.1.0 [`#1800`](https://github.com/th-ch/youtube-music/pull/1800)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.37.71 [`#1799`](https://github.com/th-ch/youtube-music/pull/1799)
|
||||||
|
- chore(deps): update pnpm to v8.15.4 [`#1795`](https://github.com/th-ch/youtube-music/pull/1795)
|
||||||
|
- chore(deps): update dependency @types/semver to v7.5.8 [`#1797`](https://github.com/th-ch/youtube-music/pull/1797)
|
||||||
|
- fix: center the pause icon [`#1786`](https://github.com/th-ch/youtube-music/pull/1786)
|
||||||
|
- fix(deps): update dependency @cliqz/adblocker-electron to v1.26.16 [`#1788`](https://github.com/th-ch/youtube-music/pull/1788)
|
||||||
|
- fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.26.16 [`#1789`](https://github.com/th-ch/youtube-music/pull/1789)
|
||||||
|
- fix(deps): update dependency youtubei.js to v9.1.0 [`#1790`](https://github.com/th-ch/youtube-music/pull/1790)
|
||||||
|
- fix(deps): update dependency i18next to v23.10.0 [`#1785`](https://github.com/th-ch/youtube-music/pull/1785)
|
||||||
|
- chore(deps): update dependency electron to v29 [`#1773`](https://github.com/th-ch/youtube-music/pull/1773)
|
||||||
|
- chore(deps): update dependency vite to v5.1.4 [`#1778`](https://github.com/th-ch/youtube-music/pull/1778)
|
||||||
|
- chore(deps): bump ip from 2.0.0 to 2.0.1 [`#1777`](https://github.com/th-ch/youtube-music/pull/1777)
|
||||||
|
- fix: add support for Wayland [`#1864`](https://github.com/th-ch/youtube-music/issues/1864)
|
||||||
|
- fix(style): fix navigation bar items are not working [`#1381`](https://github.com/th-ch/youtube-music/issues/1381) [`#1396`](https://github.com/th-ch/youtube-music/issues/1396) [`#1649`](https://github.com/th-ch/youtube-music/issues/1649)
|
||||||
|
- fix(ytm-bugs): fixed a `scrollbar-color` bug that affected Chromium 121 and later [`#1737`](https://github.com/th-ch/youtube-music/issues/1737)
|
||||||
|
- chore(i18n): Translated using Weblate (Icelandic) [`82fa871`](https://github.com/th-ch/youtube-music/commit/82fa8719a96abdfaaa8548a0077f4db2164ec09b)
|
||||||
|
- chore(i18n): Translated using Weblate (Romanian) [`c871506`](https://github.com/th-ch/youtube-music/commit/c871506a69180308ab4fc587b6e8a33f193087e8)
|
||||||
|
- chore(i18n): Translated using Weblate (Thai) [`a7d0350`](https://github.com/th-ch/youtube-music/commit/a7d035022a229f0b245694d1fc7a484befe1c269)
|
||||||
|
|
||||||
|
#### [v3.3.2](https://github.com/th-ch/youtube-music/compare/v3.3.1...v3.3.2)
|
||||||
|
|
||||||
|
> 20 February 2024
|
||||||
|
|
||||||
|
- fix: fix bugs in MPRIS, and improve MPRIS [`#1760`](https://github.com/th-ch/youtube-music/pull/1760)
|
||||||
|
- fix(deps): update dependency electron-updater to v6.1.8 [`#1770`](https://github.com/th-ch/youtube-music/pull/1770)
|
||||||
|
- chore(deps): update dependency electron-builder to v24.12.0 [`#1771`](https://github.com/th-ch/youtube-music/pull/1771)
|
||||||
|
- feat(scrobblers): use `BrowserWindow` instead of `shell.openExternal` [`#1758`](https://github.com/th-ch/youtube-music/pull/1758)
|
||||||
|
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.0.2 [`#1763`](https://github.com/th-ch/youtube-music/pull/1763)
|
||||||
|
- chore(deps): update dependency esbuild to v0.20.1 [`#1759`](https://github.com/th-ch/youtube-music/pull/1759)
|
||||||
|
- fix(deps): update dependency i18next to v23.9.0 [`#1754`](https://github.com/th-ch/youtube-music/pull/1754)
|
||||||
|
- fix: fixed an issue that caused infinite loops when using Music Together [`#1752`](https://github.com/th-ch/youtube-music/issues/1752)
|
||||||
|
- chore(deps): rollback dependency electron-builder to v24.9.1 [`8bd05f5`](https://github.com/th-ch/youtube-music/commit/8bd05f525df98671f0a516b159cccab302b7ae99)
|
||||||
|
- chore(deps): update dependency electron-builder to v24.13.1 [`47b23b4`](https://github.com/th-ch/youtube-music/commit/47b23b414c8feb25c4d9a23d6adb7cbf1ac818fb)
|
||||||
|
- chore(i18n): Translated using Weblate (German) [`47505e9`](https://github.com/th-ch/youtube-music/commit/47505e97482f9e953ee451b968d0950585616ffa)
|
||||||
|
|
||||||
#### [v3.3.1](https://github.com/th-ch/youtube-music/compare/v3.3.0...v3.3.1)
|
#### [v3.3.1](https://github.com/th-ch/youtube-music/compare/v3.3.0...v3.3.1)
|
||||||
|
|
||||||
|
> 18 February 2024
|
||||||
|
|
||||||
- Update changelog for v3.3.0 [`6d9bb8e`](https://github.com/th-ch/youtube-music/commit/6d9bb8eb1cc2d892a5552ffb1f7c20859aa80f67)
|
- Update changelog for v3.3.0 [`6d9bb8e`](https://github.com/th-ch/youtube-music/commit/6d9bb8eb1cc2d892a5552ffb1f7c20859aa80f67)
|
||||||
- hotfix: in-app-menu position issue [`87acf4c`](https://github.com/th-ch/youtube-music/commit/87acf4cf042ba32a000a4aeaec5c17c93501d333)
|
- hotfix: in-app-menu position issue [`87acf4c`](https://github.com/th-ch/youtube-music/commit/87acf4cf042ba32a000a4aeaec5c17c93501d333)
|
||||||
- release 3.3.1 (HOTFIX) [`a6ed8bf`](https://github.com/th-ch/youtube-music/commit/a6ed8bf3aa20ca8e950e85d88f981ccf9edc7498)
|
- release 3.3.1 (HOTFIX) [`a6ed8bf`](https://github.com/th-ch/youtube-music/commit/a6ed8bf3aa20ca8e950e85d88f981ccf9edc7498)
|
||||||
|
|||||||
388
docs/readme/README-is.md
Normal file
388
docs/readme/README-is.md
Normal file
@ -0,0 +1,388 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
# YouTube Tónlist
|
||||||
|
|
||||||
|
[](https://github.com/th-ch/youtube-music/releases/)
|
||||||
|
[](https://github.com/th-ch/youtube-music/blob/master/LICENSE)
|
||||||
|
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||||
|
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||||
|
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||||
|
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||||
|
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||||
|
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
**Electron umbúðir utan um YouTube Tónlist sem inniheldur:**
|
||||||
|
|
||||||
|
- Innfæddur útlit og tilfinning, miðar að því að halda upprunalegu viðmótinu
|
||||||
|
- Rammi fyrir sérsniðnar viðbætur: breyttu YouTube Tónlist að þínum þörfum (stíl, efni, eiginleikar), virkjaðu/slökktu á viðbætur í
|
||||||
|
einn smellur
|
||||||
|
|
||||||
|
## Sýnishornsmynd
|
||||||
|
|
||||||
|
| Spilaraskjár (albúmslitaþema & umhverfisljós) |
|
||||||
|
|:---------------------------------------------------------------------------------------------------------:|
|
||||||
|
||
|
||||||
|
|
||||||
|
## Efni
|
||||||
|
|
||||||
|
- [Eiginleikar](#eiginleikar)
|
||||||
|
- [Tiltæk viðbætur](#tiltæk-viðbætur)
|
||||||
|
- [Þýðing](#þýðing)
|
||||||
|
- [Sækja](#sækja)
|
||||||
|
- [Arch Linux](#arch-linux)
|
||||||
|
- [MacOS](#macos)
|
||||||
|
- [Windows](#windows)
|
||||||
|
- [Hvernig á að setja upp án nettengingar? (í Windows)](#hvernig-á-að-setja-upp-án-nettengingar-í-windows)
|
||||||
|
- [Þemu](#þemu)
|
||||||
|
- [Þróun](#þróun)
|
||||||
|
- [Búðu til þín eigin viðbætur](#búðu-til-þín-eigin-viðbætur)
|
||||||
|
- [Er að búa til viðbót](#er-að-búa-til-viðbót)
|
||||||
|
- [Algeng notkunartilvik](#algeng-notkunartilvik)
|
||||||
|
- [Byggja](#byggja)
|
||||||
|
- [Framleiðsluforskoðun](#framleiðsluforskoðun)
|
||||||
|
- [Prófanir](#prófanir)
|
||||||
|
- [Leyfi](#leyfi)
|
||||||
|
- [Algengustu spurningar](#algengustu-spurningar)
|
||||||
|
|
||||||
|
## Eiginleikar:
|
||||||
|
|
||||||
|
- **Sjálfvirk staðfesting þegar gert er hlé** (Alltaf virkt): slökkva á
|
||||||
|
["Halda áfram að horfa?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)
|
||||||
|
popup sem gerir hlé á tónlist eftir ákveðinn tíma
|
||||||
|
|
||||||
|
- Og meira...
|
||||||
|
|
||||||
|
## Tiltæk viðbætur:
|
||||||
|
|
||||||
|
- **Auglýsingablokkari**: Lokaðu fyrir allar auglýsingar og rakningar úr kassanum
|
||||||
|
|
||||||
|
- **Albúmsaðgerðir**: Bætir Ódíslika, Mislíkt, Líkt, og Ólíkt til að nota þetta á öll lög á spilunarlista eða albúm
|
||||||
|
|
||||||
|
- **Albúmslitaþema**: Beitir kraftmikið þema og sjónrænum áhrifum sem byggjast á litavali albúmsins
|
||||||
|
|
||||||
|
- **Umhverfishamur**: Beitir lýsingaráhrifum með því að varpa mildum litum úr myndbandinu í bakgrunn skjásins
|
||||||
|
|
||||||
|
- **Hljóðþjöppur**: Notaðu þjöppun á hljóð (lækkar hljóðstyrk háværustu hluta merkis og hækkar hljóðstyrk í mýkstu hlutunum)
|
||||||
|
|
||||||
|
- **Þoka Leiðsagnarstika**: Gerir leiðsögustikuna gagnsæja og óskýrt
|
||||||
|
|
||||||
|
- **Farið Framhjá Aldurstakmörkunum**: Framhjá aldursstaðfestingu YouTube
|
||||||
|
|
||||||
|
- **Yfirskriftarval**: Virkja skjátexta
|
||||||
|
|
||||||
|
- **Fyrirferðarlítillhliðarstika**: Stilltu hliðarstikuna alltaf í þétta stillingu
|
||||||
|
|
||||||
|
- **Krossfæra**: Krossfæra á milli lög
|
||||||
|
|
||||||
|
- **Slökkva á Sjálfvirkri Spilun**: Gerir lag að byrja í "hlé" ham
|
||||||
|
|
||||||
|
- **[Discord](https://discord.com/) Rík Nærveru**: Sýndu vinum þínum hvað þú hlustar á
|
||||||
|
með [Rík Nærveru](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||||
|
|
||||||
|
- **Niðurhalari**: Niðurhalum
|
||||||
|
MP3 [beint úr viðmótinu](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||||
|
|
||||||
|
- **Veldibundiðrúmmál**: Gerir hljóðstyrkssleðann [veldisvísis](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/)
|
||||||
|
svo það er auðveldara að velja lægra hljóðstyrk.
|
||||||
|
|
||||||
|
- **Valmynd í Forriti**: [Gefur börum flott, dökkt útlit](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||||
|
|
||||||
|
> (sjá [þessa færslu](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) ef þú átt í vandræðum
|
||||||
|
með að fá aðgang að valmyndinni eftir að hafa virkjað þessa viðbót og fela valmyndarvalkostinn)
|
||||||
|
|
||||||
|
- **Scrobbler**: Bætir við scrobbling stuðningi fyrir [Last.fm](https://www.last.fm/) og [ListenBrainz](https://listenbrainz.org/)
|
||||||
|
|
||||||
|
- **Lumia Stream**: Bætir við [Lumia Stream](https://lumiastream.com/) stuðningi
|
||||||
|
|
||||||
|
- **Söngtexti Snilld**: Bætir stuðningi við texta fyrir flest lög
|
||||||
|
|
||||||
|
- **Tónlist Saman**: Deila spilunarlista með öðrum. Þegar gestgjafinn spilar lag munu allir aðrir heyra sama lagið
|
||||||
|
|
||||||
|
- **Leiðsögn**: Næsta/Til baka leiðsagnarörvar beint samþættar í viðmótinu, eins og í uppáhalds vafranum þínum
|
||||||
|
|
||||||
|
- **Engin Google Innskráning**: Fjarlægðu Google innskráningarhnappa og tengla úr viðmótinu
|
||||||
|
|
||||||
|
- **Tilkynningar**: Birta tilkynningu þegar lag byrjar að spila
|
||||||
|
([gagnvirkartilkynningar](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) eru fáanlegar á Windows)
|
||||||
|
|
||||||
|
- **Mynd-í-Mynd**: Gerir kleift að skipta forritinu yfir í mynd-í-mynd stillingu
|
||||||
|
|
||||||
|
- **Spilunarhraði**: Hlustaðu hratt, hlustaðu hægt!
|
||||||
|
[Bætir við sleða sem stjórnar lagahraðanum](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||||
|
|
||||||
|
- **Nákvæmshljóðstyrkur**: Stjórnaðu hljóðstyrknum nákvæmlega með músarhjóli/hraðtökkum, með sérsniðnum HUD og sérsniðnum hljóðstyrksþrepum
|
||||||
|
|
||||||
|
- **Flýtileiðir (og MPRIS)**: Leyfir að stilla alþjóðlegarflýtilyklar fyrir spilun (spila/gera hlé/næsta/fyrri) +
|
||||||
|
óvirkja [media osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png)
|
||||||
|
með því að hnekkja miðlunarlyklum + virkja Ctrl/CMD + F til að leita + virkja linux mpris stuðning fyrir
|
||||||
|
miðlunarlyklar + [sérsniðnir flýtilyklar](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)
|
||||||
|
fyrir [háþróaða notendur](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||||
|
- **Slepptu Lögum sem Mislíkuðust**: Sleppir mislíkaði lög
|
||||||
|
|
||||||
|
- **Slepptu Þögnum**: Slepptu sjálfkrafa þagnarköflum í lögum
|
||||||
|
|
||||||
|
- [**Styrktarblokk**](https://github.com/ajayyy/SponsorBlock): Sleppur sjálfkrafa hlutum sem ekki eru tónlist, eins og inngangur/lok
|
||||||
|
eða hlutar af tónlistarmyndböndum þar sem lag er ekki að spila
|
||||||
|
|
||||||
|
- **Miðlunarstýringarverkefnastikunnar**: Stjórnaðu spilun frá [Windows verkefnastikunni þinni](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||||
|
|
||||||
|
- **Snertistiku**: Sérsniðið Snertistikuútlit fyrir macOS
|
||||||
|
|
||||||
|
- **Tuna OBS**: Samþætting við [OBS](https://obsproject.com/)
|
||||||
|
viðbótina [Tuna](https://obsproject.com/forum/resources/tuna.843/)
|
||||||
|
|
||||||
|
- **Myndbandgæðisbreyting**: Leyfir að breyta myndbandgæðum með
|
||||||
|
[hnappi](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) á
|
||||||
|
myndbandsyfirlaginu
|
||||||
|
|
||||||
|
- **Myndbandsrofi**: Bætir við [hnappi](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) til
|
||||||
|
að skipta á milli myndbands/lagshams. Getur einnig valfrjálst fjarlægt allan myndbandsflipann
|
||||||
|
|
||||||
|
- **Sjónrænir**: Mismunandi tónlist sjónrænir
|
||||||
|
|
||||||
|
## Þýðing
|
||||||
|
|
||||||
|
Þú getur aðstoðað við þýðingar á [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||||
|
|
||||||
|
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||||
|
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="translation status" />
|
||||||
|
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Sækja
|
||||||
|
|
||||||
|
Þú getur skoðað [nýjustu útgáfuna](https://github.com/th-ch/youtube-music/releases/latest) til að finna fljótt
|
||||||
|
nýjustu útgáfuna.
|
||||||
|
|
||||||
|
### Arch Linux
|
||||||
|
|
||||||
|
Settu upp [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) pakkann frá AUR. Fyrir AUR uppsetningarleiðbeiningar skaltu skoða
|
||||||
|
þessa [wiki síðu](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||||
|
|
||||||
|
### MacOS
|
||||||
|
|
||||||
|
Þú getur sett upp appið með því að nota Homebrew (sjá [cask skilgreiningu](https://github.com/th-ch/homebrew-youtube-music))
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install th-ch/youtube-music/youtube-music
|
||||||
|
```
|
||||||
|
|
||||||
|
Ef þú setur upp forritið handvirkt og færð villu "er skemmd og ekki er hægt að opna það," þegar þú ræsir forritið skaltu keyra eftirfarandi í flugstöðinni:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
xattr -cr /Applications/YouTube\ Music.app
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Þú getur notað [Scoop pakkastjórnun](https://scoop.sh) til að setja upp `youtube-music` pakkann frá
|
||||||
|
[`extras` fötuna](https://github.com/ScoopInstaller/Extras).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scoop bucket add extras
|
||||||
|
scoop install extras/youtube-music
|
||||||
|
```
|
||||||
|
|
||||||
|
Að öðrum kosti geturðu notað [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s
|
||||||
|
opinber CLI pakkastjóri til að setja upp `th-ch.YouTubeMusic` pakkann.
|
||||||
|
|
||||||
|
*Athugið: Microsoft Defender SmartScreen gæti lokað uppsetningunni þar sem hún er frá „óþekktum útgefanda“. Þetta er einnig
|
||||||
|
satt fyrir handvirka uppsetningu þegar reynt er að keyra executable(.exe) eftir handvirkt niðurhal hér á github (sama
|
||||||
|
skrá).*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
winget install th-ch.YouTubeMusic
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Hvernig á að setja upp án nettengingar? (í Windows)
|
||||||
|
|
||||||
|
- Sæktu `*.nsis.7z` skrána fyrir _arkitektúr tækisins þíns_ á [útgáfusíðu](https://github.com/th-ch/youtube-music/releases/latest).
|
||||||
|
- `x64` fyrir 64-bita Windows
|
||||||
|
- `ia32` fyrir 32-bita Windows
|
||||||
|
- `arm64` fyrir ARM64 Windows
|
||||||
|
- Sæktu uppsetningarforrit á útgáfusíðu. (`*-Setup.exe`)
|
||||||
|
- Settu þær í **sömu möppuna**.
|
||||||
|
- Keyrðu uppsetningarforritið.
|
||||||
|
|
||||||
|
## Þemu
|
||||||
|
|
||||||
|
Þú getur hlaðið CSS skrám til að breyta útliti forritsins (Valkostir > Sjónræn klip > Þemu).
|
||||||
|
|
||||||
|
Sum fyrirframskilgreind þemu eru fáanleg á https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||||
|
|
||||||
|
## Þróun
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/th-ch/youtube-music
|
||||||
|
cd youtube-music
|
||||||
|
pnpm install --frozen-lockfile
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Búðu til þín eigin viðbætur
|
||||||
|
|
||||||
|
Með því að nota viðbætur geturðu:
|
||||||
|
|
||||||
|
- vinna með appið - `BrowserWindow` frá electron er sent til viðbótarstjórans
|
||||||
|
- breyttu framhliðinni með því að vinna með HTML/CSS
|
||||||
|
|
||||||
|
### Er að búa til viðbót
|
||||||
|
|
||||||
|
Búðu til möppu í `src/plugins/YOUR-PLUGIN-NAME`:
|
||||||
|
|
||||||
|
- `index.ts`: aðal skránni af viðbótin
|
||||||
|
```typescript
|
||||||
|
import style from './style.css?inline'; // flytja inn stíl sem inline
|
||||||
|
|
||||||
|
import { createPlugin } from '@/utils';
|
||||||
|
|
||||||
|
export default createPlugin({
|
||||||
|
name: 'Plugin Label',
|
||||||
|
restartNeeded: true, // ef gildi er satt, ytmusic show endurræsa gluggann
|
||||||
|
config: {
|
||||||
|
enabled: false,
|
||||||
|
}, // sérsniðnastillingar þinn
|
||||||
|
stylesheets: [style], // sérsniðnastílinn þinn
|
||||||
|
menu: async ({ getConfig, setConfig }) => {
|
||||||
|
// Allar *stillingaraðferðir eru umvafnar Lofor<T>
|
||||||
|
const config = await getConfig();
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: 'menu',
|
||||||
|
submenu: [1, 2, 3].map((value) => ({
|
||||||
|
label: `value ${value}`,
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.value === value,
|
||||||
|
click() {
|
||||||
|
setConfig({ value });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
backend: {
|
||||||
|
start({ window, ipc }) {
|
||||||
|
window.maximize();
|
||||||
|
|
||||||
|
// þú getur tengst við renderer viðbótina
|
||||||
|
ipc.handle('some-event', () => {
|
||||||
|
return 'hello';
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// það kviknaði þegar stillingum var breytt
|
||||||
|
onConfigChange(newConfig) { /* ... */ },
|
||||||
|
// it fired when plugin disabled
|
||||||
|
stop(context) { /* ... */ },
|
||||||
|
},
|
||||||
|
renderer: {
|
||||||
|
async start(context) {
|
||||||
|
console.log(await context.ipc.invoke('some-event'));
|
||||||
|
},
|
||||||
|
// Aðeins krókur sem er í boði fyrir renderer
|
||||||
|
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||||
|
// stilltu stillingar viðbótarinnar auðveldlega
|
||||||
|
context.setConfig({ myConfig: api.getVolume() });
|
||||||
|
},
|
||||||
|
onConfigChange(newConfig) { /* ... */ },
|
||||||
|
stop(_context) { /* ... */ },
|
||||||
|
},
|
||||||
|
preload: {
|
||||||
|
async start({ getConfig }) {
|
||||||
|
const config = await getConfig();
|
||||||
|
},
|
||||||
|
onConfigChange(newConfig) {},
|
||||||
|
stop(_context) {},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Algeng notkunartilvik
|
||||||
|
|
||||||
|
- er að sprauta sérsniðnum CSS: búðu til `style.css` skrá í sömu möppu þá:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// index.ts
|
||||||
|
import style from './style.css?inline'; // flytja inn stíl sem inline
|
||||||
|
|
||||||
|
import { createPlugin } from '@/utils';
|
||||||
|
|
||||||
|
export default createPlugin({
|
||||||
|
name: 'Plugin Label',
|
||||||
|
restartNeeded: true, // ef gildi er satt, ytmusic show endurræsa gluggann
|
||||||
|
config: {
|
||||||
|
enabled: false,
|
||||||
|
}, // sérsniðnastillingar þinn
|
||||||
|
stylesheets: [style], // sérsniðnastílinn þinn
|
||||||
|
renderer() {} // skilgreina renderer krók
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
- Ef þú vilt breyta HTML:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { createPlugin } from '@/utils';
|
||||||
|
|
||||||
|
export default createPlugin({
|
||||||
|
name: 'Plugin Label',
|
||||||
|
restartNeeded: true, // ef gildi er satt, ytmusic show endurræsa gluggann
|
||||||
|
config: {
|
||||||
|
enabled: false,
|
||||||
|
}, // sérsniðnastillingar þinn
|
||||||
|
renderer() {
|
||||||
|
// Fjarlægðu innskráningarhnappinn
|
||||||
|
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||||
|
} // skilgreina renderer krók
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
- samskipti á milli að framan og aftan: hægt að gera með því að nota ipcMain eininguna frá electron. Sjá `index.ts` skrá og
|
||||||
|
dæmi í 'styrktarblokk' viðbótinni.
|
||||||
|
|
||||||
|
## Byggja
|
||||||
|
|
||||||
|
1. Klóna geymsluna
|
||||||
|
2. Fylgdu [þessa handbók](https://pnpm.io/installation) til að setja upp 'pnpm'
|
||||||
|
3. Keyrðu `pnpm install --frozen-lockfile` til að setja upp ósjálfstæði
|
||||||
|
4. Keyrðu `pnpm build:OS`
|
||||||
|
|
||||||
|
- `pnpm dist:win` - Windows
|
||||||
|
- `pnpm dist:linux` - Linux
|
||||||
|
- `pnpm dist:mac` - MacOS
|
||||||
|
|
||||||
|
Byggir appið fyrir macOS, Linux og Windows,
|
||||||
|
með því að nota [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||||
|
|
||||||
|
## Framleiðsluforskoðun
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm start
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prófanir
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
Notar [Playwright](https://playwright.dev/) til að prófa forritið.
|
||||||
|
|
||||||
|
## Leyfi
|
||||||
|
|
||||||
|
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||||
|
|
||||||
|
## Algengustu Spurningar
|
||||||
|
|
||||||
|
### Hvers vegna forritavalmynd birtist ekki?
|
||||||
|
|
||||||
|
Ef valmöguleikinn „Fela valmynd“ er á - þú getur sýnt valmyndina með <kbd>alt</kbd> lyklinum (eða <kbd>\`</kbd> [bakka]
|
||||||
|
ef þú notar viðbótina fyrir valmynd í forriti)
|
||||||
@ -1,7 +1,7 @@
|
|||||||
# 유튜브 뮤직 (YouTube Music)
|
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
|
# 유튜브 뮤직 (YouTube Music)
|
||||||
|
|
||||||
[](https://github.com/th-ch/youtube-music/releases/)
|
[](https://github.com/th-ch/youtube-music/releases/)
|
||||||
[](https://github.com/th-ch/youtube-music/blob/master/LICENSE)
|
[](https://github.com/th-ch/youtube-music/blob/master/LICENSE)
|
||||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||||
@ -25,62 +25,26 @@
|
|||||||
- 원래의 인터페이스를 유지하는 것을 목표로 하는 네이티브 디자인 및 느낌
|
- 원래의 인터페이스를 유지하는 것을 목표로 하는 네이티브 디자인 및 느낌
|
||||||
- 맞춤 플러그인을 위한 프레임워크: 스타일, 콘텐츠, 기능 등 필요에 따라 유튜브 뮤직을 변경하고, 클릭 한 번으로 플러그인을 활성화/비활성화할 수 있습니다.
|
- 맞춤 플러그인을 위한 프레임워크: 스타일, 콘텐츠, 기능 등 필요에 따라 유튜브 뮤직을 변경하고, 클릭 한 번으로 플러그인을 활성화/비활성화할 수 있습니다.
|
||||||
|
|
||||||
## 번역
|
## Content
|
||||||
|
|
||||||
[Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/)에서 번역을 도울 수 있습니다.
|
- [기능](#기능)
|
||||||
|
- [사용 가능한 플러그인](#사용-가능한-플러그인)
|
||||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
- [번역](#번역)
|
||||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="번역 상태" />
|
- [다운로드](#다운로드)
|
||||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="번역 상태 2" />
|
- [Arch Linux](#arch-linux)
|
||||||
</a>
|
- [MacOS](#macos)
|
||||||
|
- [Windows](#windows)
|
||||||
## 다운로드
|
- [(Windows에서) 네트워크에 연결하지 않고 설치하는 방법은 무엇인가요?](#windows에서-네트워크에-연결하지-않고-설치하는-방법은-무엇인가요)
|
||||||
|
- [테마](#테마)
|
||||||
[최신 릴리즈](https://github.com/th-ch/youtube-music/releases/latest)를 확인하여 최신 버전을 빠르게 찾을 수 있습니다.
|
- [개발](#개발)
|
||||||
|
- [나만의 플러그인 만들기](#나만의-플러그인-만들기)
|
||||||
### Arch Linux
|
- [플러그인 만들기](#플러그인-만들기)
|
||||||
|
- [일반적인 사용 예](#일반적인-사용-예)
|
||||||
AUR에서 `youtube-music-bin` 패키지를 설치합니다. AUR 설치 지침은 [이 위키 페이지](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages)를 참조하세요.
|
- [빌드](#빌드)
|
||||||
|
- [프로덕션 빌드 미리보기](#프로덕션-빌드-미리보기)
|
||||||
### MacOS
|
- [테스트](#테스트)
|
||||||
|
- [라이선스](#라이선스)
|
||||||
Homebrew를 사용하여 앱을 설치할 수 있습니다:
|
- [자주 묻는 질문](#자주-묻는-질문)
|
||||||
```bash
|
|
||||||
brew install --cask https://raw.githubusercontent.com/th-ch/youtube-music/master/youtube-music.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
(앱을 수동으로 설치하고) 앱을 실행할 때 `손상되었기 때문에 열 수 없습니다.`라는 오류가 발생하면 터미널에서 다음을 실행하세요:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
xattr -cr /Applications/YouTube\ Music.app
|
|
||||||
```
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
[Scoop 패키지 매니저](https://scoop.sh)를 사용하여 [`extras` 버킷](https://github.com/ScoopInstaller/Extras)에서 `youtube-music` 패키지를 설치할 수 있습니다.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
scoop bucket add extras
|
|
||||||
scoop install extras/youtube-music
|
|
||||||
```
|
|
||||||
|
|
||||||
또는 Windows 11의 공식 CLI 패키지 관리자인 [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)을 사용하여 `th-ch.YouTubeMusic` 패키지를 설치할 수 있습니다.
|
|
||||||
|
|
||||||
*참고: "알 수 없는 게시자"의 파일이기 때문에 Microsoft Defender의 SmartScreen에서 설치를 차단할 수 있습니다. 이는 GitHub에서 동일 파일을 수동으로 다운로드한 후 실행 파일(.exe)을 실행하려고 할 때도 마찬가지로 발생합니다.*
|
|
||||||
|
|
||||||
```bash
|
|
||||||
winget install th-ch.YouTubeMusic
|
|
||||||
```
|
|
||||||
|
|
||||||
#### (Windows에서) 네트워크에 연결하지 않고 설치하는 방법은 무엇인가요?
|
|
||||||
|
|
||||||
- [릴리즈 페이지](https://github.com/th-ch/youtube-music/releases/latest)에서 _본인 기기 아키텍처_에 맞는 `*.nsis.7z` 파일을 다운로드하세요.
|
|
||||||
- `x64`는 64비트 Windows 용입니다.
|
|
||||||
- `ia32`는 32비트 Windows 용입니다.
|
|
||||||
- `arm64`는 ARM64 Windows 용입니다.
|
|
||||||
- 릴리즈 페이지에서 설치기를 다운로드하세요. (`*-Setup.exe`)
|
|
||||||
- 두 파일을 **동일한 위치**에 놓아주세요.
|
|
||||||
- 설치기를 실행하세요.
|
|
||||||
|
|
||||||
## 기능:
|
## 기능:
|
||||||
|
|
||||||
@ -156,6 +120,63 @@ winget install th-ch.YouTubeMusic
|
|||||||
|
|
||||||
- **비주얼라이저**: 플레이어에 시각화 도구 추가
|
- **비주얼라이저**: 플레이어에 시각화 도구 추가
|
||||||
|
|
||||||
|
## 번역
|
||||||
|
|
||||||
|
[Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/)에서 번역을 도울 수 있습니다.
|
||||||
|
|
||||||
|
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||||
|
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="번역 상태" />
|
||||||
|
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="번역 상태 2" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## 다운로드
|
||||||
|
|
||||||
|
[최신 릴리즈](https://github.com/th-ch/youtube-music/releases/latest)를 확인하여 최신 버전을 빠르게 찾을 수 있습니다.
|
||||||
|
|
||||||
|
### Arch Linux
|
||||||
|
|
||||||
|
AUR에서 [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) 패키지를 설치합니다. AUR 설치 지침은 [이 위키 페이지](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages)를 참조하세요.
|
||||||
|
|
||||||
|
### MacOS
|
||||||
|
|
||||||
|
Homebrew를 사용하여 앱을 설치할 수 있습니다:
|
||||||
|
```bash
|
||||||
|
brew install --cask https://raw.githubusercontent.com/th-ch/youtube-music/master/youtube-music.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
(앱을 수동으로 설치하고) 앱을 실행할 때 `손상되었기 때문에 열 수 없습니다.`라는 오류가 발생하면 터미널에서 다음을 실행하세요:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
xattr -cr /Applications/YouTube\ Music.app
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
[Scoop 패키지 매니저](https://scoop.sh)를 사용하여 [`extras` 버킷](https://github.com/ScoopInstaller/Extras)에서 `youtube-music` 패키지를 설치할 수 있습니다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scoop bucket add extras
|
||||||
|
scoop install extras/youtube-music
|
||||||
|
```
|
||||||
|
|
||||||
|
또는 Windows 11의 공식 CLI 패키지 관리자인 [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)을 사용하여 `th-ch.YouTubeMusic` 패키지를 설치할 수 있습니다.
|
||||||
|
|
||||||
|
*참고: "알 수 없는 게시자"의 파일이기 때문에 Microsoft Defender의 SmartScreen에서 설치를 차단할 수 있습니다. 이는 GitHub에서 동일 파일을 수동으로 다운로드한 후 실행 파일(.exe)을 실행하려고 할 때도 마찬가지로 발생합니다.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
winget install th-ch.YouTubeMusic
|
||||||
|
```
|
||||||
|
|
||||||
|
#### (Windows에서) 네트워크에 연결하지 않고 설치하는 방법은 무엇인가요?
|
||||||
|
|
||||||
|
- [릴리즈 페이지](https://github.com/th-ch/youtube-music/releases/latest)에서 _본인 기기 아키텍처_에 맞는 `*.nsis.7z` 파일을 다운로드하세요.
|
||||||
|
- `x64`는 64비트 Windows 용입니다.
|
||||||
|
- `ia32`는 32비트 Windows 용입니다.
|
||||||
|
- `arm64`는 ARM64 Windows 용입니다.
|
||||||
|
- 릴리즈 페이지에서 설치기를 다운로드하세요. (`*-Setup.exe`)
|
||||||
|
- 두 파일을 **동일한 위치**에 놓아주세요.
|
||||||
|
- 설치기를 실행하세요.
|
||||||
|
|
||||||
## 테마
|
## 테마
|
||||||
|
|
||||||
CSS 파일을 로드하여 애플리케이션의 모양을 변경할 수 있습니다(설정 > 시각적 변경 > 테마).
|
CSS 파일을 로드하여 애플리케이션의 모양을 변경할 수 있습니다(설정 > 시각적 변경 > 테마).
|
||||||
|
|||||||
48
package.json
48
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "youtube-music",
|
"name": "youtube-music",
|
||||||
"productName": "YouTube Music",
|
"productName": "YouTube Music",
|
||||||
"version": "3.3.2",
|
"version": "3.3.5",
|
||||||
"description": "YouTube Music Desktop App - including custom plugins",
|
"description": "YouTube Music Desktop App - including custom plugins",
|
||||||
"main": "./dist/main/index.js",
|
"main": "./dist/main/index.js",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -136,8 +136,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cliqz/adblocker-electron": "1.26.15",
|
"@cliqz/adblocker-electron": "1.26.16",
|
||||||
"@cliqz/adblocker-electron-preload": "1.26.15",
|
"@cliqz/adblocker-electron-preload": "1.26.16",
|
||||||
"@electron-toolkit/tsconfig": "1.0.1",
|
"@electron-toolkit/tsconfig": "1.0.1",
|
||||||
"@electron/remote": "2.1.2",
|
"@electron/remote": "2.1.2",
|
||||||
"@ffmpeg.wasm/core-mt": "0.12.0",
|
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||||
@ -147,7 +147,7 @@
|
|||||||
"@jellybrick/electron-better-web-request": "1.0.4",
|
"@jellybrick/electron-better-web-request": "1.0.4",
|
||||||
"@jellybrick/mpris-service": "2.1.4",
|
"@jellybrick/mpris-service": "2.1.4",
|
||||||
"@xhayper/discord-rpc": "1.1.2",
|
"@xhayper/discord-rpc": "1.1.2",
|
||||||
"async-mutex": "0.4.1",
|
"async-mutex": "0.5.0",
|
||||||
"butterchurn": "3.0.0-beta.4",
|
"butterchurn": "3.0.0-beta.4",
|
||||||
"butterchurn-presets": "3.0.0-beta.4",
|
"butterchurn-presets": "3.0.0-beta.4",
|
||||||
"color": "4.2.3",
|
"color": "4.2.3",
|
||||||
@ -158,7 +158,7 @@
|
|||||||
"electron-debug": "3.2.0",
|
"electron-debug": "3.2.0",
|
||||||
"electron-is": "3.0.0",
|
"electron-is": "3.0.0",
|
||||||
"electron-localshortcut": "3.2.1",
|
"electron-localshortcut": "3.2.1",
|
||||||
"electron-store": "8.1.0",
|
"electron-store": "8.2.0",
|
||||||
"electron-unhandled": "4.0.1",
|
"electron-unhandled": "4.0.1",
|
||||||
"electron-updater": "6.1.8",
|
"electron-updater": "6.1.8",
|
||||||
"fast-average-color": "9.4.0",
|
"fast-average-color": "9.4.0",
|
||||||
@ -166,7 +166,7 @@
|
|||||||
"filenamify": "6.0.0",
|
"filenamify": "6.0.0",
|
||||||
"howler": "2.2.4",
|
"howler": "2.2.4",
|
||||||
"html-to-text": "9.0.5",
|
"html-to-text": "9.0.5",
|
||||||
"i18next": "23.9.0",
|
"i18next": "23.10.1",
|
||||||
"keyboardevent-from-electron-accelerator": "2.0.0",
|
"keyboardevent-from-electron-accelerator": "2.0.0",
|
||||||
"keyboardevents-areequal": "0.2.2",
|
"keyboardevents-areequal": "0.2.2",
|
||||||
"node-html-parser": "6.1.12",
|
"node-html-parser": "6.1.12",
|
||||||
@ -176,48 +176,48 @@
|
|||||||
"serve": "14.2.1",
|
"serve": "14.2.1",
|
||||||
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
||||||
"solid-floating-ui": "0.3.1",
|
"solid-floating-ui": "0.3.1",
|
||||||
"solid-js": "1.8.15",
|
"solid-js": "1.8.16",
|
||||||
"solid-styled-components": "0.28.5",
|
"solid-styled-components": "0.28.5",
|
||||||
"solid-transition-group": "0.2.3",
|
"solid-transition-group": "0.2.3",
|
||||||
"ts-morph": "21.0.1",
|
"ts-morph": "22.0.0",
|
||||||
"vudio": "2.1.1",
|
"vudio": "2.1.1",
|
||||||
"x11": "2.3.0",
|
"x11": "2.3.0",
|
||||||
"youtubei.js": "9.0.2"
|
"youtubei.js": "9.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "1.41.2",
|
"@playwright/test": "1.42.1",
|
||||||
"@total-typescript/ts-reset": "0.5.1",
|
"@total-typescript/ts-reset": "0.5.1",
|
||||||
"@types/color": "3.0.6",
|
"@types/color": "3.0.6",
|
||||||
"@types/electron-localshortcut": "3.1.3",
|
"@types/electron-localshortcut": "3.1.3",
|
||||||
"@types/howler": "2.2.11",
|
"@types/howler": "2.2.11",
|
||||||
"@types/html-to-text": "9.0.4",
|
"@types/html-to-text": "9.0.4",
|
||||||
"@types/semver": "7.5.7",
|
"@types/semver": "7.5.8",
|
||||||
"@typescript-eslint/eslint-plugin": "7.0.2",
|
"@typescript-eslint/eslint-plugin": "7.4.0",
|
||||||
"bufferutil": "4.0.8",
|
"bufferutil": "4.0.8",
|
||||||
"builtin-modules": "3.3.0",
|
"builtin-modules": "3.3.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"del-cli": "5.1.0",
|
"del-cli": "5.1.0",
|
||||||
"discord-api-types": "0.37.70",
|
"discord-api-types": "0.37.76",
|
||||||
"electron": "28.2.3",
|
"electron": "29.1.5",
|
||||||
"electron-builder": "24.9.1",
|
"electron-builder": "24.9.1",
|
||||||
"electron-devtools-installer": "3.2.0",
|
"electron-devtools-installer": "3.2.0",
|
||||||
"electron-vite": "2.0.0",
|
"electron-vite": "2.1.0",
|
||||||
"esbuild": "0.20.1",
|
"esbuild": "0.20.2",
|
||||||
"eslint": "8.56.0",
|
"eslint": "8.57.0",
|
||||||
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
||||||
"eslint-import-resolver-typescript": "3.6.1",
|
"eslint-import-resolver-typescript": "3.6.1",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"eslint-plugin-prettier": "5.1.3",
|
"eslint-plugin-prettier": "5.1.3",
|
||||||
"glob": "10.3.10",
|
"glob": "10.3.10",
|
||||||
"node-gyp": "10.0.1",
|
"node-gyp": "10.1.0",
|
||||||
"playwright": "1.41.2",
|
"playwright": "1.42.1",
|
||||||
"rollup": "4.12.0",
|
"rollup": "4.13.0",
|
||||||
"typescript": "5.3.3",
|
"typescript": "5.4.3",
|
||||||
"utf-8-validate": "6.0.3",
|
"utf-8-validate": "6.0.3",
|
||||||
"vite": "5.1.3",
|
"vite": "5.2.6",
|
||||||
"vite-plugin-inspect": "0.8.3",
|
"vite-plugin-inspect": "0.8.3",
|
||||||
"vite-plugin-resolve": "2.5.1",
|
"vite-plugin-resolve": "2.5.1",
|
||||||
"vite-plugin-solid": "2.10.1",
|
"vite-plugin-solid": "2.10.2",
|
||||||
"ws": "8.16.0"
|
"ws": "8.16.0"
|
||||||
},
|
},
|
||||||
"auto-changelog": {
|
"auto-changelog": {
|
||||||
@ -226,5 +226,5 @@
|
|||||||
"unreleased": true,
|
"unreleased": true,
|
||||||
"output": "changelog.md"
|
"output": "changelog.md"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@8.15.3"
|
"packageManager": "pnpm@8.15.5"
|
||||||
}
|
}
|
||||||
|
|||||||
717
pnpm-lock.yaml
generated
717
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
|||||||
"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}}\"",
|
||||||
@ -41,6 +41,138 @@
|
|||||||
"window": {
|
"window": {
|
||||||
"tried-to-render-offscreen": "Прозореца се опита да се изрисува извън екрана, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
"tried-to-render-offscreen": "Прозореца се опита да се изрисува извън екрана, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"hide-menu-enabled": {
|
||||||
|
"detail": "Менюто е скрито. Използвайте \"Alt\", за да го покажете, или \"Escape\", ако използвате менюто в приложението",
|
||||||
|
"message": "\"Скриване на менюто\" е активирано",
|
||||||
|
"title": "\"Скриване на менюто\" активирано"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "По-късно",
|
||||||
|
"restart-now": "Рестартиране сега"
|
||||||
|
},
|
||||||
|
"detail": "\"{{pluginName}}\" плъгинът изисква рестартиране, за да влезе в сила",
|
||||||
|
"message": "\"{{pluginName}}\" трябва да рестартира",
|
||||||
|
"title": "Изисква се рестартиране"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"buttons": {
|
||||||
|
"quit": "Прекратяване",
|
||||||
|
"relaunch": "Повторно стартиране",
|
||||||
|
"wait": "Изчакване"
|
||||||
|
},
|
||||||
|
"detail": "Съжаляваме за неудобството! Моля, изберете какво да направите:",
|
||||||
|
"message": "Приложението не реагира",
|
||||||
|
"title": "Прозорецът не реагира"
|
||||||
|
},
|
||||||
|
"update-available": {
|
||||||
|
"buttons": {
|
||||||
|
"disable": "Деактивиране на актуализациите",
|
||||||
|
"download": "Изтегляне",
|
||||||
|
"ok": "Добре"
|
||||||
|
},
|
||||||
|
"detail": "Налична е нова версия, която можете да изтеглите от {{downloadLink}}",
|
||||||
|
"message": "Налична е нова версия",
|
||||||
|
"title": "Налична е актуализация"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"about": "За нас",
|
||||||
|
"navigation": {
|
||||||
|
"label": "Навигация",
|
||||||
|
"submenu": {
|
||||||
|
"copy-current-url": "Копиране на текущия URL адрес",
|
||||||
|
"go-back": "Назад",
|
||||||
|
"go-forward": "Напред",
|
||||||
|
"quit": "Изход",
|
||||||
|
"restart": "Рестартиране на приложението"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"label": "Опции",
|
||||||
|
"submenu": {
|
||||||
|
"advanced-options": {
|
||||||
|
"label": "Разширени опции",
|
||||||
|
"submenu": {
|
||||||
|
"auto-reset-app-cache": "Нулиране на кеша на приложението при стартиране на приложението",
|
||||||
|
"disable-hardware-acceleration": "Деактивиране на хардуерното ускорение",
|
||||||
|
"edit-config-json": "Редактиране на config.json",
|
||||||
|
"override-user-agent": "Замяна на User-Agent",
|
||||||
|
"restart-on-config-changes": "Рестартиране при промени в конфигурацията",
|
||||||
|
"set-proxy": {
|
||||||
|
"label": "Задаване на прокси",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Въведете адрес на прокси: (оставете празно, за да деактивирате)",
|
||||||
|
"placeholder": "Пример: SOCKS5://127.0.0.1:9999",
|
||||||
|
"title": "Задаване на прокси"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toggle-dev-tools": "Активиране на DevTools"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"always-on-top": "Винаги отгоре",
|
||||||
|
"auto-update": "Автоматично актуализиране",
|
||||||
|
"hide-menu": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Менюто ще бъде скрито при следващото стартиране, използвайте [Alt], за да го покажете, или задния бутон [`], ако използвате менюто в приложението",
|
||||||
|
"title": "\"Скриване на менюто\" активирано"
|
||||||
|
},
|
||||||
|
"label": "Скриване на менюто"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Езикът ще бъде променен след рестартиране",
|
||||||
|
"title": "Езикът беше променен"
|
||||||
|
},
|
||||||
|
"label": "Език",
|
||||||
|
"submenu": {
|
||||||
|
"to-help-translate": "Искате да помогнете с езиковия превод? Кликнете тук"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume-on-start": "Възобновяване на последната песен при стартиране на приложението",
|
||||||
|
"single-instance-lock": "Заключване до една инстанция",
|
||||||
|
"start-at-login": "Стартиране при вход",
|
||||||
|
"starting-page": {
|
||||||
|
"label": "Начална страница",
|
||||||
|
"unset": "Неустановена"
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"label": "Панел",
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "Деактивирано",
|
||||||
|
"enabled-and-hide-app": "Активиране и скриване на приложението",
|
||||||
|
"enabled-and-show-app": "Активиране и показване на приложението",
|
||||||
|
"play-pause-on-click": "Възпроизвеждане/Спиране при кликване"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visual-tweaks": {
|
||||||
|
"label": "Визуални настройки",
|
||||||
|
"submenu": {
|
||||||
|
"like-buttons": {
|
||||||
|
"default": "По подразбиране",
|
||||||
|
"force-show": "Принудително показване",
|
||||||
|
"hide": "Скриване",
|
||||||
|
"label": "Показване на \"Харесвам\" бутони"
|
||||||
|
},
|
||||||
|
"remove-upgrade-button": "Премахване на \"Ъпгрейд\" бутона",
|
||||||
|
"theme": {
|
||||||
|
"label": "Тема",
|
||||||
|
"submenu": {
|
||||||
|
"import-css-file": "Импортиране на потребителски CSS файл",
|
||||||
|
"no-theme": "Без тема"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"enabled": "Активирани",
|
||||||
|
"label": "Плъгини",
|
||||||
|
"new": "НОВО"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Scrobbling-Unterstützung aktivieren (z.B. für last.fm, Listenbrainz)",
|
"description": "Scrobbling-Unterstützung aktivieren (z.B. für last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Die Authentifizierung von Last.fm ist fehlgeschlagen.\nBlende das Pop-up bis zum nächsten Neustart aus.",
|
||||||
|
"title": "Authentifizierung fehlgeschlagen"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Last.fm API Einstellungen"
|
"api-settings": "Last.fm API Einstellungen"
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
},
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"code": "es",
|
"code": "es",
|
||||||
"local-name": "Inglés",
|
"local-name": "Español",
|
||||||
"name": "Spanish"
|
"name": "Spanish"
|
||||||
},
|
},
|
||||||
"main": {
|
"main": {
|
||||||
@ -214,7 +214,7 @@
|
|||||||
"description": "Aplica un tema dinámico y efectos visuales basados en la paleta de colores del álbum",
|
"description": "Aplica un tema dinámico y efectos visuales basados en la paleta de colores del álbum",
|
||||||
"menu": {
|
"menu": {
|
||||||
"color-mix-ratio": {
|
"color-mix-ratio": {
|
||||||
"label": "Proporción de la mezcla de color",
|
"label": "Proporción de la mezcla de colores",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
@ -434,7 +434,7 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"romanized-lyrics": "Letras Romanizadas"
|
"romanized-lyrics": "Letras Romanizadas"
|
||||||
},
|
},
|
||||||
"name": "Lyrics Genius",
|
"name": "Letras Genius",
|
||||||
"renderer": {
|
"renderer": {
|
||||||
"fetched-lyrics": "Letras recuperadas de Genius"
|
"fetched-lyrics": "Letras recuperadas de Genius"
|
||||||
}
|
}
|
||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Añadir soporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
"description": "Añadir soporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Error al autenticar con Last.fm\nOcultar la ventana emergente hasta el próximo reinicio.",
|
||||||
|
"title": "Error de autenticación"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Ajustes de la API de Last.fm"
|
"api-settings": "Ajustes de la API de Last.fm"
|
||||||
|
|||||||
@ -105,7 +105,7 @@
|
|||||||
"label": "Définir un proxy",
|
"label": "Définir un proxy",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "Entrez l'adresse proxy : (laissez vide pour désactiver)",
|
"label": "Entrez l'adresse proxy : (laissez vide pour désactiver)",
|
||||||
"placeholder": "Exemple: socks5://127.0.0.1:9999",
|
"placeholder": "Exemple: SOCKS5://127.0.0.1:9999",
|
||||||
"title": "Définir un proxy"
|
"title": "Définir un proxy"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -194,7 +194,7 @@
|
|||||||
"show": "Afficher la fenêtre",
|
"show": "Afficher la fenêtre",
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"default": "YouTube Music",
|
"default": "YouTube Music",
|
||||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
"with-song-info": "YouTube Music : {{artist}} - {{title}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -212,10 +212,18 @@
|
|||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
"description": "Applique un thème dynamique et des effets visuels basés sur la palette des couleurs de l'album",
|
"description": "Applique un thème dynamique et des effets visuels basés sur la palette des couleurs de l'album",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"label": "Ratio de mélange des couleurs",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{ratio}}%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"name": "Thème de couleur d'album"
|
"name": "Thème de couleur d'album"
|
||||||
},
|
},
|
||||||
"ambient-mode": {
|
"ambient-mode": {
|
||||||
"description": "Applique un effet d'éclairage en jetant des couleurs douces de la vidéo, dans le fond de votre écran.",
|
"description": "Applique un effet d'éclairage en jetant des couleurs douces de la vidéo, dans le fond de votre écran",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blur-amount": {
|
"blur-amount": {
|
||||||
"label": "Quantité de flou",
|
"label": "Quantité de flou",
|
||||||
@ -302,8 +310,8 @@
|
|||||||
"prompt": {
|
"prompt": {
|
||||||
"options": {
|
"options": {
|
||||||
"multi-input": {
|
"multi-input": {
|
||||||
"fade-in-duration": "Durée du fondu (millisecondes)",
|
"fade-in-duration": "Durée du début du fondu (ms)",
|
||||||
"fade-out-duration": "Durée du fondu (millisecondes)",
|
"fade-out-duration": "Durée de sortie du fondu (ms)",
|
||||||
"fade-scaling": {
|
"fade-scaling": {
|
||||||
"label": "Mise à l'échelle du fondu",
|
"label": "Mise à l'échelle du fondu",
|
||||||
"linear": "Linéaire",
|
"linear": "Linéaire",
|
||||||
@ -372,7 +380,7 @@
|
|||||||
"converting": "Conversion…",
|
"converting": "Conversion…",
|
||||||
"done": "Terminé : {{filePath}}",
|
"done": "Terminé : {{filePath}}",
|
||||||
"download-info": "Téléchargement {{artist}} - {{title}} [{{videoId}}",
|
"download-info": "Téléchargement {{artist}} - {{title}} [{{videoId}}",
|
||||||
"download-progress": "Télécharger: {{percent}}%",
|
"download-progress": "Téléchargé : {{percent}}%",
|
||||||
"downloading": "Télécharge…",
|
"downloading": "Télécharge…",
|
||||||
"downloading-counter": "Télécharge {{current}}/{{total}}…",
|
"downloading-counter": "Télécharge {{current}}/{{total}}…",
|
||||||
"downloading-playlist": "Téléchargement de la playlist \"{{playlistTitle}}\" – {{playlistSize}} chansons ({{playlistId}})",
|
"downloading-playlist": "Téléchargement de la playlist \"{{playlistTitle}}\" – {{playlistSize}} chansons ({{playlistId}})",
|
||||||
@ -431,6 +439,52 @@
|
|||||||
"fetched-lyrics": "Paroles récupérées pour Genius"
|
"fetched-lyrics": "Paroles récupérées pour Genius"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"music-together": {
|
||||||
|
"description": "Partage une playlist avec d'autres personnes. Quand l'hôte joue un son, tout les participants entendront le même son",
|
||||||
|
"dialog": {
|
||||||
|
"enter-host": "Entrer l'identifiant de l'hôte"
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"save": "Enregistrer",
|
||||||
|
"track-source": "Source de la piste audio",
|
||||||
|
"unknown-user": "Utilisateur inconnu"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"click-to-copy-id": "Copier l'identifiant de l'hôte",
|
||||||
|
"close": "Fermer Music Together",
|
||||||
|
"connected-users": "Utilisateurs connectés",
|
||||||
|
"disconnect": "Déconnecter Music Together",
|
||||||
|
"empty-user": "Aucun utilisateur connecté",
|
||||||
|
"host": "Hôte du Music Together",
|
||||||
|
"join": "Rejoindre le Music Together",
|
||||||
|
"permission": {
|
||||||
|
"all": "Autorisez les invités à contrôler la musique et le player",
|
||||||
|
"host-only": "Seulement l'hôte peut contrôler les playlists et le lecteur",
|
||||||
|
"playlist": "Autoriser les invités à contrôler les playlists"
|
||||||
|
},
|
||||||
|
"set-permission": "Changer les permissions de contrôle",
|
||||||
|
"status": {
|
||||||
|
"disconnected": "Déconnecté",
|
||||||
|
"guest": "Connecté en tant qu'invité",
|
||||||
|
"host": "Connecté en tant qu'hôte"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Music Together [BETA]",
|
||||||
|
"toast": {
|
||||||
|
"add-song-failed": "Echec d'ajout de musique",
|
||||||
|
"closed": "Music Together fermé",
|
||||||
|
"disconnected": "Music Together déconnecté",
|
||||||
|
"host-failed": "Echec de l'hébergement du Music Together",
|
||||||
|
"id-copied": "Identifiant de l'hôte copié dans le presse papier",
|
||||||
|
"id-copy-failed": "Echec de la copie de l'identifiant de l'hôte dans le presse papier",
|
||||||
|
"join-failed": "Echec en rejoignant le Music Together",
|
||||||
|
"joined": "Rejoint le Music Together",
|
||||||
|
"permission-changed": "Permission du Music Together changé à \"{{permission}}\"",
|
||||||
|
"remove-song-failed": "Echec du retrait de la piste",
|
||||||
|
"user-connected": "{{name}} à rejoint le Music Together",
|
||||||
|
"user-disconnected": "{{name}} à quitté le Music Together"
|
||||||
|
}
|
||||||
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Flèches de navigation Suivant/Retour directement intégrées dans l'interface, comme dans votre navigateur préféré",
|
"description": "Flèches de navigation Suivant/Retour directement intégrées dans l'interface, comme dans votre navigateur préféré",
|
||||||
"name": "Navigation"
|
"name": "Navigation"
|
||||||
@ -523,8 +577,41 @@
|
|||||||
"description": "Permet de changer la qualité vidéo avec un bouton sur la vidéo",
|
"description": "Permet de changer la qualité vidéo avec un bouton sur la vidéo",
|
||||||
"name": "Changeur de qualité vidéo"
|
"name": "Changeur de qualité vidéo"
|
||||||
},
|
},
|
||||||
|
"scrobbler": {
|
||||||
|
"description": "Ajouter le support de scrobbling (ex. last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Erreur lors de l'authetification avec Last.fm\nCachez la popup jusqu'au prochain redémarrage.",
|
||||||
|
"title": "Authentification échouée"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Paramètres API de Last.fm"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Entrer le token utilisateur de ListenBrainz"
|
||||||
|
},
|
||||||
|
"scrobble-other-media": "Scrobbler d'autres médias"
|
||||||
|
},
|
||||||
|
"name": "Scrobble",
|
||||||
|
"prompt": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-key": "Clé API de Last.fm",
|
||||||
|
"api-secret": "API secret de Last.fm"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"label": "Entrez votre token utilisateur ListenBrainz :",
|
||||||
|
"title": "Token ListenBrainz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"shortcuts": {
|
"shortcuts": {
|
||||||
"description": "Permet de définir des raccourcis clavier globaux pour la lecture (lecture/pause/suivant/précédent) + désactiver l'OSD multimédia en remplaçant les touches multimédias + activer Ctrl/CMD + F pour rechercher + activer la prise en charge Linux MPRIS pour les touches multimédias + raccourcis clavier personnalisés pour les utilisateurs avancés",
|
"description": "Permet de définir des raccourcis clavier globaux pour la lecture (lecture/pause/suivant/précédent) + désactiver l'OSD multimédia en remplaçant les touches multimédias + activer Ctrl/CMD + F pour rechercher + activer la prise en charge Linux MPRIS pour les touches multimédias + raccourcis clavier personnalisés pour les utilisateurs avancés.",
|
||||||
"menu": {
|
"menu": {
|
||||||
"override-media-keys": "Remplacer les touches multimédias",
|
"override-media-keys": "Remplacer les touches multimédias",
|
||||||
"set-keybinds": "Définir les contrôles globaux des morceaux"
|
"set-keybinds": "Définir les contrôles globaux des morceaux"
|
||||||
|
|||||||
100
src/i18n/resources/hu.json
Normal file
100
src/i18n/resources/hu.json
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Nem sikerült futtatni a plugint {{pluginName}}::{{contextName}}",
|
||||||
|
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} a {{ms}}ms időpontban végrehajtott",
|
||||||
|
"initialize-failed": "Nem sikerült inicializálni a \"{{pluginName}}\" plugint",
|
||||||
|
"load-all": "Összes bővítmény betöltése",
|
||||||
|
"load-failed": "Nem sikerült betölteni a \"{{pluginName}}\" plugint",
|
||||||
|
"loaded": "Plugin \"{{pluginName}}\" betöltve",
|
||||||
|
"unload-failed": "Nem sikerült a \"{{pluginName}}\" bővítményt letölteni",
|
||||||
|
"unloaded": "A \"{{pluginName}}\" bővítményt nem töltötték be"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"code": "hu",
|
||||||
|
"local-name": "Magyar",
|
||||||
|
"name": "Hungarian"
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"console": {
|
||||||
|
"did-finish-load": {
|
||||||
|
"dev-tools": "Betöltés befejezve. DevTools megnyitva"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"loaded": "i18n betöltve"
|
||||||
|
},
|
||||||
|
"second-instance": {
|
||||||
|
"receive-command": "Fogadott parancs a protokollon keresztül: \"{{command}}\""
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"css-file-not-found": "CSS fájl \"{{cssFile}}\" nem létezik, figyelmen kívül hagyva"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"details": "Nem reagál hiba!\n{{error}}"
|
||||||
|
},
|
||||||
|
"when-ready": {
|
||||||
|
"clearing-cache-after-20s": "Alkalmazás gyorsítótárának törlése"
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"tried-to-render-offscreen": "Az ablak a képernyőn kívül próbált renderelni, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"hide-menu-enabled": {
|
||||||
|
"detail": "A menü el van rejtve, a megjelenítéshez használd az 'Alt' billentyűt (vagy az 'Escape' billentyűt, ha az alkalmazáson belüli menüt használod)",
|
||||||
|
"message": "A menü elrejtése engedélyezve",
|
||||||
|
"title": "Menü elrejtése engedélyezve"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "Később",
|
||||||
|
"restart-now": "Újraindítás most"
|
||||||
|
},
|
||||||
|
"detail": "A \"{{pluginName}}\" plugin újraindítást igényel a hatálybalépéshez",
|
||||||
|
"message": "\"{{pluginName}}\" újra kell indítani",
|
||||||
|
"title": "Újraindítás szükséges"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"buttons": {
|
||||||
|
"quit": "Kilépés",
|
||||||
|
"relaunch": "Újraindítás",
|
||||||
|
"wait": "Várj"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"update-available": {
|
||||||
|
"buttons": {
|
||||||
|
"disable": "Frissítések letiltása",
|
||||||
|
"download": "Letöltés",
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"detail": "Az új verzió elérhető, és letölthető a {{downloadLink}}",
|
||||||
|
"message": "Új verzió áll rendelkezésre",
|
||||||
|
"title": "Elérhető frissítés"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"about": "Névjegy",
|
||||||
|
"navigation": {
|
||||||
|
"label": "Navigálás",
|
||||||
|
"submenu": {
|
||||||
|
"copy-current-url": "Jelenlegi URL másolása",
|
||||||
|
"go-back": "Vissza",
|
||||||
|
"go-forward": "Előre",
|
||||||
|
"quit": "Kilépés",
|
||||||
|
"restart": "App újraindítása"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"label": "Beállítások",
|
||||||
|
"submenu": {
|
||||||
|
"advanced-options": {
|
||||||
|
"label": "Speciális beállítások"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Tambahkan dukungan scrobbling (mis. last.fm, Listenbrainz)",
|
"description": "Tambahkan dukungan scrobbling (mis. last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Gagal mengotentikasi Last.fm\nSembunyikan munculan hingga muat ulang selanjutnya.",
|
||||||
|
"title": "Otentikasi Gagal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Pengaturan API Last.fm"
|
"api-settings": "Pengaturan API Last.fm"
|
||||||
|
|||||||
690
src/i18n/resources/is.json
Normal file
690
src/i18n/resources/is.json
Normal file
@ -0,0 +1,690 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Tókst ekki að framkvæma viðbót {{pluginName}}::{{contextName}}",
|
||||||
|
"executed-at-ms": "Viðbótin {{pluginName}}::{{contextName}} var framkvæmd í {{ms}}ms",
|
||||||
|
"initialize-failed": "Tókst ekki að frumstilla viðbót \"{{pluginName}}\"",
|
||||||
|
"load-all": "Er að hlaða öllum viðbótum",
|
||||||
|
"load-failed": "Tókst ekki að hlaða viðbótinni \"{{pluginName}}\"",
|
||||||
|
"loaded": "Viðbót \"{{pluginName}}\" hlaðið",
|
||||||
|
"unload-failed": "Tókst ekki að afhlaða viðbótinni \"{{pluginName}}\"",
|
||||||
|
"unloaded": "Viðbótin „{{pluginName}}“ óhlaðin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"code": "is",
|
||||||
|
"local-name": "Íslenska",
|
||||||
|
"name": "Icelandic"
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"console": {
|
||||||
|
"did-finish-load": {
|
||||||
|
"dev-tools": "Lokið við hleðslu. DevTools opnuð"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"loaded": "i18n hlaðið"
|
||||||
|
},
|
||||||
|
"second-instance": {
|
||||||
|
"receive-command": "Fengið skipun yfir prótókoll: \"{{command}}\""
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"css-file-not-found": "CSS skrá \"{{cssFile}}\" er ekki til, er að hunsa"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"details": "Viðbragðslaust Villa!\n{{error}}"
|
||||||
|
},
|
||||||
|
"when-ready": {
|
||||||
|
"clearing-cache-after-20s": "Er að hreinsa forritabúfera"
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"tried-to-render-offscreen": "Gluggi reyndi að birta utan skjás, gluggastærð={{windowSize}}, skjástærð={{displaySize}}, stöðu={{position}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"hide-menu-enabled": {
|
||||||
|
"detail": "Valmyndin er falin, notaðu 'Breytingarlykil' til að sýna hana (eða 'Útfararlykil' ef þú notar valmynd í forriti)",
|
||||||
|
"message": "Fela Valmynd er virkjuð",
|
||||||
|
"title": "Fela Valmynd Virkjuð"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "Seinna",
|
||||||
|
"restart-now": "Endurræsa Núna"
|
||||||
|
},
|
||||||
|
"detail": "\"{{pluginName}}\" viðbótin þarfnast endurræsingar til að taka gildi",
|
||||||
|
"message": "\"{{pluginName}}\" þarf að endurræsa",
|
||||||
|
"title": "Endurræsa Krafist"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"buttons": {
|
||||||
|
"quit": "Hætta",
|
||||||
|
"relaunch": "Endurræsa",
|
||||||
|
"wait": "Bíddu"
|
||||||
|
},
|
||||||
|
"detail": "Við biðjumst velvirðingar á óþægindunum! vinsamlegast veldu hvað á að gera:",
|
||||||
|
"message": "Umsóknin svarar ekki",
|
||||||
|
"title": "Gluggi er svarar ekki"
|
||||||
|
},
|
||||||
|
"update-available": {
|
||||||
|
"buttons": {
|
||||||
|
"disable": "Gera Uppfærslur Óvirkar",
|
||||||
|
"download": "Sækja",
|
||||||
|
"ok": "Í lagi"
|
||||||
|
},
|
||||||
|
"detail": "Ný útgáfa er fáanleg og hægt er að hlaða henni niður á {{downloadLink}}",
|
||||||
|
"message": "Ný útgáfa er fáanleg",
|
||||||
|
"title": "Uppfærsla Fáanleg"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"about": "Um",
|
||||||
|
"navigation": {
|
||||||
|
"label": "Leiðsögn",
|
||||||
|
"submenu": {
|
||||||
|
"copy-current-url": "Afritaðu núverandi vefslóð",
|
||||||
|
"go-back": "Farðu til baka",
|
||||||
|
"go-forward": "Farðu áfram",
|
||||||
|
"quit": "Útganga",
|
||||||
|
"restart": "Endurræstu Forritið"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"label": "Valkostir",
|
||||||
|
"submenu": {
|
||||||
|
"advanced-options": {
|
||||||
|
"label": "Ítarlegravalkostir",
|
||||||
|
"submenu": {
|
||||||
|
"auto-reset-app-cache": "Endurstilltu skyndiminni forritsins þegar forritið ræsir",
|
||||||
|
"disable-hardware-acceleration": "Slökktu á vélbúnaðarhröðun",
|
||||||
|
"edit-config-json": "Breyta config.json",
|
||||||
|
"override-user-agent": "Hneka Notandaumboðsmanni",
|
||||||
|
"restart-on-config-changes": "Endurræstu við stillingarbreytingar",
|
||||||
|
"set-proxy": {
|
||||||
|
"label": "Stilla umboð",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Sláðu inn umboðsfang: (skilið eftir autt til að slökkva á)",
|
||||||
|
"placeholder": "Dæmi: SOCKS5://127.0.0.1:9999",
|
||||||
|
"title": "Stilla umboð"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toggle-dev-tools": "Breyta DevTools"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"always-on-top": "Alltaf á toppnum",
|
||||||
|
"auto-update": "Sjálfvirk Uppfærsla",
|
||||||
|
"hide-menu": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Valmyndin verður falin við næstu ræsingu, notaðu [Alt] til að sýna hana (eða bakaðu við [`] ef þú notar valmynd í forriti)",
|
||||||
|
"title": "Fela Valmynd Virkjuð"
|
||||||
|
},
|
||||||
|
"label": "Fela Valmynd"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Tungumáli verður breytt eftir endurræsingu",
|
||||||
|
"title": "Tungumáli Breytt"
|
||||||
|
},
|
||||||
|
"label": "Tungumál",
|
||||||
|
"submenu": {
|
||||||
|
"to-help-translate": "Viltu hjálpa til við að þýða? Smellið hér"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume-on-start": "Haltu áfram síðasta lagi þegar forritið byrjar",
|
||||||
|
"single-instance-lock": "Eittdæmilás",
|
||||||
|
"start-at-login": "Byrjaðu á innskráningu",
|
||||||
|
"starting-page": {
|
||||||
|
"label": "Upphafssíða",
|
||||||
|
"unset": "Ósetja"
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"label": "Bakki",
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "Fötluð",
|
||||||
|
"enabled-and-hide-app": "Bakki virkt, og fela forritsgluggi",
|
||||||
|
"enabled-and-show-app": "Virkjað og sýna forrit",
|
||||||
|
"play-pause-on-click": "Spila/hlé við smell"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visual-tweaks": {
|
||||||
|
"label": "Sjónrænaraðlögun",
|
||||||
|
"submenu": {
|
||||||
|
"like-buttons": {
|
||||||
|
"default": "Sjálfgefinn",
|
||||||
|
"force-show": "Þvingaðu sýna",
|
||||||
|
"hide": "Fela",
|
||||||
|
"label": "Líkartakkar"
|
||||||
|
},
|
||||||
|
"remove-upgrade-button": "Fjarlægja uppgræðartakkan",
|
||||||
|
"theme": {
|
||||||
|
"label": "Þema",
|
||||||
|
"submenu": {
|
||||||
|
"import-css-file": "Flytja inn sérsniðna CSS skrá",
|
||||||
|
"no-theme": "Engin þema"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"enabled": "Virkt",
|
||||||
|
"label": "Viðbætur",
|
||||||
|
"new": "NÝR"
|
||||||
|
},
|
||||||
|
"view": {
|
||||||
|
"label": "Útsýni",
|
||||||
|
"submenu": {
|
||||||
|
"force-reload": "Þvingaðu Endurhleðslu",
|
||||||
|
"reload": "Endurhlaða",
|
||||||
|
"reset-zoom": "Raunveruleg Stærð",
|
||||||
|
"toggle-fullscreen": "Breyta Fullskjá",
|
||||||
|
"zoom-in": "Aðdráttur",
|
||||||
|
"zoom-out": "Aðdráttur út"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"next": "Næst",
|
||||||
|
"play-pause": "Spila/Hlé",
|
||||||
|
"previous": "Fyrri",
|
||||||
|
"quit": "Útganga",
|
||||||
|
"restart": "Endurræstu Forritið",
|
||||||
|
"show": "Sýna glugga",
|
||||||
|
"tooltip": {
|
||||||
|
"default": "YouTube Tónlist",
|
||||||
|
"with-song-info": "YouTube Tónlist: {{artist}} - {{title}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"adblocker": {
|
||||||
|
"description": "Lokaðu fyrir allar auglýsingar og rakningar úr kassanum",
|
||||||
|
"menu": {
|
||||||
|
"blocker": "Blokkari"
|
||||||
|
},
|
||||||
|
"name": "Auglýsingablokkari"
|
||||||
|
},
|
||||||
|
"album-actions": {
|
||||||
|
"description": "Bætir Ódíslika, Mislíkt, Líkt, og Ólíkt til að nota þetta á öll lög á spilunarlista eða albúm",
|
||||||
|
"name": "Albúmsaðgerðir"
|
||||||
|
},
|
||||||
|
"album-color-theme": {
|
||||||
|
"description": "Beitir kraftmikið þema og sjónrænum áhrifum sem byggjast á litavali albúmsins",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"label": "Litablöndunarhlutfall",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{ratio}}%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Albúmslitaþema"
|
||||||
|
},
|
||||||
|
"ambient-mode": {
|
||||||
|
"description": "Beitir lýsingaráhrifum með því að varpa mildum litum úr myndbandinu í bakgrunn skjásins",
|
||||||
|
"menu": {
|
||||||
|
"blur-amount": {
|
||||||
|
"label": "Þokuupphæð",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{blurAmount}} pixlum"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buffer": {
|
||||||
|
"label": "Stuðpúði",
|
||||||
|
"submenu": {
|
||||||
|
"buffer": "{{buffer}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"opacity": {
|
||||||
|
"label": "Ógegnsæi",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality": {
|
||||||
|
"label": "Gæði",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{quality}} pixlum"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"label": "Sæði",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{size}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"smoothness-transition": {
|
||||||
|
"label": "Slétt umskipti",
|
||||||
|
"submenu": {
|
||||||
|
"during": "Meðan á {{interpolationTime}} s"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"use-fullscreen": {
|
||||||
|
"label": "Er að nota fullskjár"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Umhverfishamur"
|
||||||
|
},
|
||||||
|
"audio-compressor": {
|
||||||
|
"description": "Notaðu þjöppun á hljóð (lækkar hljóðstyrk háværustu hluta merkis og hækkar hljóðstyrk í mýkstu hlutunum)",
|
||||||
|
"name": "Hljóðþjöppu"
|
||||||
|
},
|
||||||
|
"blur-nav-bar": {
|
||||||
|
"description": "Gerir leiðsögustikuna gagnsæja og óskýrt",
|
||||||
|
"name": "Þoka Leiðsagnarstika"
|
||||||
|
},
|
||||||
|
"bypass-age-restrictions": {
|
||||||
|
"description": "Framhjá aldursstaðfestingu YouTube",
|
||||||
|
"name": "Farið Framhjá Aldurstakmörkunum"
|
||||||
|
},
|
||||||
|
"captions-selector": {
|
||||||
|
"description": "Skjátextavali fyrir YouTube Tónlist hljóðrásir",
|
||||||
|
"menu": {
|
||||||
|
"autoload": "Veldu sjálfkrafa síðast notaða myndatexta",
|
||||||
|
"disable-captions": "Engir skjátextar sjálfgefið"
|
||||||
|
},
|
||||||
|
"name": "Yfirskriftarval",
|
||||||
|
"prompt": {
|
||||||
|
"selector": {
|
||||||
|
"label": "Núverandi tungumál skjátexta: {{language}}",
|
||||||
|
"none": "Enginn",
|
||||||
|
"title": "Veldu tungumál fyrir skjátexta"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"title": "Opnaðu skjátextavali"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compact-sidebar": {
|
||||||
|
"description": "Stilltu hliðarstikuna alltaf í þétta stillingu",
|
||||||
|
"name": "Fyrirferðarlítillhliðarstika"
|
||||||
|
},
|
||||||
|
"crossfade": {
|
||||||
|
"description": "Krossfæra á milli lög",
|
||||||
|
"menu": {
|
||||||
|
"advanced": "Háþróaður"
|
||||||
|
},
|
||||||
|
"name": "Krossfæra [Prófunarútgáfa]",
|
||||||
|
"prompt": {
|
||||||
|
"options": {
|
||||||
|
"multi-input": {
|
||||||
|
"fade-in-duration": "Dvína í lengd (ms)",
|
||||||
|
"fade-out-duration": "Dvína út lengd (ms)",
|
||||||
|
"fade-scaling": {
|
||||||
|
"label": "Fölunarskala",
|
||||||
|
"linear": "Línulegt",
|
||||||
|
"logarithmic": "Logaritmískt"
|
||||||
|
},
|
||||||
|
"seconds-before-end": "Krossfæra N sekúndum fyrir enda"
|
||||||
|
},
|
||||||
|
"title": "Krossfæravalkosti"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disable-autoplay": {
|
||||||
|
"description": "Gerir lag að byrja í \"hlé\" ham",
|
||||||
|
"menu": {
|
||||||
|
"apply-once": "Á aðeins við ræsingu"
|
||||||
|
},
|
||||||
|
"name": "Slökkva á sjálfvirkri spilun"
|
||||||
|
},
|
||||||
|
"discord": {
|
||||||
|
"backend": {
|
||||||
|
"already-connected": "Reyndi að tengja við virka tengingu",
|
||||||
|
"connected": "Tengdur við Discord",
|
||||||
|
"disconnected": "Aftengdur við Discord"
|
||||||
|
},
|
||||||
|
"description": "Sýndu vinum þínum hvað þú hlustar á með Rík Nærvera",
|
||||||
|
"menu": {
|
||||||
|
"auto-reconnect": "Sjálfvirk endurtengja",
|
||||||
|
"clear-activity": "Hreinsa virkni",
|
||||||
|
"clear-activity-after-timeout": "Hreinsa virkni eftir tímamörk",
|
||||||
|
"connected": "Tengt",
|
||||||
|
"disconnected": "Aftengt",
|
||||||
|
"hide-duration-left": "Fela tímalengd til vinstri",
|
||||||
|
"hide-github-button": "Fela GitHub tengilhnapp",
|
||||||
|
"play-on-youtube-music": "Spilaðu á YouTube Tónlist",
|
||||||
|
"set-inactivity-timeout": "Stilltu tímamörk fyrir óvirkni"
|
||||||
|
},
|
||||||
|
"name": "Discord Rík Nærvera",
|
||||||
|
"prompt": {
|
||||||
|
"set-inactivity-timeout": {
|
||||||
|
"label": "Sláðu inn óvirknitíma eftir sekúndur:",
|
||||||
|
"title": "Stilltu tímamörk fyrir óvirkni"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"downloader": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"error": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "Í lagi"
|
||||||
|
},
|
||||||
|
"message": "Úff! Afsakið, niðurhal mistókst…",
|
||||||
|
"title": "Villa við niðurhal!"
|
||||||
|
},
|
||||||
|
"start-download-playlist": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "Í lagi"
|
||||||
|
},
|
||||||
|
"detail": "({{playlistSize}} lög)",
|
||||||
|
"message": "Að sækja lagalista {{playlistTitle}}",
|
||||||
|
"title": "Niðurhal byrjað"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"feedback": {
|
||||||
|
"conversion-progress": "Umbreyting: {{percent}}%",
|
||||||
|
"converting": "Er að umbreytir…",
|
||||||
|
"done": "Búið: {{filePath}}",
|
||||||
|
"download-info": "Er að niðurhal {{artist}} - {{title}} [{{videoId}}",
|
||||||
|
"download-progress": "Niðurhal: {{percent}}%",
|
||||||
|
"downloading": "Er að niðurhal…",
|
||||||
|
"downloading-counter": "Er að niðurhal {{current}}/{{total}}…",
|
||||||
|
"downloading-playlist": "Er að niðurhal spilunarlisti \"{{playlistTitle}}\" - {{playlistSize}} lög ({{playlistId}})",
|
||||||
|
"error-while-downloading": "Villa við niðurhal \"{{author}} - {{title}}\": {{error}}",
|
||||||
|
"folder-already-exists": "Mappan {{playlistFolder}} er þegar til",
|
||||||
|
"getting-playlist-info": "Sækir upplýsingar um spilunarlista…",
|
||||||
|
"loading": "Er að hlaða.…",
|
||||||
|
"playlist-has-only-one-song": "Spilunarlista hefur aðeins eitt atriði, það er verið að hlaða því niður beint",
|
||||||
|
"playlist-id-not-found": "Ekkert auðkenni spilunarlista fannst",
|
||||||
|
"playlist-is-empty": "Spilunarlistinn er tómur",
|
||||||
|
"playlist-is-mix-or-private": "Villa við að fá upplýsingar um spilunarlista: Gakktu úr skugga um að þetta sé ekki einkaspilunarlisti eða \"Mixað fyrir þig\"\n\n{{error}}",
|
||||||
|
"preparing-file": "Er að undirbúa skrá…",
|
||||||
|
"saving": "Er að vista…",
|
||||||
|
"trying-to-get-playlist-id": "Er að reyna að fá auðkenni spilunarlista: {{playlistId}}",
|
||||||
|
"video-id-not-found": "Myndband fannst ekki",
|
||||||
|
"writing-id3": "Að skrifa ID3 tög…"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Niðurhalar MP3 / upprunahljóði beint úr viðmótinu",
|
||||||
|
"menu": {
|
||||||
|
"choose-download-folder": "Veldu niðurhalsmöppu",
|
||||||
|
"download-playlist": "Sækja spilunarlista",
|
||||||
|
"presets": "Forstillingar",
|
||||||
|
"skip-existing": "Slepptu núverandi skrám"
|
||||||
|
},
|
||||||
|
"name": "Niðurhalari",
|
||||||
|
"renderer": {
|
||||||
|
"can-not-update-progress": "Ekki er hægt að uppfæra framvindu"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"button": "Sækja"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"exponential-volume": {
|
||||||
|
"description": "Gerir hljóðstyrkssleðann veldisvísis svo það er auðveldara að velja lægra hljóðstyrk.",
|
||||||
|
"name": "Veldibundiðrúmmál"
|
||||||
|
},
|
||||||
|
"in-app-menu": {
|
||||||
|
"description": "Gefur valmyndastikum glæsilegt, dökkt eða albúmslitsjáðu",
|
||||||
|
"menu": {
|
||||||
|
"hide-dom-window-controls": "Fela DOM gluggastýringar"
|
||||||
|
},
|
||||||
|
"name": "Valmynd í forriti"
|
||||||
|
},
|
||||||
|
"lumiastream": {
|
||||||
|
"description": "Bætir við Lumia Stream stuðningi",
|
||||||
|
"name": "Lumia Stream [Prófunarútgáfa]"
|
||||||
|
},
|
||||||
|
"lyrics-genius": {
|
||||||
|
"description": "Bætir stuðningi við texta fyrir flest lög",
|
||||||
|
"menu": {
|
||||||
|
"romanized-lyrics": "Rómaníseraðir Söngtexti"
|
||||||
|
},
|
||||||
|
"name": "Söngtexti Snilld",
|
||||||
|
"renderer": {
|
||||||
|
"fetched-lyrics": "Sótt söngtexti fyrir Snilld"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"music-together": {
|
||||||
|
"description": "Deila spilunarlista með öðrum. Þegar gestgjafinn spilar lag munu allir aðrir heyra sama lagið",
|
||||||
|
"dialog": {
|
||||||
|
"enter-host": "Sláðu inn auðkenni gestgjafa"
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"save": "Vista",
|
||||||
|
"track-source": "Lagsuppspretta",
|
||||||
|
"unknown-user": "Óþekktur notandi"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"click-to-copy-id": "Afritaðu hýsingarauðkenni",
|
||||||
|
"close": "Lokaðu Tónlist Saman",
|
||||||
|
"connected-users": "Tengdir Notendur",
|
||||||
|
"disconnect": "Aftengdu Tónlist Saman",
|
||||||
|
"empty-user": "Engir tengdir notendur",
|
||||||
|
"host": "Tónlist Saman Gestgjafi",
|
||||||
|
"join": "Vertu með Tónlist Saman",
|
||||||
|
"permission": {
|
||||||
|
"all": "Leyfðu gestum að stjórna spilunarlista og spilara",
|
||||||
|
"host-only": "Aðeins gestgjafi getur stjórnað spilunarlista og spilara",
|
||||||
|
"playlist": "Leyfðu gestum að stjórna spilunarlista"
|
||||||
|
},
|
||||||
|
"set-permission": "Breyta Stjórnunarheimild",
|
||||||
|
"status": {
|
||||||
|
"disconnected": "Aftengt",
|
||||||
|
"guest": "Tengdur sem Gestur",
|
||||||
|
"host": "Tengdur sem Gestgjafi"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Tónlist Saman [Prófunarútgáfa]",
|
||||||
|
"toast": {
|
||||||
|
"add-song-failed": "Mistókst að bæta við lagi",
|
||||||
|
"closed": "Tónlist Saman lokað",
|
||||||
|
"disconnected": "Tónlist Saman aftengt",
|
||||||
|
"host-failed": "Mistókst að hýsa Tónlist Saman",
|
||||||
|
"id-copied": "Gestgjafaauðkenni afritað á klippiborð",
|
||||||
|
"id-copy-failed": "Mistókst að afrita Hýsingarauðkenni á klippiborð",
|
||||||
|
"join-failed": "Ekki tókst að taka þátt í Tónlist Saman",
|
||||||
|
"joined": "Tengd Tónlist Saman",
|
||||||
|
"permission-changed": "Tónlist Saman leyfi breytt í \"{{permission}}\"",
|
||||||
|
"remove-song-failed": "Tókst ekki að fjarlægja lag",
|
||||||
|
"user-connected": "{{name}} tengd Tónlist Saman",
|
||||||
|
"user-disconnected": "{{name}} fór frá Tónlist Saman"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"description": "Næsta/Til baka leiðsagnarörvar beint samþættar í viðmótinu, eins og í uppáhalds vafranum þínum",
|
||||||
|
"name": "Leiðsögn"
|
||||||
|
},
|
||||||
|
"no-google-login": {
|
||||||
|
"description": "Fjarlægðu Google innskráningarhnappa og tengla úr viðmótinu",
|
||||||
|
"name": "Engin Google innskráning"
|
||||||
|
},
|
||||||
|
"notifications": {
|
||||||
|
"description": "Birta tilkynningu þegar lag byrjar að spila (gagnvirkartilkynningar eru fáanlegar á Windows)",
|
||||||
|
"menu": {
|
||||||
|
"interactive": "Gagnvirkartilkynningar",
|
||||||
|
"interactive-settings": {
|
||||||
|
"label": "Gagnvirkarstillingar",
|
||||||
|
"submenu": {
|
||||||
|
"hide-button-text": "Fela hnappatexta",
|
||||||
|
"refresh-on-play-pause": "Endurnýjaðu í Spilun/Hlé",
|
||||||
|
"tray-controls": "Opna/loka á bakka smellur"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"priority": "Tilkynningaforgangur",
|
||||||
|
"toast-style": "Ristað brauð stíl",
|
||||||
|
"unpause-notification": "Sýna tilkynningu þegar ekki er gert hlé"
|
||||||
|
},
|
||||||
|
"name": "Tilkynningar"
|
||||||
|
},
|
||||||
|
"picture-in-picture": {
|
||||||
|
"description": "Gerir kleift að skipta forritinu yfir í mynd-í-mynd stillingu",
|
||||||
|
"menu": {
|
||||||
|
"always-on-top": "Alltaf á toppnum",
|
||||||
|
"hotkey": {
|
||||||
|
"label": "Flýtilykil",
|
||||||
|
"prompt": {
|
||||||
|
"keybind-options": {
|
||||||
|
"hotkey": "Flýtilykil"
|
||||||
|
},
|
||||||
|
"label": "Veldu flýtilykil til að skipta mynd-í-mynd",
|
||||||
|
"title": "Mynd-í-mynd Flýtilykil"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"save-window-position": "Vista gluggastöðu",
|
||||||
|
"save-window-size": "Vista gluggastærð",
|
||||||
|
"use-native-pip": "Notaðu innbyggða PiP í vafra"
|
||||||
|
},
|
||||||
|
"name": "Mynd-í-mynd",
|
||||||
|
"templates": {
|
||||||
|
"button": "Mynd-í-mynd"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playback-speed": {
|
||||||
|
"description": "Hlustaðu hratt, hlustaðu hægt! Bætir við sleða sem stjórnar lagahraðanum",
|
||||||
|
"name": "Spilunarhraði",
|
||||||
|
"templates": {
|
||||||
|
"button": "Hraði"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"precise-volume": {
|
||||||
|
"description": "Stjórnaðu hljóðstyrknum nákvæmlega með músarhjóli/hraðtökkum, með sérsniðnum HUD og sérsniðnum hljóðstyrksþrepum",
|
||||||
|
"menu": {
|
||||||
|
"arrows-shortcuts": "Staðbundnar Örvatakkar Stjórna",
|
||||||
|
"custom-volume-steps": "Stilltu Sérsniðin Hljóðstyrksskref",
|
||||||
|
"global-shortcuts": "Alþjóðlegarflýtilyklar"
|
||||||
|
},
|
||||||
|
"name": "Nákvæmshljóðstyrkur",
|
||||||
|
"prompt": {
|
||||||
|
"global-shortcuts": {
|
||||||
|
"keybind-options": {
|
||||||
|
"decrease": "Minnka Hljóðstyrk",
|
||||||
|
"increase": "Auka Hljóðstyrk"
|
||||||
|
},
|
||||||
|
"label": "Veldu Alþjóðleghljóðstyrklyklabindingar:",
|
||||||
|
"title": "Alþjóðleghljóðstyrklyklabindingar"
|
||||||
|
},
|
||||||
|
"volume-steps": {
|
||||||
|
"label": "Veldu Hljóðstyrksauka/Minnka Skref",
|
||||||
|
"title": "Hljóðstyrksskref"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality-changer": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"quality-changer": {
|
||||||
|
"detail": "Núverandi Gæði: {{quality}}",
|
||||||
|
"message": "Veldu Myndbandsgæði:",
|
||||||
|
"title": "Veldu Myndbandsgæði"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Leyfir að breyta myndbandgæðum með hnappi á myndbandsyfirlaginu",
|
||||||
|
"name": "Myndbandgæðisbreyting"
|
||||||
|
},
|
||||||
|
"scrobbler": {
|
||||||
|
"description": "Bæta við scrobbling stuðningi (osv. last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Mistókst að auðkenna með Last.fm\nFela sprettigluggann þar til næstu endurræsingu.",
|
||||||
|
"title": "Auðkenning Mistókst"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Last.fm API Stillingar"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Sláðu inn ListenBrainz notandalykilinn"
|
||||||
|
},
|
||||||
|
"scrobble-other-media": "Scrobble aðra fjölmiðla"
|
||||||
|
},
|
||||||
|
"name": "Scrobbler",
|
||||||
|
"prompt": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-key": "Last.fm API lykill",
|
||||||
|
"api-secret": "Last.fm API leyndarmál"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"label": "Sláðu inn ListenBrainz notandatáknið þitt:",
|
||||||
|
"title": "ListenBrainz tákn"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shortcuts": {
|
||||||
|
"description": "Leyfir að stilla alþjóðlegaflýtilykla fyrir spilun (spila/gera hlé/næsta/fyrri) og slökkva á OSD miðla með því að hnekkja miðlunartökkum, kveikja á Ctrl/CMD + F til að leita, kveikja á Linux MPRIS stuðningi fyrir miðlunarlykla og sérsniðna flýtilykla fyrir lengra komna notendur",
|
||||||
|
"menu": {
|
||||||
|
"override-media-keys": "Hneka Fjölmiðlalykla",
|
||||||
|
"set-keybinds": "Stilltu Alþjóðlegslagastýringar"
|
||||||
|
},
|
||||||
|
"name": "Flýtileiðir (og MPRIS)",
|
||||||
|
"prompt": {
|
||||||
|
"keybind": {
|
||||||
|
"keybind-options": {
|
||||||
|
"next": "Næst",
|
||||||
|
"play-pause": "Spila / Hlé",
|
||||||
|
"previous": "Fyrri"
|
||||||
|
},
|
||||||
|
"label": "Veldu Alþjóðlegslyklabind fyrir Lagastýringu:",
|
||||||
|
"title": "Alþjóðlegslyklabindingar"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skip-disliked-songs": {
|
||||||
|
"description": "Sleppir mislíkaði lög",
|
||||||
|
"name": "Slepptu Mislíkaði Lög"
|
||||||
|
},
|
||||||
|
"skip-silences": {
|
||||||
|
"description": "Slepptu sjálfkrafa þagnarköflum í lögum",
|
||||||
|
"name": "Slepptu Þögnum"
|
||||||
|
},
|
||||||
|
"sponsorblock": {
|
||||||
|
"description": "Sleppur sjálfkrafa hlutum sem ekki eru tónlist, eins og inngangur/lok eða hlutar af tónlistarmyndböndum þar sem lag er ekki að spila",
|
||||||
|
"name": "Styrktarblokk"
|
||||||
|
},
|
||||||
|
"taskbar-mediacontrol": {
|
||||||
|
"description": "Stjórnaðu spilun frá Windows verkefnastikunni þinni",
|
||||||
|
"name": "Miðlunarstýringarverkefnastikunnar"
|
||||||
|
},
|
||||||
|
"touchbar": {
|
||||||
|
"description": "Bætir við Snertistiku græju fyrir macOS notendur",
|
||||||
|
"name": "Snertistiku"
|
||||||
|
},
|
||||||
|
"tuna-obs": {
|
||||||
|
"description": "Samþætting við OBS viðbót Tuna",
|
||||||
|
"name": "Tuna OBS"
|
||||||
|
},
|
||||||
|
"video-toggle": {
|
||||||
|
"description": "Bætir við hnappi til að skipta á milli myndbands/lagshams. Getur einnig valfrjálst fjarlægt allan myndbandsflipann",
|
||||||
|
"menu": {
|
||||||
|
"align": {
|
||||||
|
"label": "Jöfnun",
|
||||||
|
"submenu": {
|
||||||
|
"left": "Vinstri",
|
||||||
|
"middle": "Miðja",
|
||||||
|
"right": "Rétt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"force-hide": "Þvingaðu fjarlægja myndbandsflipann",
|
||||||
|
"mode": {
|
||||||
|
"label": "Hamur",
|
||||||
|
"submenu": {
|
||||||
|
"custom": "Sérsniðinn rofi",
|
||||||
|
"disabled": "Fötluð",
|
||||||
|
"native": "Innfæddsrofi"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Myndbandsrofi",
|
||||||
|
"templates": {
|
||||||
|
"button": "Lag"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visualizer": {
|
||||||
|
"description": "Bætir sýndarstýringar við spilarann",
|
||||||
|
"menu": {
|
||||||
|
"visualizer-type": "Sýndarstýringartegund"
|
||||||
|
},
|
||||||
|
"name": "Sýndarstýringar"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Aggiunge il supporto per lo scrobbling (Last.fm, Listenbrainz ecc.)",
|
"description": "Aggiunge il supporto per lo scrobbling (Last.fm, Listenbrainz ecc.)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Impossibile autenticarsi con Last.fm\nNascondi il popup fino al prossimo riavvio.",
|
||||||
|
"title": "Autenticazione fallita"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Impostazione Last.fm API"
|
"api-settings": "Impostazione Last.fm API"
|
||||||
|
|||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "スクロブリング対応を追加します(例:last.fm、Listenbrainzなど)",
|
"description": "スクロブリング対応を追加します(例:last.fm、Listenbrainzなど)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Last.fm の認証に失敗しました\n次の再起動までポップアップは非表示になります。",
|
||||||
|
"title": "認証に失敗"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Last.fm API 設定"
|
"api-settings": "Last.fm API 設定"
|
||||||
|
|||||||
@ -170,7 +170,8 @@
|
|||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"enabled": "Įjungta",
|
"enabled": "Įjungta",
|
||||||
"label": "Įskiepiai"
|
"label": "Įskiepiai",
|
||||||
|
"new": "NAUJIENA"
|
||||||
},
|
},
|
||||||
"view": {
|
"view": {
|
||||||
"label": "Vaizdas",
|
"label": "Vaizdas",
|
||||||
|
|||||||
@ -36,15 +36,15 @@
|
|||||||
"details": "Svarer ikke\n{{error}}"
|
"details": "Svarer ikke\n{{error}}"
|
||||||
},
|
},
|
||||||
"when-ready": {
|
"when-ready": {
|
||||||
"clearing-cache-after-20s": "Tømmer programhurtiglager"
|
"clearing-cache-after-20s": "Tømmer programhurtigbuffer"
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
"tried-to-render-offscreen": "Prøvde å tegne vindu utenfor skjermen. Størrelse={{windowSize}}, skjermstørrelse={{displaySize}}, posisjon={{position}}"
|
"tried-to-render-offscreen": "Prøvde å tegne vindu utenfor skjermen, størrelse={{windowSize}}, skjermstørrelse={{displaySize}}, posisjon={{position}}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"hide-menu-enabled": {
|
"hide-menu-enabled": {
|
||||||
"detail": "Menyen er skjult. Bruk «Alt» for å vise den, (ller «Esc» for å bruke menyen i programmet).",
|
"detail": "Menyen er skjult, bruk 'Alt' for å vise den (eller 'Escape' for å bruke menyen i programmet)",
|
||||||
"message": "Meny skjult",
|
"message": "Meny skjult",
|
||||||
"title": "Meny vist"
|
"title": "Meny vist"
|
||||||
},
|
},
|
||||||
@ -85,7 +85,7 @@
|
|||||||
"submenu": {
|
"submenu": {
|
||||||
"copy-current-url": "Kopier nåværende nettadresse",
|
"copy-current-url": "Kopier nåværende nettadresse",
|
||||||
"go-back": "Tilbake",
|
"go-back": "Tilbake",
|
||||||
"go-forward": "Forover",
|
"go-forward": "Framover",
|
||||||
"quit": "Avslutt",
|
"quit": "Avslutt",
|
||||||
"restart": "Programomstart"
|
"restart": "Programomstart"
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@
|
|||||||
"advanced-options": {
|
"advanced-options": {
|
||||||
"label": "Avanserte alternativer",
|
"label": "Avanserte alternativer",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"auto-reset-app-cache": "Tilbakestill programhurtiglager når programmet startes",
|
"auto-reset-app-cache": "Tilbakestill programhurtigbuffer når programmet startes",
|
||||||
"disable-hardware-acceleration": "Skru av maskinvareakselerasjon",
|
"disable-hardware-acceleration": "Skru av maskinvareakselerasjon",
|
||||||
"edit-config-json": "Rediger config.json",
|
"edit-config-json": "Rediger config.json",
|
||||||
"override-user-agent": "Overstyr brukeragent",
|
"override-user-agent": "Overstyr brukeragent",
|
||||||
|
|||||||
43
src/i18n/resources/nl.json
Normal file
43
src/i18n/resources/nl.json
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Kan plug-in {{pluginName}}::{{contextName}} niet uitvoeren",
|
||||||
|
"executed-at-ms": "Plug-in {{pluginName}}::{{contextName}} uitgevoerd in {{ms}}ms",
|
||||||
|
"initialize-failed": "Kan plug-in \"{{pluginName}}\" niet laden",
|
||||||
|
"load-all": "Alle plug-ins laden",
|
||||||
|
"load-failed": "Kan plug-in \"{{pluginName}}\" niet laden",
|
||||||
|
"loaded": "Plug-in \"{{pluginName}}\" geladen",
|
||||||
|
"unload-failed": "Kan plug-in \"{{pluginName}}\" niet verwijderen",
|
||||||
|
"unloaded": "Plug-in \"{{pluginName}}\" geladen"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"code": "nl",
|
||||||
|
"local-name": "Nederlands",
|
||||||
|
"name": "Dutch"
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"console": {
|
||||||
|
"did-finish-load": {
|
||||||
|
"dev-tools": "Klaar met laden, DevTools geopend"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"loaded": "i18n geladen"
|
||||||
|
},
|
||||||
|
"second-instance": {
|
||||||
|
"receive-command": "Ontvangen commando via protocol: \"{{command}}\""
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"css-file-not-found": "CSS bestand \"{{cssFile}}\" niet gevonden"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"details": "Niet reagerend door fout:\n{{error}}"
|
||||||
|
},
|
||||||
|
"when-ready": {
|
||||||
|
"clearing-cache-after-20s": "App-cache wissen"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -214,6 +214,7 @@
|
|||||||
"description": "Stosuje dynamiczny motyw i efekty wizualne w oparciu o paletę kolorów albumu",
|
"description": "Stosuje dynamiczny motyw i efekty wizualne w oparciu o paletę kolorów albumu",
|
||||||
"menu": {
|
"menu": {
|
||||||
"color-mix-ratio": {
|
"color-mix-ratio": {
|
||||||
|
"label": "Intensywność koloru",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
@ -439,7 +440,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"music-together": {
|
"music-together": {
|
||||||
"description": "Pozwala na udostępnianie listy odtwarzania w taki sposób, że osoby po wejściu w link słuchają tego samego utworu co host (jeżeli słucha jej z owej listy odtwarzania)",
|
"description": "Pozwala na udostępnianie listy odtwarzania z możliwością słuchania tego samego utworu co host",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"enter-host": "Wpisz ID hosta"
|
"enter-host": "Wpisz ID hosta"
|
||||||
},
|
},
|
||||||
@ -454,7 +455,7 @@
|
|||||||
"connected-users": "Połączeni użytkownicy",
|
"connected-users": "Połączeni użytkownicy",
|
||||||
"disconnect": "Rozłącz z hosta",
|
"disconnect": "Rozłącz z hosta",
|
||||||
"empty-user": "Brak połączonych użytkowników",
|
"empty-user": "Brak połączonych użytkowników",
|
||||||
"host": "Host słuchania razem",
|
"host": "Udostępnij tą listę odtwarzania",
|
||||||
"join": "Połącz z hostem",
|
"join": "Połącz z hostem",
|
||||||
"permission": {
|
"permission": {
|
||||||
"all": "Połączeni użytkownicy mają kontrolę nad listą odtwarzania oraz playerem",
|
"all": "Połączeni użytkownicy mają kontrolę nad listą odtwarzania oraz playerem",
|
||||||
@ -577,14 +578,29 @@
|
|||||||
"name": "Zmieniacz jakości wideo"
|
"name": "Zmieniacz jakości wideo"
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"menu": {
|
"description": "Umożliwia scrobbling utworów do m.in. last.fm lub Listenbrainz",
|
||||||
"listenbrainz": {
|
"dialog": {
|
||||||
"token": "Podaj token użytkownika ListenBrainz"
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Podczas autoryzowania z last.fm wystąpił błąd.\nSchowaj pop-up aż do następnego uruchomienia.",
|
||||||
|
"title": "Podczas autoryzowania wystąpił błąd"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Ustawienia API Last.fm"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Podaj token użytkownika ListenBrainz"
|
||||||
|
},
|
||||||
|
"scrobble-other-media": "Scrobbluj pozostałe multimedia"
|
||||||
|
},
|
||||||
|
"name": "Scrobblowanie",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-key": "klucz API Last.fm"
|
"api-key": "klucz API Last.fm",
|
||||||
|
"api-secret": "Sekretny klucz Last.fm API (\"secret key\")"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": {
|
"token": {
|
||||||
|
|||||||
@ -212,6 +212,13 @@
|
|||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
"description": "Aplica um tema dinâmico e efeitos visuais com base na paleta de cores do álbum",
|
"description": "Aplica um tema dinâmico e efeitos visuais com base na paleta de cores do álbum",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"submenu": {
|
||||||
|
"percent": "Proporção"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"name": "Tema de cores do álbum"
|
"name": "Tema de cores do álbum"
|
||||||
},
|
},
|
||||||
"ambient-mode": {
|
"ambient-mode": {
|
||||||
@ -569,8 +576,30 @@
|
|||||||
"description": "Permite alterar a qualidade do vídeo com um botão na sobreposição de vídeo",
|
"description": "Permite alterar a qualidade do vídeo com um botão na sobreposição de vídeo",
|
||||||
"name": "Trocador de qualidade do vídeo"
|
"name": "Trocador de qualidade do vídeo"
|
||||||
},
|
},
|
||||||
|
"scrobbler": {
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"title": "Falha na autenticação"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Configurações de API Last.fm"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prompt": {
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"label": "Insira seu token de usuário do ListenBrainz:",
|
||||||
|
"title": "Token ListenBrainz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"shortcuts": {
|
"shortcuts": {
|
||||||
"description": "Permite definir teclas de atalho globais para reprodução (reproduzir/pausar/próximo/anterior) e desligar o OSD de mídia substituindo as teclas de mídia, ativando Ctrl/CMD + F para pesquisar, ativando o suporte Linux MPRIS para teclas de mídia e teclas de atalho personalizadas para usuários avançados.",
|
"description": "Permite definir teclas de atalho globais para reprodução (reproduzir/pausar/próximo/anterior) e desligar o OSD de mídia substituindo as teclas de mídia, ativando Ctrl/CMD + F para pesquisar, ativando o suporte Linux MPRIS para teclas de mídia e teclas de atalho personalizadas para usuários avançados",
|
||||||
"menu": {
|
"menu": {
|
||||||
"override-media-keys": "Substituir teclas de mídia",
|
"override-media-keys": "Substituir teclas de mídia",
|
||||||
"set-keybinds": "Definir controles globais de música"
|
"set-keybinds": "Definir controles globais de música"
|
||||||
|
|||||||
690
src/i18n/resources/ro.json
Normal file
690
src/i18n/resources/ro.json
Normal file
@ -0,0 +1,690 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Nu s-a reusit executarea plugin-ului {{pluginName}}::{{contextName}}",
|
||||||
|
"executed-at-ms": "Plugin-ul {{pluginName}}::{{contextName}} s-a executat in {{ms}} ms",
|
||||||
|
"initialize-failed": "Initializarea plugin-ului \"{{pluginName}}\" a esuat",
|
||||||
|
"load-all": "Se incarca toate plugin-urile",
|
||||||
|
"load-failed": "Esec la incarcarea plugin-ului \"{{pluginName}}\"",
|
||||||
|
"loaded": "Plugin-ul \"{{pluginName}}\" s-a incarcat",
|
||||||
|
"unload-failed": "Esec la oprirea plugin-ului \"{{pluginName}}\"",
|
||||||
|
"unloaded": "Plugin-ul \"{{pluginName}}\" s-a terminat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"code": "ro",
|
||||||
|
"local-name": "Română",
|
||||||
|
"name": "Romanian"
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"console": {
|
||||||
|
"did-finish-load": {
|
||||||
|
"dev-tools": "S-a terminat incarcarea. Panoul de developer e deschis"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"loaded": "i18n incarcat"
|
||||||
|
},
|
||||||
|
"second-instance": {
|
||||||
|
"receive-command": "Comanda primita prin protocol: \"{{command}}\""
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"css-file-not-found": "Fisierul CSS \"{{cssFile}}\" nu exista, se ignora"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"details": "Eroare, procesul nu raspunde\n{{error}}"
|
||||||
|
},
|
||||||
|
"when-ready": {
|
||||||
|
"clearing-cache-after-20s": "Se sterge cache-ul aplicatiei"
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"tried-to-render-offscreen": "Fereastra a incercat sa fie randata in afara ecranului, marimeaFerestrei={{windowSize}}, marimeaEcranului={{displaySize}}, pozitia={{position}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"hide-menu-enabled": {
|
||||||
|
"detail": "Meniul este ascuns, folositi tasta 'Alt' pentru a-l face sa apara (sau tasta 'Esc' daca folositi meniul din aplicatie)",
|
||||||
|
"message": "Ascunderea meniului este activata",
|
||||||
|
"title": "Ascunderea meniului activata"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "Mai tarziu",
|
||||||
|
"restart-now": "Reporneste acum"
|
||||||
|
},
|
||||||
|
"detail": "Plugin-ul \"{{pluginName}}\" necesita o repornire pentru a intra in efect",
|
||||||
|
"message": "Pugin-ul \"{{pluginName}}\" trebuie repornit",
|
||||||
|
"title": "Repornire necesara"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"buttons": {
|
||||||
|
"quit": "Iesi",
|
||||||
|
"relaunch": "Reporneste",
|
||||||
|
"wait": "Asteapta"
|
||||||
|
},
|
||||||
|
"detail": "Ne cerem scuze pentru incovenient! va rugam alegeti ce doriti sa faceti:",
|
||||||
|
"message": "Applicatia nu raspunde",
|
||||||
|
"title": "Fereastra nu raspunde"
|
||||||
|
},
|
||||||
|
"update-available": {
|
||||||
|
"buttons": {
|
||||||
|
"disable": "Dezactiveaza actualizarile",
|
||||||
|
"download": "Descarca",
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"detail": "O noua versiune este disponibila si poate fi descarcata pe {{downloadLink}}",
|
||||||
|
"message": "O noua versiune este disponibila",
|
||||||
|
"title": "Actualizare disponibila"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"about": "Despre",
|
||||||
|
"navigation": {
|
||||||
|
"label": "Navigatie",
|
||||||
|
"submenu": {
|
||||||
|
"copy-current-url": "Copiaza URL-ul actual",
|
||||||
|
"go-back": "Mergi inapoi",
|
||||||
|
"go-forward": "Mergi inainte",
|
||||||
|
"quit": "Iesi",
|
||||||
|
"restart": "Reporneste aplicatia"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"label": "Setari",
|
||||||
|
"submenu": {
|
||||||
|
"advanced-options": {
|
||||||
|
"label": "Setari avansate",
|
||||||
|
"submenu": {
|
||||||
|
"auto-reset-app-cache": "Reseteaza cache-ul aplicatiei la pornire",
|
||||||
|
"disable-hardware-acceleration": "Dezactiveaza acceleratia hardware",
|
||||||
|
"edit-config-json": "Editeaza config,json",
|
||||||
|
"override-user-agent": "Suprascrie User-Agent-ul",
|
||||||
|
"restart-on-config-changes": "Reporneste la modificarea configuratiei",
|
||||||
|
"set-proxy": {
|
||||||
|
"label": "Seteaza proxy",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Introduceti adresa proxy: (lasati liber pentru a dezactiva)",
|
||||||
|
"placeholder": "Exemplu: SOCKS5://127.0.0.1:9999",
|
||||||
|
"title": "Seteaza proxy"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toggle-dev-tools": "Deschide uneltele de dezvoltator"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"always-on-top": "Mereu deasupra",
|
||||||
|
"auto-update": "Actualizare automata",
|
||||||
|
"hide-menu": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Meniul va fi ascuns la urmatoarea pornire, folositi [Alt] pentru a-l face sa apara (sau ghilimea intoarsa [`] daca folositi meniul applicatiei)",
|
||||||
|
"title": "Ascunderea meniului pornita"
|
||||||
|
},
|
||||||
|
"label": "Ascunde meniul"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Limba va fi schimbata dupa repornire",
|
||||||
|
"title": "Limba actualizata"
|
||||||
|
},
|
||||||
|
"label": "Limba",
|
||||||
|
"submenu": {
|
||||||
|
"to-help-translate": "Vrei sa ajuti la traducere? Apasa aici"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume-on-start": "Continua ultimul cantec ascultat cand porneste aplicatia",
|
||||||
|
"single-instance-lock": "Oprirea deschiderii mai multor instante",
|
||||||
|
"start-at-login": "Incepe la autentificare",
|
||||||
|
"starting-page": {
|
||||||
|
"label": "Pagina de pornire",
|
||||||
|
"unset": "Deselectat"
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"label": "Tray",
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "Dezactivat",
|
||||||
|
"enabled-and-hide-app": "Activeaza si ascunde fereastra aplicatiei",
|
||||||
|
"enabled-and-show-app": "Activeaza si arata fereastra aplicatiei",
|
||||||
|
"play-pause-on-click": "Start/Pauza la click"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visual-tweaks": {
|
||||||
|
"label": "Optimizari vizuale",
|
||||||
|
"submenu": {
|
||||||
|
"like-buttons": {
|
||||||
|
"default": "Default",
|
||||||
|
"force-show": "Forteaza randarea",
|
||||||
|
"hide": "Ascunde",
|
||||||
|
"label": "Butoane de like"
|
||||||
|
},
|
||||||
|
"remove-upgrade-button": "Elimina butonul de upgrade",
|
||||||
|
"theme": {
|
||||||
|
"label": "Tema",
|
||||||
|
"submenu": {
|
||||||
|
"import-css-file": "Importa fisiere CSS proprii",
|
||||||
|
"no-theme": "Fara tema"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"enabled": "Activat",
|
||||||
|
"label": "Plugins",
|
||||||
|
"new": "NOU"
|
||||||
|
},
|
||||||
|
"view": {
|
||||||
|
"label": "Aspect",
|
||||||
|
"submenu": {
|
||||||
|
"force-reload": "Reimprospatare fortata",
|
||||||
|
"reload": "Reimprospateaza",
|
||||||
|
"reset-zoom": "Marimea actuala",
|
||||||
|
"toggle-fullscreen": "Porneste Full Screen",
|
||||||
|
"zoom-in": "Mareste",
|
||||||
|
"zoom-out": "Micsoreaza"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"next": "Urmatorul",
|
||||||
|
"play-pause": "Reda/Pauza",
|
||||||
|
"previous": "Anteriorul",
|
||||||
|
"quit": "Iesi",
|
||||||
|
"restart": "Reporneste aplicatia",
|
||||||
|
"show": "Arata fereastra",
|
||||||
|
"tooltip": {
|
||||||
|
"default": "YouTube Music",
|
||||||
|
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"adblocker": {
|
||||||
|
"description": "Blocheaza toate reclamele si trackers",
|
||||||
|
"menu": {
|
||||||
|
"blocker": "Blocator"
|
||||||
|
},
|
||||||
|
"name": "Blocator de reclame"
|
||||||
|
},
|
||||||
|
"album-actions": {
|
||||||
|
"description": "Adauga butoane pentru Undislike, Like si Unlike pentru toate piesele dintr-un playlist sau album",
|
||||||
|
"name": "Actiuni pentru album"
|
||||||
|
},
|
||||||
|
"album-color-theme": {
|
||||||
|
"description": "Aplica o tema dinamica si efecte vizuale bazate pe paleta de culori a albumului",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"label": "Raportul amestecului de culori",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{ratio}}%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Tema de culori a albumului"
|
||||||
|
},
|
||||||
|
"ambient-mode": {
|
||||||
|
"description": "Aplica un efect de iluminare, aplicand culori preluate din video pe fundalul ecranului",
|
||||||
|
"menu": {
|
||||||
|
"blur-amount": {
|
||||||
|
"label": "Cantitatea de blur",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{blurAmount}} pixeli"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buffer": {
|
||||||
|
"label": "Buffer",
|
||||||
|
"submenu": {
|
||||||
|
"buffer": "{{buffer}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"opacity": {
|
||||||
|
"label": "Opacitate",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality": {
|
||||||
|
"label": "Calitate",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{quality}} pixeli"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"label": "Marime",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{size}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"smoothness-transition": {
|
||||||
|
"label": "Fluenta tranzitiei",
|
||||||
|
"submenu": {
|
||||||
|
"during": "In timpul {{interpolationTime}} s"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"use-fullscreen": {
|
||||||
|
"label": "Foloseste fullscreen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Mod ambiental"
|
||||||
|
},
|
||||||
|
"audio-compressor": {
|
||||||
|
"description": "Aplica compresie pe audio (scade volumul partilor cele mai sonore si creste volumul partilor mai putin sonore)",
|
||||||
|
"name": "Compresor audio"
|
||||||
|
},
|
||||||
|
"blur-nav-bar": {
|
||||||
|
"description": "Fa bara de navigare semi-transparenta",
|
||||||
|
"name": "Bara de naviagtie semi-transparenta"
|
||||||
|
},
|
||||||
|
"bypass-age-restrictions": {
|
||||||
|
"description": "Treci peste verificarea de varsta a YouTube-ului",
|
||||||
|
"name": "Ignora restrictiile de varsta"
|
||||||
|
},
|
||||||
|
"captions-selector": {
|
||||||
|
"description": "Selector de subtitrari pentru piesele audio de pe YouTube Music",
|
||||||
|
"menu": {
|
||||||
|
"autoload": "Selecteaza automat ultima subtitrare folosita",
|
||||||
|
"disable-captions": "Fara subtitrari by default"
|
||||||
|
},
|
||||||
|
"name": "Selector de subtitrari",
|
||||||
|
"prompt": {
|
||||||
|
"selector": {
|
||||||
|
"label": "Limba curenta a subtitrarilor: {{language}}",
|
||||||
|
"none": "Niciuna",
|
||||||
|
"title": "Alege limba subtitrarilor"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"title": "Deschide selectorul de subtitrari"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compact-sidebar": {
|
||||||
|
"description": "Pastreaza bara laterala mereu in modul compact",
|
||||||
|
"name": "Bara laterala compacta"
|
||||||
|
},
|
||||||
|
"crossfade": {
|
||||||
|
"description": "Tranzitioneaza intre cantece",
|
||||||
|
"menu": {
|
||||||
|
"advanced": "Avansat"
|
||||||
|
},
|
||||||
|
"name": "Tranzitie [Beta]",
|
||||||
|
"prompt": {
|
||||||
|
"options": {
|
||||||
|
"multi-input": {
|
||||||
|
"fade-in-duration": "Durata tranzitie de inceput (ms)",
|
||||||
|
"fade-out-duration": "Durata tranzitie de sfarsit (ms)",
|
||||||
|
"fade-scaling": {
|
||||||
|
"label": "Scala tranzitiei",
|
||||||
|
"linear": "Linear",
|
||||||
|
"logarithmic": "Logaritmic"
|
||||||
|
},
|
||||||
|
"seconds-before-end": "Tranzitie N secunde inainte de final"
|
||||||
|
},
|
||||||
|
"title": "Optiuni de tranzitie"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disable-autoplay": {
|
||||||
|
"description": "Fa cantecul sa inceapa in modul \"pauza\"",
|
||||||
|
"menu": {
|
||||||
|
"apply-once": "Se aplica doar la pornirea aplicatiei"
|
||||||
|
},
|
||||||
|
"name": "Dezactiveaza redarea automata"
|
||||||
|
},
|
||||||
|
"discord": {
|
||||||
|
"backend": {
|
||||||
|
"already-connected": "S-a incercat conectarea cu o conexiune activa",
|
||||||
|
"connected": "Conectat la Discord",
|
||||||
|
"disconnected": "Deconectat de la Discord"
|
||||||
|
},
|
||||||
|
"description": "Arata-le prietenilor ce asculti cu Rich Presence",
|
||||||
|
"menu": {
|
||||||
|
"auto-reconnect": "Reconectare automata",
|
||||||
|
"clear-activity": "Sterge activitatea",
|
||||||
|
"clear-activity-after-timeout": "Sterge activitatea dupa timeout",
|
||||||
|
"connected": "Conectat",
|
||||||
|
"disconnected": "Deconectat",
|
||||||
|
"hide-duration-left": "Ascunde timpul ramas",
|
||||||
|
"hide-github-button": "Ascunde butonul cu link-ul GitHub",
|
||||||
|
"play-on-youtube-music": "Reda pe YouTube Music",
|
||||||
|
"set-inactivity-timeout": "Seteaza intervalul de inactivitate"
|
||||||
|
},
|
||||||
|
"name": "Discord Rich Presence",
|
||||||
|
"prompt": {
|
||||||
|
"set-inactivity-timeout": {
|
||||||
|
"label": "Introduceti perioada de inactivitate dorita in secunde:",
|
||||||
|
"title": "Seteaza timpul de inactivitate"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"downloader": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"error": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"message": "Argh! Scuze, descarcarea a esuat…",
|
||||||
|
"title": "Eroare la descarcare!"
|
||||||
|
},
|
||||||
|
"start-download-playlist": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"detail": "({{playlistSize}} cantece)",
|
||||||
|
"message": "Se descarca Playlist-ul {{playlistTitle}}",
|
||||||
|
"title": "Descarcarea a inceput"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"feedback": {
|
||||||
|
"conversion-progress": "Conversie: {{percent}}%",
|
||||||
|
"converting": "Se converteste…",
|
||||||
|
"done": "Descarcat: {{filePath}}",
|
||||||
|
"download-info": "Se descarca {{artist}} -{{title}} [{{videoId}}",
|
||||||
|
"download-progress": "Se descarca: {{percent}}%",
|
||||||
|
"downloading": "Se descarca…",
|
||||||
|
"downloading-counter": "Se descarca {{current}}/{{total}}…",
|
||||||
|
"downloading-playlist": "Se descarca playlist-ul \"{{playlistTitle}}\" - {{playlistSize}} piese ({{playlistId}})",
|
||||||
|
"error-while-downloading": "Eroare la descarcarea piesei \"{{author}} - {{title}}\":{{error}}",
|
||||||
|
"folder-already-exists": "Folderul {{playlistFolder}} exista deja",
|
||||||
|
"getting-playlist-info": "Se aduna informatiile despre playlist…",
|
||||||
|
"loading": "Se incarca…",
|
||||||
|
"playlist-has-only-one-song": "Playlist-ul are doar un element, acesta va fi descarcat direct",
|
||||||
|
"playlist-id-not-found": "Niciun ID al playlist-ului nu a fost gasit",
|
||||||
|
"playlist-is-empty": "Playlist-ul este gol",
|
||||||
|
"playlist-is-mix-or-private": "Eroare la colectarea informatiilor despre playlist: asigurati-va ca nu este privat sau un playlist \"Mixed for you\"\n\n{{error}}",
|
||||||
|
"preparing-file": "Se pregateste fisierul…",
|
||||||
|
"saving": "Se salveaza…",
|
||||||
|
"trying-to-get-playlist-id": "Se incearca obtinerea ID-ului playlist-ului: {{playlistId}}",
|
||||||
|
"video-id-not-found": "Video-ul nu a fost gasit",
|
||||||
|
"writing-id3": "Se scriu tag-urile ID3…"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Descarca MP3 / sursa audio direct din interfata",
|
||||||
|
"menu": {
|
||||||
|
"choose-download-folder": "Alege folderul de descarcari",
|
||||||
|
"download-playlist": "Descarca playlist-ul",
|
||||||
|
"presets": "Setari implicite",
|
||||||
|
"skip-existing": "Treci peste fisierele existente"
|
||||||
|
},
|
||||||
|
"name": "Downloader",
|
||||||
|
"renderer": {
|
||||||
|
"can-not-update-progress": "Nu se poate actualiza progresul"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"button": "Descarca"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"exponential-volume": {
|
||||||
|
"description": "Fa slider-ul de volum exponential pentru a fi mai usor de selectat volumuri reduse.",
|
||||||
|
"name": "Volum exponential"
|
||||||
|
},
|
||||||
|
"in-app-menu": {
|
||||||
|
"description": "Ofera barelor de meniu un aspect extravagant, intunecat sau de culoarea albumului",
|
||||||
|
"menu": {
|
||||||
|
"hide-dom-window-controls": "Ascunde controalele ferestrei DOM"
|
||||||
|
},
|
||||||
|
"name": "Meniul aplicatiei"
|
||||||
|
},
|
||||||
|
"lumiastream": {
|
||||||
|
"description": "Adauga asistenta pentru Lumia Stream",
|
||||||
|
"name": "Lumia Stream [Beta]"
|
||||||
|
},
|
||||||
|
"lyrics-genius": {
|
||||||
|
"description": "Adauga versuri pentru majoritatea cantecelor",
|
||||||
|
"menu": {
|
||||||
|
"romanized-lyrics": "Versuri romantizate"
|
||||||
|
},
|
||||||
|
"name": "Lyrics Genius",
|
||||||
|
"renderer": {
|
||||||
|
"fetched-lyrics": "Versuri preluate de pe Genius"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"music-together": {
|
||||||
|
"description": "Impartaseste playlist-ul cu altii. Cand gazda va pune o piesa, toti ceilalti vor auzi acelasi cantec",
|
||||||
|
"dialog": {
|
||||||
|
"enter-host": "Introdu ID-ul host-ului"
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"save": "Salveaza",
|
||||||
|
"track-source": "Sursa piesei",
|
||||||
|
"unknown-user": "Utilizator necunoscut"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"click-to-copy-id": "Copiaza ID-ul host-ului",
|
||||||
|
"close": "Inchide Music Together",
|
||||||
|
"connected-users": "Utilizatori conectati",
|
||||||
|
"disconnect": "Deconecteaza Music Together",
|
||||||
|
"empty-user": "Niciun utilizator conectat",
|
||||||
|
"host": "Gazda Music Together",
|
||||||
|
"join": "Alatura-te Music Together",
|
||||||
|
"permission": {
|
||||||
|
"all": "Permite invitatilor sa controleze playlist-ul si player-ul",
|
||||||
|
"host-only": "Doar gazda poate controla playlist-ul si player-ul",
|
||||||
|
"playlist": "Permite invitatilor controlul asupra playlist-ului"
|
||||||
|
},
|
||||||
|
"set-permission": "Schimba controlul permisiunilor",
|
||||||
|
"status": {
|
||||||
|
"disconnected": "Deconectat",
|
||||||
|
"guest": "Conectat ca invitat",
|
||||||
|
"host": "Conectat ca gazda"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Music Together [Beta]",
|
||||||
|
"toast": {
|
||||||
|
"add-song-failed": "Adaugarea piesei a esuat",
|
||||||
|
"closed": "Music Together inchis",
|
||||||
|
"disconnected": "Music Together deconectat",
|
||||||
|
"host-failed": "Nu s-a reusit gazduirea Music Together",
|
||||||
|
"id-copied": "ID-ul host-ului a fost copiat in clipboard",
|
||||||
|
"id-copy-failed": "Eroare la copierea ID-ului host-ului in clipboard",
|
||||||
|
"join-failed": "Nu s-a reusit alaturarea la Music Together",
|
||||||
|
"joined": "V-ati alaturat Music Together",
|
||||||
|
"permission-changed": "Permisiunile Music Together s-au schimbat la \"{{permission}}\"",
|
||||||
|
"remove-song-failed": "Eroare la indepartarea cantecului",
|
||||||
|
"user-connected": "{{name}} s-a alaturat la Music Together",
|
||||||
|
"user-disconnected": "{{name}} a parasit Music Together"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"description": "Sagetile pentru Urmatorul/Anteriorul integrate direct in interfata, ca in browser-ul tau preferat",
|
||||||
|
"name": "Navigatie"
|
||||||
|
},
|
||||||
|
"no-google-login": {
|
||||||
|
"description": "Elimina butonul de autentificare Google si link-urile din interfata",
|
||||||
|
"name": "Nicio autentificare Google"
|
||||||
|
},
|
||||||
|
"notifications": {
|
||||||
|
"description": "Afiseaza o notificare cand incepe sa cante o piesa (notificarile interactive sunt disponibile pe Windows)",
|
||||||
|
"menu": {
|
||||||
|
"interactive": "Notificari interactive",
|
||||||
|
"interactive-settings": {
|
||||||
|
"label": "Setari interactive",
|
||||||
|
"submenu": {
|
||||||
|
"hide-button-text": "Ascunde textul butoanelor",
|
||||||
|
"refresh-on-play-pause": "Reimprospateaza la Reda/Pauza",
|
||||||
|
"tray-controls": "Deschide/Inchide la apasarea icnoitei pentru meniul Tray"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"priority": "Prioritatea notificarilor",
|
||||||
|
"toast-style": "Stilul notificarilor",
|
||||||
|
"unpause-notification": "Arata notificarile la pauza"
|
||||||
|
},
|
||||||
|
"name": "Notificari"
|
||||||
|
},
|
||||||
|
"picture-in-picture": {
|
||||||
|
"description": "Permite sa schimbi aplicatie la modul picture-in-picture",
|
||||||
|
"menu": {
|
||||||
|
"always-on-top": "Mereu deasupra",
|
||||||
|
"hotkey": {
|
||||||
|
"label": "Scurtaturi pe tastatura",
|
||||||
|
"prompt": {
|
||||||
|
"keybind-options": {
|
||||||
|
"hotkey": "Scurtaturi din taste"
|
||||||
|
},
|
||||||
|
"label": "Scurtaturi din taste pentru picture-in-picture",
|
||||||
|
"title": "Scurtatura Picture-in-picture"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"save-window-position": "Salveaza pozitia ferestrei",
|
||||||
|
"save-window-size": "Salveaza marimea ferestrei",
|
||||||
|
"use-native-pip": "Foloseste PiP-ul nativ pentru broswer"
|
||||||
|
},
|
||||||
|
"name": "Picture-in-picture",
|
||||||
|
"templates": {
|
||||||
|
"button": "Picture-in-picture"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playback-speed": {
|
||||||
|
"description": "Asculta rapid, asculta lent! Adauga un slider pentru viteza de redare a cantecului",
|
||||||
|
"name": "Viteza de redare",
|
||||||
|
"templates": {
|
||||||
|
"button": "Viteza"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"precise-volume": {
|
||||||
|
"description": "Controleaza volumul precis folosind rotita mouse-ului/scurtaturi din tastatura, cu un HUD personalizat si incremente de volum personalizate",
|
||||||
|
"menu": {
|
||||||
|
"arrows-shortcuts": "Control cu tastele sageti locale",
|
||||||
|
"custom-volume-steps": "Seteaza incrementele de volum",
|
||||||
|
"global-shortcuts": "Scurtaturi de tastatura globale"
|
||||||
|
},
|
||||||
|
"name": "Volum precis",
|
||||||
|
"prompt": {
|
||||||
|
"global-shortcuts": {
|
||||||
|
"keybind-options": {
|
||||||
|
"decrease": "Redu volumul audio",
|
||||||
|
"increase": "Creste volumul audio"
|
||||||
|
},
|
||||||
|
"label": "Alege combinatiile de taste globale pentru volumul audio:",
|
||||||
|
"title": "Combinatii globale de taste pentru volum"
|
||||||
|
},
|
||||||
|
"volume-steps": {
|
||||||
|
"label": "Alege pasii de increment pentru volum audio",
|
||||||
|
"title": "Incremente de volum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality-changer": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"quality-changer": {
|
||||||
|
"detail": "Calitate actuala: {{quality}}",
|
||||||
|
"message": "Alegeti calitatea video:",
|
||||||
|
"title": "Alegeti calitatea video"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Permite schimbarea calitatii video cu un buton prezent peste video",
|
||||||
|
"name": "Modificator de calitate video"
|
||||||
|
},
|
||||||
|
"scrobbler": {
|
||||||
|
"description": "Adauga asistenta pentru scrobbling (etc. last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Autentificarea cu Last.fm a esuat\nAscunde acest pop-up pana la urmatoarea repornire.",
|
||||||
|
"title": "Autentificare Esuata"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Setari pentru API-ul Last.fm"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Introdu token-ul de utilizator ListenBrainz"
|
||||||
|
},
|
||||||
|
"scrobble-other-media": "Scrobble alte surse media"
|
||||||
|
},
|
||||||
|
"name": "Scrobbler",
|
||||||
|
"prompt": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-key": "Cheia API Last.fm",
|
||||||
|
"api-secret": "Secret API Last.fm"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"label": "Introdu token-ul tau de utilizator ListenBrainz:",
|
||||||
|
"title": "Token-ul ListenBrainz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shortcuts": {
|
||||||
|
"description": "Permite setari globale pentru scurtaturi pe tastatura pentru playback (reda/pauza/urmatorul/anteriorul), pentru oprirea media OSD prin suprascriera tastelor media, pentru folosirea combinatiei Ctrl/CMD + F pentru a cauta, pentru asistenta Linux MPRIS pentru taste media si pentru scurtaturi perosnalizate pentru utilizatori avansati",
|
||||||
|
"menu": {
|
||||||
|
"override-media-keys": "Suprascrie tastele media",
|
||||||
|
"set-keybinds": "Seteaza scurtaturile globale pentru cantece"
|
||||||
|
},
|
||||||
|
"name": "Scurtaturi (& MPRIS)",
|
||||||
|
"prompt": {
|
||||||
|
"keybind": {
|
||||||
|
"keybind-options": {
|
||||||
|
"next": "Urmatorul",
|
||||||
|
"play-pause": "Reda / Pauza",
|
||||||
|
"previous": "Anteriorul"
|
||||||
|
},
|
||||||
|
"label": "Alege combinatia de taste globala pentru controlul cantecelor:",
|
||||||
|
"title": "Scurtaturi pe tastatura globale"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skip-disliked-songs": {
|
||||||
|
"description": "Sari peste cantecele disliked",
|
||||||
|
"name": "Treci peste cantecele disliked"
|
||||||
|
},
|
||||||
|
"skip-silences": {
|
||||||
|
"description": "Treci automat peste sectiunile de liniste din cantece",
|
||||||
|
"name": "Treci peste liniste"
|
||||||
|
},
|
||||||
|
"sponsorblock": {
|
||||||
|
"description": "Treci automat peste partile non-muzicale precum intro/outro sau parti din video-ul catecului, cand nu se aude cantecul",
|
||||||
|
"name": "SponsorBlock"
|
||||||
|
},
|
||||||
|
"taskbar-mediacontrol": {
|
||||||
|
"description": "Controleaza redarea din Bara de Activitati Windows",
|
||||||
|
"name": "Control media in Bara de Activitate"
|
||||||
|
},
|
||||||
|
"touchbar": {
|
||||||
|
"description": "Adauga un widget TouchBar pentru utilizatorii macOS",
|
||||||
|
"name": "TouchBar"
|
||||||
|
},
|
||||||
|
"tuna-obs": {
|
||||||
|
"description": "Integrare cu plugin-ul OBS Tuna",
|
||||||
|
"name": "Tuna OBS"
|
||||||
|
},
|
||||||
|
"video-toggle": {
|
||||||
|
"description": "Adauga un buton ce schimba intre modurile Video/Cantec. se poate optional elimia complet optiunea video",
|
||||||
|
"menu": {
|
||||||
|
"align": {
|
||||||
|
"label": "Aliniere",
|
||||||
|
"submenu": {
|
||||||
|
"left": "Stanga",
|
||||||
|
"middle": "Mijloc",
|
||||||
|
"right": "Dreapta"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"force-hide": "Forteaza eliminarea tab-ului video",
|
||||||
|
"mode": {
|
||||||
|
"label": "Mod",
|
||||||
|
"submenu": {
|
||||||
|
"custom": "Comutatoare personalizate",
|
||||||
|
"disabled": "Dezactivat",
|
||||||
|
"native": "Comutatoare native"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Comutator video",
|
||||||
|
"templates": {
|
||||||
|
"button": "Cantec"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visualizer": {
|
||||||
|
"description": "Adauga un visualizer la player",
|
||||||
|
"menu": {
|
||||||
|
"visualizer-type": "Tip de visualizer"
|
||||||
|
},
|
||||||
|
"name": "Visualizer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Добавьте поддержку скробблинга (например, last.fm, Listenbrainz)",
|
"description": "Добавьте поддержку скробблинга (например, last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Не удалось войти с помощью Last.fm\nСкрыть сообщение до следующего запуска",
|
||||||
|
"title": "Ошибка аунтефикации"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Настройки API Last.fm"
|
"api-settings": "Настройки API Last.fm"
|
||||||
|
|||||||
107
src/i18n/resources/sv.json
Normal file
107
src/i18n/resources/sv.json
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
{
|
||||||
|
"language": {
|
||||||
|
"code": "sv",
|
||||||
|
"local-name": "Svenska",
|
||||||
|
"name": "Swedish"
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"navigation": {
|
||||||
|
"name": "Navigering"
|
||||||
|
},
|
||||||
|
"no-google-login": {
|
||||||
|
"name": "Inget Google Login"
|
||||||
|
},
|
||||||
|
"notifications": {
|
||||||
|
"name": "Notiser"
|
||||||
|
},
|
||||||
|
"picture-in-picture": {
|
||||||
|
"menu": {
|
||||||
|
"hotkey": {
|
||||||
|
"label": "Snabbkommando",
|
||||||
|
"prompt": {
|
||||||
|
"keybind-options": {
|
||||||
|
"hotkey": "Snabbkommando"
|
||||||
|
},
|
||||||
|
"title": "Bild-I-Bild genväg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Bild-I-Bild",
|
||||||
|
"templates": {
|
||||||
|
"button": "Bild-i-bild"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playback-speed": {
|
||||||
|
"name": "Uppspelningshastighet",
|
||||||
|
"templates": {
|
||||||
|
"button": "Hasighet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"precise-volume": {
|
||||||
|
"prompt": {
|
||||||
|
"global-shortcuts": {
|
||||||
|
"keybind-options": {
|
||||||
|
"decrease": "Minska Volym",
|
||||||
|
"increase": "Öka Volym"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"volume-steps": {
|
||||||
|
"title": "Volymsteg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality-changer": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"quality-changer": {
|
||||||
|
"detail": "Nuvarande kvalité: {{quality}}",
|
||||||
|
"message": "Välj Video Kvalité:",
|
||||||
|
"title": "Välj Video Kvalité"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scrobbler": {
|
||||||
|
"prompt": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-key": "Last.fm API nyckel"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"title": "ListenBrainz token"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shortcuts": {
|
||||||
|
"prompt": {
|
||||||
|
"keybind": {
|
||||||
|
"keybind-options": {
|
||||||
|
"next": "Nästa",
|
||||||
|
"play-pause": "Spela / Pausa",
|
||||||
|
"previous": "Föregående"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"video-toggle": {
|
||||||
|
"menu": {
|
||||||
|
"align": {
|
||||||
|
"submenu": {
|
||||||
|
"left": "Vänster",
|
||||||
|
"middle": "Mitten",
|
||||||
|
"right": "Höger"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mode": {
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "Inaktiverad"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"button": "Låt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,12 +4,12 @@
|
|||||||
"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,32 +21,51 @@
|
|||||||
"main": {
|
"main": {
|
||||||
"console": {
|
"console": {
|
||||||
"did-finish-load": {
|
"did-finish-load": {
|
||||||
"dev-tools": "การโหลดเสร็จสิ้น DevTools ได้ถูกเปิดแล้ว"
|
"dev-tools": "การโหลดเสร็จสิ้น. โหมดนักพัฒนาสามรถใช้งานได้แล้ว"
|
||||||
},
|
},
|
||||||
"i18n": {
|
"i18n": {
|
||||||
"loaded": "โหลด i18n แล้ว"
|
"loaded": "โหลด i18n แล้ว"
|
||||||
},
|
},
|
||||||
"second-instance": {
|
"second-instance": {
|
||||||
"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": {
|
||||||
|
"detail": "เมนูถูกซ่อนไว้ กด'Alt' เพื่อแสดงเมนู (หรือ 'Escape' หากอยู่ในเมนูแอป)",
|
||||||
|
"message": "การซ่อนเมนูถูกเปิดใช้งาน",
|
||||||
|
"title": "เปิดใช้งานการซ่อนเมนู"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "ภายหลัง",
|
||||||
|
"restart-now": "รีสตาร์ทตอนนี้"
|
||||||
|
},
|
||||||
|
"detail": "\"{{pluginName}}\" ปลั๊กอินต้องการการรีสตาร์ทเพื่อแสดงผล",
|
||||||
|
"message": "\"{{pluginName}}\" ต้องการรีสตาร์ท",
|
||||||
|
"title": "แนะนำให้รีสตาร์ท"
|
||||||
|
},
|
||||||
"unresponsive": {
|
"unresponsive": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"quit": "เลิก"
|
"quit": "ออก",
|
||||||
}
|
"relaunch": "เปิดใหม่",
|
||||||
|
"wait": "รอซักครู่"
|
||||||
|
},
|
||||||
|
"detail": "ขออภัยในความไม่สะดวก! โปรดเลือกสิ่งที่ต้องการจะทำ:",
|
||||||
|
"message": "แอปพลิเคชันไม่ตอบสนอง",
|
||||||
|
"title": "หน้าต่างไม่ตอบสนอง"
|
||||||
},
|
},
|
||||||
"update-available": {
|
"update-available": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
@ -62,6 +81,7 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"about": "เกี่ยวกับ",
|
"about": "เกี่ยวกับ",
|
||||||
"navigation": {
|
"navigation": {
|
||||||
|
"label": "การนำทาง",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"copy-current-url": "คัดลอก URL ปัจจุบัน",
|
"copy-current-url": "คัดลอก URL ปัจจุบัน",
|
||||||
"go-back": "ก่อนหน้า",
|
"go-back": "ก่อนหน้า",
|
||||||
@ -79,22 +99,291 @@
|
|||||||
"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": "รีสตาร์ทเมื่อมีการเปลี่ยนแปลงคอนฟิก",
|
||||||
|
"set-proxy": {
|
||||||
|
"label": "ตั้งค่าพร็อกซี่",
|
||||||
|
"prompt": {
|
||||||
|
"label": "ใส่ที่อยู่พร็อกซี่: (ปล่อยให้ว่างเพื่อปิดใช้งาน)",
|
||||||
|
"placeholder": "ตัวอย่าง: SOCKS5://127.0.0.1:9999",
|
||||||
|
"title": "ตั้งค่าพร็อกซี่"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toggle-dev-tools": "เปิด-ปิด DevTools"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"always-on-top": "อยู่ด้านบนตลอดเวลา",
|
||||||
|
"auto-update": "อัปเดตอัตโนมัติ",
|
||||||
|
"hide-menu": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "เมนูจะถูกซ่อนในการเปิดครั้งถัดไป กด [Alt] เพื่อแสดงเมนู (หรือใช้ backtick [`] หากอยู่ในเมนูแอป)",
|
||||||
|
"title": "เปิดใช้งานการซ่อนเมนู"
|
||||||
|
},
|
||||||
|
"label": "ซ่อนเมนู"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "ภาษาจะเปลี่ยนหลังจากทำการรีสตาร์ท",
|
||||||
|
"title": "ภาษาถูกเปลี่ยนแล้ว"
|
||||||
|
},
|
||||||
|
"label": "ภาษา",
|
||||||
|
"submenu": {
|
||||||
|
"to-help-translate": "ต้องการช่วยแปล? คลิกที่นี่"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume-on-start": "เล่นเพลงล่าสุดต่อ เมื่อแอปเริ่มต้น",
|
||||||
|
"single-instance-lock": "ล็อกการทำงานเพียงรายการเดียว",
|
||||||
|
"start-at-login": "เริ่มต้นที่การเข้าสู่ระบบ",
|
||||||
|
"starting-page": {
|
||||||
|
"label": "หน้าเริ่มต้น",
|
||||||
|
"unset": "ยกเลิกการตั้งค่า"
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"label": "ถาดรายการ",
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "ปิดการใช้งาน",
|
||||||
|
"enabled-and-hide-app": "เปิดใช้งานและซ่อนแอป",
|
||||||
|
"enabled-and-show-app": "เปิดใช้งานและแสดงแอป",
|
||||||
|
"play-pause-on-click": "เล่น/หยุดเล่น เมื่อคลิก"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visual-tweaks": {
|
||||||
|
"label": "การปรับแต่งหน้าตาแอป",
|
||||||
|
"submenu": {
|
||||||
|
"like-buttons": {
|
||||||
|
"default": "ค่าเริ่มต้น",
|
||||||
|
"force-show": "บังคับให้แสดง",
|
||||||
|
"hide": "ซ่อน",
|
||||||
|
"label": "ปุ่มถูกใจ"
|
||||||
|
},
|
||||||
|
"remove-upgrade-button": "ลบปุ่มอัปเกรด",
|
||||||
|
"theme": {
|
||||||
|
"label": "ธีม",
|
||||||
|
"submenu": {
|
||||||
|
"import-css-file": "นำเข้าไฟล์ CSS ที่กำหนดเอง",
|
||||||
|
"no-theme": "ไม่มีธีม"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"enabled": "เปิดใช้งาน",
|
||||||
|
"label": "ปลั๊กอิน",
|
||||||
|
"new": "ใหม่"
|
||||||
|
},
|
||||||
|
"view": {
|
||||||
|
"label": "มุมมอง",
|
||||||
|
"submenu": {
|
||||||
|
"force-reload": "บังคับโหลดใหม่",
|
||||||
|
"reload": "โหลดใหม่",
|
||||||
|
"reset-zoom": "ขนาดจริง",
|
||||||
|
"toggle-fullscreen": "สลับเต็มหน้าจอ",
|
||||||
|
"zoom-in": "ซูมเข้า",
|
||||||
|
"zoom-out": "ซูมออก"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"next": "ค่อไป",
|
||||||
|
"play-pause": "เล่น/พัก",
|
||||||
|
"previous": "ก่อนหน้า",
|
||||||
|
"quit": "ออก",
|
||||||
|
"restart": "รีสตาร์ทแอป",
|
||||||
|
"show": "แสดงหน้าต่าง",
|
||||||
|
"tooltip": {
|
||||||
|
"default": "ยูทุปมิวสิค",
|
||||||
|
"with-song-info": "ยูทูปมิวสิค: {{artist}} - {{title}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
|
"adblocker": {
|
||||||
|
"description": "บล็อกโฆษณาและการติดตามทั้งหมดอย่างอัตโนมัติ",
|
||||||
|
"menu": {
|
||||||
|
"blocker": "เครื่องมือบล็อก"
|
||||||
|
},
|
||||||
|
"name": "ตัวบล็อกโฆษณา"
|
||||||
|
},
|
||||||
|
"album-actions": {
|
||||||
|
"description": "เพิ่ม ยกเลิกไม่ชอบ, ไม่ชอบ, 'ถูกใจ', และ 'ยกเลิกถูกใจ' เพื่อให้สามารถใช้งานกับเพลงทั้งหมดในรายการเพลงหรืออัลบั้ม",
|
||||||
|
"name": "การกระทำที่เกี่ยวกับอัลบั้ม"
|
||||||
|
},
|
||||||
|
"album-color-theme": {
|
||||||
|
"description": "ใช้ธีมและเอฟเฟกต์ไดนามิก โดยขึ้นอยู่กับสีของอัลบั้ม",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"label": "สัดส่วนการผสมสี",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{ratio}}เปอร์เซ็น"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "ธีมสีของอัลบั้ม"
|
||||||
|
},
|
||||||
|
"ambient-mode": {
|
||||||
|
"description": "เอฟเฟกต์แสงจะใช้สีอ่อนๆจากวีดิโอมาเป็พื้นหลังสกรีน",
|
||||||
|
"menu": {
|
||||||
|
"blur-amount": {
|
||||||
|
"label": "ระดับความเบลอ",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{blurAmount}} พิกเซล"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buffer": {
|
||||||
|
"label": "บัฟเฟอร์",
|
||||||
|
"submenu": {
|
||||||
|
"buffer": "{{buffer}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"opacity": {
|
||||||
|
"label": "ความโปร่งใส",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality": {
|
||||||
|
"label": "คุณภาพ",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{quality}} พิกเซล"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"label": "ขนาด",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{size}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"smoothness-transition": {
|
||||||
|
"label": "การเปลี่ยนแบบสมูท",
|
||||||
|
"submenu": {
|
||||||
|
"during": "ระหว่าง {{interpolationTime}} วินาที"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"use-fullscreen": {
|
||||||
|
"label": "ใช้โหมดเต็มหน้าจอ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "โหมดสภาพแวดล้อม"
|
||||||
|
},
|
||||||
|
"audio-compressor": {
|
||||||
|
"description": "ใช้การบีบอัดเสียง (ลดระดับเสียงของส่วนที่ดังที่สุดของสัญญาณและเพิ่มระดับเสียงของส่วนที่เบาที่สุด)",
|
||||||
|
"name": "เครื่องมือบีบอัดเสียง"
|
||||||
|
},
|
||||||
|
"blur-nav-bar": {
|
||||||
|
"description": "ทำให้แถบนำทางโปร่งแสงและเบลอ",
|
||||||
|
"name": "เบลอแถบนำทาง"
|
||||||
|
},
|
||||||
|
"bypass-age-restrictions": {
|
||||||
|
"description": "ข้ามการตรวจสอบอายุของยูทูป",
|
||||||
|
"name": "ข้ามข้อจำกัดอายุ"
|
||||||
|
},
|
||||||
|
"captions-selector": {
|
||||||
|
"description": "ตัวเลือกคำบรรยายสำหรับเพลงในYoutube Music",
|
||||||
|
"menu": {
|
||||||
|
"autoload": "เลือกคำบรรยายที่ใช้ครั้งล่าสุดโดยอัตโนมัติ",
|
||||||
|
"disable-captions": "ไม่มีคำบรรยายเป็นค่าเริ่มต้น"
|
||||||
|
},
|
||||||
|
"name": "ตัวเลือกคำบรรยาย",
|
||||||
|
"prompt": {
|
||||||
|
"selector": {
|
||||||
|
"label": "ภาษาคำบรรยายปัจจุบัน: {{language}}",
|
||||||
|
"none": "ไม่มี",
|
||||||
|
"title": "เลือกภาษาคำบรรยาย"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"title": "เปิดตัวเลือกคำบรรยาย"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compact-sidebar": {
|
||||||
|
"description": "ตั้งค่าแถบข้างให้อยู่ในโหมดกระชับเสมอ",
|
||||||
|
"name": "แถบข้างแบบกระชับ"
|
||||||
|
},
|
||||||
|
"crossfade": {
|
||||||
|
"description": "การเฟดเพลงระหว่างเพลง",
|
||||||
|
"menu": {
|
||||||
|
"advanced": "ขั้นสูง"
|
||||||
|
},
|
||||||
|
"name": "การเฟดเพลง [เบต้า]",
|
||||||
|
"prompt": {
|
||||||
|
"options": {
|
||||||
|
"multi-input": {
|
||||||
|
"fade-in-duration": "ระยะเวลาการเฟดเข้าสู่ (มิลลิวินาที)",
|
||||||
|
"fade-out-duration": "ระยะเวลาการเฟดออก (มิลลิวินาที)",
|
||||||
|
"fade-scaling": {
|
||||||
|
"label": "การปรับขนาดของการเฟด",
|
||||||
|
"linear": "การเปลี่ยนแปลงเชิงเส้น",
|
||||||
|
"logarithmic": "การเปลี่ยนแปลงเชิงลอการิทึม"
|
||||||
|
},
|
||||||
|
"seconds-before-end": "เฟดเพลง N วินาทีก่อนจบ"
|
||||||
|
},
|
||||||
|
"title": "ตัวเลือกเฟดเพลง"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disable-autoplay": {
|
||||||
|
"description": "เริ่มเพลงในโหมดหยุด",
|
||||||
|
"menu": {
|
||||||
|
"apply-once": "ใช้เฉพาะเมื่อเริ่มต้น"
|
||||||
|
},
|
||||||
|
"name": "ปิดใช้งานการเล่นอัตโนมัติ"
|
||||||
|
},
|
||||||
|
"discord": {
|
||||||
|
"backend": {
|
||||||
|
"already-connected": "พยายามเชื่อมต่อกับการเชื่อมต่อที่ทำงานอยู่",
|
||||||
|
"connected": "เชื่อมต่อกับดิสคอร์ดแล้ว",
|
||||||
|
"disconnected": "ตัดการเชื่อมต่อออกจากดิสคอร์ด"
|
||||||
|
},
|
||||||
|
"description": "แสดงให้เพื่อนเห็นว่าคุณกำลังฟังอะไรด้วย Rich Presence",
|
||||||
|
"menu": {
|
||||||
|
"auto-reconnect": "เชื่อมต่อใหม่โดยอัตโนมัติ",
|
||||||
|
"clear-activity": "ล้างกิจกรรม",
|
||||||
|
"clear-activity-after-timeout": "ล้างกิจกรรมหลังจากหมดเวลา",
|
||||||
|
"connected": "เชื่อมต่อแล้ว",
|
||||||
|
"disconnected": "ตัดการเชื่อมต่อ",
|
||||||
|
"hide-duration-left": "ซ่อนระยะเวลาที่เหลือ",
|
||||||
|
"hide-github-button": "ซ่อนปุ่มลิงก์ GitHub",
|
||||||
|
"play-on-youtube-music": "เล่นบนยูทูปมิวสุค",
|
||||||
|
"set-inactivity-timeout": "ตั้งระยะเวลาไม่มีกิจกรรม"
|
||||||
|
},
|
||||||
|
"name": "Discord Rich Presence",
|
||||||
|
"prompt": {
|
||||||
|
"set-inactivity-timeout": {
|
||||||
|
"label": "ป้อนระยะเวลาไม่มีกิจกรรมเป็นวินาที:",
|
||||||
|
"title": "ตั้งระยะเวลาไม่มีกิจกรรม"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"downloader": {
|
"downloader": {
|
||||||
"backend": {
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"error": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "ตกลง"
|
||||||
|
},
|
||||||
|
"message": "อ๊ะ! ขออภัย ดาวน์โหลดล้มเหลว…",
|
||||||
|
"title": "มีข้อผิดพลาดในการดาวน์โหลด!"
|
||||||
|
},
|
||||||
|
"start-download-playlist": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "ตกลง"
|
||||||
|
},
|
||||||
|
"detail": "({{playlistSize}} เพลง)",
|
||||||
|
"message": "กำลังดาวน์โหลดเพลย์ลิสต์ {{playlistTitle}}",
|
||||||
|
"title": "เริ่มต้นการดาวน์โหลดแล้ว"
|
||||||
|
}
|
||||||
|
},
|
||||||
"feedback": {
|
"feedback": {
|
||||||
|
"conversion-progress": "การแปลง: {{percent}}%",
|
||||||
|
"converting": "กำลังแปลง…",
|
||||||
|
"done": "เสร็จสิ้น: {{filePath}}",
|
||||||
"download-info": "กำลังดาวน์โหลด {{artist}} - {{title}} [{{videoId}}",
|
"download-info": "กำลังดาวน์โหลด {{artist}} - {{title}} [{{videoId}}",
|
||||||
"download-progress": "ดาวน์โหลด: {{percent}}%",
|
"download-progress": "ดาวน์โหลด: {{percent}}%",
|
||||||
"downloading": "กำลังดาวน์โหลด…",
|
"downloading": "กำลังดาวน์โหลด…",
|
||||||
"downloading-counter": "กำลังดาวน์โหลด {{current}}/{{total}}…",
|
"downloading-counter": "กำลังดาวน์โหลด {{current}}/{{total}}…",
|
||||||
"downloading-playlist": "กำลังดาวน์โหลดเพลย์ลีสต์ \"{{playlistTitle}}\" - {{playlistSize}} เพลง ({{playlistId}})",
|
"downloading-playlist": "กำลังดาวน์โหลดเพลย์ลิสต์ \"{{playlistTitle}}\" - {{playlistSize}} เพลง ({{playlistId}})",
|
||||||
"error-while-downloading": "เกิดข้อผิดพลาดในการดาวน์โหลด \"{{author}} - {{title}}\": {{error}}",
|
"error-while-downloading": "เกิดข้อผิดพลาดในการดาวน์โหลด \"{{author}} - {{title}}\": {{error}}",
|
||||||
"folder-already-exists": "มีโฟลเดอร์ {{playlistFolder}} อยู่แล้ว",
|
"folder-already-exists": "มีโฟลเดอร์ {{playlistFolder}} อยู่แล้ว",
|
||||||
"getting-playlist-info": "กำลังรับข้อมูลเพลย์ลิสต์…",
|
"getting-playlist-info": "กำลังรับข้อมูลเพลย์ลิสต์…",
|
||||||
@ -114,6 +403,7 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"choose-download-folder": "เลือกโฟลเดอร์ดาวน์โหลด",
|
"choose-download-folder": "เลือกโฟลเดอร์ดาวน์โหลด",
|
||||||
"download-playlist": "ดาวน์โหลดเพลย์ลิสต์",
|
"download-playlist": "ดาวน์โหลดเพลย์ลิสต์",
|
||||||
|
"presets": "พรีเซ็ต",
|
||||||
"skip-existing": "ข้ามไฟล์ที่มีอยู่แล้ว"
|
"skip-existing": "ข้ามไฟล์ที่มีอยู่แล้ว"
|
||||||
},
|
},
|
||||||
"name": "ตัวดาวน์โหลด",
|
"name": "ตัวดาวน์โหลด",
|
||||||
@ -123,6 +413,67 @@
|
|||||||
"templates": {
|
"templates": {
|
||||||
"button": "ดาวน์โหลด"
|
"button": "ดาวน์โหลด"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"exponential-volume": {
|
||||||
|
"description": "ทำให้ตัวเลือกความดังมีลักษณะเอ็กซ์โปเนนเชียล เพื่อให้ง่ายต่อการเลือกระดับความดังที่ต่ำลง",
|
||||||
|
"name": "ระดับเสียงแบบเอ็กซโปเนนเชียล"
|
||||||
|
},
|
||||||
|
"in-app-menu": {
|
||||||
|
"description": "ให้เมนูบาร์ดูทันสมัย มืดหรือเป็นสีของอัลบั้มอย่างน่าสนใจ",
|
||||||
|
"menu": {
|
||||||
|
"hide-dom-window-controls": "ซ่อนตัวควบคุมหน้าต่าง DOM"
|
||||||
|
},
|
||||||
|
"name": "เมนูในแอป"
|
||||||
|
},
|
||||||
|
"lumiastream": {
|
||||||
|
"description": "เพิ่มการรองรับ ลูเมีย สตรีม",
|
||||||
|
"name": "ลูเมีย สตรีม [เบต้า]"
|
||||||
|
},
|
||||||
|
"lyrics-genius": {
|
||||||
|
"description": "เพิ่มการสนับสนุนเนื้อเพลงสำหรับเพลงหลายๆ เพลง",
|
||||||
|
"menu": {
|
||||||
|
"romanized-lyrics": "เนื้อเพลงโรมันไรซ์"
|
||||||
|
},
|
||||||
|
"name": "เนื้อเพลงแบบอัจฉริยะ",
|
||||||
|
"renderer": {
|
||||||
|
"fetched-lyrics": "ดึงข้อมูลเนื้อเพลงแบบอัจฉริยะแล้ว"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"music-together": {
|
||||||
|
"description": "แบ่งปันเพลย์ลิสต์กับผู้อื่น โดยเมื่อเจ้าภาพเล่นเพลง ทุกคนอื่นๆ จะได้ยินเพลงเดียวกัน",
|
||||||
|
"dialog": {
|
||||||
|
"enter-host": "ป้อนรหัสโฮสต์"
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"save": "บันทึก",
|
||||||
|
"track-source": "แหล่งข้อมูลเพลง",
|
||||||
|
"unknown-user": "ผู้ใช้ที่ไม่รู้จัก"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"click-to-copy-id": "คัดลอกรหัสโฮสต์",
|
||||||
|
"close": "ปิด Music Together",
|
||||||
|
"connected-users": "ผู้ใช้ที่เชื่อมต่อ",
|
||||||
|
"disconnect": "ตัดการเชื่อมต่อ Music Together",
|
||||||
|
"empty-user": "ไม่มีผู้ใช้ที่เชื่อมต่อ",
|
||||||
|
"host": "โฮสต์ Music Together",
|
||||||
|
"join": "เข้าร่วม Music Together",
|
||||||
|
"permission": {
|
||||||
|
"all": "อนุญาตให้แขกควบคุมเพลย์ลิสต์และเครื่องเล่น",
|
||||||
|
"host-only": "เฉพาะโฮสต์เท่านั้นที่สามารถควบคุมเพลย์ลิสต์และเครื่องเล่นได้",
|
||||||
|
"playlist": "อนุญาตให้แขกควบคุมเพลย์ลิสต์"
|
||||||
|
},
|
||||||
|
"set-permission": "เปลี่ยนการอนุญาตในการควบคุม",
|
||||||
|
"status": {
|
||||||
|
"disconnected": "ตัดการเชื่อมต่อแล้ว",
|
||||||
|
"guest": "เชื่อมต่อเป็นแขก",
|
||||||
|
"host": "เชื่อมต่อเป็นโฮสต์"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Music Together [เบต้า]",
|
||||||
|
"toast": {
|
||||||
|
"add-song-failed": "เพิ่มเพลงล้มเหลว",
|
||||||
|
"closed": "ปิด Music Together แล้ว"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Listeleme desteği ekler (lastfm, listenbrainz ve benzeri)",
|
"description": "Listeleme desteği ekler (lastfm, listenbrainz ve benzeri)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Last.fm ile kimlik doğrulaması yapılamadı\nBir sonraki yeniden başlatmaya kadar açılır pencereyi gizle.",
|
||||||
|
"title": "Kimlik Doğrulama Başarısız"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Last.fm API Ayarları"
|
"api-settings": "Last.fm API Ayarları"
|
||||||
|
|||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Додає підтримку скроблінгу (last.fm, Listenbrainz тощо)",
|
"description": "Додає підтримку скроблінгу (last.fm, Listenbrainz тощо)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Не вдалося автентифікуватися на Last.fm\nСховати до наступного запуску.",
|
||||||
|
"title": "Не вдалося автентифікуватися"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Налаштування API Last.fm"
|
"api-settings": "Налаштування API Last.fm"
|
||||||
|
|||||||
@ -212,6 +212,14 @@
|
|||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
"description": "Áp dụng chủ đề động và hiệu ứng hình ảnh dựa trên bảng màu của album",
|
"description": "Áp dụng chủ đề động và hiệu ứng hình ảnh dựa trên bảng màu của album",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"label": "Tỉ lệ trộn màu",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{ratio}}%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"name": "Màu nền album"
|
"name": "Màu nền album"
|
||||||
},
|
},
|
||||||
"ambient-mode": {
|
"ambient-mode": {
|
||||||
@ -498,7 +506,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Ưu tiên thông báo",
|
"priority": "Ưu tiên thông báo",
|
||||||
"toast-style": "Kiểu toast",
|
"toast-style": "Kiểu thông báo bật lên",
|
||||||
"unpause-notification": "Hiển thị thông báo khi bỏ tạm dừng"
|
"unpause-notification": "Hiển thị thông báo khi bỏ tạm dừng"
|
||||||
},
|
},
|
||||||
"name": "Thông báo"
|
"name": "Thông báo"
|
||||||
@ -571,13 +579,22 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Thêm hỗ trợ scrobbling (v.v. Last.fm, Listenbrainz)",
|
"description": "Thêm hỗ trợ scrobbling (v.v. Last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Không thể xác minh với \nẨn thông báo cho đến lần bật ứng dụng tiếp theo.",
|
||||||
|
"title": "Xác minh thất bại"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Cài đặt API Last.fm"
|
"api-settings": "Cài đặt API Last.fm"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Nhập mã người dùng ListenBrainz"
|
"token": "Nhập mã người dùng ListenBrainz"
|
||||||
}
|
},
|
||||||
|
"scrobble-other-media": "Scrobber nội dung khác"
|
||||||
},
|
},
|
||||||
"name": "Scrobbler",
|
"name": "Scrobbler",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
|||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "添加歌曲追踪支持(如 Last.fm 和 Listenbrainz)",
|
"description": "添加歌曲追踪支持(如 Last.fm 和 Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "与 Last.fm 认证时失败\n弹出窗口将在下次重启前隐藏。",
|
||||||
|
"title": "认证失败"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Last.fm API 设置"
|
"api-settings": "Last.fm API 设置"
|
||||||
|
|||||||
@ -579,6 +579,14 @@
|
|||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "額外新增 scrobbling 支援 (例如:last.fm, Listenbrainz)",
|
"description": "額外新增 scrobbling 支援 (例如:last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Last.fm認證失敗\n將隱藏彈窗直到重啟。",
|
||||||
|
"title": "認證失敗"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Last.fm API 設定"
|
"api-settings": "Last.fm API 設定"
|
||||||
|
|||||||
@ -82,11 +82,15 @@ if (!gotTheLock) {
|
|||||||
app.exit();
|
app.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ozone platform hint: Required for Wayland support
|
||||||
|
app.commandLine.appendSwitch('ozone-platform-hint', 'auto');
|
||||||
// SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt)
|
// SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt)
|
||||||
// OverlayScrollbar: Required for overlay scrollbars
|
// OverlayScrollbar: Required for overlay scrollbars
|
||||||
|
// UseOzonePlatform: Required for Wayland support
|
||||||
|
// WaylandWindowDecorations: Required for Wayland decorations
|
||||||
app.commandLine.appendSwitch(
|
app.commandLine.appendSwitch(
|
||||||
'enable-features',
|
'enable-features',
|
||||||
'OverlayScrollbar,SharedArrayBuffer',
|
'OverlayScrollbar,SharedArrayBuffer,UseOzonePlatform,WaylandWindowDecorations',
|
||||||
);
|
);
|
||||||
if (config.get('options.disableHardwareAcceleration')) {
|
if (config.get('options.disableHardwareAcceleration')) {
|
||||||
if (is.dev()) {
|
if (is.dev()) {
|
||||||
|
|||||||
@ -24,19 +24,13 @@ yt-page-navigation-progress {
|
|||||||
background-color 300ms cubic-bezier(0.2, 0, 0.6, 1) !important;
|
background-color 300ms cubic-bezier(0.2, 0, 0.6, 1) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#img,
|
|
||||||
#player,
|
|
||||||
.song-media-controls.style-scope.ytmusic-player {
|
|
||||||
border-radius: 2% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
#items {
|
#items {
|
||||||
border-radius: 10px !important;
|
border-radius: 10px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fix blur navigation bar */
|
/* fix blur navigation bar */
|
||||||
|
|
||||||
ytmusic-app-layout > [slot='player-page'] {
|
ytmusic-app-layout > [slot="player-page"]:not([is-mweb-modernization-enabled]) {
|
||||||
padding-top: 90px;
|
padding-top: 90px;
|
||||||
margin-top: calc(-90px + var(--menu-bar-height, 0px)) !important;
|
margin-top: calc(-90px + var(--menu-bar-height, 0px)) !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,18 +1,10 @@
|
|||||||
import style from './style.css?inline';
|
import style from './style.css?inline';
|
||||||
|
|
||||||
import { createPlugin } from '@/utils';
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
import { createPlugin } from '@/utils';
|
||||||
|
import { menu } from './menu';
|
||||||
|
import { AmbientModePluginConfig } from './types';
|
||||||
|
|
||||||
export type AmbientModePluginConfig = {
|
|
||||||
enabled: boolean;
|
|
||||||
quality: number;
|
|
||||||
buffer: number;
|
|
||||||
interpolationTime: number;
|
|
||||||
blur: number;
|
|
||||||
size: number;
|
|
||||||
opacity: number;
|
|
||||||
fullscreen: boolean;
|
|
||||||
};
|
|
||||||
const defaultConfig: AmbientModePluginConfig = {
|
const defaultConfig: AmbientModePluginConfig = {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
quality: 50,
|
quality: 50,
|
||||||
@ -30,205 +22,78 @@ export default createPlugin({
|
|||||||
restartNeeded: false,
|
restartNeeded: false,
|
||||||
config: defaultConfig,
|
config: defaultConfig,
|
||||||
stylesheets: [style],
|
stylesheets: [style],
|
||||||
menu: async ({ getConfig, setConfig }) => {
|
menu: menu,
|
||||||
const interpolationTimeList = [0, 500, 1000, 1500, 2000, 3000, 4000, 5000];
|
|
||||||
const qualityList = [10, 25, 50, 100, 200, 500, 1000];
|
|
||||||
const sizeList = [100, 110, 125, 150, 175, 200, 300];
|
|
||||||
const bufferList = [1, 5, 10, 20, 30];
|
|
||||||
const blurAmountList = [0, 5, 10, 25, 50, 100, 150, 200, 500];
|
|
||||||
const opacityList = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];
|
|
||||||
|
|
||||||
const config = await getConfig();
|
|
||||||
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.smoothness-transition.label'),
|
|
||||||
submenu: interpolationTimeList.map((interpolationTime) => ({
|
|
||||||
label: t(
|
|
||||||
'plugins.ambient-mode.menu.smoothness-transition.submenu.during',
|
|
||||||
{
|
|
||||||
interpolationTime: interpolationTime / 1000,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
type: 'radio',
|
|
||||||
checked: config.interpolationTime === interpolationTime,
|
|
||||||
click() {
|
|
||||||
setConfig({ interpolationTime });
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.quality.label'),
|
|
||||||
submenu: qualityList.map((quality) => ({
|
|
||||||
label: t('plugins.ambient-mode.menu.quality.submenu.pixels', {
|
|
||||||
quality,
|
|
||||||
}),
|
|
||||||
type: 'radio',
|
|
||||||
checked: config.quality === quality,
|
|
||||||
click() {
|
|
||||||
setConfig({ quality });
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.size.label'),
|
|
||||||
submenu: sizeList.map((size) => ({
|
|
||||||
label: t('plugins.ambient-mode.menu.size.submenu.percent', { size }),
|
|
||||||
type: 'radio',
|
|
||||||
checked: config.size === size,
|
|
||||||
click() {
|
|
||||||
setConfig({ size });
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.buffer.label'),
|
|
||||||
submenu: bufferList.map((buffer) => ({
|
|
||||||
label: t('plugins.ambient-mode.menu.buffer.submenu.buffer', {
|
|
||||||
buffer,
|
|
||||||
}),
|
|
||||||
type: 'radio',
|
|
||||||
checked: config.buffer === buffer,
|
|
||||||
click() {
|
|
||||||
setConfig({ buffer });
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.opacity.label'),
|
|
||||||
submenu: opacityList.map((opacity) => ({
|
|
||||||
label: t('plugins.ambient-mode.menu.opacity.submenu.percent', {
|
|
||||||
opacity: opacity * 100,
|
|
||||||
}),
|
|
||||||
type: 'radio',
|
|
||||||
checked: config.opacity === opacity,
|
|
||||||
click() {
|
|
||||||
setConfig({ opacity });
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.blur-amount.label'),
|
|
||||||
submenu: blurAmountList.map((blur) => ({
|
|
||||||
label: t('plugins.ambient-mode.menu.blur-amount.submenu.pixels', {
|
|
||||||
blurAmount: blur,
|
|
||||||
}),
|
|
||||||
type: 'radio',
|
|
||||||
checked: config.blur === blur,
|
|
||||||
click() {
|
|
||||||
setConfig({ blur });
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: t('plugins.ambient-mode.menu.use-fullscreen.label'),
|
|
||||||
type: 'checkbox',
|
|
||||||
checked: config.fullscreen,
|
|
||||||
click(item) {
|
|
||||||
setConfig({ fullscreen: item.checked });
|
|
||||||
},
|
|
||||||
},
|
|
||||||
];
|
|
||||||
},
|
|
||||||
|
|
||||||
renderer: {
|
renderer: {
|
||||||
interpolationTime: defaultConfig.interpolationTime,
|
interpolationTime: defaultConfig.interpolationTime,
|
||||||
buffer: defaultConfig.buffer,
|
buffer: defaultConfig.buffer,
|
||||||
qualityRatio: defaultConfig.quality,
|
qualityRatio: defaultConfig.quality,
|
||||||
sizeRatio: defaultConfig.size / 100,
|
size: defaultConfig.size,
|
||||||
blur: defaultConfig.blur,
|
blur: defaultConfig.blur,
|
||||||
opacity: defaultConfig.opacity,
|
opacity: defaultConfig.opacity,
|
||||||
isFullscreen: defaultConfig.fullscreen,
|
isFullscreen: defaultConfig.fullscreen,
|
||||||
|
|
||||||
unregister: null as (() => void) | null,
|
unregister: null as (() => void) | null,
|
||||||
update: null as (() => void) | null,
|
update: null as (() => void) | null,
|
||||||
observer: null as MutationObserver | null,
|
interval: null as NodeJS.Timeout | null,
|
||||||
|
lastMediaType: null as "video" | "image" | null,
|
||||||
|
lastVideoSource: null as string | null,
|
||||||
|
lastImageSource: null as string | null,
|
||||||
|
|
||||||
|
async start({ getConfig }) {
|
||||||
|
const config = await getConfig();
|
||||||
|
this.interpolationTime = config.interpolationTime;
|
||||||
|
this.buffer = config.buffer;
|
||||||
|
this.qualityRatio = config.quality;
|
||||||
|
this.size = config.size;
|
||||||
|
this.blur = config.blur;
|
||||||
|
this.opacity = config.opacity;
|
||||||
|
this.isFullscreen = config.fullscreen;
|
||||||
|
|
||||||
|
const songImage = document.querySelector<HTMLImageElement>('#song-image');
|
||||||
|
const songVideo = document.querySelector<HTMLDivElement>('#song-video');
|
||||||
|
const image = songImage?.querySelector<HTMLImageElement>('yt-img-shadow > img');
|
||||||
|
const video = songVideo?.querySelector<HTMLVideoElement>('.html5-video-container > video');
|
||||||
|
const videoWrapper = document.querySelector('#song-video > .player-wrapper');
|
||||||
|
|
||||||
start() {
|
|
||||||
const injectBlurImage = () => {
|
const injectBlurImage = () => {
|
||||||
const songImage = document.querySelector<HTMLImageElement>(
|
if (!songImage || !image) return null;
|
||||||
'#song-image',
|
|
||||||
);
|
|
||||||
const image = document.querySelector<HTMLImageElement>(
|
|
||||||
'#song-image yt-img-shadow > img',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!songImage) return null;
|
this.lastImageSource = image.src;
|
||||||
if (!image) return null;
|
|
||||||
|
|
||||||
const blurImage = document.createElement('img');
|
const blurImage = document.createElement('img');
|
||||||
blurImage.classList.add('html5-blur-image');
|
blurImage.classList.add('html5-blur-image');
|
||||||
blurImage.src = image.src;
|
blurImage.src = image.src;
|
||||||
|
|
||||||
const applyImageAttribute = () => {
|
this.update = () => {
|
||||||
const rect = image.getBoundingClientRect();
|
|
||||||
|
|
||||||
const newWidth = Math.floor(image.width || rect.width);
|
|
||||||
const newHeight = Math.floor(image.height || rect.height);
|
|
||||||
|
|
||||||
if (newWidth === 0 || newHeight === 0) return;
|
|
||||||
|
|
||||||
if (this.isFullscreen) blurImage.classList.add('fullscreen');
|
if (this.isFullscreen) blurImage.classList.add('fullscreen');
|
||||||
else blurImage.classList.remove('fullscreen');
|
else blurImage.classList.remove('fullscreen');
|
||||||
|
|
||||||
const leftOffset = (newWidth * (this.sizeRatio - 1)) / 2;
|
blurImage.style.setProperty('--width', `${this.size}%`);
|
||||||
const topOffset = (newHeight * (this.sizeRatio - 1)) / 2;
|
blurImage.style.setProperty('--height', `${this.size}%`);
|
||||||
blurImage.style.setProperty('--left', `${-1 * leftOffset}px`);
|
|
||||||
blurImage.style.setProperty('--top', `${-1 * topOffset}px`);
|
|
||||||
blurImage.style.setProperty('--width', `${newWidth * this.sizeRatio}px`);
|
|
||||||
blurImage.style.setProperty('--height', `${newHeight * this.sizeRatio}px`);
|
|
||||||
blurImage.style.setProperty('--blur', `${this.blur}px`);
|
blurImage.style.setProperty('--blur', `${this.blur}px`);
|
||||||
blurImage.style.setProperty('--opacity', `${this.opacity}`);
|
blurImage.style.setProperty('--opacity', `${this.opacity}`);
|
||||||
};
|
};
|
||||||
|
this.update();
|
||||||
this.update = applyImageAttribute;
|
|
||||||
|
|
||||||
const observer = new MutationObserver((mutations) => {
|
|
||||||
mutations.forEach((mutation) => {
|
|
||||||
if (mutation.type === 'attributes') {
|
|
||||||
applyImageAttribute();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
const resizeObserver = new ResizeObserver(() => {
|
|
||||||
applyImageAttribute();
|
|
||||||
});
|
|
||||||
|
|
||||||
applyImageAttribute();
|
|
||||||
observer.observe(songImage, { attributes: true });
|
|
||||||
resizeObserver.observe(songImage);
|
|
||||||
window.addEventListener('resize', applyImageAttribute);
|
|
||||||
|
|
||||||
/* injecting */
|
/* injecting */
|
||||||
songImage.prepend(blurImage);
|
songImage.prepend(blurImage);
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
return () => {
|
return () => {
|
||||||
observer.disconnect();
|
|
||||||
resizeObserver.disconnect();
|
|
||||||
window.removeEventListener('resize', applyImageAttribute);
|
|
||||||
|
|
||||||
if (blurImage.isConnected) blurImage.remove();
|
if (blurImage.isConnected) blurImage.remove();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const injectBlurVideo = (): (() => void) | null => {
|
const injectBlurVideo = () => {
|
||||||
const songVideo = document.querySelector<HTMLDivElement>('#song-video');
|
if (!songVideo || !video || !videoWrapper) return null;
|
||||||
const video = document.querySelector<HTMLVideoElement>(
|
|
||||||
'#song-video .html5-video-container > video',
|
|
||||||
);
|
|
||||||
const wrapper = document.querySelector('#song-video > .player-wrapper');
|
|
||||||
|
|
||||||
if (!songVideo) return null;
|
this.lastVideoSource = video.src;
|
||||||
if (!video) return null;
|
|
||||||
if (!wrapper) return null;
|
|
||||||
|
|
||||||
const blurCanvas = document.createElement('canvas');
|
const blurCanvas = document.createElement('canvas');
|
||||||
blurCanvas.classList.add('html5-blur-canvas');
|
blurCanvas.classList.add('html5-blur-canvas');
|
||||||
|
|
||||||
const context = blurCanvas.getContext('2d', {
|
const context = blurCanvas.getContext('2d', { willReadFrequently: true });
|
||||||
willReadFrequently: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
/* effect */
|
/* effect */
|
||||||
let lastEffectWorkId: number | null = null;
|
let lastEffectWorkId: number | null = null;
|
||||||
@ -242,17 +107,13 @@ export default createPlugin({
|
|||||||
if (!context) return;
|
if (!context) return;
|
||||||
|
|
||||||
const width = this.qualityRatio;
|
const width = this.qualityRatio;
|
||||||
let height = Math.max(
|
let height = Math.max(Math.floor((blurCanvas.height / blurCanvas.width) * width), 1,);
|
||||||
Math.floor((blurCanvas.height / blurCanvas.width) * width),
|
|
||||||
1,
|
|
||||||
);
|
|
||||||
if (!Number.isFinite(height)) height = width;
|
if (!Number.isFinite(height)) height = width;
|
||||||
if (!height) return;
|
if (!height) return;
|
||||||
|
|
||||||
context.globalAlpha = 1;
|
context.globalAlpha = 1;
|
||||||
if (lastImageData) {
|
if (lastImageData) {
|
||||||
const frameOffset =
|
const frameOffset = (1 / this.buffer) * (1000 / this.interpolationTime);
|
||||||
(1 / this.buffer) * (1000 / this.interpolationTime);
|
|
||||||
context.globalAlpha = 1 - (frameOffset * 2); // because of alpha value must be < 1
|
context.globalAlpha = 1 - (frameOffset * 2); // because of alpha value must be < 1
|
||||||
context.putImageData(lastImageData, 0, 0);
|
context.putImageData(lastImageData, 0, 0);
|
||||||
context.globalAlpha = frameOffset;
|
context.globalAlpha = frameOffset;
|
||||||
@ -265,7 +126,7 @@ export default createPlugin({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const applyVideoAttributes = () => {
|
this.update = () => {
|
||||||
const rect = video.getBoundingClientRect();
|
const rect = video.getBoundingClientRect();
|
||||||
|
|
||||||
const newWidth = Math.floor(video.width || rect.width);
|
const newWidth = Math.floor(video.width || rect.width);
|
||||||
@ -274,45 +135,21 @@ export default createPlugin({
|
|||||||
if (newWidth === 0 || newHeight === 0) return;
|
if (newWidth === 0 || newHeight === 0) return;
|
||||||
|
|
||||||
blurCanvas.width = this.qualityRatio;
|
blurCanvas.width = this.qualityRatio;
|
||||||
blurCanvas.height = Math.floor(
|
blurCanvas.height = Math.floor((newHeight / newWidth) * this.qualityRatio);
|
||||||
(newHeight / newWidth) * this.qualityRatio,
|
|
||||||
);
|
|
||||||
blurCanvas.style.width = `${newWidth * this.sizeRatio}px`;
|
|
||||||
blurCanvas.style.height = `${newHeight * this.sizeRatio}px`;
|
|
||||||
|
|
||||||
if (this.isFullscreen) blurCanvas.classList.add('fullscreen');
|
if (this.isFullscreen) blurCanvas.classList.add('fullscreen');
|
||||||
else blurCanvas.classList.remove('fullscreen');
|
else blurCanvas.classList.remove('fullscreen');
|
||||||
|
|
||||||
const leftOffset = (newWidth * (this.sizeRatio - 1)) / 2;
|
blurCanvas.style.setProperty('--width', `${this.size}%`);
|
||||||
const topOffset = (newHeight * (this.sizeRatio - 1)) / 2;
|
blurCanvas.style.setProperty('--height', `${this.size}%`);
|
||||||
blurCanvas.style.setProperty('--left', `${-1 * leftOffset}px`);
|
|
||||||
blurCanvas.style.setProperty('--top', `${-1 * topOffset}px`);
|
|
||||||
blurCanvas.style.setProperty('--blur', `${this.blur}px`);
|
blurCanvas.style.setProperty('--blur', `${this.blur}px`);
|
||||||
blurCanvas.style.setProperty('--opacity', `${this.opacity}`);
|
blurCanvas.style.setProperty('--opacity', `${this.opacity}`);
|
||||||
};
|
};
|
||||||
this.update = applyVideoAttributes;
|
this.update();
|
||||||
|
|
||||||
const observer = new MutationObserver((mutations) => {
|
|
||||||
mutations.forEach((mutation) => {
|
|
||||||
if (mutation.type === 'attributes') {
|
|
||||||
applyVideoAttributes();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
const resizeObserver = new ResizeObserver(() => {
|
|
||||||
applyVideoAttributes();
|
|
||||||
});
|
|
||||||
|
|
||||||
/* hooking */
|
/* hooking */
|
||||||
let canvasInterval: NodeJS.Timeout | null = null;
|
let canvasInterval: NodeJS.Timeout | null = null;
|
||||||
canvasInterval = setInterval(
|
canvasInterval = setInterval(onSync, Math.max(1, Math.ceil(1000 / this.buffer)));
|
||||||
onSync,
|
|
||||||
Math.max(1, Math.ceil(1000 / this.buffer)),
|
|
||||||
);
|
|
||||||
applyVideoAttributes();
|
|
||||||
observer.observe(songVideo, { attributes: true });
|
|
||||||
resizeObserver.observe(songVideo);
|
|
||||||
window.addEventListener('resize', applyVideoAttributes);
|
|
||||||
|
|
||||||
const onPause = () => {
|
const onPause = () => {
|
||||||
if (canvasInterval) clearInterval(canvasInterval);
|
if (canvasInterval) clearInterval(canvasInterval);
|
||||||
@ -320,16 +157,13 @@ export default createPlugin({
|
|||||||
};
|
};
|
||||||
const onPlay = () => {
|
const onPlay = () => {
|
||||||
if (canvasInterval) clearInterval(canvasInterval);
|
if (canvasInterval) clearInterval(canvasInterval);
|
||||||
canvasInterval = setInterval(
|
canvasInterval = setInterval(onSync, Math.max(1, Math.ceil(1000 / this.buffer)));
|
||||||
onSync,
|
|
||||||
Math.max(1, Math.ceil(1000 / this.buffer)),
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
songVideo.addEventListener('pause', onPause);
|
songVideo.addEventListener('pause', onPause);
|
||||||
songVideo.addEventListener('play', onPlay);
|
songVideo.addEventListener('play', onPlay);
|
||||||
|
|
||||||
/* injecting */
|
/* injecting */
|
||||||
wrapper.prepend(blurCanvas);
|
videoWrapper.prepend(blurCanvas);
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
return () => {
|
return () => {
|
||||||
@ -338,55 +172,63 @@ export default createPlugin({
|
|||||||
songVideo.removeEventListener('pause', onPause);
|
songVideo.removeEventListener('pause', onPause);
|
||||||
songVideo.removeEventListener('play', onPlay);
|
songVideo.removeEventListener('play', onPlay);
|
||||||
|
|
||||||
observer.disconnect();
|
|
||||||
resizeObserver.disconnect();
|
|
||||||
window.removeEventListener('resize', applyVideoAttributes);
|
|
||||||
|
|
||||||
if (blurCanvas.isConnected) blurCanvas.remove();
|
if (blurCanvas.isConnected) blurCanvas.remove();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const isVideoMode = () => {
|
const isVideoMode = () => {
|
||||||
const songVideo = document.querySelector<HTMLDivElement>('#song-video');
|
const songVideo = document.querySelector<HTMLDivElement>('#song-video');
|
||||||
if (!songVideo) return false;
|
if (!songVideo) {
|
||||||
|
this.lastMediaType = "image";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return getComputedStyle(songVideo).display !== 'none';
|
const isVideo = getComputedStyle(songVideo).display !== 'none';
|
||||||
|
this.lastMediaType = isVideo ? "video" : "image";
|
||||||
|
return isVideo;
|
||||||
};
|
};
|
||||||
|
|
||||||
const playerPage = document.querySelector<HTMLElement>('#player-page');
|
const playerPage = document.querySelector<HTMLElement>('#player-page');
|
||||||
const ytmusicAppLayout = document.querySelector<HTMLElement>('#layout');
|
const ytmusicAppLayout = document.querySelector<HTMLElement>('#layout');
|
||||||
|
|
||||||
const isPageOpen = ytmusicAppLayout?.hasAttribute('player-page-open');
|
const injectBlurElement = (force?: boolean): boolean | void => {
|
||||||
if (isPageOpen) {
|
const isPageOpen = ytmusicAppLayout?.hasAttribute('player-page-open');
|
||||||
this.unregister?.();
|
if (isPageOpen) {
|
||||||
this.unregister = (isVideoMode() ? injectBlurVideo() : injectBlurImage()) ?? null;
|
const isVideo = isVideoMode();
|
||||||
|
if (!force) {
|
||||||
|
if (this.lastMediaType === "video" && this.lastVideoSource === video?.src) return false;
|
||||||
|
if (this.lastMediaType === "image" && this.lastImageSource === image?.src) return false;
|
||||||
|
}
|
||||||
|
this.unregister?.();
|
||||||
|
this.unregister = (isVideo ? injectBlurVideo() : injectBlurImage()) ?? null;
|
||||||
|
} else {
|
||||||
|
this.unregister?.();
|
||||||
|
this.unregister = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* needed for switching between different views (e.g. miniplayer) */
|
||||||
const observer = new MutationObserver((mutationsList) => {
|
const observer = new MutationObserver((mutationsList) => {
|
||||||
for (const mutation of mutationsList) {
|
for (const mutation of mutationsList) {
|
||||||
if (mutation.type === 'attributes') {
|
if (mutation.type === 'attributes') {
|
||||||
const isPageOpen =
|
injectBlurElement(true);
|
||||||
ytmusicAppLayout?.hasAttribute('player-page-open');
|
break;
|
||||||
if (isPageOpen) {
|
|
||||||
this.unregister?.();
|
|
||||||
this.unregister = (isVideoMode() ? injectBlurVideo() : injectBlurImage()) ?? null;
|
|
||||||
} else {
|
|
||||||
this.unregister?.();
|
|
||||||
this.unregister = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (playerPage) {
|
if (playerPage) {
|
||||||
observer.observe(playerPage, { attributes: true });
|
observer.observe(playerPage, { attributes: true });
|
||||||
|
|
||||||
|
/* fallback ticker for when the observer isn't triggered */
|
||||||
|
this.interval = setInterval(injectBlurElement, 1000);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onConfigChange(newConfig) {
|
onConfigChange(newConfig) {
|
||||||
this.interpolationTime = newConfig.interpolationTime;
|
this.interpolationTime = newConfig.interpolationTime;
|
||||||
this.buffer = newConfig.buffer;
|
this.buffer = newConfig.buffer;
|
||||||
this.qualityRatio = newConfig.quality;
|
this.qualityRatio = newConfig.quality;
|
||||||
this.sizeRatio = newConfig.size / 100;
|
this.size = newConfig.size;
|
||||||
this.blur = newConfig.blur;
|
this.blur = newConfig.blur;
|
||||||
this.opacity = newConfig.opacity;
|
this.opacity = newConfig.opacity;
|
||||||
this.isFullscreen = newConfig.fullscreen;
|
this.isFullscreen = newConfig.fullscreen;
|
||||||
@ -394,9 +236,9 @@ export default createPlugin({
|
|||||||
this.update?.();
|
this.update?.();
|
||||||
},
|
},
|
||||||
stop() {
|
stop() {
|
||||||
this.observer?.disconnect();
|
|
||||||
this.update = null;
|
this.update = null;
|
||||||
this.unregister?.();
|
this.unregister?.();
|
||||||
|
if (this.interval) clearInterval(this.interval);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
110
src/plugins/ambient-mode/menu.ts
Normal file
110
src/plugins/ambient-mode/menu.ts
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import { t } from "@/i18n";
|
||||||
|
import { MenuContext } from "@/types/contexts";
|
||||||
|
import { MenuItemConstructorOptions } from "electron";
|
||||||
|
import { AmbientModePluginConfig } from "./types";
|
||||||
|
|
||||||
|
export interface menuParameters {
|
||||||
|
getConfig: () => AmbientModePluginConfig | Promise<AmbientModePluginConfig>;
|
||||||
|
setConfig: (conf: Partial<Omit<AmbientModePluginConfig, "enabled">>) => void | Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const menu: (ctx: MenuContext<AmbientModePluginConfig>) => MenuItemConstructorOptions[] | Promise<MenuItemConstructorOptions[]> = async ({ getConfig, setConfig }: menuParameters) => {
|
||||||
|
const interpolationTimeList = [0, 500, 1000, 1500, 2000, 3000, 4000, 5000];
|
||||||
|
const qualityList = [10, 25, 50, 100, 200, 500, 1000];
|
||||||
|
const sizeList = [100, 110, 125, 150, 175, 200, 300];
|
||||||
|
const bufferList = [1, 5, 10, 20, 30];
|
||||||
|
const blurAmountList = [0, 5, 10, 25, 50, 100, 150, 200, 500];
|
||||||
|
const opacityList = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];
|
||||||
|
|
||||||
|
const config = await getConfig();
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.smoothness-transition.label'),
|
||||||
|
submenu: interpolationTimeList.map((interpolationTime) => ({
|
||||||
|
label: t(
|
||||||
|
'plugins.ambient-mode.menu.smoothness-transition.submenu.during',
|
||||||
|
{
|
||||||
|
interpolationTime: interpolationTime / 1000,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.interpolationTime === interpolationTime,
|
||||||
|
click() {
|
||||||
|
setConfig({ interpolationTime });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.quality.label'),
|
||||||
|
submenu: qualityList.map((quality) => ({
|
||||||
|
label: t('plugins.ambient-mode.menu.quality.submenu.pixels', {
|
||||||
|
quality,
|
||||||
|
}),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.quality === quality,
|
||||||
|
click() {
|
||||||
|
setConfig({ quality });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.size.label'),
|
||||||
|
submenu: sizeList.map((size) => ({
|
||||||
|
label: t('plugins.ambient-mode.menu.size.submenu.percent', { size }),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.size === size,
|
||||||
|
click() {
|
||||||
|
setConfig({ size });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.buffer.label'),
|
||||||
|
submenu: bufferList.map((buffer) => ({
|
||||||
|
label: t('plugins.ambient-mode.menu.buffer.submenu.buffer', {
|
||||||
|
buffer,
|
||||||
|
}),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.buffer === buffer,
|
||||||
|
click() {
|
||||||
|
setConfig({ buffer });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.opacity.label'),
|
||||||
|
submenu: opacityList.map((opacity) => ({
|
||||||
|
label: t('plugins.ambient-mode.menu.opacity.submenu.percent', {
|
||||||
|
opacity: opacity * 100,
|
||||||
|
}),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.opacity === opacity,
|
||||||
|
click() {
|
||||||
|
setConfig({ opacity });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.blur-amount.label'),
|
||||||
|
submenu: blurAmountList.map((blur) => ({
|
||||||
|
label: t('plugins.ambient-mode.menu.blur-amount.submenu.pixels', {
|
||||||
|
blurAmount: blur,
|
||||||
|
}),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.blur === blur,
|
||||||
|
click() {
|
||||||
|
setConfig({ blur });
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.ambient-mode.menu.use-fullscreen.label'),
|
||||||
|
type: 'checkbox',
|
||||||
|
checked: config.fullscreen,
|
||||||
|
click(item: Electron.MenuItem) {
|
||||||
|
setConfig({ fullscreen: item.checked });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
@ -1,40 +1,36 @@
|
|||||||
#song-video canvas.html5-blur-canvas {
|
#song-video canvas.html5-blur-canvas,
|
||||||
|
#song-image .html5-blur-image {
|
||||||
filter: blur(var(--blur, 100px));
|
filter: blur(var(--blur, 100px));
|
||||||
opacity: var(--opacity, 1);
|
opacity: var(--opacity, 1);
|
||||||
|
width: var(--width, 100%);
|
||||||
|
height: var(--height, 100%);
|
||||||
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#song-video canvas.html5-blur-canvas:not(.fullscreen) {
|
#song-video canvas.html5-blur-canvas:not(.fullscreen),
|
||||||
|
#song-image .html5-blur-image {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
left: var(--left, 0px);
|
top: 50%;
|
||||||
top: var(--top, 0px);
|
transform: translate(-50%, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
#song-video canvas.html5-blur-canvas.fullscreen {
|
#song-video canvas.html5-blur-canvas.fullscreen {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
|
||||||
width: 100% !important;
|
width: 100%;
|
||||||
height: 100% !important;
|
height: 100%;
|
||||||
left: 0 !important;
|
|
||||||
top: 0 !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#song-video .html5-video-container > video {
|
#song-video .html5-video-container {
|
||||||
top: 0 !important;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#song-image .html5-blur-image {
|
#player:not([video-mode]):not(.video-mode):not([player-ui-state='MINIPLAYER']):not([is-mweb-modernization-enabled]) {
|
||||||
position: absolute;
|
width: 100%;
|
||||||
|
margin: 0 auto !important;
|
||||||
left: var(--left, 0px);
|
overflow: visible;
|
||||||
top: var(--top, 0px);
|
|
||||||
width: var(--width, 100%) !important;
|
|
||||||
height: var(--height, 100%) !important;
|
|
||||||
|
|
||||||
filter: blur(var(--blur, 100px));
|
|
||||||
opacity: var(--opacity, 1);
|
|
||||||
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
}
|
||||||
|
|||||||
10
src/plugins/ambient-mode/types.ts
Normal file
10
src/plugins/ambient-mode/types.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
export type AmbientModePluginConfig = {
|
||||||
|
enabled: boolean;
|
||||||
|
quality: number;
|
||||||
|
buffer: number;
|
||||||
|
interpolationTime: number;
|
||||||
|
blur: number;
|
||||||
|
size: number;
|
||||||
|
opacity: number;
|
||||||
|
fullscreen: boolean;
|
||||||
|
};
|
||||||
@ -1,5 +1,4 @@
|
|||||||
import {
|
import {
|
||||||
createWriteStream,
|
|
||||||
existsSync,
|
existsSync,
|
||||||
mkdirSync,
|
mkdirSync,
|
||||||
writeFileSync,
|
writeFileSync,
|
||||||
@ -32,7 +31,6 @@ import { fetchFromGenius } from '@/plugins/lyrics-genius/main';
|
|||||||
import { isEnabled } from '@/config/plugins';
|
import { isEnabled } from '@/config/plugins';
|
||||||
import { cleanupName, getImage, MediaType, type SongInfo } from '@/providers/song-info';
|
import { cleanupName, getImage, MediaType, type SongInfo } from '@/providers/song-info';
|
||||||
import { getNetFetchAsFetch } from '@/plugins/utils/main';
|
import { getNetFetchAsFetch } from '@/plugins/utils/main';
|
||||||
import { cache } from '@/providers/decorators';
|
|
||||||
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|
||||||
@ -297,7 +295,7 @@ async function downloadSongUnsafe(
|
|||||||
mkdirSync(dir);
|
mkdirSync(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
const fileBuffer = await iterableStreamToTargetFile(
|
let fileBuffer = await iterableStreamToProcessedUint8Array(
|
||||||
iterableStream,
|
iterableStream,
|
||||||
targetFileExtension,
|
targetFileExtension,
|
||||||
metadata,
|
metadata,
|
||||||
@ -307,19 +305,16 @@ async function downloadSongUnsafe(
|
|||||||
increasePlaylistProgress,
|
increasePlaylistProgress,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (fileBuffer && targetFileExtension === 'mp3') {
|
||||||
|
fileBuffer = await writeID3(
|
||||||
|
Buffer.from(fileBuffer),
|
||||||
|
metadata,
|
||||||
|
sendFeedback,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (fileBuffer) {
|
if (fileBuffer) {
|
||||||
if (targetFileExtension !== 'mp3') {
|
writeFileSync(filePath, fileBuffer);
|
||||||
createWriteStream(filePath).write(fileBuffer);
|
|
||||||
} else {
|
|
||||||
const buffer = await writeID3(
|
|
||||||
Buffer.from(fileBuffer),
|
|
||||||
metadata,
|
|
||||||
sendFeedback,
|
|
||||||
);
|
|
||||||
if (buffer) {
|
|
||||||
writeFileSync(filePath, buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sendFeedback(null, -1);
|
sendFeedback(null, -1);
|
||||||
@ -330,15 +325,12 @@ async function downloadSongUnsafe(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function iterableStreamToTargetFile(
|
async function downloadChunks(
|
||||||
stream: AsyncGenerator<Uint8Array, void>,
|
stream: AsyncGenerator<Uint8Array, void>,
|
||||||
extension: string,
|
|
||||||
metadata: CustomSongInfo,
|
|
||||||
presetFfmpegArgs: string[],
|
|
||||||
contentLength: number,
|
contentLength: number,
|
||||||
sendFeedback: (str: string, value?: number) => void,
|
sendFeedback: (str: string, value?: number) => void,
|
||||||
increasePlaylistProgress: (value: number) => void = () => {},
|
increasePlaylistProgress: (value: number) => void = () => {},
|
||||||
): Promise<Uint8Array | null> {
|
) {
|
||||||
const chunks = [];
|
const chunks = [];
|
||||||
let downloaded = 0;
|
let downloaded = 0;
|
||||||
for await (const chunk of stream) {
|
for await (const chunk of stream) {
|
||||||
@ -356,65 +348,80 @@ async function iterableStreamToTargetFile(
|
|||||||
// This is a very rough estimate, trying to make the progress bar look nice
|
// This is a very rough estimate, trying to make the progress bar look nice
|
||||||
increasePlaylistProgress(ratio * 0.15);
|
increasePlaylistProgress(ratio * 0.15);
|
||||||
}
|
}
|
||||||
|
return chunks;
|
||||||
sendFeedback(t('plugins.downloader.backend.feedback.loading'), 2); // Indefinite progress bar after download
|
|
||||||
|
|
||||||
const buffer = Buffer.concat(chunks);
|
|
||||||
const safeVideoName = randomBytes(32).toString('hex');
|
|
||||||
const releaseFFmpegMutex = await ffmpegMutex.acquire();
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (!ffmpeg.isLoaded()) {
|
|
||||||
await ffmpeg.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
sendFeedback(t('plugins.downloader.backend.feedback.preparing-file'));
|
|
||||||
ffmpeg.FS('writeFile', safeVideoName, buffer);
|
|
||||||
|
|
||||||
sendFeedback(t('plugins.downloader.backend.feedback.converting'));
|
|
||||||
|
|
||||||
ffmpeg.setProgress(({ ratio }) => {
|
|
||||||
sendFeedback(
|
|
||||||
t('plugins.downloader.backend.feedback.conversion-progress', {
|
|
||||||
percent: Math.floor(ratio * 100),
|
|
||||||
}),
|
|
||||||
ratio,
|
|
||||||
);
|
|
||||||
increasePlaylistProgress(0.15 + (ratio * 0.85));
|
|
||||||
});
|
|
||||||
|
|
||||||
const safeVideoNameWithExtension = `${safeVideoName}.${extension}`;
|
|
||||||
try {
|
|
||||||
await ffmpeg.run(
|
|
||||||
'-i',
|
|
||||||
safeVideoName,
|
|
||||||
...presetFfmpegArgs,
|
|
||||||
...getFFmpegMetadataArgs(metadata),
|
|
||||||
safeVideoNameWithExtension,
|
|
||||||
);
|
|
||||||
} finally {
|
|
||||||
ffmpeg.FS('unlink', safeVideoName);
|
|
||||||
}
|
|
||||||
|
|
||||||
sendFeedback(t('plugins.downloader.backend.feedback.saving'));
|
|
||||||
|
|
||||||
try {
|
|
||||||
return ffmpeg.FS('readFile', safeVideoNameWithExtension);
|
|
||||||
} finally {
|
|
||||||
ffmpeg.FS('unlink', safeVideoNameWithExtension);
|
|
||||||
}
|
|
||||||
} catch (error: unknown) {
|
|
||||||
sendError(error as Error, safeVideoName);
|
|
||||||
} finally {
|
|
||||||
releaseFFmpegMutex();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const getCoverBuffer = cache(async (url: string) => {
|
async function iterableStreamToProcessedUint8Array(
|
||||||
|
stream: AsyncGenerator<Uint8Array, void>,
|
||||||
|
extension: string,
|
||||||
|
metadata: CustomSongInfo,
|
||||||
|
presetFfmpegArgs: string[],
|
||||||
|
contentLength: number,
|
||||||
|
sendFeedback: (str: string, value?: number) => void,
|
||||||
|
increasePlaylistProgress: (value: number) => void = () => {},
|
||||||
|
): Promise<Uint8Array | null> {
|
||||||
|
sendFeedback(t('plugins.downloader.backend.feedback.loading'), 2); // Indefinite progress bar after download
|
||||||
|
|
||||||
|
const safeVideoName = randomBytes(32).toString('hex');
|
||||||
|
|
||||||
|
return await ffmpegMutex.runExclusive(async () => {
|
||||||
|
try {
|
||||||
|
if (!ffmpeg.isLoaded()) {
|
||||||
|
await ffmpeg.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
sendFeedback(t('plugins.downloader.backend.feedback.preparing-file'));
|
||||||
|
ffmpeg.FS(
|
||||||
|
'writeFile',
|
||||||
|
safeVideoName,
|
||||||
|
Buffer.concat(
|
||||||
|
await downloadChunks(stream, contentLength, sendFeedback, increasePlaylistProgress),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
sendFeedback(t('plugins.downloader.backend.feedback.converting'));
|
||||||
|
|
||||||
|
ffmpeg.setProgress(({ ratio }) => {
|
||||||
|
sendFeedback(
|
||||||
|
t('plugins.downloader.backend.feedback.conversion-progress', {
|
||||||
|
percent: Math.floor(ratio * 100),
|
||||||
|
}),
|
||||||
|
ratio,
|
||||||
|
);
|
||||||
|
increasePlaylistProgress(0.15 + (ratio * 0.85));
|
||||||
|
});
|
||||||
|
|
||||||
|
const safeVideoNameWithExtension = `${safeVideoName}.${extension}`;
|
||||||
|
try {
|
||||||
|
await ffmpeg.run(
|
||||||
|
'-i',
|
||||||
|
safeVideoName,
|
||||||
|
...presetFfmpegArgs,
|
||||||
|
...getFFmpegMetadataArgs(metadata),
|
||||||
|
safeVideoNameWithExtension,
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
ffmpeg.FS('unlink', safeVideoName);
|
||||||
|
}
|
||||||
|
|
||||||
|
sendFeedback(t('plugins.downloader.backend.feedback.saving'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
return ffmpeg.FS('readFile', safeVideoNameWithExtension);
|
||||||
|
} finally {
|
||||||
|
ffmpeg.FS('unlink', safeVideoNameWithExtension);
|
||||||
|
}
|
||||||
|
} catch (error: unknown) {
|
||||||
|
sendError(error as Error, safeVideoName);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const getCoverBuffer = async (url: string) => {
|
||||||
const nativeImage = cropMaxWidth(await getImage(url));
|
const nativeImage = cropMaxWidth(await getImage(url));
|
||||||
return nativeImage && !nativeImage.isEmpty() ? nativeImage.toPNG() : null;
|
return nativeImage && !nativeImage.isEmpty() ? nativeImage.toPNG() : null;
|
||||||
});
|
};
|
||||||
|
|
||||||
async function writeID3(
|
async function writeID3(
|
||||||
buffer: Buffer,
|
buffer: Buffer,
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { Menu, MenuItem } from 'electron';
|
import { Menu, MenuItem } from 'electron';
|
||||||
import { createEffect, createResource, createSignal, Index, Match, onMount, Show, Switch } from 'solid-js';
|
import { createEffect, createResource, createSignal, Index, Match, onCleanup, onMount, Show, Switch } from 'solid-js';
|
||||||
import { css } from 'solid-styled-components';
|
import { css } from 'solid-styled-components';
|
||||||
import { TransitionGroup } from 'solid-transition-group';
|
import { TransitionGroup } from 'solid-transition-group';
|
||||||
|
|
||||||
@ -38,11 +38,16 @@ const titleStyle = cache(() => css`
|
|||||||
user-select: none;
|
user-select: none;
|
||||||
|
|
||||||
transition: opacity 200ms ease 0s,
|
transition: opacity 200ms ease 0s,
|
||||||
|
transform 300ms cubic-bezier(0.2, 0, 0.6, 1) 0s,
|
||||||
background-color 300ms cubic-bezier(0.2, 0, 0.6, 1) 0s;
|
background-color 300ms cubic-bezier(0.2, 0, 0.6, 1) 0s;
|
||||||
|
|
||||||
&[data-macos="true"] {
|
&[data-macos="true"] {
|
||||||
padding: 4px 4px 4px 74px;
|
padding: 4px 4px 4px 74px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ytmusic-app:has(ytmusic-player[player-ui-state=FULLSCREEN]) ~ &:not([data-show="true"]) {
|
||||||
|
transform: translateY(calc(-1 * var(--menu-bar-height, 32px)));
|
||||||
|
}
|
||||||
`);
|
`);
|
||||||
|
|
||||||
const separatorStyle = cache(() => css`
|
const separatorStyle = cache(() => css`
|
||||||
@ -162,6 +167,7 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
const [ignoreTransition, setIgnoreTransition] = createSignal(false);
|
const [ignoreTransition, setIgnoreTransition] = createSignal(false);
|
||||||
const [openTarget, setOpenTarget] = createSignal<HTMLElement | null>(null);
|
const [openTarget, setOpenTarget] = createSignal<HTMLElement | null>(null);
|
||||||
const [menu, setMenu] = createSignal<Menu | null>(null);
|
const [menu, setMenu] = createSignal<Menu | null>(null);
|
||||||
|
const [mouseY, setMouseY] = createSignal(0);
|
||||||
|
|
||||||
const [data, { refetch }] = createResource(async () => await props.ipc.invoke('get-menu') as Promise<Menu | null>);
|
const [data, { refetch }] = createResource(async () => await props.ipc.invoke('get-menu') as Promise<Menu | null>);
|
||||||
const [isMaximized, { refetch: refetchMaximize }] = createResource(async () => await props.ipc.invoke('window-is-maximized') as Promise<boolean>);
|
const [isMaximized, { refetch: refetchMaximize }] = createResource(async () => await props.ipc.invoke('window-is-maximized') as Promise<boolean>);
|
||||||
@ -224,6 +230,10 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
setMenu(await refreshMenuItem(menuData, commandId));
|
setMenu(await refreshMenuItem(menuData, commandId));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const listener = (e: MouseEvent) => {
|
||||||
|
setMouseY(e.clientY);
|
||||||
|
};
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
props.ipc.on('close-all-in-app-menu-panel', async () => {
|
props.ipc.on('close-all-in-app-menu-panel', async () => {
|
||||||
setIgnoreTransition(true);
|
setIgnoreTransition(true);
|
||||||
@ -257,6 +267,9 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
setOpenTarget(null);
|
setOpenTarget(null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// tracking mouse position
|
||||||
|
window.addEventListener('mousemove', listener);
|
||||||
});
|
});
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
@ -265,8 +278,12 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onCleanup(() => {
|
||||||
|
window.removeEventListener('mousemove', listener);
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav data-ytmd-main-panel={true} class={titleStyle()} data-macos={props.isMacOS}>
|
<nav data-ytmd-main-panel={true} class={titleStyle()} data-macos={props.isMacOS} data-show={mouseY() < 32}>
|
||||||
<IconButton
|
<IconButton
|
||||||
onClick={() => setCollapsed(!collapsed())}
|
onClick={() => setCollapsed(!collapsed())}
|
||||||
style={{
|
style={{
|
||||||
|
|||||||
@ -51,3 +51,13 @@ ytmusic-guide-renderer {
|
|||||||
100vh - var(--menu-bar-height) - var(--ytmusic-nav-bar-height)
|
100vh - var(--menu-bar-height) - var(--ytmusic-nav-bar-height)
|
||||||
) !important;
|
) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fix mini player behavior */
|
||||||
|
ytmusic-app-layout ytmusic-player-page[is-mweb-modernization-enabled] .side-panel.ytmusic-player-page {
|
||||||
|
transform: translate(0, calc(var(--ytmusic-player-page-inner-height) - var(--ytmusic-player-page-tabs-header-height) - var(--ytmusic-player-page-player-bar-height) - var(--menu-bar-height, 32px) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ytm-bugs: see https://github.com/th-ch/youtube-music/issues/1737 */
|
||||||
|
html {
|
||||||
|
scrollbar-color: unset;
|
||||||
|
}
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import { app, NativeImage } from 'electron';
|
|||||||
|
|
||||||
import youtubeMusicIcon from '@assets/youtube-music.png?asset&asarUnpack';
|
import youtubeMusicIcon from '@assets/youtube-music.png?asset&asarUnpack';
|
||||||
|
|
||||||
import { cache } from '@/providers/decorators';
|
|
||||||
import { SongInfo } from '@/providers/song-info';
|
import { SongInfo } from '@/providers/song-info';
|
||||||
|
|
||||||
import type { NotificationsPluginConfig } from './index';
|
import type { NotificationsPluginConfig } from './index';
|
||||||
@ -30,7 +29,7 @@ export const urgencyLevels = [
|
|||||||
{ name: 'High', value: 'critical' } as const,
|
{ name: 'High', value: 'critical' } as const,
|
||||||
];
|
];
|
||||||
|
|
||||||
const nativeImageToLogo = cache((nativeImage: NativeImage) => {
|
const nativeImageToLogo = (nativeImage: NativeImage) => {
|
||||||
const temporaryImage = nativeImage.resize({ height: 256 });
|
const temporaryImage = nativeImage.resize({ height: 256 });
|
||||||
const margin = Math.max(temporaryImage.getSize().width - 256, 0);
|
const margin = Math.max(temporaryImage.getSize().width - 256, 0);
|
||||||
|
|
||||||
@ -40,7 +39,7 @@ const nativeImageToLogo = cache((nativeImage: NativeImage) => {
|
|||||||
width: 256,
|
width: 256,
|
||||||
height: 256,
|
height: 256,
|
||||||
});
|
});
|
||||||
});
|
};
|
||||||
|
|
||||||
export const notificationImage = (
|
export const notificationImage = (
|
||||||
songInfo: SongInfo,
|
songInfo: SongInfo,
|
||||||
@ -66,7 +65,7 @@ export const notificationImage = (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const saveImage = cache((img: NativeImage, savePath: string) => {
|
export const saveImage = (img: NativeImage, savePath: string) => {
|
||||||
try {
|
try {
|
||||||
fs.writeFileSync(savePath, img.toPNG());
|
fs.writeFileSync(savePath, img.toPNG());
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
@ -76,7 +75,7 @@ export const saveImage = cache((img: NativeImage, savePath: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return savePath;
|
return savePath;
|
||||||
});
|
};
|
||||||
|
|
||||||
export const snakeToCamel = (string_: string) =>
|
export const snakeToCamel = (string_: string) =>
|
||||||
string_.replaceAll(/([-_][a-z]|^[a-z])/g, (group) =>
|
string_.replaceAll(/([-_][a-z]|^[a-z])/g, (group) =>
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import { BrowserWindow, ipcMain, nativeImage, net } from 'electron';
|
|||||||
|
|
||||||
import { Mutex } from 'async-mutex';
|
import { Mutex } from 'async-mutex';
|
||||||
|
|
||||||
import { cache } from './decorators';
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
|
||||||
import type { GetPlayerResponse } from '@/types/get-player-response';
|
import type { GetPlayerResponse } from '@/types/get-player-response';
|
||||||
@ -45,19 +44,20 @@ export interface SongInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Grab the native image using the src
|
// Grab the native image using the src
|
||||||
export const getImage = cache(
|
export const getImage = async (src: string): Promise<Electron.NativeImage> => {
|
||||||
async (src: string): Promise<Electron.NativeImage> => {
|
const result = await net.fetch(src);
|
||||||
const result = await net.fetch(src);
|
const output = nativeImage.createFromBuffer(
|
||||||
const buffer = await result.arrayBuffer();
|
Buffer.from(
|
||||||
const output = nativeImage.createFromBuffer(Buffer.from(buffer));
|
await result.arrayBuffer(),
|
||||||
if (output.isEmpty() && !src.endsWith('.jpg') && src.includes('.jpg')) {
|
),
|
||||||
// Fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315)
|
);
|
||||||
return getImage(src.slice(0, src.lastIndexOf('.jpg') + 4));
|
if (output.isEmpty() && !src.endsWith('.jpg') && src.includes('.jpg')) {
|
||||||
}
|
// Fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315)
|
||||||
|
return getImage(src.slice(0, src.lastIndexOf('.jpg') + 4));
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
},
|
};
|
||||||
);
|
|
||||||
|
|
||||||
const handleData = async (
|
const handleData = async (
|
||||||
data: GetPlayerResponse,
|
data: GetPlayerResponse,
|
||||||
|
|||||||
12
src/tray.ts
12
src/tray.ts
@ -1,4 +1,5 @@
|
|||||||
import { Menu, nativeImage, Tray } from 'electron';
|
import { Menu, screen, nativeImage, Tray } from 'electron';
|
||||||
|
import is from 'electron-is';
|
||||||
|
|
||||||
import defaultTrayIconAsset from '@assets/youtube-music-tray.png?asset&asarUnpack';
|
import defaultTrayIconAsset from '@assets/youtube-music-tray.png?asset&asarUnpack';
|
||||||
import pausedTrayIconAsset from '@assets/youtube-music-tray-paused.png?asset&asarUnpack';
|
import pausedTrayIconAsset from '@assets/youtube-music-tray-paused.png?asset&asarUnpack';
|
||||||
@ -48,13 +49,14 @@ export const setUpTray = (app: Electron.App, win: Electron.BrowserWindow) => {
|
|||||||
|
|
||||||
const { playPause, next, previous } = getSongControls(win);
|
const { playPause, next, previous } = getSongControls(win);
|
||||||
|
|
||||||
|
const pixelRatio = is.windows() ? screen.getPrimaryDisplay().scaleFactor || 1 : 1;
|
||||||
const defaultTrayIcon = nativeImage.createFromPath(defaultTrayIconAsset).resize({
|
const defaultTrayIcon = nativeImage.createFromPath(defaultTrayIconAsset).resize({
|
||||||
width: 16,
|
width: 16 * pixelRatio,
|
||||||
height: 16,
|
height: 16 * pixelRatio,
|
||||||
});
|
});
|
||||||
const pausedTrayIcon = nativeImage.createFromPath(pausedTrayIconAsset).resize({
|
const pausedTrayIcon = nativeImage.createFromPath(pausedTrayIconAsset).resize({
|
||||||
width: 16,
|
width: 16 * pixelRatio,
|
||||||
height: 16,
|
height: 16 * pixelRatio,
|
||||||
});
|
});
|
||||||
|
|
||||||
tray = new Tray(defaultTrayIcon);
|
tray = new Tray(defaultTrayIcon);
|
||||||
|
|||||||
@ -3,12 +3,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Allow window dragging */
|
/* Allow window dragging */
|
||||||
.center-content.ytmusic-nav-bar {
|
ytmusic-nav-bar {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
ytmusic-nav-bar::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-content.ytmusic-nav-bar > ytmusic-search-box {
|
ytmusic-nav-bar > .left-content > *,
|
||||||
|
ytmusic-nav-bar > .center-content > *,
|
||||||
|
ytmusic-nav-bar > .right-content > * {
|
||||||
-webkit-app-region: no-drag;
|
-webkit-app-region: no-drag;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +64,19 @@ ytmusic-nav-bar > div.left-content > a > picture > img {
|
|||||||
tp-yt-paper-item.ytmusic-guide-entry-renderer::before {
|
tp-yt-paper-item.ytmusic-guide-entry-renderer::before {
|
||||||
border-radius: 8px !important;
|
border-radius: 8px !important;
|
||||||
}
|
}
|
||||||
/** apply fix when #av-id is exist */
|
|
||||||
ytmusic-player-page:not([video-mode]):not([player-fullscreened]) #av-id ~ #player.ytmusic-player-page {
|
/* fix video player align */
|
||||||
margin-top: calc(var(--ytmusic-player-page-vertical-padding) / 2 * -1) !important;
|
#av-id {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#av-id ~ #player.ytmusic-player-page:not([player-ui-state="FULLSCREEN"]) {
|
||||||
|
margin-top: auto !important;
|
||||||
|
margin-bottom: auto !important;
|
||||||
|
max-height: calc(100% - (var(--ytmusic-player-page-vertical-padding) * 2));
|
||||||
|
max-width: calc(100% - var(--ytmusic-player-page-vertical-padding) * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
ytmusic-player[player-ui-state=FULLSCREEN] {
|
||||||
|
top: calc(var(--menu-bar-height, 32px) * -1) !important;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user