mirror of
https://github.com/austinried/subtracks.git
synced 2025-12-27 09:09:29 +01:00
Compare commits
31 Commits
v2.0.0-alp
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b0bb26f84b | ||
|
|
e94fcf3128 | ||
|
|
bd6e818f36 | ||
|
|
96d0c35c31 | ||
|
|
4ef3281a0b | ||
|
|
c56e3dba0f | ||
|
|
53d284ace4 | ||
|
|
c2733482e5 | ||
|
|
67f0c926c4 | ||
|
|
889be2ff2c | ||
|
|
52b51954aa | ||
|
|
1c76293559 | ||
|
|
250d6793a2 | ||
|
|
121af2bca3 | ||
|
|
e410dcb2eb | ||
|
|
63ff9772e5 | ||
|
|
1ae29c5ade | ||
|
|
fedd6a71bb | ||
|
|
8f64cfcbca | ||
|
|
1edb2c13da | ||
|
|
7f83204b24 | ||
|
|
0fe52494d0 | ||
|
|
56dbcde3b4 | ||
|
|
8fbc5e6ce4 | ||
|
|
979a4b7c73 | ||
|
|
7b1da24748 | ||
|
|
7014aa85d1 | ||
|
|
abab674322 | ||
|
|
498bb22a69 | ||
|
|
11fe43a750 | ||
|
|
2a60a7306c |
8
.github/ISSUE_TEMPLATE/bug_report.md
vendored
8
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -23,10 +23,14 @@ A clear and concise description of what you expected to happen.
|
|||||||
**Screenshots**
|
**Screenshots**
|
||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Smartphone (please complete the following information):**
|
**Device**
|
||||||
- Device: [e.g. Pixel 4]
|
- Model: [e.g. Pixel 4]
|
||||||
- OS: [e.g. Android 12]
|
- OS: [e.g. Android 12]
|
||||||
- Subtracks version [e.g. 1.2.0]
|
- Subtracks version [e.g. 1.2.0]
|
||||||
|
|
||||||
|
**Server**
|
||||||
|
- Software: [e.g. Navidrome]
|
||||||
|
- Version: [e.g. 0.49.3]
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
|||||||
@ -22,6 +22,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -53,6 +55,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -62,32 +66,12 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"cs": [
|
"cs": [
|
||||||
"actionsCancel",
|
|
||||||
"actionsDelete",
|
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
|
||||||
"resourcesAlbumCount",
|
"resourcesAlbumCount",
|
||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
"resourcesFilterAlbum",
|
|
||||||
"resourcesFilterArtist",
|
|
||||||
"resourcesFilterOwner",
|
|
||||||
"resourcesFilterYear",
|
|
||||||
"resourcesPlaylistCount",
|
"resourcesPlaylistCount",
|
||||||
"resourcesSongCount",
|
"resourcesSongCount",
|
||||||
"resourcesSongListDeleteAllContent",
|
"settingsAboutShareLogs",
|
||||||
"resourcesSongListDeleteAllTitle",
|
"settingsAboutChooseLog",
|
||||||
"resourcesSortByAlbum",
|
|
||||||
"resourcesSortByAlbumCount",
|
|
||||||
"resourcesSortByTitle",
|
|
||||||
"resourcesSortByUpdated",
|
|
||||||
"settingsAboutActionsLicenses",
|
|
||||||
"settingsAboutActionsProjectHomepage",
|
|
||||||
"settingsAboutActionsSupport",
|
|
||||||
"settingsAboutName",
|
|
||||||
"settingsAboutVersion",
|
|
||||||
"settingsMusicName",
|
"settingsMusicName",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff",
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn",
|
"settingsMusicOptionsScrobbleDescriptionOn",
|
||||||
@ -96,12 +80,7 @@
|
|||||||
"settingsNetworkOptionsMinBufferTitle",
|
"settingsNetworkOptionsMinBufferTitle",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn"
|
||||||
"settingsNetworkOptionsStreamFormat",
|
|
||||||
"settingsNetworkOptionsStreamFormatServerDefault",
|
|
||||||
"settingsResetActionsClearImageCache",
|
|
||||||
"settingsResetName",
|
|
||||||
"settingsServersFieldsName"
|
|
||||||
],
|
],
|
||||||
|
|
||||||
"da": [
|
"da": [
|
||||||
@ -133,6 +112,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff",
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
@ -146,44 +127,11 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"de": [
|
"de": [
|
||||||
"actionsCancel",
|
"settingsAboutShareLogs",
|
||||||
"actionsDelete",
|
"settingsAboutChooseLog"
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
|
||||||
"resourcesAlbumCount",
|
|
||||||
"resourcesArtistCount",
|
|
||||||
"resourcesFilterAlbum",
|
|
||||||
"resourcesFilterArtist",
|
|
||||||
"resourcesFilterOwner",
|
|
||||||
"resourcesFilterYear",
|
|
||||||
"resourcesPlaylistCount",
|
|
||||||
"resourcesSongCount",
|
|
||||||
"resourcesSongListDeleteAllContent",
|
|
||||||
"resourcesSongListDeleteAllTitle",
|
|
||||||
"resourcesSortByAlbum",
|
|
||||||
"resourcesSortByAlbumCount",
|
|
||||||
"resourcesSortByTitle",
|
|
||||||
"resourcesSortByUpdated",
|
|
||||||
"settingsAboutActionsSupport",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
|
||||||
"settingsNetworkOptionsStreamFormat",
|
|
||||||
"settingsNetworkOptionsStreamFormatServerDefault",
|
|
||||||
"settingsServersFieldsName"
|
|
||||||
],
|
],
|
||||||
|
|
||||||
"es": [
|
"es": [
|
||||||
"actionsCancel",
|
|
||||||
"actionsDelete",
|
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
|
||||||
"resourcesAlbumCount",
|
"resourcesAlbumCount",
|
||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
"resourcesFilterAlbum",
|
"resourcesFilterAlbum",
|
||||||
@ -199,6 +147,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -230,37 +180,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsAboutShareLogs",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
|
||||||
"settingsNetworkOptionsStreamFormat",
|
|
||||||
"settingsNetworkOptionsStreamFormatServerDefault",
|
|
||||||
"settingsServersFieldsName"
|
|
||||||
],
|
|
||||||
|
|
||||||
"gl": [
|
|
||||||
"actionsCancel",
|
|
||||||
"actionsDelete",
|
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
|
||||||
"resourcesAlbumCount",
|
|
||||||
"resourcesArtistCount",
|
|
||||||
"resourcesFilterAlbum",
|
|
||||||
"resourcesFilterArtist",
|
|
||||||
"resourcesFilterOwner",
|
|
||||||
"resourcesFilterYear",
|
|
||||||
"resourcesPlaylistCount",
|
|
||||||
"resourcesSongCount",
|
|
||||||
"resourcesSongListDeleteAllContent",
|
|
||||||
"resourcesSongListDeleteAllTitle",
|
|
||||||
"resourcesSortByAlbum",
|
|
||||||
"resourcesSortByAlbumCount",
|
|
||||||
"resourcesSortByTitle",
|
|
||||||
"resourcesSortByUpdated",
|
|
||||||
"settingsAboutActionsSupport",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -292,6 +213,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -343,6 +266,8 @@
|
|||||||
"settingsAboutActionsLicenses",
|
"settingsAboutActionsLicenses",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutName",
|
"settingsAboutName",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsAboutVersion",
|
"settingsAboutVersion",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff",
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn",
|
"settingsMusicOptionsScrobbleDescriptionOn",
|
||||||
@ -399,6 +324,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -430,6 +357,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -461,6 +390,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -470,63 +401,17 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"pt": [
|
"pt": [
|
||||||
"actionsCancel",
|
|
||||||
"actionsDelete",
|
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
|
||||||
"resourcesAlbumCount",
|
"resourcesAlbumCount",
|
||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
"resourcesFilterAlbum",
|
|
||||||
"resourcesFilterArtist",
|
|
||||||
"resourcesFilterOwner",
|
"resourcesFilterOwner",
|
||||||
"resourcesFilterYear",
|
|
||||||
"resourcesPlaylistCount",
|
"resourcesPlaylistCount",
|
||||||
"resourcesSongCount",
|
"resourcesSongCount",
|
||||||
"resourcesSongListDeleteAllContent",
|
"resourcesSongListDeleteAllContent",
|
||||||
"resourcesSongListDeleteAllTitle",
|
"resourcesSongListDeleteAllTitle",
|
||||||
"resourcesSortByAlbum",
|
|
||||||
"resourcesSortByAlbumCount",
|
"resourcesSortByAlbumCount",
|
||||||
"resourcesSortByTitle",
|
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutShareLogs",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
|
||||||
"settingsNetworkOptionsStreamFormat",
|
|
||||||
"settingsNetworkOptionsStreamFormatServerDefault",
|
|
||||||
"settingsServersFieldsName"
|
|
||||||
],
|
|
||||||
|
|
||||||
"ru": [
|
|
||||||
"actionsCancel",
|
|
||||||
"actionsDelete",
|
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
|
||||||
"resourcesAlbumCount",
|
|
||||||
"resourcesArtistCount",
|
|
||||||
"resourcesFilterAlbum",
|
|
||||||
"resourcesFilterArtist",
|
|
||||||
"resourcesFilterOwner",
|
|
||||||
"resourcesFilterYear",
|
|
||||||
"resourcesPlaylistCount",
|
|
||||||
"resourcesSongCount",
|
|
||||||
"resourcesSongListDeleteAllContent",
|
|
||||||
"resourcesSongListDeleteAllTitle",
|
|
||||||
"resourcesSortByAlbum",
|
|
||||||
"resourcesSortByAlbumCount",
|
|
||||||
"resourcesSortByTitle",
|
|
||||||
"resourcesSortByUpdated",
|
|
||||||
"settingsAboutActionsSupport",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
|
||||||
"settingsNetworkOptionsStreamFormat",
|
|
||||||
"settingsNetworkOptionsStreamFormatServerDefault",
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
"settingsServersFieldsName"
|
"settingsServersFieldsName"
|
||||||
],
|
],
|
||||||
@ -554,6 +439,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -585,6 +472,8 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -594,28 +483,13 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"zh": [
|
"zh": [
|
||||||
"actionsCancel",
|
|
||||||
"actionsDelete",
|
|
||||||
"actionsDownload",
|
|
||||||
"actionsDownloadCancel",
|
|
||||||
"actionsDownloadDelete",
|
|
||||||
"actionsOk",
|
|
||||||
"controlsShuffle",
|
"controlsShuffle",
|
||||||
"resourcesAlbumCount",
|
"resourcesAlbumCount",
|
||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
"resourcesFilterAlbum",
|
|
||||||
"resourcesFilterArtist",
|
|
||||||
"resourcesFilterOwner",
|
|
||||||
"resourcesFilterYear",
|
|
||||||
"resourcesPlaylistCount",
|
"resourcesPlaylistCount",
|
||||||
"resourcesSongCount",
|
"resourcesSongCount",
|
||||||
"resourcesSongListDeleteAllContent",
|
"settingsAboutShareLogs",
|
||||||
"resourcesSongListDeleteAllTitle",
|
"settingsAboutChooseLog",
|
||||||
"resourcesSortByAlbum",
|
|
||||||
"resourcesSortByAlbumCount",
|
|
||||||
"resourcesSortByTitle",
|
|
||||||
"resourcesSortByUpdated",
|
|
||||||
"settingsAboutActionsSupport",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
|||||||
62
TODO.md
62
TODO.md
@ -1,34 +1,30 @@
|
|||||||
## To-do
|
## To-do
|
||||||
- [ ] Star/unstar
|
- Star/unstar
|
||||||
- [ ] Context menus
|
- Context menus
|
||||||
- [ ] Download actions for song
|
- Download actions for song
|
||||||
- [ ] Playlist management
|
- Playlist management
|
||||||
- [ ] Add to playlist (from context)
|
- Add to playlist (from context)
|
||||||
- [ ] Queue management
|
- Queue management
|
||||||
- [ ] View playing queue
|
- View playing queue
|
||||||
- [ ] Re-order queue
|
- Re-order queue
|
||||||
- [ ] Add to queue (from context)
|
- Add to queue (from context)
|
||||||
- [ ] Remove from queue
|
- Remove from queue
|
||||||
- [ ] Scrobbling
|
- Scrobbling
|
||||||
- [ ] Library filters (year/genre/etc)
|
- Library filters (year/genre/etc)
|
||||||
- [ ] Library list display modes
|
- Library list display modes
|
||||||
- [ ] Search
|
- Search
|
||||||
- [ ] Individual "more" results pages
|
- Individual "more" results pages
|
||||||
- [ ] Radio modes
|
- Now playing gestures
|
||||||
- [ ] Artist
|
- Swipe bar/album to skip
|
||||||
- [ ] Now playing gestures
|
- Double-tap to seek forward/back (bar only)
|
||||||
- [ ] Swipe bar/album to skip
|
- Settings
|
||||||
- [ ] Double-tap to seek forward/back (bar only)
|
- Music
|
||||||
- [ ] Settings
|
- Scrobble
|
||||||
- [ ] Sources
|
- Downloads
|
||||||
- [ ] Use plaintext password
|
- Used/available space
|
||||||
- [ ] Music
|
- Clear downloads
|
||||||
- [ ] Scrobble
|
- Clear images
|
||||||
- [ ] Downloads
|
- About
|
||||||
- [ ] Used/available space
|
- Licenses
|
||||||
- [ ] Clear downloads
|
- Welcome/setup flow
|
||||||
- [ ] Clear images
|
- Proper loading screen/animation
|
||||||
- [ ] About
|
|
||||||
- [ ] Licenses
|
|
||||||
- [ ] Welcome/setup flow
|
|
||||||
- [ ] Proper loading screen/animation
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
@ -77,7 +78,8 @@ class App extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
routeInformationParser: appRouter.defaultRouteParser(),
|
routeInformationParser: appRouter.defaultRouteParser(),
|
||||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||||
supportedLocales: AppLocalizations.supportedLocales,
|
supportedLocales: [...AppLocalizations.supportedLocales]
|
||||||
|
..moveToTheFront(const Locale('en')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
|
|||||||
|
|
||||||
import '../services/sync_service.dart';
|
import '../services/sync_service.dart';
|
||||||
import 'items.dart';
|
import 'items.dart';
|
||||||
|
import 'snackbars.dart';
|
||||||
|
|
||||||
class PagedListQueryView<T> extends HookConsumerWidget {
|
class PagedListQueryView<T> extends HookConsumerWidget {
|
||||||
final PagingController<int, T> pagingController;
|
final PagingController<int, T> pagingController;
|
||||||
@ -122,7 +123,13 @@ class SyncAllRefresh extends HookConsumerWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
return RefreshIndicator(
|
return RefreshIndicator(
|
||||||
onRefresh: () => ref.read(syncServiceProvider.notifier).syncAll(),
|
onRefresh: () async {
|
||||||
|
try {
|
||||||
|
await ref.read(syncServiceProvider.notifier).syncAll();
|
||||||
|
} catch (e) {
|
||||||
|
showErrorSnackbar(context, e.toString());
|
||||||
|
}
|
||||||
|
},
|
||||||
child: child,
|
child: child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,19 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
|
||||||
|
import '../../database/database.dart';
|
||||||
|
import '../../models/query.dart';
|
||||||
|
import '../../models/support.dart';
|
||||||
|
import '../../services/audio_service.dart';
|
||||||
import '../../state/music.dart';
|
import '../../state/music.dart';
|
||||||
import '../../state/settings.dart';
|
import '../../state/settings.dart';
|
||||||
import '../app_router.dart';
|
import '../app_router.dart';
|
||||||
|
import '../buttons.dart';
|
||||||
import '../images.dart';
|
import '../images.dart';
|
||||||
import '../items.dart';
|
import '../items.dart';
|
||||||
|
|
||||||
@ -27,6 +33,26 @@ class ArtistPage extends HookConsumerWidget {
|
|||||||
final albums = ref.watch(albumsByArtistIdProvider(id));
|
final albums = ref.watch(albumsByArtistIdProvider(id));
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
floatingActionButton: RadioPlayFab(
|
||||||
|
onPressed: () => artist.hasValue
|
||||||
|
? ref.read(audioControlProvider).playRadio(
|
||||||
|
context: QueueContextType.artist,
|
||||||
|
contextId: artist.valueOrNull!.id,
|
||||||
|
query: ListQuery(
|
||||||
|
filters: IList([
|
||||||
|
FilterWith.equals(
|
||||||
|
column: 'artist_id',
|
||||||
|
value: artist.valueOrNull!.id,
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
getSongs: (query) => ref
|
||||||
|
.read(databaseProvider)
|
||||||
|
.songsList(ref.read(sourceIdProvider), query)
|
||||||
|
.get(),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
),
|
||||||
body: CustomScrollView(
|
body: CustomScrollView(
|
||||||
slivers: [
|
slivers: [
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
|
|||||||
@ -1,11 +1,16 @@
|
|||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:path/path.dart' as p;
|
||||||
|
import 'package:share_plus/share_plus.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
|
import '../../log.dart';
|
||||||
import '../../models/support.dart';
|
import '../../models/support.dart';
|
||||||
import '../../services/settings_service.dart';
|
import '../../services/settings_service.dart';
|
||||||
import '../../state/init.dart';
|
import '../../state/init.dart';
|
||||||
@ -162,6 +167,54 @@ class _About extends HookConsumerWidget {
|
|||||||
mode: LaunchMode.externalApplication,
|
mode: LaunchMode.externalApplication,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
const _ShareLogsButton(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ShareLogsButton extends StatelessWidget {
|
||||||
|
const _ShareLogsButton();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final l = AppLocalizations.of(context);
|
||||||
|
|
||||||
|
return Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
OutlinedButton.icon(
|
||||||
|
icon: const Icon(Icons.share),
|
||||||
|
label: Text(l.settingsAboutShareLogs),
|
||||||
|
onPressed: () async {
|
||||||
|
final files = await logFiles();
|
||||||
|
if (files.isEmpty) return;
|
||||||
|
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
final value = await showDialog<String>(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => MultipleChoiceDialog<String>(
|
||||||
|
title: l.settingsAboutChooseLog,
|
||||||
|
current: files.first.path,
|
||||||
|
options: files
|
||||||
|
.map((e) => MultiChoiceOption.string(
|
||||||
|
title: p.basename(e.path),
|
||||||
|
option: e.path,
|
||||||
|
))
|
||||||
|
.toIList(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (value == null) return;
|
||||||
|
Share.shareXFiles(
|
||||||
|
[XFile(value, mimeType: 'text/plain')],
|
||||||
|
subject: 'Logs from subtracks: ${String.fromCharCodes(
|
||||||
|
List.generate(8, (_) => Random().nextInt(26) + 65),
|
||||||
|
)}',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,9 +8,11 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
|
||||||
import '../../database/database.dart';
|
import '../../database/database.dart';
|
||||||
|
import '../../log.dart';
|
||||||
import '../../models/settings.dart';
|
import '../../models/settings.dart';
|
||||||
import '../../services/settings_service.dart';
|
import '../../services/settings_service.dart';
|
||||||
import '../items.dart';
|
import '../items.dart';
|
||||||
|
import '../snackbars.dart';
|
||||||
|
|
||||||
class SourcePage extends HookConsumerWidget {
|
class SourcePage extends HookConsumerWidget {
|
||||||
final int? id;
|
final int? id;
|
||||||
@ -41,9 +43,10 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
label: l.settingsServersFieldsAddress,
|
label: l.settingsServersFieldsAddress,
|
||||||
initialValue: source?.address.toString(),
|
initialValue: source?.address.toString(),
|
||||||
keyboardType: TextInputType.url,
|
keyboardType: TextInputType.url,
|
||||||
|
autofillHints: const [AutofillHints.url],
|
||||||
required: true,
|
required: true,
|
||||||
validator: (value, label) {
|
validator: (value, label) {
|
||||||
if (Uri.tryParse(value!) == null) {
|
if (!value!.contains(RegExp(r'https?:\/\/'))) {
|
||||||
return '$label must be a valid URL';
|
return '$label must be a valid URL';
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -52,15 +55,27 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
final username = LabeledTextField(
|
final username = LabeledTextField(
|
||||||
label: l.settingsServersFieldsUsername,
|
label: l.settingsServersFieldsUsername,
|
||||||
initialValue: source?.username,
|
initialValue: source?.username,
|
||||||
|
autofillHints: const [AutofillHints.username],
|
||||||
required: true,
|
required: true,
|
||||||
);
|
);
|
||||||
final password = LabeledTextField(
|
final password = LabeledTextField(
|
||||||
label: l.settingsServersFieldsPassword,
|
label: l.settingsServersFieldsPassword,
|
||||||
initialValue: source?.password,
|
initialValue: source?.password,
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
|
autofillHints: const [AutofillHints.password],
|
||||||
required: true,
|
required: true,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
final forcePlaintextPassword = useState(!(source?.useTokenAuth ?? true));
|
||||||
|
final forcePlaintextSwitch = SwitchListTile(
|
||||||
|
value: forcePlaintextPassword.value,
|
||||||
|
title: Text(l.settingsServersOptionsForcePlaintextPasswordTitle),
|
||||||
|
subtitle: forcePlaintextPassword.value
|
||||||
|
? Text(l.settingsServersOptionsForcePlaintextPasswordDescriptionOn)
|
||||||
|
: Text(l.settingsServersOptionsForcePlaintextPasswordDescriptionOff),
|
||||||
|
onChanged: (value) => forcePlaintextPassword.value = value,
|
||||||
|
);
|
||||||
|
|
||||||
return WillPopScope(
|
return WillPopScope(
|
||||||
onWillPop: () async => !isSaving.value && !isDeleting.value,
|
onWillPop: () async => !isSaving.value && !isDeleting.value,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
@ -128,6 +143,7 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
address: Uri.parse(address.value),
|
address: Uri.parse(address.value),
|
||||||
username: username.value,
|
username: username.value,
|
||||||
password: password.value,
|
password: password.value,
|
||||||
|
useTokenAuth: !forcePlaintextPassword.value,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@ -142,12 +158,14 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
features: IList(),
|
features: IList(),
|
||||||
username: username.value,
|
username: username.value,
|
||||||
password: password.value,
|
password: password.value,
|
||||||
useTokenAuth: const Value(true),
|
useTokenAuth:
|
||||||
|
Value(!forcePlaintextPassword.value),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (e, st) {
|
||||||
// TOOD: toast the error or whatever
|
showErrorSnackbar(context, e.toString());
|
||||||
|
log.severe('Saving source', e, st);
|
||||||
error = true;
|
error = true;
|
||||||
} finally {
|
} finally {
|
||||||
isSaving.value = false;
|
isSaving.value = false;
|
||||||
@ -163,21 +181,25 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
body: Form(
|
body: Form(
|
||||||
key: form,
|
key: form,
|
||||||
child: Padding(
|
child: AutofillGroup(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 24),
|
|
||||||
child: ListView(
|
child: ListView(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 96 - kToolbarHeight),
|
const SizedBox(height: 96 - kToolbarHeight),
|
||||||
Text(
|
Padding(
|
||||||
source == null
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
? l.settingsServersActionsAdd
|
child: Text(
|
||||||
: l.settingsServersActionsEdit,
|
source == null
|
||||||
style: theme.textTheme.displaySmall,
|
? l.settingsServersActionsAdd
|
||||||
|
: l.settingsServersActionsEdit,
|
||||||
|
style: theme.textTheme.displaySmall,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
name,
|
name,
|
||||||
address,
|
address,
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
|
const SizedBox(height: 24),
|
||||||
|
forcePlaintextSwitch,
|
||||||
const FabPadding(),
|
const FabPadding(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -194,6 +216,7 @@ class LabeledTextField extends HookConsumerWidget {
|
|||||||
final bool obscureText;
|
final bool obscureText;
|
||||||
final bool required;
|
final bool required;
|
||||||
final TextInputType? keyboardType;
|
final TextInputType? keyboardType;
|
||||||
|
final Iterable<String>? autofillHints;
|
||||||
final String? Function(String? value, String label)? validator;
|
final String? Function(String? value, String label)? validator;
|
||||||
|
|
||||||
// ignore: prefer_const_constructors_in_immutables
|
// ignore: prefer_const_constructors_in_immutables
|
||||||
@ -204,6 +227,7 @@ class LabeledTextField extends HookConsumerWidget {
|
|||||||
this.obscureText = false,
|
this.obscureText = false,
|
||||||
this.keyboardType,
|
this.keyboardType,
|
||||||
this.validator,
|
this.validator,
|
||||||
|
this.autofillHints,
|
||||||
this.required = false,
|
this.required = false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -224,35 +248,36 @@ class LabeledTextField extends HookConsumerWidget {
|
|||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
_controller = useTextEditingController(text: initialValue);
|
_controller = useTextEditingController(text: initialValue);
|
||||||
|
|
||||||
return Column(
|
return Padding(
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
children: [
|
child: Column(
|
||||||
const SizedBox(height: 24),
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
Text(
|
children: [
|
||||||
label,
|
const SizedBox(height: 24),
|
||||||
style: theme.textTheme.titleMedium,
|
Text(label, style: theme.textTheme.titleMedium),
|
||||||
),
|
TextFormField(
|
||||||
TextFormField(
|
controller: _controller,
|
||||||
controller: _controller,
|
obscureText: obscureText,
|
||||||
obscureText: obscureText,
|
keyboardType: keyboardType,
|
||||||
keyboardType: keyboardType,
|
autofillHints: autofillHints,
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
String? error;
|
String? error;
|
||||||
|
|
||||||
if (required) {
|
if (required) {
|
||||||
error = _requiredValidator(value);
|
error = _requiredValidator(value);
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
return error;
|
return error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (validator != null) {
|
if (validator != null) {
|
||||||
return validator!(value, label);
|
return validator!(value, label);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
lib/app/snackbars.dart
Normal file
14
lib/app/snackbars.dart
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
void showErrorSnackbar(BuildContext context, String message) {
|
||||||
|
final colors = Theme.of(context).colorScheme;
|
||||||
|
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||||
|
content: Text(message, style: TextStyle(color: colors.onErrorContainer)),
|
||||||
|
backgroundColor: colors.errorContainer,
|
||||||
|
showCloseIcon: true,
|
||||||
|
closeIconColor: colors.onErrorContainer,
|
||||||
|
behavior: SnackBarBehavior.floating,
|
||||||
|
duration: const Duration(seconds: 10),
|
||||||
|
));
|
||||||
|
}
|
||||||
@ -9,14 +9,20 @@ import 'package:path/path.dart' as p;
|
|||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
|
import '../log.dart';
|
||||||
import '../models/music.dart';
|
import '../models/music.dart';
|
||||||
import '../models/query.dart';
|
import '../models/query.dart';
|
||||||
import '../models/settings.dart';
|
import '../models/settings.dart';
|
||||||
import '../models/support.dart';
|
import '../models/support.dart';
|
||||||
import 'converters.dart';
|
import 'converters.dart';
|
||||||
|
import 'error_logging_database.dart';
|
||||||
|
|
||||||
part 'database.g.dart';
|
part 'database.g.dart';
|
||||||
|
|
||||||
|
// don't exceed SQLITE_MAX_VARIABLE_NUMBER (32766 for version >= 3.32.0)
|
||||||
|
// https://www.sqlite.org/limits.html
|
||||||
|
const kSqliteMaxVariableNumber = 32766;
|
||||||
|
|
||||||
@DriftDatabase(include: {'tables.drift'})
|
@DriftDatabase(include: {'tables.drift'})
|
||||||
class SubtracksDatabase extends _$SubtracksDatabase {
|
class SubtracksDatabase extends _$SubtracksDatabase {
|
||||||
SubtracksDatabase() : super(_openConnection());
|
SubtracksDatabase() : super(_openConnection());
|
||||||
@ -169,12 +175,27 @@ class SubtracksDatabase extends _$SubtracksDatabase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteArtistsNotIn(int sourceId, Iterable<String> ids) async {
|
Future<void> deleteArtistsNotIn(int sourceId, Set<String> ids) {
|
||||||
await (delete(artists)
|
return transaction(() async {
|
||||||
..where(
|
final allIds = (await (selectOnly(artists)
|
||||||
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
|
..addColumns([artists.id])
|
||||||
))
|
..where(artists.sourceId.equals(sourceId)))
|
||||||
.go();
|
.map((row) => row.read(artists.id))
|
||||||
|
.get())
|
||||||
|
.whereNotNull()
|
||||||
|
.toSet();
|
||||||
|
final downloadIds = (await artistIdsWithDownloadStatus(sourceId).get())
|
||||||
|
.whereNotNull()
|
||||||
|
.toSet();
|
||||||
|
|
||||||
|
final diff = allIds.difference(downloadIds).difference(ids);
|
||||||
|
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
|
||||||
|
await (delete(artists)
|
||||||
|
..where(
|
||||||
|
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
|
||||||
|
.go();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveAlbums(Iterable<AlbumsCompanion> albums) async {
|
Future<void> saveAlbums(Iterable<AlbumsCompanion> albums) async {
|
||||||
@ -183,15 +204,27 @@ class SubtracksDatabase extends _$SubtracksDatabase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteAlbumsNotIn(int sourceId, Iterable<String> ids) async {
|
Future<void> deleteAlbumsNotIn(int sourceId, Set<String> ids) {
|
||||||
final alsoKeep = (await albumIdsWithDownloaded(sourceId).get()).toSet();
|
return transaction(() async {
|
||||||
|
final allIds = (await (selectOnly(albums)
|
||||||
|
..addColumns([albums.id])
|
||||||
|
..where(albums.sourceId.equals(sourceId)))
|
||||||
|
.map((row) => row.read(albums.id))
|
||||||
|
.get())
|
||||||
|
.whereNotNull()
|
||||||
|
.toSet();
|
||||||
|
final downloadIds = (await albumIdsWithDownloadStatus(sourceId).get())
|
||||||
|
.whereNotNull()
|
||||||
|
.toSet();
|
||||||
|
|
||||||
ids = ids.toList()..addAll(alsoKeep);
|
final diff = allIds.difference(downloadIds).difference(ids);
|
||||||
await (delete(albums)
|
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
|
||||||
..where(
|
await (delete(albums)
|
||||||
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
|
..where(
|
||||||
))
|
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
|
||||||
.go();
|
.go();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> savePlaylists(
|
Future<void> savePlaylists(
|
||||||
@ -215,18 +248,31 @@ class SubtracksDatabase extends _$SubtracksDatabase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deletePlaylistsNotIn(int sourceId, Iterable<String> ids) async {
|
Future<void> deletePlaylistsNotIn(int sourceId, Set<String> ids) {
|
||||||
await (delete(playlists)
|
return transaction(() async {
|
||||||
..where(
|
final allIds = (await (selectOnly(playlists)
|
||||||
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
|
..addColumns([playlists.id])
|
||||||
))
|
..where(playlists.sourceId.equals(sourceId)))
|
||||||
.go();
|
.map((row) => row.read(playlists.id))
|
||||||
await (delete(playlistSongs)
|
.get())
|
||||||
..where(
|
.whereNotNull()
|
||||||
(tbl) =>
|
.toSet();
|
||||||
tbl.sourceId.equals(sourceId) & tbl.playlistId.isNotIn(ids),
|
final downloadIds = (await playlistIdsWithDownloadStatus(sourceId).get())
|
||||||
))
|
.whereNotNull()
|
||||||
.go();
|
.toSet();
|
||||||
|
|
||||||
|
final diff = allIds.difference(downloadIds).difference(ids);
|
||||||
|
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
|
||||||
|
await (delete(playlists)
|
||||||
|
..where(
|
||||||
|
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
|
||||||
|
.go();
|
||||||
|
await (delete(playlistSongs)
|
||||||
|
..where((tbl) =>
|
||||||
|
tbl.sourceId.equals(sourceId) & tbl.playlistId.isIn(slice)))
|
||||||
|
.go();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> savePlaylistSongs(
|
Future<void> savePlaylistSongs(
|
||||||
@ -250,29 +296,33 @@ class SubtracksDatabase extends _$SubtracksDatabase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteSongsNotIn(int sourceId, Iterable<String> ids) async {
|
Future<void> deleteSongsNotIn(int sourceId, Set<String> ids) {
|
||||||
await (delete(songs)
|
return transaction(() async {
|
||||||
..where(
|
final allIds = (await (selectOnly(songs)
|
||||||
(tbl) =>
|
..addColumns([songs.id])
|
||||||
tbl.sourceId.equals(sourceId) &
|
..where(
|
||||||
tbl.id.isNotIn(ids) &
|
songs.sourceId.equals(sourceId) &
|
||||||
tbl.downloadFilePath.isNull() &
|
songs.downloadFilePath.isNull() &
|
||||||
tbl.downloadTaskId.isNull(),
|
songs.downloadTaskId.isNull(),
|
||||||
))
|
))
|
||||||
.go();
|
.map((row) => row.read(songs.id))
|
||||||
final remainingIds = (await (selectOnly(songs)
|
.get())
|
||||||
..addColumns([songs.id])
|
.whereNotNull()
|
||||||
..where(songs.sourceId.equals(sourceId)))
|
.toSet();
|
||||||
.map((row) => row.read(songs.id))
|
|
||||||
.get())
|
final diff = allIds.difference(ids);
|
||||||
.whereNotNull();
|
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
|
||||||
await (delete(playlistSongs)
|
await (delete(songs)
|
||||||
..where(
|
..where(
|
||||||
(tbl) =>
|
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
|
||||||
tbl.sourceId.equals(sourceId) &
|
.go();
|
||||||
tbl.songId.isNotIn(remainingIds),
|
await (delete(playlistSongs)
|
||||||
))
|
..where(
|
||||||
.go();
|
(tbl) => tbl.sourceId.equals(sourceId) & tbl.songId.isIn(slice),
|
||||||
|
))
|
||||||
|
.go();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Selectable<LastBottomNavStateData> getLastBottomNavState() {
|
Selectable<LastBottomNavStateData> getLastBottomNavState() {
|
||||||
@ -387,7 +437,11 @@ LazyDatabase _openConnection() {
|
|||||||
final dbFolder = await getApplicationDocumentsDirectory();
|
final dbFolder = await getApplicationDocumentsDirectory();
|
||||||
final file = File(p.join(dbFolder.path, 'subtracks.sqlite'));
|
final file = File(p.join(dbFolder.path, 'subtracks.sqlite'));
|
||||||
// return NativeDatabase.createInBackground(file, logStatements: true);
|
// return NativeDatabase.createInBackground(file, logStatements: true);
|
||||||
return NativeDatabase.createInBackground(file);
|
|
||||||
|
return ErrorLoggingDatabase(
|
||||||
|
NativeDatabase.createInBackground(file),
|
||||||
|
(e, s) => log.severe('SQL error', e, s),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4596,7 +4596,7 @@ abstract class _$SubtracksDatabase extends GeneratedDatabase {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Selectable<String> albumIdsWithDownloaded(int sourceId) {
|
Selectable<String> albumIdsWithDownloadStatus(int sourceId) {
|
||||||
return customSelect(
|
return customSelect(
|
||||||
'SELECT albums.id FROM albums JOIN songs ON songs.source_id = albums.source_id AND songs.album_id = albums.id WHERE albums.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY albums.id',
|
'SELECT albums.id FROM albums JOIN songs ON songs.source_id = albums.source_id AND songs.album_id = albums.id WHERE albums.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY albums.id',
|
||||||
variables: [
|
variables: [
|
||||||
@ -4608,6 +4608,32 @@ abstract class _$SubtracksDatabase extends GeneratedDatabase {
|
|||||||
}).map((QueryRow row) => row.read<String>('id'));
|
}).map((QueryRow row) => row.read<String>('id'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Selectable<String> artistIdsWithDownloadStatus(int sourceId) {
|
||||||
|
return customSelect(
|
||||||
|
'SELECT artists.id FROM artists LEFT JOIN albums ON artists.source_id = albums.source_id AND artists.id = albums.artist_id LEFT JOIN songs ON albums.source_id = songs.source_id AND albums.id = songs.album_id WHERE artists.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY artists.id',
|
||||||
|
variables: [
|
||||||
|
Variable<int>(sourceId)
|
||||||
|
],
|
||||||
|
readsFrom: {
|
||||||
|
artists,
|
||||||
|
albums,
|
||||||
|
songs,
|
||||||
|
}).map((QueryRow row) => row.read<String>('id'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Selectable<String> playlistIdsWithDownloadStatus(int sourceId) {
|
||||||
|
return customSelect(
|
||||||
|
'SELECT playlists.id FROM playlists LEFT JOIN playlist_songs ON playlist_songs.source_id = playlists.source_id AND playlist_songs.playlist_id = playlists.id LEFT JOIN songs ON playlist_songs.source_id = songs.source_id AND playlist_songs.song_id = songs.id WHERE playlists.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY playlists.id',
|
||||||
|
variables: [
|
||||||
|
Variable<int>(sourceId)
|
||||||
|
],
|
||||||
|
readsFrom: {
|
||||||
|
playlists,
|
||||||
|
playlistSongs,
|
||||||
|
songs,
|
||||||
|
}).map((QueryRow row) => row.read<String>('id'));
|
||||||
|
}
|
||||||
|
|
||||||
Selectable<int> searchArtists(String query, int limit, int offset) {
|
Selectable<int> searchArtists(String query, int limit, int offset) {
|
||||||
return customSelect(
|
return customSelect(
|
||||||
'SELECT "rowid" FROM artists_fts WHERE artists_fts MATCH ?1 ORDER BY rank LIMIT ?2 OFFSET ?3',
|
'SELECT "rowid" FROM artists_fts WHERE artists_fts MATCH ?1 ORDER BY rank LIMIT ?2 OFFSET ?3',
|
||||||
|
|||||||
94
lib/database/error_logging_database.dart
Normal file
94
lib/database/error_logging_database.dart
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:drift/drift.dart';
|
||||||
|
import 'package:drift/isolate.dart';
|
||||||
|
|
||||||
|
/// https://github.com/simolus3/drift/issues/2326#issuecomment-1445138730
|
||||||
|
class ErrorLoggingDatabase implements QueryExecutor {
|
||||||
|
final QueryExecutor inner;
|
||||||
|
final void Function(Object, StackTrace) onError;
|
||||||
|
|
||||||
|
ErrorLoggingDatabase(this.inner, this.onError);
|
||||||
|
|
||||||
|
Future<T> _handleErrors<T>(Future<T> Function() body) {
|
||||||
|
return Future.sync(body)
|
||||||
|
.onError<DriftWrappedException>((error, stackTrace) {
|
||||||
|
onError(error, error.trace ?? stackTrace);
|
||||||
|
throw error;
|
||||||
|
}).onError<DriftRemoteException>((error, stackTrace) {
|
||||||
|
onError(error, error.remoteStackTrace ?? stackTrace);
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
TransactionExecutor beginTransaction() {
|
||||||
|
return _ErrorLoggingTransactionExecutor(inner.beginTransaction(), onError);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> close() {
|
||||||
|
return _handleErrors(inner.close);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
SqlDialect get dialect => inner.dialect;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> ensureOpen(QueryExecutorUser user) {
|
||||||
|
return _handleErrors(() => inner.ensureOpen(user));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> runBatched(BatchedStatements statements) {
|
||||||
|
return _handleErrors(() => inner.runBatched(statements));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> runCustom(String statement, [List<Object?>? args]) {
|
||||||
|
return _handleErrors(() => inner.runCustom(statement, args));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<int> runDelete(String statement, List<Object?> args) {
|
||||||
|
return _handleErrors(() => inner.runDelete(statement, args));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<int> runInsert(String statement, List<Object?> args) {
|
||||||
|
return _handleErrors(() => inner.runInsert(statement, args));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<Map<String, Object?>>> runSelect(
|
||||||
|
String statement, List<Object?> args) {
|
||||||
|
return _handleErrors(() => inner.runSelect(statement, args));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<int> runUpdate(String statement, List<Object?> args) {
|
||||||
|
return _handleErrors(() => inner.runUpdate(statement, args));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ErrorLoggingTransactionExecutor extends ErrorLoggingDatabase
|
||||||
|
implements TransactionExecutor {
|
||||||
|
final TransactionExecutor transaction;
|
||||||
|
|
||||||
|
_ErrorLoggingTransactionExecutor(
|
||||||
|
this.transaction, void Function(Object, StackTrace) onError)
|
||||||
|
: super(transaction, onError);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> rollback() {
|
||||||
|
return _handleErrors(transaction.rollback);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> send() {
|
||||||
|
return _handleErrors(transaction.send);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get supportsNestedTransactions => transaction.supportsNestedTransactions;
|
||||||
|
}
|
||||||
@ -244,7 +244,7 @@ allSubsonicSources WITH SubsonicSettings:
|
|||||||
FROM sources
|
FROM sources
|
||||||
JOIN subsonic_sources ON subsonic_sources.source_id = sources.id;
|
JOIN subsonic_sources ON subsonic_sources.source_id = sources.id;
|
||||||
|
|
||||||
albumIdsWithDownloaded:
|
albumIdsWithDownloadStatus:
|
||||||
SELECT albums.id
|
SELECT albums.id
|
||||||
FROM albums
|
FROM albums
|
||||||
JOIN songs on songs.source_id = albums.source_id AND songs.album_id = albums.id
|
JOIN songs on songs.source_id = albums.source_id AND songs.album_id = albums.id
|
||||||
@ -253,6 +253,26 @@ albumIdsWithDownloaded:
|
|||||||
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
|
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
|
||||||
GROUP BY albums.id;
|
GROUP BY albums.id;
|
||||||
|
|
||||||
|
artistIdsWithDownloadStatus:
|
||||||
|
SELECT artists.id
|
||||||
|
FROM artists
|
||||||
|
LEFT JOIN albums ON artists.source_id = albums.source_id AND artists.id = albums.artist_id
|
||||||
|
LEFT JOIN songs ON albums.source_id = songs.source_id AND albums.id = songs.album_id
|
||||||
|
WHERE
|
||||||
|
artists.source_id = :source_id
|
||||||
|
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
|
||||||
|
GROUP BY artists.id;
|
||||||
|
|
||||||
|
playlistIdsWithDownloadStatus:
|
||||||
|
SELECT playlists.id
|
||||||
|
FROM playlists
|
||||||
|
LEFT JOIN playlist_songs ON playlist_songs.source_id = playlists.source_id AND playlist_songs.playlist_id = playlists.id
|
||||||
|
LEFT JOIN songs ON playlist_songs.source_id = songs.source_id AND playlist_songs.song_id = songs.id
|
||||||
|
WHERE
|
||||||
|
playlists.source_id = :source_id
|
||||||
|
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
|
||||||
|
GROUP BY playlists.id;
|
||||||
|
|
||||||
searchArtists:
|
searchArtists:
|
||||||
SELECT rowid
|
SELECT rowid
|
||||||
FROM artists_fts
|
FROM artists_fts
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
|
import '../log.dart';
|
||||||
|
|
||||||
part 'client.g.dart';
|
part 'client.g.dart';
|
||||||
|
|
||||||
const Map<String, String> subtracksHeaders = {
|
const Map<String, String> subtracksHeaders = {
|
||||||
@ -14,8 +15,14 @@ class SubtracksHttpClient extends BaseClient {
|
|||||||
@override
|
@override
|
||||||
Future<StreamedResponse> send(BaseRequest request) {
|
Future<StreamedResponse> send(BaseRequest request) {
|
||||||
request.headers.addAll(subtracksHeaders);
|
request.headers.addAll(subtracksHeaders);
|
||||||
if (kDebugMode) print('${request.method} ${request.url}');
|
log.info('${request.method} ${request.url}');
|
||||||
return request.send();
|
|
||||||
|
try {
|
||||||
|
return request.send();
|
||||||
|
} catch (e, st) {
|
||||||
|
log.severe('HTTP client: ${request.method} ${request.url}', e, st);
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,166 +1,226 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "Ohodnotit",
|
"actionsStar": "Ohodnotit",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "Zrušit hodnocení",
|
"actionsUnstar": "Zrušit hodnocení",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "Zde nic není…",
|
"messagesNothingHere": "Zde nic není…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "Domů",
|
"navigationTabsHome": "Domů",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "Knihovna",
|
"navigationTabsLibrary": "Knihovna",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "Hledat",
|
"navigationTabsSearch": "Hledat",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "Nastavení",
|
"navigationTabsSettings": "Nastavení",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "Přehrát album",
|
"resourcesAlbumActionsPlay": "Přehrát album",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "Zobrazit album",
|
"resourcesAlbumActionsView": "Zobrazit album",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "Seřadit alba",
|
"resourcesAlbumListsSort": "Seřadit alba",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, =1{Album} few{Alba} many{Alba} other{Alba}}",
|
"resourcesAlbumName": "{count,plural, =1{Album} few{Alba} many{Alba} other{Alba}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "Zobrazit umělce",
|
"resourcesArtistActionsView": "Zobrazit umělce",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "Seřadit umělce",
|
"resourcesArtistListsSort": "Seřadit umělce",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, =1{Umělec} few{Umělci} many{Umělci} other{Umělci}}",
|
"resourcesArtistName": "{count,plural, =1{Umělec} few{Umělci} many{Umělci} other{Umělci}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "Podle žánru",
|
"resourcesFilterGenre": "Podle žánru",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "Ohodnocené",
|
"resourcesFilterStarred": "Ohodnocené",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "Přehrát seznam skladeb",
|
"resourcesPlaylistActionsPlay": "Přehrát seznam skladeb",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, =1{Seznam skladeb} few{Seznamy skladeb} many{Seznamy skladeb} other{Seznamy skladeb}}",
|
"resourcesPlaylistName": "{count,plural, =1{Seznam skladeb} few{Seznamy skladeb} many{Seznamy skladeb} other{Seznamy skladeb}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, =1{Fronta} few{Fronty} many{Fronty} other{Fronty}}",
|
"resourcesQueueName": "{count,plural, =1{Fronta} few{Fronty} many{Fronty} other{Fronty}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "Top skladby",
|
"resourcesSongListsArtistTopSongs": "Top skladby",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, =1{Skladba} few{Skladby} many{Skladby} other{Skladby}}",
|
"resourcesSongName": "{count,plural, =1{Skladba} few{Skladby} many{Skladby} other{Skladby}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "Nedávno přidané",
|
"resourcesSortByAdded": "Nedávno přidané",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "Podle umělce",
|
"resourcesSortByArtist": "Umělce",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "Často přehrávané",
|
"resourcesSortByFrequentlyPlayed": "Často přehrávané",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "Podle názvu",
|
"resourcesSortByName": "Názvu",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "Náhodně",
|
"resourcesSortByRandom": "Náhodně",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "Často přehrávané",
|
"resourcesSortByRecentlyPlayed": "Často přehrávané",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "Podle roku",
|
"resourcesSortByYear": "Roku",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "Hledat: {query}",
|
"searchHeaderTitle": "Hledat: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "Hledat",
|
"searchInputPlaceholder": "Hledat",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "Více…",
|
"searchMoreResults": "Více…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "Výsledky hledání",
|
"searchNowPlayingContext": "Výsledky hledání",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsNetworkName": "Síť",
|
"settingsNetworkName": "Síť",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximální datový tok (mobil)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximální datový tok (mobil)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximální datový tok (Wi-Fi)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximální datový tok (Wi-Fi)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value}kbps",
|
"settingsNetworkValuesKbps": "{value}kbps",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} sekund",
|
"settingsNetworkValuesSeconds": "{value} sekund",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "Neomezeno",
|
"settingsNetworkValuesUnlimitedKbps": "Neomezeno",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsServersActionsAdd": "Přidat server",
|
"settingsServersActionsAdd": "Přidat server",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "Odstranit",
|
"settingsServersActionsDelete": "Odstranit",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "Upravit server",
|
"settingsServersActionsEdit": "Upravit server",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "Uložit",
|
"settingsServersActionsSave": "Uložit",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "Otestovat spojení",
|
"settingsServersActionsTestConnection": "Otestovat spojení",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "Adresa",
|
"settingsServersFieldsAddress": "Adresa",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "Heslo",
|
"settingsServersFieldsPassword": "Heslo",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "Uživ. jméno",
|
"settingsServersFieldsUsername": "Uživ. jméno",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "Připojení k {address} selhalo, zkontrolujte nastavení nebo server",
|
"settingsServersMessagesConnectionFailed": "Připojení k {address} selhalo, zkontrolujte nastavení nebo server",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "Připojení k {address} je OK!",
|
"settingsServersMessagesConnectionOk": "Připojení k {address} je OK!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "Servery",
|
"settingsServersName": "Servery",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Posílat heslo jako token + salt",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Posílat heslo jako token + salt",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Posílat heslo v prostém textu (zastaralé, ujistěte se, že je vaše připojení zabezpečené!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Posílat heslo v prostém textu (zastaralé, ujistěte se, že je vaše připojení zabezpečené!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "Vynutit heslo ve formátu prostého textu",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "Vynutit heslo ve formátu prostého textu",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"actionsDownloadDelete": "Smazat stažené",
|
||||||
|
"@actionsDownloadDelete": {},
|
||||||
|
"actionsOk": "OK",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"actionsCancel": "Zrušit",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"actionsDownload": "Stáhnout",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"controlsShuffle": "Náhodně",
|
||||||
|
"@controlsShuffle": {},
|
||||||
|
"resourcesFilterAlbum": "Album",
|
||||||
|
"@resourcesFilterAlbum": {},
|
||||||
|
"resourcesFilterArtist": "Umělec",
|
||||||
|
"@resourcesFilterArtist": {},
|
||||||
|
"resourcesFilterYear": "Rok",
|
||||||
|
"@resourcesFilterYear": {},
|
||||||
|
"resourcesFilterOwner": "Majitele",
|
||||||
|
"@resourcesFilterOwner": {},
|
||||||
|
"resourcesSongListDeleteAllTitle": "Smazat stažené?",
|
||||||
|
"@resourcesSongListDeleteAllTitle": {},
|
||||||
|
"resourcesSongListDeleteAllContent": "Toto odstraní všechny stažené soubory s hudbou.",
|
||||||
|
"@resourcesSongListDeleteAllContent": {},
|
||||||
|
"resourcesSortByUpdated": "Naposledy upravené",
|
||||||
|
"@resourcesSortByUpdated": {},
|
||||||
|
"resourcesSortByAlbum": "Alba",
|
||||||
|
"@resourcesSortByAlbum": {},
|
||||||
|
"resourcesSortByAlbumCount": "Počtu alb",
|
||||||
|
"@resourcesSortByAlbumCount": {},
|
||||||
|
"resourcesSortByTitle": "Názvu",
|
||||||
|
"@resourcesSortByTitle": {},
|
||||||
|
"settingsAboutActionsLicenses": "Licence",
|
||||||
|
"@settingsAboutActionsLicenses": {},
|
||||||
|
"settingsAboutActionsProjectHomepage": "Stránka projektu",
|
||||||
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
|
"settingsAboutActionsSupport": "Podpořit vývojáře 💜",
|
||||||
|
"@settingsAboutActionsSupport": {},
|
||||||
|
"settingsAboutVersion": "verze {version}",
|
||||||
|
"@settingsAboutVersion": {
|
||||||
|
"placeholders": {
|
||||||
|
"version": {
|
||||||
|
"type": "String"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"settingsNetworkOptionsStreamFormat": "Preferovaný formát pro streamování",
|
||||||
|
"@settingsNetworkOptionsStreamFormat": {},
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault": "Použít nastavení serveru",
|
||||||
|
"@settingsNetworkOptionsStreamFormatServerDefault": {},
|
||||||
|
"settingsResetActionsClearImageCache": "Smazat mezipaměť obrázků",
|
||||||
|
"@settingsResetActionsClearImageCache": {},
|
||||||
|
"settingsResetName": "Resetovat",
|
||||||
|
"@settingsResetName": {},
|
||||||
|
"settingsServersFieldsName": "Jméno",
|
||||||
|
"@settingsServersFieldsName": {},
|
||||||
|
"settingsAboutName": "O aplikaci",
|
||||||
|
"@settingsAboutName": {},
|
||||||
|
"actionsDownloadCancel": "Zrušit stahování",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"actionsDelete": "Smazat",
|
||||||
|
"@actionsDelete": {}
|
||||||
}
|
}
|
||||||
@ -1,196 +1,276 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "Markieren",
|
"actionsStar": "Markieren",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "Markierung entfernen",
|
"actionsUnstar": "Markierung entfernen",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "Hier ist nichts…",
|
"messagesNothingHere": "Hier ist nichts…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "Startseite",
|
"navigationTabsHome": "Startseite",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "Bibliothek",
|
"navigationTabsLibrary": "Bibliothek",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "Suche",
|
"navigationTabsSearch": "Suche",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "Einstellungen",
|
"navigationTabsSettings": "Einstellungen",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "Album abspielen",
|
"resourcesAlbumActionsPlay": "Album abspielen",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "Album anzeigen",
|
"resourcesAlbumActionsView": "Album anzeigen",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "Alben sortieren",
|
"resourcesAlbumListsSort": "Alben sortieren",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, =1{Album} other{Alben}}",
|
"resourcesAlbumName": "{count,plural, =1{Album} other{Alben}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "Interpret anzeigen",
|
"resourcesArtistActionsView": "Interpret anzeigen",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "Interpreten sortieren",
|
"resourcesArtistListsSort": "Interpreten sortieren",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, =1{Interpret} other{Interpreten}}",
|
"resourcesArtistName": "{count,plural, =1{Interpret} other{Interpreten}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "Nach Genre",
|
"resourcesFilterGenre": "Nach Genre",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "Favoriten",
|
"resourcesFilterStarred": "Favoriten",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "Wiedergabeliste abspielen",
|
"resourcesPlaylistActionsPlay": "Wiedergabeliste abspielen",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, =1{Wiedergabeliste} other{Wiedergabelisten}}",
|
"resourcesPlaylistName": "{count,plural, =1{Wiedergabeliste} other{Wiedergabelisten}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, =1{Warteschlange} other{Warteschlangen}}",
|
"resourcesQueueName": "{count,plural, =1{Warteschlange} other{Warteschlangen}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "Top Lieder",
|
"resourcesSongListsArtistTopSongs": "Top Lieder",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, =1{Lied} other{Lieder}}",
|
"resourcesSongName": "{count,plural, =1{Lied} other{Lieder}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "Kürzlich hinzugefügt",
|
"resourcesSortByAdded": "Kürzlich hinzugefügt",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "Nach Interpreten",
|
"resourcesSortByArtist": "Nach Interpreten",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "Häufig abgespielt",
|
"resourcesSortByFrequentlyPlayed": "Häufig abgespielt",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "Nach Name",
|
"resourcesSortByName": "Nach Name",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "Zufällig",
|
"resourcesSortByRandom": "Zufällig",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "Kürzlich abgespielt",
|
"resourcesSortByRecentlyPlayed": "Kürzlich abgespielt",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "Nach Jahr",
|
"resourcesSortByYear": "Nach Jahr",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "Suche: {query}",
|
"searchHeaderTitle": "Suche: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "Suche",
|
"searchInputPlaceholder": "Suche",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "Mehr…",
|
"searchMoreResults": "Mehr…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "Suchergebnis",
|
"searchNowPlayingContext": "Suchergebnis",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsAboutActionsLicenses": "Lizenzen",
|
"settingsAboutActionsLicenses": "Lizenzen",
|
||||||
"@settingsAboutActionsLicenses": {},
|
"@settingsAboutActionsLicenses": {},
|
||||||
"settingsAboutActionsProjectHomepage": "Projektseite",
|
"settingsAboutActionsProjectHomepage": "Projektseite",
|
||||||
"@settingsAboutActionsProjectHomepage": {},
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
"settingsAboutName": "Über",
|
"settingsAboutName": "Über",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutVersion": "Version {version}",
|
"settingsAboutVersion": "Version {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"version": {
|
"version": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsMusicName": "Musik",
|
"settingsMusicName": "Musik",
|
||||||
"@settingsMusicName": {},
|
"@settingsMusicName": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff": "Kein Scrobble für Wiedergabeverlauf",
|
"settingsMusicOptionsScrobbleDescriptionOff": "Kein Scrobble für Wiedergabeverlauf",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble Wiedergabeverlauf",
|
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble Wiedergabeverlauf",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
||||||
"settingsMusicOptionsScrobbleTitle": "Scrobble Wiedergabe",
|
"settingsMusicOptionsScrobbleTitle": "Scrobble Wiedergabe",
|
||||||
"@settingsMusicOptionsScrobbleTitle": {},
|
"@settingsMusicOptionsScrobbleTitle": {},
|
||||||
"settingsNetworkName": "Netzwerk",
|
"settingsNetworkName": "Netzwerk",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximale Bitrate (Mobil)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximale Bitrate (Mobil)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximale Bitrate (WLAN)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximale Bitrate (WLAN)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkOptionsMaxBufferTitle": "Maximale Pufferzeit",
|
"settingsNetworkOptionsMaxBufferTitle": "Maximale Pufferzeit",
|
||||||
"@settingsNetworkOptionsMaxBufferTitle": {},
|
"@settingsNetworkOptionsMaxBufferTitle": {},
|
||||||
"settingsNetworkOptionsMinBufferTitle": "Minimale Pufferzeit",
|
"settingsNetworkOptionsMinBufferTitle": "Minimale Pufferzeit",
|
||||||
"@settingsNetworkOptionsMinBufferTitle": {},
|
"@settingsNetworkOptionsMinBufferTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value}kbps",
|
"settingsNetworkValuesKbps": "{value}kbps",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} Sekunden",
|
"settingsNetworkValuesSeconds": "{value} Sekunden",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "Unbegrenzt",
|
"settingsNetworkValuesUnlimitedKbps": "Unbegrenzt",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsResetActionsClearImageCache": "Bildzwischenspeicher löschen",
|
"settingsResetActionsClearImageCache": "Bildzwischenspeicher löschen",
|
||||||
"@settingsResetActionsClearImageCache": {},
|
"@settingsResetActionsClearImageCache": {},
|
||||||
"settingsResetName": "Zurücksetzen",
|
"settingsResetName": "Zurücksetzen",
|
||||||
"@settingsResetName": {},
|
"@settingsResetName": {},
|
||||||
"settingsServersActionsAdd": "Server hinzufügen",
|
"settingsServersActionsAdd": "Server hinzufügen",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "Löschen",
|
"settingsServersActionsDelete": "Löschen",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "Server bearbeiten",
|
"settingsServersActionsEdit": "Server bearbeiten",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "Speichern",
|
"settingsServersActionsSave": "Speichern",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "Verbindung testen",
|
"settingsServersActionsTestConnection": "Verbindung testen",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "Adresse",
|
"settingsServersFieldsAddress": "Adresse",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "Passwort",
|
"settingsServersFieldsPassword": "Passwort",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "Nutzername",
|
"settingsServersFieldsUsername": "Nutzername",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "Verbindung zu {address} fehlgeschlagen, überprüfe Einstellungen oder Server",
|
"settingsServersMessagesConnectionFailed": "Verbindung zu {address} fehlgeschlagen, überprüfe Einstellungen oder Server",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "Verbindung zu {address} ist OK!",
|
"settingsServersMessagesConnectionOk": "Verbindung zu {address} ist OK!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "Server",
|
"settingsServersName": "Server",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Sende Passwort als Token + Salt",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Sende Passwort als Token + Salt",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Passwort als Klartext senden (Veraltet, stellen Sie sicher, dass Ihre Verbindung sicher ist!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Passwort als Klartext senden (Veraltet, stellen Sie sicher, dass Ihre Verbindung sicher ist!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "Erzwinge Klartextpasswort",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "Erzwinge Klartextpasswort",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"actionsDelete": "Löschen",
|
||||||
|
"@actionsDelete": {},
|
||||||
|
"actionsDownload": "Herunterladen",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"actionsDownloadCancel": "Download abbrechen",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"controlsShuffle": "Zufall",
|
||||||
|
"@controlsShuffle": {},
|
||||||
|
"actionsCancel": "Abbrechen",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"actionsDownloadDelete": "Heruntergeladene Inhalte löschen",
|
||||||
|
"@actionsDownloadDelete": {},
|
||||||
|
"actionsOk": "OK",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"resourcesAlbumCount": "{count,plural, =1{{count} Album} other{{count} Alben}}",
|
||||||
|
"@resourcesAlbumCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesFilterAlbum": "Album",
|
||||||
|
"@resourcesFilterAlbum": {},
|
||||||
|
"resourcesArtistCount": "{count,plural, =1{{count} Künstler} other{{count} Künstler}}",
|
||||||
|
"@resourcesArtistCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesFilterArtist": "Künstler",
|
||||||
|
"@resourcesFilterArtist": {},
|
||||||
|
"resourcesFilterOwner": "Besitzer",
|
||||||
|
"@resourcesFilterOwner": {},
|
||||||
|
"resourcesFilterYear": "Jahr",
|
||||||
|
"@resourcesFilterYear": {},
|
||||||
|
"resourcesPlaylistCount": "{count,plural, =1{{count} Playlist} other{{count} Playlists}}",
|
||||||
|
"@resourcesPlaylistCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesSongCount": "{count,plural, =1{{count} Song} other{{count} Songs}}",
|
||||||
|
"@resourcesSongCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesSongListDeleteAllContent": "Hierdurch werden alle heruntergeladenen Inhalte entfernt.",
|
||||||
|
"@resourcesSongListDeleteAllContent": {},
|
||||||
|
"resourcesSortByAlbum": "Album",
|
||||||
|
"@resourcesSortByAlbum": {},
|
||||||
|
"resourcesSortByAlbumCount": "Albenanzahl",
|
||||||
|
"@resourcesSortByAlbumCount": {},
|
||||||
|
"resourcesSortByTitle": "Titel",
|
||||||
|
"@resourcesSortByTitle": {},
|
||||||
|
"resourcesSortByUpdated": "Kürzlich hinzugefügt",
|
||||||
|
"@resourcesSortByUpdated": {},
|
||||||
|
"settingsAboutActionsSupport": "Den Entwickler unterstützen",
|
||||||
|
"@settingsAboutActionsSupport": {},
|
||||||
|
"settingsNetworkOptionsOfflineMode": "Offline Modus",
|
||||||
|
"@settingsNetworkOptionsOfflineMode": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOff": "Nutze das Internet um Musik zu synchronisieren.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOff": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOn": "Nutze nicht das Internet um Musik zu synchronisieren.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOn": {},
|
||||||
|
"settingsNetworkOptionsStreamFormat": "Bevorzugtes Streaming-Format",
|
||||||
|
"@settingsNetworkOptionsStreamFormat": {},
|
||||||
|
"settingsServersFieldsName": "Name",
|
||||||
|
"@settingsServersFieldsName": {},
|
||||||
|
"resourcesSongListDeleteAllTitle": "Downloads löschen?",
|
||||||
|
"@resourcesSongListDeleteAllTitle": {},
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault": "Server-Standard verwenden",
|
||||||
|
"@settingsNetworkOptionsStreamFormatServerDefault": {}
|
||||||
}
|
}
|
||||||
@ -173,6 +173,10 @@
|
|||||||
"@settingsAboutActionsSupport": {},
|
"@settingsAboutActionsSupport": {},
|
||||||
"settingsAboutName": "About",
|
"settingsAboutName": "About",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
|
"settingsAboutShareLogs": "Share logs",
|
||||||
|
"@settingsAboutShareLogs": {},
|
||||||
|
"settingsAboutChooseLog": "Choose a log file",
|
||||||
|
"@settingsAboutChooseLog": {},
|
||||||
"settingsAboutVersion": "version {version}",
|
"settingsAboutVersion": "version {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|||||||
@ -1,196 +1,210 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "Estrella",
|
"actionsStar": "Favorito",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "Retirar estrella",
|
"actionsUnstar": "Retirar favorito",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "Nada aquí…",
|
"messagesNothingHere": "Nada aquí…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "Casa",
|
"navigationTabsHome": "Casa",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "Biblioteca",
|
"navigationTabsLibrary": "Biblioteca",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "Buscar",
|
"navigationTabsSearch": "Buscar",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "Entorno",
|
"navigationTabsSettings": "Entorno",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "Reproducir Álbum",
|
"resourcesAlbumActionsPlay": "Reproducir Álbum",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "Ver Álbum",
|
"resourcesAlbumActionsView": "Ver Álbum",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "Ordenar Álbumes",
|
"resourcesAlbumListsSort": "Ordenar Álbumes",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbumes}}",
|
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbumes}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "Ver Artista",
|
"resourcesArtistActionsView": "Ver Artista",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "Oredenar Artistas",
|
"resourcesArtistListsSort": "Oredenar Artistas",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
|
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "Por Género",
|
"resourcesFilterGenre": "Por Género",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "Estrellas",
|
"resourcesFilterStarred": "Estrellas",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "Reproducir Lista de reproducción",
|
"resourcesPlaylistActionsPlay": "Reproducir Lista de reproducción",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, =1{Lista de reproducción} other{Listas de reproducción}}",
|
"resourcesPlaylistName": "{count,plural, =1{Lista de reproducción} other{Listas de reproducción}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, =1{Cola} other{Colas}}",
|
"resourcesQueueName": "{count,plural, =1{Cola} other{Colas}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "Mejores Canciones",
|
"resourcesSongListsArtistTopSongs": "Mejores Canciones",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, =1{Cancion} other{Canciones}}",
|
"resourcesSongName": "{count,plural, =1{Cancion} other{Canciones}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "Recientemente Añadido",
|
"resourcesSortByAdded": "Recientemente Añadido",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "Por Artista",
|
"resourcesSortByArtist": "Por Artista",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "Jugado Frecuentemente",
|
"resourcesSortByFrequentlyPlayed": "Jugado Frecuentemente",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "Por Nombre",
|
"resourcesSortByName": "Por Nombre",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "Aleatorio",
|
"resourcesSortByRandom": "Aleatorio",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "Recientemente Jugado",
|
"resourcesSortByRecentlyPlayed": "Recientemente Jugado",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "Por Año",
|
"resourcesSortByYear": "Por Año",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "Buscar: {query}",
|
"searchHeaderTitle": "Buscar: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "Buscar",
|
"searchInputPlaceholder": "Buscar",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "Más…",
|
"searchMoreResults": "Más…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "Resultados de la búsqueda",
|
"searchNowPlayingContext": "Resultados de la búsqueda",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsAboutActionsLicenses": "Licencias",
|
"settingsAboutActionsLicenses": "Licencias",
|
||||||
"@settingsAboutActionsLicenses": {},
|
"@settingsAboutActionsLicenses": {},
|
||||||
"settingsAboutActionsProjectHomepage": "Página de inicio del proyecto",
|
"settingsAboutActionsProjectHomepage": "Página de inicio del proyecto",
|
||||||
"@settingsAboutActionsProjectHomepage": {},
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
"settingsAboutName": "Información",
|
"settingsAboutName": "Información",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutVersion": "versión {version}",
|
"settingsAboutVersion": "versión {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"version": {
|
"version": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsMusicName": "Música",
|
"settingsMusicName": "Música",
|
||||||
"@settingsMusicName": {},
|
"@settingsMusicName": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff": "No hagas historial de reproducción de scrobble",
|
"settingsMusicOptionsScrobbleDescriptionOff": "No hagas historial de reproducción de scrobble",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn": "Historial de reproducción de scrobble",
|
"settingsMusicOptionsScrobbleDescriptionOn": "Historial de reproducción de scrobble",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
||||||
"settingsMusicOptionsScrobbleTitle": "Obras de teatro de Scrobble",
|
"settingsMusicOptionsScrobbleTitle": "Obras de teatro de Scrobble",
|
||||||
"@settingsMusicOptionsScrobbleTitle": {},
|
"@settingsMusicOptionsScrobbleTitle": {},
|
||||||
"settingsNetworkName": "Sitio",
|
"settingsNetworkName": "Sitio",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "Tasa de bits máxima (mobile)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "Tasa de bits máxima (mobile)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "Tasa de bits máxima (Wi-Fi)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "Tasa de bits máxima (Wi-Fi)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkOptionsMaxBufferTitle": "Máxima de buffer tiempo",
|
"settingsNetworkOptionsMaxBufferTitle": "Máxima de buffer tiempo",
|
||||||
"@settingsNetworkOptionsMaxBufferTitle": {},
|
"@settingsNetworkOptionsMaxBufferTitle": {},
|
||||||
"settingsNetworkOptionsMinBufferTitle": "Mínimo de buffer tiempo",
|
"settingsNetworkOptionsMinBufferTitle": "Mínimo de buffer tiempo",
|
||||||
"@settingsNetworkOptionsMinBufferTitle": {},
|
"@settingsNetworkOptionsMinBufferTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value} kilobytes por segundo",
|
"settingsNetworkValuesKbps": "{value} kilobytes por segundo",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} segundos",
|
"settingsNetworkValuesSeconds": "{value} segundos",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "Ilimitados",
|
"settingsNetworkValuesUnlimitedKbps": "Ilimitados",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsResetActionsClearImageCache": "Caché de imágenes claras",
|
"settingsResetActionsClearImageCache": "Caché de imágenes claras",
|
||||||
"@settingsResetActionsClearImageCache": {},
|
"@settingsResetActionsClearImageCache": {},
|
||||||
"settingsResetName": "Reinicializar",
|
"settingsResetName": "Reinicializar",
|
||||||
"@settingsResetName": {},
|
"@settingsResetName": {},
|
||||||
"settingsServersActionsAdd": "Agregar Servidor",
|
"settingsServersActionsAdd": "Agregar Servidor",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "Supr",
|
"settingsServersActionsDelete": "Supr",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "Editar Servidor",
|
"settingsServersActionsEdit": "Editar Servidor",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "Enviar",
|
"settingsServersActionsSave": "Enviar",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "Conexión de prueba",
|
"settingsServersActionsTestConnection": "Conexión de prueba",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "Alocución",
|
"settingsServersFieldsAddress": "Alocución",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "La contraseña",
|
"settingsServersFieldsPassword": "La contraseña",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "Nombre de usuario",
|
"settingsServersFieldsUsername": "Nombre de usuario",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "La conexión a {address} falló, verifique la configuracón o el servidor",
|
"settingsServersMessagesConnectionFailed": "La conexión a {address} falló, verifique la configuracón o el servidor",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "¡Conexión con {address} Ok!",
|
"settingsServersMessagesConnectionOk": "¡Conexión con {address} Ok!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "Servidores",
|
"settingsServersName": "Servidores",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contraseña como token + sal",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contraseña como token + sal",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contraseña en texto plano (¡legado, asegúrese de que su conexión sea segura!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contraseña en texto plano (¡legado, asegúrese de que su conexión sea segura!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contraseña de texto sin formato",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contraseña de texto sin formato",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"actionsDelete": "Borrar",
|
||||||
|
"@actionsDelete": {},
|
||||||
|
"actionsOk": "Ok",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"actionsDownload": "Descargar",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"actionsDownloadCancel": "Anular descargar",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"controlsShuffle": "Reproducir aleatoriamente",
|
||||||
|
"@controlsShuffle": {},
|
||||||
|
"actionsCancel": "Cancelar",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"actionsDownloadDelete": "Eliminar descargado",
|
||||||
|
"@actionsDownloadDelete": {}
|
||||||
}
|
}
|
||||||
@ -1,196 +1,280 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "Estrela",
|
"actionsStar": "Estrela",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "Retirar",
|
"actionsUnstar": "Retirar",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "Nada por aquí…",
|
"messagesNothingHere": "Nada por aquí…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "Inicio",
|
"navigationTabsHome": "Inicio",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "Biblioteca",
|
"navigationTabsLibrary": "Biblioteca",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "Buscar",
|
"navigationTabsSearch": "Buscar",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "Axustes",
|
"navigationTabsSettings": "Axustes",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "Reproducir",
|
"resourcesAlbumActionsPlay": "Reproducir",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "Ver Álbum",
|
"resourcesAlbumActionsView": "Ver Álbum",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "Ordenar Álbums",
|
"resourcesAlbumListsSort": "Ordenar Álbums",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbums}}",
|
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbums}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "Ver Artista",
|
"resourcesArtistActionsView": "Ver Artista",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "Ordenar Artistas",
|
"resourcesArtistListsSort": "Ordenar Artistas",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
|
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "Por xénero",
|
"resourcesFilterGenre": "Por xénero",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "Favoritas",
|
"resourcesFilterStarred": "Favoritas",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "Reproducir lista",
|
"resourcesPlaylistActionsPlay": "Reproducir lista",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, =1{Listaxe} other{Listaxes}}",
|
"resourcesPlaylistName": "{count,plural, =1{Listaxe} other{Listaxes}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
|
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "Máis reproducidas",
|
"resourcesSongListsArtistTopSongs": "Máis reproducidas",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, =1{Canción} other{Cancións}}",
|
"resourcesSongName": "{count,plural, =1{Canción} other{Cancións}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "Últimas engadidas",
|
"resourcesSortByAdded": "Últimas engadidas",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "Por artista",
|
"resourcesSortByArtist": "Por artista",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "Reproducidas a miúdo",
|
"resourcesSortByFrequentlyPlayed": "Reproducidas a miúdo",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "Por nome",
|
"resourcesSortByName": "Por nome",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "Ao chou",
|
"resourcesSortByRandom": "Ao chou",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "Reproducidas a miúdo",
|
"resourcesSortByRecentlyPlayed": "Reproducidas a miúdo",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "Por ano",
|
"resourcesSortByYear": "Por ano",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "Buscar: {query}",
|
"searchHeaderTitle": "Buscar: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "Buscar",
|
"searchInputPlaceholder": "Buscar",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "Máis…",
|
"searchMoreResults": "Máis…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "Resultados",
|
"searchNowPlayingContext": "Resultados",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsAboutActionsLicenses": "Licenzas",
|
"settingsAboutActionsLicenses": "Licenzas",
|
||||||
"@settingsAboutActionsLicenses": {},
|
"@settingsAboutActionsLicenses": {},
|
||||||
"settingsAboutActionsProjectHomepage": "Web do Proxecto",
|
"settingsAboutActionsProjectHomepage": "Web do Proxecto",
|
||||||
"@settingsAboutActionsProjectHomepage": {},
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
"settingsAboutName": "Acerca de",
|
"settingsAboutName": "Acerca de",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutVersion": "versión {version}",
|
"settingsAboutVersion": "versión {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"version": {
|
"version": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsMusicName": "Música",
|
"settingsMusicName": "Música",
|
||||||
"@settingsMusicName": {},
|
"@settingsMusicName": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff": "Non rexistrar o historial de reprodución",
|
"settingsMusicOptionsScrobbleDescriptionOff": "Non rexistrar o historial de reprodución",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn": "Rexistrar o historial de reprodución",
|
"settingsMusicOptionsScrobbleDescriptionOn": "Rexistrar o historial de reprodución",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
||||||
"settingsMusicOptionsScrobbleTitle": "Rexistrar reprodución",
|
"settingsMusicOptionsScrobbleTitle": "Rexistrar reprodución",
|
||||||
"@settingsMusicOptionsScrobbleTitle": {},
|
"@settingsMusicOptionsScrobbleTitle": {},
|
||||||
"settingsNetworkName": "Rede",
|
"settingsNetworkName": "Rede",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate máx. (móbil)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate máx. (móbil)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate máx. (Wi-Fi)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate máx. (Wi-Fi)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkOptionsMaxBufferTitle": "Tempo máximo na memoria",
|
"settingsNetworkOptionsMaxBufferTitle": "Tempo máximo na memoria",
|
||||||
"@settingsNetworkOptionsMaxBufferTitle": {},
|
"@settingsNetworkOptionsMaxBufferTitle": {},
|
||||||
"settingsNetworkOptionsMinBufferTitle": "Tempo mínimo na memoria",
|
"settingsNetworkOptionsMinBufferTitle": "Tempo mínimo na memoria",
|
||||||
"@settingsNetworkOptionsMinBufferTitle": {},
|
"@settingsNetworkOptionsMinBufferTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value}kbps",
|
"settingsNetworkValuesKbps": "{value}kbps",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} segundos",
|
"settingsNetworkValuesSeconds": "{value} segundos",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "Sen límite",
|
"settingsNetworkValuesUnlimitedKbps": "Sen límite",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsResetActionsClearImageCache": "Limpar a caché de imaxes",
|
"settingsResetActionsClearImageCache": "Limpar a caché de imaxes",
|
||||||
"@settingsResetActionsClearImageCache": {},
|
"@settingsResetActionsClearImageCache": {},
|
||||||
"settingsResetName": "Restablecer",
|
"settingsResetName": "Restablecer",
|
||||||
"@settingsResetName": {},
|
"@settingsResetName": {},
|
||||||
"settingsServersActionsAdd": "Engadir Servidor",
|
"settingsServersActionsAdd": "Engadir Servidor",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "Eliminar",
|
"settingsServersActionsDelete": "Eliminar",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "Editar Servidor",
|
"settingsServersActionsEdit": "Editar Servidor",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "Gardar",
|
"settingsServersActionsSave": "Gardar",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "Comprobar Conexión",
|
"settingsServersActionsTestConnection": "Comprobar Conexión",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "Enderezo",
|
"settingsServersFieldsAddress": "Enderezo",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "Contrasinal",
|
"settingsServersFieldsPassword": "Contrasinal",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "Identificador",
|
"settingsServersFieldsUsername": "Identificador",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "Fallou a conexión a {address}, comproba os axustes",
|
"settingsServersMessagesConnectionFailed": "Fallou a conexión a {address}, comproba os axustes",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "Conexión con {address} OK!",
|
"settingsServersMessagesConnectionOk": "Conexión con {address} OK!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "Servidores",
|
"settingsServersName": "Servidores",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contrasinal como token + salt",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contrasinal como token + salt",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contrasinal en texto plano (herdado, pon coidado en que a conexión sexa segura!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contrasinal en texto plano (herdado, pon coidado en que a conexión sexa segura!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contrasinal en texto plano",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contrasinal en texto plano",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"actionsCancel": "Cancelar",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"actionsDelete": "Eliminar",
|
||||||
|
"@actionsDelete": {},
|
||||||
|
"actionsDownload": "Descargar",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"actionsDownloadCancel": "Cancelar a descarga",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"actionsDownloadDelete": "Eliminar o descargado",
|
||||||
|
"@actionsDownloadDelete": {},
|
||||||
|
"actionsOk": "OK",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"controlsShuffle": "Barallar",
|
||||||
|
"@controlsShuffle": {},
|
||||||
|
"resourcesAlbumCount": "{count,plural, =1{{count} álbum} other{{count} álbums}}",
|
||||||
|
"@resourcesAlbumCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesArtistCount": "{count,plural, =1{{count} artista} other{{count} artistas}}",
|
||||||
|
"@resourcesArtistCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesFilterAlbum": "Álbum",
|
||||||
|
"@resourcesFilterAlbum": {},
|
||||||
|
"resourcesFilterArtist": "Artista",
|
||||||
|
"@resourcesFilterArtist": {},
|
||||||
|
"resourcesFilterOwner": "Dono",
|
||||||
|
"@resourcesFilterOwner": {},
|
||||||
|
"resourcesFilterYear": "Ano",
|
||||||
|
"@resourcesFilterYear": {},
|
||||||
|
"resourcesPlaylistCount": "{count,plural, =1{{count} lista} other{{count} listas}}",
|
||||||
|
"@resourcesPlaylistCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesSongCount": "{count,plural, =1{{count} canción} other{{count} cancións}}",
|
||||||
|
"@resourcesSongCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesSongListDeleteAllContent": "Vas eliminar todas as cancións descargadas.",
|
||||||
|
"@resourcesSongListDeleteAllContent": {},
|
||||||
|
"resourcesSongListDeleteAllTitle": "Eliminar descargas?",
|
||||||
|
"@resourcesSongListDeleteAllTitle": {},
|
||||||
|
"resourcesSortByAlbum": "Álbum",
|
||||||
|
"@resourcesSortByAlbum": {},
|
||||||
|
"resourcesSortByAlbumCount": "Número de álbums",
|
||||||
|
"@resourcesSortByAlbumCount": {},
|
||||||
|
"settingsAboutActionsSupport": "Axuda ao desenvolvemento 💜",
|
||||||
|
"@settingsAboutActionsSupport": {},
|
||||||
|
"settingsNetworkOptionsOfflineMode": "Modo sen conexión",
|
||||||
|
"@settingsNetworkOptionsOfflineMode": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOff": "Usa internet para sincr. música.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOff": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOn": "Non usar internet para sincr. ou reproducir música.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOn": {},
|
||||||
|
"settingsNetworkOptionsStreamFormat": "Modo de reprodución preferido",
|
||||||
|
"@settingsNetworkOptionsStreamFormat": {},
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault": "Usar por defecto do servidor",
|
||||||
|
"@settingsNetworkOptionsStreamFormatServerDefault": {},
|
||||||
|
"settingsServersFieldsName": "Nome",
|
||||||
|
"@settingsServersFieldsName": {},
|
||||||
|
"resourcesSortByTitle": "Título",
|
||||||
|
"@resourcesSortByTitle": {},
|
||||||
|
"resourcesSortByUpdated": "Actualizado recentemente",
|
||||||
|
"@resourcesSortByUpdated": {},
|
||||||
|
"settingsAboutShareLogs": "Compartir rexistros",
|
||||||
|
"@settingsAboutShareLogs": {},
|
||||||
|
"settingsAboutChooseLog": "Escolle un ficheiro de rexistro",
|
||||||
|
"@settingsAboutChooseLog": {}
|
||||||
}
|
}
|
||||||
@ -1,196 +1,230 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "Favorito",
|
"actionsStar": "Favorito",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "Remover favorito",
|
"actionsUnstar": "Remover favorito",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "Não existe nada…",
|
"messagesNothingHere": "Não existe nada…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "Início",
|
"navigationTabsHome": "Início",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "Biblioteca",
|
"navigationTabsLibrary": "Biblioteca",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "Procurar",
|
"navigationTabsSearch": "Procurar",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "Definições",
|
"navigationTabsSettings": "Definições",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "Tocar Álbum",
|
"resourcesAlbumActionsPlay": "Tocar Álbum",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "Ver Álbum",
|
"resourcesAlbumActionsView": "Ver Álbum",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "Ordenar Álbuns",
|
"resourcesAlbumListsSort": "Ordenar Álbuns",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbuns}}",
|
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbuns}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "Ver Artista",
|
"resourcesArtistActionsView": "Ver Artista",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "Ordenar Artistas",
|
"resourcesArtistListsSort": "Ordenar Artistas",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
|
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "Por Género",
|
"resourcesFilterGenre": "Por Género",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "Favoritos",
|
"resourcesFilterStarred": "Favoritos",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "Tocar Playlist",
|
"resourcesPlaylistActionsPlay": "Tocar Playlist",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, =1{Lista} other{Listas}}",
|
"resourcesPlaylistName": "{count,plural, =1{Lista} other{Listas}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
|
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "Top Músicas",
|
"resourcesSongListsArtistTopSongs": "Top Músicas",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, =1{Música} other{Músicas}}",
|
"resourcesSongName": "{count,plural, =1{Música} other{Músicas}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "Adicionado recentemente",
|
"resourcesSortByAdded": "Adicionado recentemente",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "Por Artista",
|
"resourcesSortByArtist": "Por Artista",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "Mais Tocado",
|
"resourcesSortByFrequentlyPlayed": "Mais Tocado",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "Por Nome",
|
"resourcesSortByName": "Por Nome",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "Aleatório",
|
"resourcesSortByRandom": "Aleatório",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "Ouviu recentemente",
|
"resourcesSortByRecentlyPlayed": "Ouviu recentemente",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "Por Ano",
|
"resourcesSortByYear": "Por Ano",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "Procurar: {query}",
|
"searchHeaderTitle": "Procurar: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "Procurar",
|
"searchInputPlaceholder": "Procurar",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "Mais…",
|
"searchMoreResults": "Mais…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "Resultados da Pesquisa",
|
"searchNowPlayingContext": "Resultados da Pesquisa",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsAboutActionsLicenses": "Licenças",
|
"settingsAboutActionsLicenses": "Licenças",
|
||||||
"@settingsAboutActionsLicenses": {},
|
"@settingsAboutActionsLicenses": {},
|
||||||
"settingsAboutActionsProjectHomepage": "Página do Projeto",
|
"settingsAboutActionsProjectHomepage": "Página do Projeto",
|
||||||
"@settingsAboutActionsProjectHomepage": {},
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
"settingsAboutName": "Acerca",
|
"settingsAboutName": "Acerca",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutVersion": "versão {version}",
|
"settingsAboutVersion": "versão {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"version": {
|
"version": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsMusicName": "Música",
|
"settingsMusicName": "Música",
|
||||||
"@settingsMusicName": {},
|
"@settingsMusicName": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff": "Não enviar histórico de reproduções por scrobble",
|
"settingsMusicOptionsScrobbleDescriptionOff": "Não enviar histórico de reproduções por scrobble",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn": "Enviar histórico de reproduções por scrobble",
|
"settingsMusicOptionsScrobbleDescriptionOn": "Enviar histórico de reproduções por scrobble",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
||||||
"settingsMusicOptionsScrobbleTitle": "Enviar reproduções por scrobble",
|
"settingsMusicOptionsScrobbleTitle": "Enviar reproduções por scrobble",
|
||||||
"@settingsMusicOptionsScrobbleTitle": {},
|
"@settingsMusicOptionsScrobbleTitle": {},
|
||||||
"settingsNetworkName": "Rede",
|
"settingsNetworkName": "Rede",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate Máximo (móvel)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate Máximo (móvel)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate Máximo (Wi-Fi)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate Máximo (Wi-Fi)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkOptionsMaxBufferTitle": "Tempo de buffer máximo",
|
"settingsNetworkOptionsMaxBufferTitle": "Tempo de buffer máximo",
|
||||||
"@settingsNetworkOptionsMaxBufferTitle": {},
|
"@settingsNetworkOptionsMaxBufferTitle": {},
|
||||||
"settingsNetworkOptionsMinBufferTitle": "Tempo de buffer mínimo",
|
"settingsNetworkOptionsMinBufferTitle": "Tempo de buffer mínimo",
|
||||||
"@settingsNetworkOptionsMinBufferTitle": {},
|
"@settingsNetworkOptionsMinBufferTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value}kbps",
|
"settingsNetworkValuesKbps": "{value}kbps",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} segundos",
|
"settingsNetworkValuesSeconds": "{value} segundos",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "Ilimitado",
|
"settingsNetworkValuesUnlimitedKbps": "Ilimitado",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsResetActionsClearImageCache": "Limpar cache de Imagens",
|
"settingsResetActionsClearImageCache": "Limpar cache de Imagens",
|
||||||
"@settingsResetActionsClearImageCache": {},
|
"@settingsResetActionsClearImageCache": {},
|
||||||
"settingsResetName": "Redefinir",
|
"settingsResetName": "Redefinir",
|
||||||
"@settingsResetName": {},
|
"@settingsResetName": {},
|
||||||
"settingsServersActionsAdd": "Adicionar Servidor",
|
"settingsServersActionsAdd": "Adicionar Servidor",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "Apagar",
|
"settingsServersActionsDelete": "Apagar",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "Editar Servidor",
|
"settingsServersActionsEdit": "Editar Servidor",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "Guardar",
|
"settingsServersActionsSave": "Guardar",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "Testar Ligação",
|
"settingsServersActionsTestConnection": "Testar Ligação",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "Endereço",
|
"settingsServersFieldsAddress": "Endereço",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "Senha",
|
"settingsServersFieldsPassword": "Senha",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "Nome de utilizador",
|
"settingsServersFieldsUsername": "Nome de utilizador",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "Ligação a {address} falhou, verifique definições ou servidor",
|
"settingsServersMessagesConnectionFailed": "Ligação a {address} falhou, verifique definições ou servidor",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "Ligação a {address} OK!",
|
"settingsServersMessagesConnectionOk": "Ligação a {address} OK!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "Servidores",
|
"settingsServersName": "Servidores",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar senha como token + sal",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar senha como token + sal",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar senha em texto simples (antigo, certifique-se que a sua ligação é segura!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar senha em texto simples (antigo, certifique-se que a sua ligação é segura!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "Forçar password em texto simples",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "Forçar password em texto simples",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"actionsCancel": "Cancelar",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"actionsDelete": "Apagar",
|
||||||
|
"@actionsDelete": {},
|
||||||
|
"actionsDownload": "Descarregar",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"actionsDownloadCancel": "Cancelar descarga",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"actionsDownloadDelete": "Apagar descarga",
|
||||||
|
"@actionsDownloadDelete": {},
|
||||||
|
"resourcesFilterAlbum": "Álbum",
|
||||||
|
"@resourcesFilterAlbum": {},
|
||||||
|
"resourcesFilterArtist": "Artista",
|
||||||
|
"@resourcesFilterArtist": {},
|
||||||
|
"resourcesFilterYear": "Ano",
|
||||||
|
"@resourcesFilterYear": {},
|
||||||
|
"resourcesSortByAlbum": "Álbum",
|
||||||
|
"@resourcesSortByAlbum": {},
|
||||||
|
"settingsAboutActionsSupport": "Apoie o programador 💜",
|
||||||
|
"@settingsAboutActionsSupport": {},
|
||||||
|
"settingsNetworkOptionsOfflineMode": "Modo offline",
|
||||||
|
"@settingsNetworkOptionsOfflineMode": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOff": "Usar a internet para sincronizar música.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOff": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOn": "Não usar a internet para sincronizar ou tocar música.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOn": {},
|
||||||
|
"settingsNetworkOptionsStreamFormat": "Formato preferido de streaming",
|
||||||
|
"@settingsNetworkOptionsStreamFormat": {},
|
||||||
|
"resourcesSortByTitle": "Título",
|
||||||
|
"@resourcesSortByTitle": {},
|
||||||
|
"actionsOk": "OK",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"controlsShuffle": "Aleatório",
|
||||||
|
"@controlsShuffle": {}
|
||||||
}
|
}
|
||||||
@ -1,196 +1,280 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "Избранное",
|
"actionsStar": "Избранное",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "Убрать из избранного",
|
"actionsUnstar": "Убрать из избранного",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "Здесь ничего нет…",
|
"messagesNothingHere": "Здесь ничего нет…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "Главная",
|
"navigationTabsHome": "Главная",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "Библиотека",
|
"navigationTabsLibrary": "Библиотека",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "Поиск",
|
"navigationTabsSearch": "Поиск",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "Настройки",
|
"navigationTabsSettings": "Настройки",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "Воспроизвести альбом",
|
"resourcesAlbumActionsPlay": "Воспроизвести альбом",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "Посмотреть альбом",
|
"resourcesAlbumActionsView": "Посмотреть альбом",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "Сортировка альбомов",
|
"resourcesAlbumListsSort": "Сортировка альбомов",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, =1{Альбом} few{Альбомы} many{Альбомов} other{Альбомов}}",
|
"resourcesAlbumName": "{count,plural, =1{Альбом} few{Альбомы} many{Альбомов} other{Альбомов}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "Посмотреть исполнителя",
|
"resourcesArtistActionsView": "Посмотреть исполнителя",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "Сортировать исполнителей",
|
"resourcesArtistListsSort": "Сортировать исполнителей",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, =1{Исполнитель} few{Исполнители} many{Исполнителей} other{Исполнителей}}",
|
"resourcesArtistName": "{count,plural, =1{Исполнитель} few{Исполнители} many{Исполнителей} other{Исполнителей}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "По жанру",
|
"resourcesFilterGenre": "По жанру",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "Избранные",
|
"resourcesFilterStarred": "Избранные",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "Воспроизвести плейлист",
|
"resourcesPlaylistActionsPlay": "Воспроизвести плейлист",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, =1{Плейлист} few{Плейлисты} many{Плейлистов} other{Плейлистов}}",
|
"resourcesPlaylistName": "{count,plural, =1{Плейлист} few{Плейлисты} many{Плейлистов} other{Плейлистов}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, =1{Очередь} few{Очереди} many{Очередей} other{Очередей}}",
|
"resourcesQueueName": "{count,plural, =1{Очередь} few{Очереди} many{Очередей} other{Очередей}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "Лучшие треки",
|
"resourcesSongListsArtistTopSongs": "Лучшие треки",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, =1{Трек} few{Трека} many{Треков} other{Треков}}",
|
"resourcesSongName": "{count,plural, =1{Трек} few{Трека} many{Треков} other{Треков}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "Недавно добавленные",
|
"resourcesSortByAdded": "Недавно добавленные",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "По исполнителю",
|
"resourcesSortByArtist": "По исполнителям",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "Часто проигрываемые",
|
"resourcesSortByFrequentlyPlayed": "Часто проигрываемые",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "По имени",
|
"resourcesSortByName": "По имени",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "Случайно",
|
"resourcesSortByRandom": "Случайно",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "Недавно проигранные",
|
"resourcesSortByRecentlyPlayed": "Недавно проигранные",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "По году",
|
"resourcesSortByYear": "По году",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "Поиск: {query}",
|
"searchHeaderTitle": "Поиск: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "Поиск",
|
"searchInputPlaceholder": "Поиск",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "Больше…",
|
"searchMoreResults": "Больше…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "Результаты поиска",
|
"searchNowPlayingContext": "Результаты поиска",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsAboutActionsLicenses": "Лицензии",
|
"settingsAboutActionsLicenses": "Лицензии",
|
||||||
"@settingsAboutActionsLicenses": {},
|
"@settingsAboutActionsLicenses": {},
|
||||||
"settingsAboutActionsProjectHomepage": "Сайт проекта",
|
"settingsAboutActionsProjectHomepage": "Сайт проекта",
|
||||||
"@settingsAboutActionsProjectHomepage": {},
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
"settingsAboutName": "О Subtracks",
|
"settingsAboutName": "О Subtracks",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutVersion": "версия {version}",
|
"settingsAboutVersion": "версия {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"version": {
|
"version": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsMusicName": "Музыка",
|
"settingsMusicName": "Музыка",
|
||||||
"@settingsMusicName": {},
|
"@settingsMusicName": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff": "Не отправлять историю воспроизведений",
|
"settingsMusicOptionsScrobbleDescriptionOff": "Не отправлять историю воспроизведений",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn": "Скробблинг истории воспроизведения",
|
"settingsMusicOptionsScrobbleDescriptionOn": "Скробблинг истории воспроизведения",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
||||||
"settingsMusicOptionsScrobbleTitle": "Скробблинг",
|
"settingsMusicOptionsScrobbleTitle": "Скробблинг",
|
||||||
"@settingsMusicOptionsScrobbleTitle": {},
|
"@settingsMusicOptionsScrobbleTitle": {},
|
||||||
"settingsNetworkName": "Сеть",
|
"settingsNetworkName": "Сеть",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "Максимальный битрейт (мобильный интернет)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "Максимальный битрейт (мобильный интернет)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "Максимальный битрейт (Wi-Fi)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "Максимальный битрейт (Wi-Fi)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkOptionsMaxBufferTitle": "Максимальное время буферизации",
|
"settingsNetworkOptionsMaxBufferTitle": "Максимальное время буферизации",
|
||||||
"@settingsNetworkOptionsMaxBufferTitle": {},
|
"@settingsNetworkOptionsMaxBufferTitle": {},
|
||||||
"settingsNetworkOptionsMinBufferTitle": "Минимальное время буферизации",
|
"settingsNetworkOptionsMinBufferTitle": "Минимальное время буферизации",
|
||||||
"@settingsNetworkOptionsMinBufferTitle": {},
|
"@settingsNetworkOptionsMinBufferTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value} кбит/с",
|
"settingsNetworkValuesKbps": "{value} кбит/с",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} секунд",
|
"settingsNetworkValuesSeconds": "{value} секунд",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "Без ограничений",
|
"settingsNetworkValuesUnlimitedKbps": "Без ограничений",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsResetActionsClearImageCache": "Очистить кэш изображения",
|
"settingsResetActionsClearImageCache": "Очистить кэш изображения",
|
||||||
"@settingsResetActionsClearImageCache": {},
|
"@settingsResetActionsClearImageCache": {},
|
||||||
"settingsResetName": "Сброс",
|
"settingsResetName": "Сброс",
|
||||||
"@settingsResetName": {},
|
"@settingsResetName": {},
|
||||||
"settingsServersActionsAdd": "Добавить сервер",
|
"settingsServersActionsAdd": "Добавить сервер",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "Удалить",
|
"settingsServersActionsDelete": "Удалить",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "Редактировать сервер",
|
"settingsServersActionsEdit": "Редактировать сервер",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "Сохранить",
|
"settingsServersActionsSave": "Сохранить",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "Проверить подключение",
|
"settingsServersActionsTestConnection": "Проверить подключение",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "Адрес",
|
"settingsServersFieldsAddress": "Адрес",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "Пароль",
|
"settingsServersFieldsPassword": "Пароль",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "Имя пользователя",
|
"settingsServersFieldsUsername": "Имя пользователя",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "Не удалось подключиться к {address}, проверьте настройки или сервер",
|
"settingsServersMessagesConnectionFailed": "Не удалось подключиться к {address}, проверьте настройки или сервер",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "Подключение к {address} установлено!",
|
"settingsServersMessagesConnectionOk": "Подключение к {address} установлено!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "Серверы",
|
"settingsServersName": "Серверы",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Отправить пароль в виде токена",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Отправить пароль в виде токена",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Отправить пароль в виде текста (устарело, убедитесь, что ваше соединение безопасно!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Отправить пароль в виде текста (устарело, убедитесь, что ваше соединение безопасно!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "Принудительно использовать текстовой пароль",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "Принудительно использовать текстовой пароль",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"settingsAboutShareLogs": "Поделиться журналами",
|
||||||
|
"@settingsAboutShareLogs": {},
|
||||||
|
"settingsAboutChooseLog": "Выбрать файл журнала",
|
||||||
|
"@settingsAboutChooseLog": {},
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault": "Использовать сервер по умолчанию",
|
||||||
|
"@settingsNetworkOptionsStreamFormatServerDefault": {},
|
||||||
|
"actionsDownload": "Скачать",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"actionsDownloadCancel": "Отменить загрузку",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"actionsCancel": "Отменить",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"resourcesSongCount": "{count,plural, =1{{count} трек} other{{count} треки}}",
|
||||||
|
"@resourcesSongCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesSortByAlbum": "По альбомам",
|
||||||
|
"@resourcesSortByAlbum": {},
|
||||||
|
"resourcesSortByTitle": "По заголовку",
|
||||||
|
"@resourcesSortByTitle": {},
|
||||||
|
"resourcesSortByUpdated": "По недавно обновленному",
|
||||||
|
"@resourcesSortByUpdated": {},
|
||||||
|
"resourcesSortByAlbumCount": "По количеству альбомов",
|
||||||
|
"@resourcesSortByAlbumCount": {},
|
||||||
|
"settingsNetworkOptionsOfflineMode": "Автономный режим",
|
||||||
|
"@settingsNetworkOptionsOfflineMode": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOff": "Использовать интернет для синхронизации музыки.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOff": {},
|
||||||
|
"settingsServersFieldsName": "Имя",
|
||||||
|
"@settingsServersFieldsName": {},
|
||||||
|
"actionsDelete": "Удалить",
|
||||||
|
"@actionsDelete": {},
|
||||||
|
"actionsDownloadDelete": "Удалить загруженное",
|
||||||
|
"@actionsDownloadDelete": {},
|
||||||
|
"actionsOk": "ОК",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"controlsShuffle": "Перемешать",
|
||||||
|
"@controlsShuffle": {},
|
||||||
|
"resourcesFilterArtist": "По исполнителю",
|
||||||
|
"@resourcesFilterArtist": {},
|
||||||
|
"resourcesFilterAlbum": "По альбомам",
|
||||||
|
"@resourcesFilterAlbum": {},
|
||||||
|
"resourcesFilterYear": "По годам",
|
||||||
|
"@resourcesFilterYear": {},
|
||||||
|
"resourcesFilterOwner": "По владельцу",
|
||||||
|
"@resourcesFilterOwner": {},
|
||||||
|
"resourcesSongListDeleteAllContent": "Это удалит все загруженные файлы песен.",
|
||||||
|
"@resourcesSongListDeleteAllContent": {},
|
||||||
|
"settingsNetworkOptionsStreamFormat": "Предпочтительный формат потока",
|
||||||
|
"@settingsNetworkOptionsStreamFormat": {},
|
||||||
|
"resourcesSongListDeleteAllTitle": "Удалить загрузки?",
|
||||||
|
"@resourcesSongListDeleteAllTitle": {},
|
||||||
|
"settingsNetworkOptionsOfflineModeOn": "Не использовать интернет для синхронизации или воспроизведения музыки.",
|
||||||
|
"@settingsNetworkOptionsOfflineModeOn": {},
|
||||||
|
"settingsAboutActionsSupport": "Поддержать разработчика",
|
||||||
|
"@settingsAboutActionsSupport": {},
|
||||||
|
"resourcesArtistCount": "{count,plural, =1{{count} исполнитель} other{{count} исполнители}}",
|
||||||
|
"@resourcesArtistCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesPlaylistCount": "{count,plural, =1{{count} плейлист} other{{count} плейлисты}}",
|
||||||
|
"@resourcesPlaylistCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resourcesAlbumCount": "{count,plural, =1{{count} альбом} other{{count} альбомы}}",
|
||||||
|
"@resourcesAlbumCount": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -1,196 +1,230 @@
|
|||||||
{
|
{
|
||||||
"actionsStar": "收藏",
|
"actionsStar": "收藏",
|
||||||
"@actionsStar": {},
|
"@actionsStar": {},
|
||||||
"actionsUnstar": "移除收藏",
|
"actionsUnstar": "移除收藏",
|
||||||
"@actionsUnstar": {},
|
"@actionsUnstar": {},
|
||||||
"messagesNothingHere": "什么都没有…",
|
"messagesNothingHere": "什么都没有…",
|
||||||
"@messagesNothingHere": {},
|
"@messagesNothingHere": {},
|
||||||
"navigationTabsHome": "首页",
|
"navigationTabsHome": "首页",
|
||||||
"@navigationTabsHome": {},
|
"@navigationTabsHome": {},
|
||||||
"navigationTabsLibrary": "所有",
|
"navigationTabsLibrary": "所有",
|
||||||
"@navigationTabsLibrary": {},
|
"@navigationTabsLibrary": {},
|
||||||
"navigationTabsSearch": "搜索",
|
"navigationTabsSearch": "搜索",
|
||||||
"@navigationTabsSearch": {},
|
"@navigationTabsSearch": {},
|
||||||
"navigationTabsSettings": "设置",
|
"navigationTabsSettings": "设置",
|
||||||
"@navigationTabsSettings": {},
|
"@navigationTabsSettings": {},
|
||||||
"resourcesAlbumActionsPlay": "播放专辑",
|
"resourcesAlbumActionsPlay": "播放专辑",
|
||||||
"@resourcesAlbumActionsPlay": {},
|
"@resourcesAlbumActionsPlay": {},
|
||||||
"resourcesAlbumActionsView": "查看专辑",
|
"resourcesAlbumActionsView": "查看专辑",
|
||||||
"@resourcesAlbumActionsView": {},
|
"@resourcesAlbumActionsView": {},
|
||||||
"resourcesAlbumListsSort": "专辑排序",
|
"resourcesAlbumListsSort": "专辑排序",
|
||||||
"@resourcesAlbumListsSort": {},
|
"@resourcesAlbumListsSort": {},
|
||||||
"resourcesAlbumName": "{count,plural, other{专辑}}",
|
"resourcesAlbumName": "{count,plural, other{专辑}}",
|
||||||
"@resourcesAlbumName": {
|
"@resourcesAlbumName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesArtistActionsView": "查看歌手",
|
"resourcesArtistActionsView": "查看歌手",
|
||||||
"@resourcesArtistActionsView": {},
|
"@resourcesArtistActionsView": {},
|
||||||
"resourcesArtistListsSort": "歌手排序",
|
"resourcesArtistListsSort": "歌手排序",
|
||||||
"@resourcesArtistListsSort": {},
|
"@resourcesArtistListsSort": {},
|
||||||
"resourcesArtistName": "{count,plural, other{歌手}}",
|
"resourcesArtistName": "{count,plural, other{歌手}}",
|
||||||
"@resourcesArtistName": {
|
"@resourcesArtistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesFilterGenre": "根据类型",
|
"resourcesFilterGenre": "根据类型",
|
||||||
"@resourcesFilterGenre": {},
|
"@resourcesFilterGenre": {},
|
||||||
"resourcesFilterStarred": "已收藏",
|
"resourcesFilterStarred": "已收藏",
|
||||||
"@resourcesFilterStarred": {},
|
"@resourcesFilterStarred": {},
|
||||||
"resourcesPlaylistActionsPlay": "全部播放",
|
"resourcesPlaylistActionsPlay": "全部播放",
|
||||||
"@resourcesPlaylistActionsPlay": {},
|
"@resourcesPlaylistActionsPlay": {},
|
||||||
"resourcesPlaylistName": "{count,plural, other{播放列表}}",
|
"resourcesPlaylistName": "{count,plural, other{播放列表}}",
|
||||||
"@resourcesPlaylistName": {
|
"@resourcesPlaylistName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesQueueName": "{count,plural, other{队列}}",
|
"resourcesQueueName": "{count,plural, other{队列}}",
|
||||||
"@resourcesQueueName": {
|
"@resourcesQueueName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSongListsArtistTopSongs": "热门歌曲",
|
"resourcesSongListsArtistTopSongs": "热门歌曲",
|
||||||
"@resourcesSongListsArtistTopSongs": {},
|
"@resourcesSongListsArtistTopSongs": {},
|
||||||
"resourcesSongName": "{count,plural, other{歌曲}}",
|
"resourcesSongName": "{count,plural, other{歌曲}}",
|
||||||
"@resourcesSongName": {
|
"@resourcesSongName": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resourcesSortByAdded": "最近添加",
|
"resourcesSortByAdded": "最近添加",
|
||||||
"@resourcesSortByAdded": {},
|
"@resourcesSortByAdded": {},
|
||||||
"resourcesSortByArtist": "根据歌手",
|
"resourcesSortByArtist": "根据歌手",
|
||||||
"@resourcesSortByArtist": {},
|
"@resourcesSortByArtist": {},
|
||||||
"resourcesSortByFrequentlyPlayed": "播放最多",
|
"resourcesSortByFrequentlyPlayed": "播放最多",
|
||||||
"@resourcesSortByFrequentlyPlayed": {},
|
"@resourcesSortByFrequentlyPlayed": {},
|
||||||
"resourcesSortByName": "根据名称",
|
"resourcesSortByName": "根据名称",
|
||||||
"@resourcesSortByName": {},
|
"@resourcesSortByName": {},
|
||||||
"resourcesSortByRandom": "随机",
|
"resourcesSortByRandom": "随机",
|
||||||
"@resourcesSortByRandom": {},
|
"@resourcesSortByRandom": {},
|
||||||
"resourcesSortByRecentlyPlayed": "最近播放",
|
"resourcesSortByRecentlyPlayed": "最近播放",
|
||||||
"@resourcesSortByRecentlyPlayed": {},
|
"@resourcesSortByRecentlyPlayed": {},
|
||||||
"resourcesSortByYear": "根据年份",
|
"resourcesSortByYear": "根据年份",
|
||||||
"@resourcesSortByYear": {},
|
"@resourcesSortByYear": {},
|
||||||
"searchHeaderTitle": "搜索: {query}",
|
"searchHeaderTitle": "搜索: {query}",
|
||||||
"@searchHeaderTitle": {
|
"@searchHeaderTitle": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"query": {
|
"query": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"searchInputPlaceholder": "搜索",
|
"searchInputPlaceholder": "搜索",
|
||||||
"@searchInputPlaceholder": {},
|
"@searchInputPlaceholder": {},
|
||||||
"searchMoreResults": "更多…",
|
"searchMoreResults": "更多…",
|
||||||
"@searchMoreResults": {},
|
"@searchMoreResults": {},
|
||||||
"searchNowPlayingContext": "搜索结果",
|
"searchNowPlayingContext": "搜索结果",
|
||||||
"@searchNowPlayingContext": {},
|
"@searchNowPlayingContext": {},
|
||||||
"settingsAboutActionsLicenses": "许可",
|
"settingsAboutActionsLicenses": "许可",
|
||||||
"@settingsAboutActionsLicenses": {},
|
"@settingsAboutActionsLicenses": {},
|
||||||
"settingsAboutActionsProjectHomepage": "项目地址",
|
"settingsAboutActionsProjectHomepage": "项目地址",
|
||||||
"@settingsAboutActionsProjectHomepage": {},
|
"@settingsAboutActionsProjectHomepage": {},
|
||||||
"settingsAboutName": "关于",
|
"settingsAboutName": "关于",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutVersion": "版本 {version}",
|
"settingsAboutVersion": "版本 {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"version": {
|
"version": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsMusicName": "音乐",
|
"settingsMusicName": "音乐",
|
||||||
"@settingsMusicName": {},
|
"@settingsMusicName": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff": "不记录scrobble历史",
|
"settingsMusicOptionsScrobbleDescriptionOff": "不记录scrobble历史",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
"@settingsMusicOptionsScrobbleDescriptionOff": {},
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble播放历史",
|
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble播放历史",
|
||||||
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
"@settingsMusicOptionsScrobbleDescriptionOn": {},
|
||||||
"settingsMusicOptionsScrobbleTitle": "Scrobble模式",
|
"settingsMusicOptionsScrobbleTitle": "Scrobble模式",
|
||||||
"@settingsMusicOptionsScrobbleTitle": {},
|
"@settingsMusicOptionsScrobbleTitle": {},
|
||||||
"settingsNetworkName": "网络",
|
"settingsNetworkName": "网络",
|
||||||
"@settingsNetworkName": {},
|
"@settingsNetworkName": {},
|
||||||
"settingsNetworkOptionsMaxBitrateMobileTitle": "最大比特率 (3G/4G/5G)",
|
"settingsNetworkOptionsMaxBitrateMobileTitle": "最大比特率 (3G/4G/5G)",
|
||||||
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
|
||||||
"settingsNetworkOptionsMaxBitrateWifiTitle": "最大比特率 (Wi-Fi)",
|
"settingsNetworkOptionsMaxBitrateWifiTitle": "最大比特率 (Wi-Fi)",
|
||||||
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
|
||||||
"settingsNetworkOptionsMaxBufferTitle": "最大缓冲时间",
|
"settingsNetworkOptionsMaxBufferTitle": "最大缓冲时间",
|
||||||
"@settingsNetworkOptionsMaxBufferTitle": {},
|
"@settingsNetworkOptionsMaxBufferTitle": {},
|
||||||
"settingsNetworkOptionsMinBufferTitle": "最小缓冲时间",
|
"settingsNetworkOptionsMinBufferTitle": "最小缓冲时间",
|
||||||
"@settingsNetworkOptionsMinBufferTitle": {},
|
"@settingsNetworkOptionsMinBufferTitle": {},
|
||||||
"settingsNetworkValuesKbps": "{value}kbps",
|
"settingsNetworkValuesKbps": "{value}kbps",
|
||||||
"@settingsNetworkValuesKbps": {
|
"@settingsNetworkValuesKbps": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesSeconds": "{value} 秒",
|
"settingsNetworkValuesSeconds": "{value} 秒",
|
||||||
"@settingsNetworkValuesSeconds": {
|
"@settingsNetworkValuesSeconds": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsNetworkValuesUnlimitedKbps": "不限制",
|
"settingsNetworkValuesUnlimitedKbps": "不限制",
|
||||||
"@settingsNetworkValuesUnlimitedKbps": {},
|
"@settingsNetworkValuesUnlimitedKbps": {},
|
||||||
"settingsResetActionsClearImageCache": "清除图片缓存",
|
"settingsResetActionsClearImageCache": "清除图片缓存",
|
||||||
"@settingsResetActionsClearImageCache": {},
|
"@settingsResetActionsClearImageCache": {},
|
||||||
"settingsResetName": "重置",
|
"settingsResetName": "重置",
|
||||||
"@settingsResetName": {},
|
"@settingsResetName": {},
|
||||||
"settingsServersActionsAdd": "添加服务器",
|
"settingsServersActionsAdd": "添加服务器",
|
||||||
"@settingsServersActionsAdd": {},
|
"@settingsServersActionsAdd": {},
|
||||||
"settingsServersActionsDelete": "删除",
|
"settingsServersActionsDelete": "删除",
|
||||||
"@settingsServersActionsDelete": {},
|
"@settingsServersActionsDelete": {},
|
||||||
"settingsServersActionsEdit": "编辑服务器",
|
"settingsServersActionsEdit": "编辑服务器",
|
||||||
"@settingsServersActionsEdit": {},
|
"@settingsServersActionsEdit": {},
|
||||||
"settingsServersActionsSave": "保存",
|
"settingsServersActionsSave": "保存",
|
||||||
"@settingsServersActionsSave": {},
|
"@settingsServersActionsSave": {},
|
||||||
"settingsServersActionsTestConnection": "测试连接",
|
"settingsServersActionsTestConnection": "测试连接",
|
||||||
"@settingsServersActionsTestConnection": {},
|
"@settingsServersActionsTestConnection": {},
|
||||||
"settingsServersFieldsAddress": "地址",
|
"settingsServersFieldsAddress": "地址",
|
||||||
"@settingsServersFieldsAddress": {},
|
"@settingsServersFieldsAddress": {},
|
||||||
"settingsServersFieldsPassword": "密码",
|
"settingsServersFieldsPassword": "密码",
|
||||||
"@settingsServersFieldsPassword": {},
|
"@settingsServersFieldsPassword": {},
|
||||||
"settingsServersFieldsUsername": "用户名",
|
"settingsServersFieldsUsername": "用户名",
|
||||||
"@settingsServersFieldsUsername": {},
|
"@settingsServersFieldsUsername": {},
|
||||||
"settingsServersMessagesConnectionFailed": "连接到 {address} 失败,检查设置或服务器",
|
"settingsServersMessagesConnectionFailed": "连接到 {address} 失败,检查设置或服务器",
|
||||||
"@settingsServersMessagesConnectionFailed": {
|
"@settingsServersMessagesConnectionFailed": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersMessagesConnectionOk": "连接到 {address} 正常!",
|
"settingsServersMessagesConnectionOk": "连接到 {address} 正常!",
|
||||||
"@settingsServersMessagesConnectionOk": {
|
"@settingsServersMessagesConnectionOk": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"address": {
|
"address": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settingsServersName": "服务器",
|
"settingsServersName": "服务器",
|
||||||
"@settingsServersName": {},
|
"@settingsServersName": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "密码以 token + salt 加密发送",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "密码以 token + salt 加密发送",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "密码以明文发送(不推荐,注意链接安全!)",
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "密码以明文发送(不推荐,注意链接安全!)",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
|
||||||
"settingsServersOptionsForcePlaintextPasswordTitle": "强制使用明文密码",
|
"settingsServersOptionsForcePlaintextPasswordTitle": "强制使用明文密码",
|
||||||
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
|
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
|
||||||
|
"actionsDownload": "下载",
|
||||||
|
"@actionsDownload": {},
|
||||||
|
"actionsDownloadCancel": "取消下载",
|
||||||
|
"@actionsDownloadCancel": {},
|
||||||
|
"actionsDownloadDelete": "删除已下载",
|
||||||
|
"@actionsDownloadDelete": {},
|
||||||
|
"actionsOk": "确定",
|
||||||
|
"@actionsOk": {},
|
||||||
|
"resourcesFilterArtist": "歌手",
|
||||||
|
"@resourcesFilterArtist": {},
|
||||||
|
"resourcesFilterOwner": "所有者",
|
||||||
|
"@resourcesFilterOwner": {},
|
||||||
|
"resourcesSongListDeleteAllTitle": "删除下载?",
|
||||||
|
"@resourcesSongListDeleteAllTitle": {},
|
||||||
|
"resourcesSortByAlbum": "专辑",
|
||||||
|
"@resourcesSortByAlbum": {},
|
||||||
|
"resourcesSortByAlbumCount": "专辑数量",
|
||||||
|
"@resourcesSortByAlbumCount": {},
|
||||||
|
"resourcesSortByUpdated": "最近添加",
|
||||||
|
"@resourcesSortByUpdated": {},
|
||||||
|
"settingsAboutActionsSupport": "支持开发者",
|
||||||
|
"@settingsAboutActionsSupport": {},
|
||||||
|
"resourcesFilterAlbum": "专辑",
|
||||||
|
"@resourcesFilterAlbum": {},
|
||||||
|
"resourcesSortByTitle": "标题",
|
||||||
|
"@resourcesSortByTitle": {},
|
||||||
|
"actionsCancel": "取消",
|
||||||
|
"@actionsCancel": {},
|
||||||
|
"actionsDelete": "删除",
|
||||||
|
"@actionsDelete": {},
|
||||||
|
"resourcesFilterYear": "年份",
|
||||||
|
"@resourcesFilterYear": {},
|
||||||
|
"resourcesSongListDeleteAllContent": "该操作会删除所有已下载的歌曲文件。",
|
||||||
|
"@resourcesSongListDeleteAllContent": {}
|
||||||
}
|
}
|
||||||
209
lib/log.dart
Normal file
209
lib/log.dart
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
// import 'dart:convert';
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:path/path.dart' as p;
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
|
class AnsiColor {
|
||||||
|
/// ANSI Control Sequence Introducer, signals the terminal for new settings.
|
||||||
|
static const ansiEsc = '\x1B[';
|
||||||
|
|
||||||
|
/// Reset all colors and options for current SGRs to terminal defaults.
|
||||||
|
static const ansiDefault = '${ansiEsc}0m';
|
||||||
|
|
||||||
|
final int? fg;
|
||||||
|
final int? bg;
|
||||||
|
final bool color;
|
||||||
|
|
||||||
|
AnsiColor.none()
|
||||||
|
: fg = null,
|
||||||
|
bg = null,
|
||||||
|
color = false;
|
||||||
|
|
||||||
|
AnsiColor.fg(this.fg)
|
||||||
|
: bg = null,
|
||||||
|
color = true;
|
||||||
|
|
||||||
|
AnsiColor.bg(this.bg)
|
||||||
|
: fg = null,
|
||||||
|
color = true;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
if (fg != null) {
|
||||||
|
return '${ansiEsc}38;5;${fg}m';
|
||||||
|
} else if (bg != null) {
|
||||||
|
return '${ansiEsc}48;5;${bg}m';
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String call(String msg) {
|
||||||
|
if (color) {
|
||||||
|
// ignore: unnecessary_brace_in_string_interps
|
||||||
|
return '${this}$msg$ansiDefault';
|
||||||
|
} else {
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AnsiColor toFg() => AnsiColor.fg(bg);
|
||||||
|
|
||||||
|
AnsiColor toBg() => AnsiColor.bg(fg);
|
||||||
|
|
||||||
|
/// Defaults the terminal's foreground color without altering the background.
|
||||||
|
String get resetForeground => color ? '${ansiEsc}39m' : '';
|
||||||
|
|
||||||
|
/// Defaults the terminal's background color without altering the foreground.
|
||||||
|
String get resetBackground => color ? '${ansiEsc}49m' : '';
|
||||||
|
|
||||||
|
static int grey(double level) => 232 + (level.clamp(0.0, 1.0) * 23).round();
|
||||||
|
}
|
||||||
|
|
||||||
|
final levelColors = {
|
||||||
|
Level.FINEST: AnsiColor.fg(AnsiColor.grey(0.5)),
|
||||||
|
Level.FINER: AnsiColor.fg(AnsiColor.grey(0.5)),
|
||||||
|
Level.FINE: AnsiColor.fg(AnsiColor.grey(0.5)),
|
||||||
|
Level.CONFIG: AnsiColor.fg(81),
|
||||||
|
Level.INFO: AnsiColor.fg(12),
|
||||||
|
Level.WARNING: AnsiColor.fg(208),
|
||||||
|
Level.SEVERE: AnsiColor.fg(196),
|
||||||
|
Level.SHOUT: AnsiColor.fg(199),
|
||||||
|
};
|
||||||
|
|
||||||
|
class LogData {
|
||||||
|
final String? message;
|
||||||
|
final Object? data;
|
||||||
|
|
||||||
|
const LogData(this.message, this.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
String _format(
|
||||||
|
LogRecord event, {
|
||||||
|
bool color = false,
|
||||||
|
bool time = true,
|
||||||
|
bool level = true,
|
||||||
|
bool redact = true,
|
||||||
|
}) {
|
||||||
|
var message = '';
|
||||||
|
if (time) message += '${event.time.toIso8601String()} ';
|
||||||
|
if (level) message += '${event.level.name} ';
|
||||||
|
|
||||||
|
final object = event.object;
|
||||||
|
if (object is LogData) {
|
||||||
|
message += '${object.message}';
|
||||||
|
message += '\n${object.data}';
|
||||||
|
} else if (object != null) {
|
||||||
|
message += 'Object';
|
||||||
|
message += '\n$object';
|
||||||
|
} else {
|
||||||
|
message += event.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.error != null) {
|
||||||
|
message += '\n${event.error}';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (redact) {
|
||||||
|
message = _redactUrl(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.stackTrace != null) {
|
||||||
|
message += '\n${event.stackTrace}';
|
||||||
|
}
|
||||||
|
|
||||||
|
return color
|
||||||
|
? message.split('\n').map((e) => levelColors[event.level]!(e)).join('\n')
|
||||||
|
: message;
|
||||||
|
}
|
||||||
|
|
||||||
|
String _redactUrl(String message) {
|
||||||
|
if (!_queryReplace('u').hasMatch(message)) {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
message = _redactParam(message, 'u');
|
||||||
|
message = _redactParam(message, 'p');
|
||||||
|
message = _redactParam(message, 's');
|
||||||
|
message = _redactParam(message, 't');
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegExp _queryReplace(String key) => RegExp('$key=([^&|\\n|\\t\\s]+)');
|
||||||
|
|
||||||
|
String _redactParam(String url, String key) =>
|
||||||
|
url.replaceAll(_queryReplace(key), '$key=REDACTED');
|
||||||
|
|
||||||
|
Future<Directory> logDirectory() async {
|
||||||
|
return Directory(
|
||||||
|
p.join((await getApplicationDocumentsDirectory()).path, 'logs'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<File>> logFiles() async {
|
||||||
|
final dir = await logDirectory();
|
||||||
|
return dir.listSync().whereType<File>().toList()
|
||||||
|
..sort(
|
||||||
|
(a, b) => b.statSync().modified.compareTo(a.statSync().modified),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
File _currentLogFile(String logDir) {
|
||||||
|
final now = DateTime.now();
|
||||||
|
return File(p.join(logDir, '${now.year}-${now.month}-${now.day}.txt'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _printFile(String event, String logDir) async {
|
||||||
|
final file = _currentLogFile(logDir);
|
||||||
|
|
||||||
|
if (!event.endsWith('\n')) {
|
||||||
|
event += '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
await file.writeAsString(event, mode: FileMode.writeOnlyAppend, flush: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _printDebug(LogRecord event) {
|
||||||
|
// ignore: avoid_print
|
||||||
|
print(_format(event, color: true, time: false, level: false, redact: false));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _printRelease(LogRecord event, String logDir) async {
|
||||||
|
await _printFile(
|
||||||
|
_format(event, color: false, time: true, level: true, redact: true),
|
||||||
|
logDir,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final log = Logger('default');
|
||||||
|
|
||||||
|
Future<void> initLogging() async {
|
||||||
|
final dir = (await logDirectory())..create();
|
||||||
|
|
||||||
|
final file = _currentLogFile(dir.path);
|
||||||
|
if (!(await file.exists())) {
|
||||||
|
await file.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
final files = await logFiles();
|
||||||
|
if (files.length > 7) {
|
||||||
|
for (var file in files.slice(7)) {
|
||||||
|
await file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.root.level = kDebugMode ? Level.ALL : Level.INFO;
|
||||||
|
Logger.root.onRecord.asyncMap((event) async {
|
||||||
|
if (kDebugMode) {
|
||||||
|
_printDebug(event);
|
||||||
|
} else {
|
||||||
|
await _printRelease(event, dir.path);
|
||||||
|
}
|
||||||
|
}).listen((_) {}, cancelOnError: false);
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import 'package:stack_trace/stack_trace.dart' as stack_trace;
|
|||||||
import 'package:worker_manager/worker_manager.dart';
|
import 'package:worker_manager/worker_manager.dart';
|
||||||
|
|
||||||
import 'app/app.dart';
|
import 'app/app.dart';
|
||||||
|
import 'log.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
// TOOD: probably remove before live
|
// TOOD: probably remove before live
|
||||||
@ -18,5 +19,8 @@ void main() async {
|
|||||||
await Executor().warmUp();
|
await Executor().warmUp();
|
||||||
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
await initLogging();
|
||||||
|
|
||||||
runApp(const ProviderScope(child: MyApp()));
|
runApp(const ProviderScope(child: MyApp()));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,7 +68,8 @@ enum QueueContextType {
|
|||||||
album('album'),
|
album('album'),
|
||||||
playlist('playlist'),
|
playlist('playlist'),
|
||||||
library('library'),
|
library('library'),
|
||||||
genre('genre');
|
genre('genre'),
|
||||||
|
artist('artist');
|
||||||
|
|
||||||
const QueueContextType(this.value);
|
const QueueContextType(this.value);
|
||||||
final String value;
|
final String value;
|
||||||
|
|||||||
@ -28,6 +28,7 @@ const _$QueueContextTypeEnumMap = {
|
|||||||
QueueContextType.playlist: 'playlist',
|
QueueContextType.playlist: 'playlist',
|
||||||
QueueContextType.library: 'library',
|
QueueContextType.library: 'library',
|
||||||
QueueContextType.genre: 'genre',
|
QueueContextType.genre: 'genre',
|
||||||
|
QueueContextType.artist: 'artist',
|
||||||
};
|
};
|
||||||
|
|
||||||
_$_MediaItemData _$$_MediaItemDataFromJson(Map<String, dynamic> json) =>
|
_$_MediaItemData _$$_MediaItemDataFromJson(Map<String, dynamic> json) =>
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import 'dart:math';
|
|||||||
import 'package:audio_service/audio_service.dart';
|
import 'package:audio_service/audio_service.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:drift/drift.dart' show Value;
|
import 'package:drift/drift.dart' show Value;
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:just_audio/just_audio.dart';
|
import 'package:just_audio/just_audio.dart';
|
||||||
import 'package:pool/pool.dart';
|
import 'package:pool/pool.dart';
|
||||||
@ -14,6 +13,7 @@ import 'package:synchronized/synchronized.dart';
|
|||||||
|
|
||||||
import '../cache/image_cache.dart';
|
import '../cache/image_cache.dart';
|
||||||
import '../database/database.dart';
|
import '../database/database.dart';
|
||||||
|
import '../log.dart';
|
||||||
import '../models/music.dart';
|
import '../models/music.dart';
|
||||||
import '../models/query.dart';
|
import '../models/query.dart';
|
||||||
import '../models/support.dart';
|
import '../models/support.dart';
|
||||||
@ -122,6 +122,10 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_player.playbackEventStream.doOnError((e, st) async {
|
||||||
|
log.warning('playbackEventStream', e, st);
|
||||||
|
});
|
||||||
|
|
||||||
shuffleIndicies.listen((value) {
|
shuffleIndicies.listen((value) {
|
||||||
playbackState.add(playbackState.value.copyWith(
|
playbackState.add(playbackState.value.copyWith(
|
||||||
shuffleMode: value != null
|
shuffleMode: value != null
|
||||||
@ -137,7 +141,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
_player.processingStateStream.listen((event) async {
|
_player.processingStateStream.listen((event) async {
|
||||||
if (event == ProcessingState.completed) {
|
if (event == ProcessingState.completed) {
|
||||||
if (_audioSource.length > 0) {
|
if (_audioSource.length > 0) {
|
||||||
yell('completed');
|
log.fine('completed');
|
||||||
await stop();
|
await stop();
|
||||||
await seek(Duration.zero);
|
await seek(Duration.zero);
|
||||||
}
|
}
|
||||||
@ -386,7 +390,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
mediaItem.add(slice.current!.mediaItem);
|
mediaItem.add(slice.current!.mediaItem);
|
||||||
queue.add(list.map((e) => e.mediaItem).toList());
|
queue.add(list.map((e) => e.mediaItem).toList());
|
||||||
|
|
||||||
yell('addAll');
|
log.fine('addAll');
|
||||||
await _audioSource.addAll(list.map((e) => e.audioSource).toList());
|
await _audioSource.addAll(list.map((e) => e.audioSource).toList());
|
||||||
await _player.seek(Duration.zero, index: list.indexOf(slice.current!));
|
await _player.seek(Duration.zero, index: list.indexOf(slice.current!));
|
||||||
}
|
}
|
||||||
@ -410,7 +414,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
final sourceNeedsPrev = sourceIndex == 0;
|
final sourceNeedsPrev = sourceIndex == 0;
|
||||||
|
|
||||||
if (sourceNeedsNext && slice.next != null) {
|
if (sourceNeedsNext && slice.next != null) {
|
||||||
yell('add');
|
log.fine('add');
|
||||||
await _audioSource.add(slice.next!.audioSource);
|
await _audioSource.add(slice.next!.audioSource);
|
||||||
}
|
}
|
||||||
if (sourceNeedsPrev && slice.prev != null) {
|
if (sourceNeedsPrev && slice.prev != null) {
|
||||||
@ -497,7 +501,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _insertFirstAudioSource(AudioSource source) {
|
Future<void> _insertFirstAudioSource(AudioSource source) {
|
||||||
yell('insert');
|
log.fine('insert');
|
||||||
final wait = _audioSource.insert(0, source);
|
final wait = _audioSource.insert(0, source);
|
||||||
_currentIndexIgnore.add(1);
|
_currentIndexIgnore.add(1);
|
||||||
return wait;
|
return wait;
|
||||||
@ -505,20 +509,20 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
|
|
||||||
Future<void> _pruneAudioSources(int keepIndex) async {
|
Future<void> _pruneAudioSources(int keepIndex) async {
|
||||||
if (keepIndex > 0) {
|
if (keepIndex > 0) {
|
||||||
yell('removeRange 0');
|
log.fine('removeRange 0');
|
||||||
final wait = _audioSource.removeRange(0, keepIndex);
|
final wait = _audioSource.removeRange(0, keepIndex);
|
||||||
_currentIndexIgnore.add(0);
|
_currentIndexIgnore.add(0);
|
||||||
await wait;
|
await wait;
|
||||||
}
|
}
|
||||||
if (_audioSource.length > 1) {
|
if (_audioSource.length > 1) {
|
||||||
yell('removeRange 1');
|
log.fine('removeRange 1');
|
||||||
await _audioSource.removeRange(1, _audioSource.length);
|
await _audioSource.removeRange(1, _audioSource.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _clearAudioSource([bool clearMetadata = false]) async {
|
Future<void> _clearAudioSource([bool clearMetadata = false]) async {
|
||||||
// await _player.stop();
|
// await _player.stop();
|
||||||
yell('_clearAudioSource');
|
log.fine('_clearAudioSource');
|
||||||
await _audioSource.clear();
|
await _audioSource.clear();
|
||||||
|
|
||||||
if (clearMetadata) {
|
if (clearMetadata) {
|
||||||
@ -697,11 +701,3 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void yell(String msg) {
|
|
||||||
if (kDebugMode) {
|
|
||||||
print('=================================================================<');
|
|
||||||
print(msg);
|
|
||||||
print('=================================================================>');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -214,7 +214,7 @@ class DownloadService extends _$DownloadService {
|
|||||||
Future<void> deleteAll(int sourceId) async {
|
Future<void> deleteAll(int sourceId) async {
|
||||||
final db = ref.read(databaseProvider);
|
final db = ref.read(databaseProvider);
|
||||||
|
|
||||||
final albumIds = await db.albumIdsWithDownloaded(sourceId).get();
|
final albumIds = await db.albumIdsWithDownloadStatus(sourceId).get();
|
||||||
for (var id in albumIds) {
|
for (var id in albumIds) {
|
||||||
await deleteAlbum(await (db.albumById(sourceId, id)).getSingle());
|
await deleteAlbum(await (db.albumById(sourceId, id)).getSingle());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ part of 'download_service.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$downloadServiceHash() => r'92e963b5c070f4d1edb0cd81899b16393c2b9a70';
|
String _$downloadServiceHash() => r'c72c49f980e307f3013467e76b6564d14a34a736';
|
||||||
|
|
||||||
/// See also [DownloadService].
|
/// See also [DownloadService].
|
||||||
@ProviderFor(DownloadService)
|
@ProviderFor(DownloadService)
|
||||||
|
|||||||
@ -46,13 +46,15 @@ class SettingsService extends _$SettingsService {
|
|||||||
features: IList(),
|
features: IList(),
|
||||||
username: subsonic.username.value,
|
username: subsonic.username.value,
|
||||||
password: subsonic.password.value,
|
password: subsonic.password.value,
|
||||||
useTokenAuth: true,
|
useTokenAuth: subsonic.useTokenAuth.value,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
createdAt: DateTime.now(),
|
createdAt: DateTime.now(),
|
||||||
),
|
),
|
||||||
ref.read(httpClientProvider),
|
ref.read(httpClientProvider),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
await client.test();
|
||||||
|
|
||||||
final features = IList([
|
final features = IList([
|
||||||
if (await client.testFeature(SubsonicFeature.emptyQuerySearch))
|
if (await client.testFeature(SubsonicFeature.emptyQuerySearch))
|
||||||
SubsonicFeature.emptyQuerySearch,
|
SubsonicFeature.emptyQuerySearch,
|
||||||
@ -66,6 +68,10 @@ class SettingsService extends _$SettingsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateSource(SubsonicSettings source) async {
|
Future<void> updateSource(SubsonicSettings source) async {
|
||||||
|
final client = SubsonicClient(source, ref.read(httpClientProvider));
|
||||||
|
|
||||||
|
await client.test();
|
||||||
|
|
||||||
await _db.updateSource(source);
|
await _db.updateSource(source);
|
||||||
await init();
|
await init();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,7 +31,7 @@ class SyncService extends _$SyncService {
|
|||||||
final source = ref.read(musicSourceProvider);
|
final source = ref.read(musicSourceProvider);
|
||||||
final db = ref.read(databaseProvider);
|
final db = ref.read(databaseProvider);
|
||||||
|
|
||||||
final ids = <String>[];
|
final ids = <String>{};
|
||||||
await for (var artists in source.allArtists()) {
|
await for (var artists in source.allArtists()) {
|
||||||
ids.addAll(artists.map((e) => e.id.value));
|
ids.addAll(artists.map((e) => e.id.value));
|
||||||
await db.saveArtists(artists);
|
await db.saveArtists(artists);
|
||||||
@ -44,7 +44,7 @@ class SyncService extends _$SyncService {
|
|||||||
final source = ref.read(musicSourceProvider);
|
final source = ref.read(musicSourceProvider);
|
||||||
final db = ref.read(databaseProvider);
|
final db = ref.read(databaseProvider);
|
||||||
|
|
||||||
final ids = <String>[];
|
final ids = <String>{};
|
||||||
await for (var albums in source.allAlbums()) {
|
await for (var albums in source.allAlbums()) {
|
||||||
ids.addAll(albums.map((e) => e.id.value));
|
ids.addAll(albums.map((e) => e.id.value));
|
||||||
await db.saveAlbums(albums);
|
await db.saveAlbums(albums);
|
||||||
@ -57,7 +57,7 @@ class SyncService extends _$SyncService {
|
|||||||
final source = ref.read(musicSourceProvider);
|
final source = ref.read(musicSourceProvider);
|
||||||
final db = ref.read(databaseProvider);
|
final db = ref.read(databaseProvider);
|
||||||
|
|
||||||
final ids = <String>[];
|
final ids = <String>{};
|
||||||
await for (var playlists in source.allPlaylists()) {
|
await for (var playlists in source.allPlaylists()) {
|
||||||
ids.addAll(playlists.map((e) => e.playist.id.value));
|
ids.addAll(playlists.map((e) => e.playist.id.value));
|
||||||
await db.savePlaylists(playlists);
|
await db.savePlaylists(playlists);
|
||||||
@ -70,7 +70,7 @@ class SyncService extends _$SyncService {
|
|||||||
final source = ref.read(musicSourceProvider);
|
final source = ref.read(musicSourceProvider);
|
||||||
final db = ref.read(databaseProvider);
|
final db = ref.read(databaseProvider);
|
||||||
|
|
||||||
final ids = <String>[];
|
final ids = <String>{};
|
||||||
await for (var songs in source.allSongs()) {
|
await for (var songs in source.allSongs()) {
|
||||||
ids.addAll(songs.map((e) => e.id.value));
|
ids.addAll(songs.map((e) => e.id.value));
|
||||||
await db.saveSongs(songs);
|
await db.saveSongs(songs);
|
||||||
|
|||||||
@ -6,7 +6,7 @@ part of 'sync_service.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$syncServiceHash() => r'2b8da374c3143bc56f17115440d57bc70468a17e';
|
String _$syncServiceHash() => r'58ebee4e6f055b64ee6789ae43d63c0e15c679e0';
|
||||||
|
|
||||||
/// See also [SyncService].
|
/// See also [SyncService].
|
||||||
@ProviderFor(SyncService)
|
@ProviderFor(SyncService)
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:rxdart/rxdart.dart';
|
||||||
|
|
||||||
import '../database/database.dart';
|
import '../database/database.dart';
|
||||||
|
import '../log.dart';
|
||||||
import '../state/settings.dart';
|
import '../state/settings.dart';
|
||||||
|
|
||||||
abstract class BaseMusicSource {
|
abstract class BaseMusicSource {
|
||||||
@ -40,25 +42,33 @@ class MusicSource implements BaseMusicSource {
|
|||||||
@override
|
@override
|
||||||
Stream<Iterable<AlbumsCompanion>> allAlbums() {
|
Stream<Iterable<AlbumsCompanion>> allAlbums() {
|
||||||
_testOnline();
|
_testOnline();
|
||||||
return _source.allAlbums();
|
return _source
|
||||||
|
.allAlbums()
|
||||||
|
.doOnError((e, st) => log.severe('allAlbums', e, st));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<Iterable<ArtistsCompanion>> allArtists() {
|
Stream<Iterable<ArtistsCompanion>> allArtists() {
|
||||||
_testOnline();
|
_testOnline();
|
||||||
return _source.allArtists();
|
return _source
|
||||||
|
.allArtists()
|
||||||
|
.doOnError((e, st) => log.severe('allArtists', e, st));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<Iterable<PlaylistWithSongsCompanion>> allPlaylists() {
|
Stream<Iterable<PlaylistWithSongsCompanion>> allPlaylists() {
|
||||||
_testOnline();
|
_testOnline();
|
||||||
return _source.allPlaylists();
|
return _source
|
||||||
|
.allPlaylists()
|
||||||
|
.doOnError((e, st) => log.severe('allPlaylists', e, st));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<Iterable<SongsCompanion>> allSongs() {
|
Stream<Iterable<SongsCompanion>> allSongs() {
|
||||||
_testOnline();
|
_testOnline();
|
||||||
return _source.allSongs();
|
return _source
|
||||||
|
.allSongs()
|
||||||
|
.doOnError((e, st) => log.severe('allSongs', e, st));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -82,10 +92,4 @@ class MusicSource implements BaseMusicSource {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Uri streamUri(String songId) => _source.streamUri(songId);
|
Uri streamUri(String songId) => _source.streamUri(songId);
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(other) => other is BaseMusicSource && (other.id == id);
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => id;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import 'package:crypto/crypto.dart';
|
|||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:xml/xml.dart';
|
import 'package:xml/xml.dart';
|
||||||
|
|
||||||
|
import '../../log.dart';
|
||||||
import '../../models/settings.dart';
|
import '../../models/settings.dart';
|
||||||
import 'xml.dart';
|
import 'xml.dart';
|
||||||
|
|
||||||
@ -89,12 +90,16 @@ class SubsonicClient {
|
|||||||
final subsonicResponse =
|
final subsonicResponse =
|
||||||
SubsonicResponse(XmlDocument.parse(utf8.decode(res.bodyBytes)));
|
SubsonicResponse(XmlDocument.parse(utf8.decode(res.bodyBytes)));
|
||||||
if (subsonicResponse.status == Status.failed) {
|
if (subsonicResponse.status == Status.failed) {
|
||||||
throw SubsonicException(subsonicResponse.xml);
|
final error = SubsonicException(subsonicResponse.xml);
|
||||||
|
log.severe('Subsonic error', error);
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return subsonicResponse;
|
return subsonicResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> test() => get('ping');
|
||||||
|
|
||||||
Future<bool> testFeature(SubsonicFeature feature) async {
|
Future<bool> testFeature(SubsonicFeature feature) async {
|
||||||
switch (feature) {
|
switch (feature) {
|
||||||
case SubsonicFeature.emptyQuerySearch:
|
case SubsonicFeature.emptyQuerySearch:
|
||||||
|
|||||||
34
pubspec.lock
34
pubspec.lock
@ -290,6 +290,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.6.3"
|
version: "1.6.3"
|
||||||
|
cross_file:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: cross_file
|
||||||
|
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.3+4"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -679,7 +687,7 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "2.0.1"
|
||||||
logging:
|
logging:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: logging
|
name: logging
|
||||||
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
|
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
|
||||||
@ -834,10 +842,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_windows
|
name: path_provider_windows
|
||||||
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
|
sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.5"
|
version: "2.1.6"
|
||||||
pedantic:
|
pedantic:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -950,6 +958,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.27.7"
|
version: "0.27.7"
|
||||||
|
share_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: share_plus
|
||||||
|
sha256: "322a1ec9d9fe07e2e2252c098ce93d12dbd06133cc4c00ffe6a4ef505c295c17"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "7.0.0"
|
||||||
|
share_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_platform_interface
|
||||||
|
sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.2.1"
|
||||||
shelf:
|
shelf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1319,10 +1343,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4
|
sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.4"
|
version: "4.1.4"
|
||||||
worker_manager:
|
worker_manager:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@ -4,7 +4,7 @@ homepage: https://github.com/austinried/subtracks
|
|||||||
repository: https://github.com/austinried/subtracks
|
repository: https://github.com/austinried/subtracks
|
||||||
issue_tracker: https://github.com/austinried/subtracks/issues
|
issue_tracker: https://github.com/austinried/subtracks/issues
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 2.0.0-alpha.1+10
|
version: 2.0.0-alpha.3+12
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.19.2 <3.0.0'
|
sdk: '>=2.19.2 <3.0.0'
|
||||||
@ -57,6 +57,8 @@ dependencies:
|
|||||||
connectivity_plus: ^3.0.4
|
connectivity_plus: ^3.0.4
|
||||||
package_info_plus: ^3.1.1
|
package_info_plus: ^3.1.1
|
||||||
url_launcher: ^6.1.10
|
url_launcher: ^6.1.10
|
||||||
|
logging: ^1.1.1
|
||||||
|
share_plus: ^7.0.0
|
||||||
|
|
||||||
# https://github.com/dart-lang/intl/issues/522#issuecomment-1469961807
|
# https://github.com/dart-lang/intl/issues/522#issuecomment-1469961807
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user