From 165c84fd7ebcf083c3ee14b3851d3b4132f99cec Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Sun, 10 Mar 2024 20:32:32 +0100 Subject: [PATCH 001/102] fix login for 10.9 servers --- lib/models/jellyfin_models.dart | 8 +- lib/models/jellyfin_models.g.dart | 16 +-- lib/services/jellyfin_api.chopper.dart | 100 +++++++++------ lib/services/jellyfin_api.dart | 36 ++---- lib/services/jellyfin_api_helper.dart | 167 +++++++------------------ pubspec.lock | 4 +- pubspec.yaml | 4 +- 7 files changed, 130 insertions(+), 205 deletions(-) diff --git a/lib/models/jellyfin_models.dart b/lib/models/jellyfin_models.dart index b91f6dd68..ad74b0a20 100644 --- a/lib/models/jellyfin_models.dart +++ b/lib/models/jellyfin_models.dart @@ -778,13 +778,13 @@ class ClientCapabilities { List? supportedCommands; @HiveField(2) - bool supportsMediaControl; + bool? supportsMediaControl; @HiveField(3) - bool supportsPersistentIdentifier; + bool? supportsPersistentIdentifier; @HiveField(4) - bool supportsSync; + bool? supportsSync; /// Defines the MediaBrowser.Model.Dlna.DeviceProfile. @HiveField(5) @@ -796,7 +796,7 @@ class ClientCapabilities { // Below fields were added during null safety migration (0.5.0) @HiveField(7) - bool supportsContentUploading; + bool? supportsContentUploading; @HiveField(8) String? messageCallbackUrl; diff --git a/lib/models/jellyfin_models.g.dart b/lib/models/jellyfin_models.g.dart index be10ba90b..95c307309 100644 --- a/lib/models/jellyfin_models.g.dart +++ b/lib/models/jellyfin_models.g.dart @@ -618,12 +618,12 @@ class ClientCapabilitiesAdapter extends TypeAdapter { return ClientCapabilities( playableMediaTypes: (fields[0] as List?)?.cast(), supportedCommands: (fields[1] as List?)?.cast(), - supportsMediaControl: fields[2] as bool, - supportsPersistentIdentifier: fields[3] as bool, - supportsSync: fields[4] as bool, + supportsMediaControl: fields[2] as bool?, + supportsPersistentIdentifier: fields[3] as bool?, + supportsSync: fields[4] as bool?, deviceProfile: fields[5] as DeviceProfile?, iconUrl: fields[6] as String?, - supportsContentUploading: fields[7] as bool, + supportsContentUploading: fields[7] as bool?, messageCallbackUrl: fields[8] as String?, appStoreUrl: fields[9] as String?, ); @@ -3060,16 +3060,16 @@ ClientCapabilities _$ClientCapabilitiesFromJson(Map json) => ClientCapabilities( supportedCommands: (json['SupportedCommands'] as List?) ?.map((e) => e as String) .toList(), - supportsMediaControl: json['SupportsMediaControl'] as bool, + supportsMediaControl: json['SupportsMediaControl'] as bool?, supportsPersistentIdentifier: - json['SupportsPersistentIdentifier'] as bool, - supportsSync: json['SupportsSync'] as bool, + json['SupportsPersistentIdentifier'] as bool?, + supportsSync: json['SupportsSync'] as bool?, deviceProfile: json['DeviceProfile'] == null ? null : DeviceProfile.fromJson( Map.from(json['DeviceProfile'] as Map)), iconUrl: json['IconUrl'] as String?, - supportsContentUploading: json['SupportsContentUploading'] as bool, + supportsContentUploading: json['SupportsContentUploading'] as bool?, messageCallbackUrl: json['MessageCallbackUrl'] as String?, appStoreUrl: json['AppStoreUrl'] as String?, ); diff --git a/lib/services/jellyfin_api.chopper.dart b/lib/services/jellyfin_api.chopper.dart index 76a5fa336..29164e4f8 100644 --- a/lib/services/jellyfin_api.chopper.dart +++ b/lib/services/jellyfin_api.chopper.dart @@ -6,6 +6,7 @@ part of 'jellyfin_api.dart'; // ChopperGenerator // ************************************************************************** +// coverage:ignore-file // ignore_for_file: type=lint class _$JellyfinApi extends JellyfinApi { _$JellyfinApi([ChopperClient? client]) { @@ -14,25 +15,27 @@ class _$JellyfinApi extends JellyfinApi { } @override - final definitionType = JellyfinApi; + final Type definitionType = JellyfinApi; @override - Future getPublicUsers() { + Future getPublicUsers() async { final Uri $url = Uri.parse('/Users/Public'); final Request $request = Request( 'GET', $url, client.baseUrl, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override - Future authenticateViaName(Map usernameAndPassword) { + Future authenticateViaName( + Map usernameAndPassword) async { final Uri $url = Uri.parse('/Users/AuthenticateByName'); final $body = usernameAndPassword; final Request $request = Request( @@ -41,18 +44,19 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, body: $body, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override Future getAlbumPrimaryImage({ required String id, String format = "webp", - }) { + }) async { final Uri $url = Uri.parse('/Items/${id}/Images/Primary'); final Map $params = {'format': format}; final Request $request = Request( @@ -61,26 +65,28 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override - Future getViews(String id) { + Future getViews(String id) async { final Uri $url = Uri.parse('/Users/${id}/Views'); final Request $request = Request( 'GET', $url, client.baseUrl, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override @@ -100,7 +106,7 @@ class _$JellyfinApi extends JellyfinApi { String? filters, int? startIndex, int? limit, - }) { + }) async { final Uri $url = Uri.parse('/Users/${userId}/Items'); final Map $params = { 'IncludeItemTypes': includeItemTypes, @@ -124,11 +130,12 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override @@ -136,7 +143,7 @@ class _$JellyfinApi extends JellyfinApi { required String id, required String userId, required int limit, - }) { + }) async { final Uri $url = Uri.parse('/Items/${id}/InstantMix'); final Map $params = { 'userId': userId, @@ -148,36 +155,38 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override Future getItemById({ required String userId, required String itemId, - }) { + }) async { final Uri $url = Uri.parse('/Users/${userId}/Items/${itemId}'); final Request $request = Request( 'GET', $url, client.baseUrl, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override Future getPlaybackInfo({ required String id, required String userId, - }) { + }) async { final Uri $url = Uri.parse('/Items/${id}/PlaybackInfo'); final Map $params = {'userId': userId}; final Request $request = Request( @@ -186,18 +195,19 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override Future updateItem({ required String itemId, required BaseItemDto newItem, - }) { + }) async { final Uri $url = Uri.parse('/Items/${itemId}'); final $body = newItem; final Request $request = Request( @@ -206,14 +216,16 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, body: $body, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, ); + return $response.bodyOrThrow; } @override - Future startPlayback(PlaybackProgressInfo playbackProgressInfo) { + Future startPlayback( + PlaybackProgressInfo playbackProgressInfo) async { final Uri $url = Uri.parse('/Sessions/Playing'); final $body = playbackProgressInfo; final Request $request = Request( @@ -222,15 +234,16 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, body: $body, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, ); + return $response.bodyOrThrow; } @override Future playbackStatusUpdate( - PlaybackProgressInfo playbackProgressInfo) { + PlaybackProgressInfo playbackProgressInfo) async { final Uri $url = Uri.parse('/Sessions/Playing/Progress'); final $body = playbackProgressInfo; final Request $request = Request( @@ -239,15 +252,16 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, body: $body, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, ); + return $response.bodyOrThrow; } @override Future playbackStatusStopped( - PlaybackProgressInfo playbackProgressInfo) { + PlaybackProgressInfo playbackProgressInfo) async { final Uri $url = Uri.parse('/Sessions/Playing/Stopped'); final $body = playbackProgressInfo; final Request $request = Request( @@ -256,10 +270,11 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, body: $body, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, ); + return $response.bodyOrThrow; } @override @@ -270,7 +285,7 @@ class _$JellyfinApi extends JellyfinApi { String? parentId, bool? recursive, String? fields = defaultFields, - }) { + }) async { final Uri $url = Uri.parse('/Playlists/${playlistId}/Items'); final Map $params = { 'UserId': userId, @@ -285,15 +300,16 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override - Future createNewPlaylist({required NewPlaylist newPlaylist}) { + Future createNewPlaylist({required NewPlaylist newPlaylist}) async { final Uri $url = Uri.parse('/Playlists'); final $body = newPlaylist; final Request $request = Request( @@ -302,11 +318,12 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, body: $body, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override @@ -367,7 +384,7 @@ class _$JellyfinApi extends JellyfinApi { int? startIndex, int? limit, required String userId, - }) { + }) async { final Uri $url = Uri.parse('/Artists/AlbumArtists'); final Map $params = { 'IncludeItemTypes': includeItemTypes, @@ -389,11 +406,12 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override @@ -404,7 +422,7 @@ class _$JellyfinApi extends JellyfinApi { String? searchTerm, int? startIndex, int? limit, - }) { + }) async { final Uri $url = Uri.parse('/Genres'); final Map $params = { 'IncludeItemTypes': includeItemTypes, @@ -420,60 +438,64 @@ class _$JellyfinApi extends JellyfinApi { client.baseUrl, parameters: $params, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override Future addFavourite({ required String userId, required String itemId, - }) { + }) async { final Uri $url = Uri.parse('/Users/${userId}/FavoriteItems/${itemId}'); final Request $request = Request( 'POST', $url, client.baseUrl, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override Future removeFavourite({ required String userId, required String itemId, - }) { + }) async { final Uri $url = Uri.parse('/Users/${userId}/FavoriteItems/${itemId}'); final Request $request = Request( 'DELETE', $url, client.baseUrl, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, responseConverter: JsonConverter.responseFactory, ); + return $response.bodyOrThrow; } @override - Future logout() { + Future logout() async { final Uri $url = Uri.parse('/Sessions/Logout'); final Request $request = Request( 'POST', $url, client.baseUrl, ); - return client.send( + final Response $response = await client.send( $request, requestConverter: JsonConverter.requestFactory, ); + return $response.bodyOrThrow; } } diff --git a/lib/services/jellyfin_api.dart b/lib/services/jellyfin_api.dart index 39f96abb1..b0c581355 100644 --- a/lib/services/jellyfin_api.dart +++ b/lib/services/jellyfin_api.dart @@ -387,33 +387,15 @@ abstract class JellyfinApi extends ChopperService { pathSegments: baseUri.pathSegments.followedBy(request.uri.pathSegments)); - // tokenHeader will be null if the user isn't logged in. - // If we send a null tokenHeader while logging in, the login will always fail. - if (tokenHeader == null) { - return request.copyWith( - uri: baseUri, - headers: { - "Content-Type": "application/json", - "X-Emby-Authorization": authHeader, - }, - ); - } else { - return request.copyWith( - uri: baseUri, - headers: { - "Content-Type": "application/json", - "X-Emby-Authorization": authHeader, - "X-Emby-Token": tokenHeader, - }, - ); - } + return request.copyWith( + uri: baseUri, + headers: { + "Content-Type": "application/json", + "Authorization": authHeader, + }, + ); }, - /// Adds X-Emby-Authentication header - // (Request request) async { - // return request.copyWith( - // headers: {"X-Emby-Authentication": await getAuthHeader()}); - // }, HttpAggregateLoggingInterceptor(), ], ); @@ -435,6 +417,10 @@ Future getAuthHeader() async { authHeader = '${authHeader}UserId="${finampUserHelper.currentUser!.id}", '; } + if (finampUserHelper.currentUser?.accessToken != null) { + authHeader = '${authHeader}Token="${finampUserHelper.currentUser!.accessToken}", '; + } + authHeader = '${authHeader}Client="Finamp", '; DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (Platform.isAndroid) { diff --git a/lib/services/jellyfin_api_helper.dart b/lib/services/jellyfin_api_helper.dart index e55504c99..8cbd0d449 100644 --- a/lib/services/jellyfin_api_helper.dart +++ b/lib/services/jellyfin_api_helper.dart @@ -47,7 +47,7 @@ class JellyfinApiHelper { return []; } - Response response; + var response; // We send a different request for playlists so that we get them back in the // right order. Doing this in the same function makes sense since they both @@ -127,11 +127,7 @@ class JellyfinApiHelper { ); } - if (response.isSuccessful) { - return (QueryResult_BaseItemDto.fromJson(response.body).items); - } else { - return Future.error(response); - } + return (QueryResult_BaseItemDto.fromJson(response).items); } /// Authenticates a user and saves the login details @@ -139,7 +135,7 @@ class JellyfinApiHelper { required String username, String? password, }) async { - Response response; + var response; // Some users won't have a password. if (password == null) { @@ -149,126 +145,88 @@ class JellyfinApiHelper { .authenticateViaName({"Username": username, "Pw": password}); } - if (response.isSuccessful) { - AuthenticationResult newUserAuthenticationResult = - AuthenticationResult.fromJson(response.body); + AuthenticationResult newUserAuthenticationResult = + AuthenticationResult.fromJson(response); - FinampUser newUser = FinampUser( - id: newUserAuthenticationResult.user!.id, - baseUrl: baseUrlTemp!.toString(), - accessToken: newUserAuthenticationResult.accessToken!, - serverId: newUserAuthenticationResult.serverId!, - views: {}, - ); + FinampUser newUser = FinampUser( + id: newUserAuthenticationResult.user!.id, + baseUrl: baseUrlTemp!.toString(), + accessToken: newUserAuthenticationResult.accessToken!, + serverId: newUserAuthenticationResult.serverId!, + views: {}, + ); - await _finampUserHelper.saveUser(newUser); - } else { - return Future.error(response); - } + await _finampUserHelper.saveUser(newUser); } /// Gets all the user's views. Future> getViews() async { - Response response = + var response = await jellyfinApi.getViews(_finampUserHelper.currentUser!.id); - if (response.isSuccessful) { - return QueryResult_BaseItemDto.fromJson(response.body).items!; - } else { - return Future.error(response); - } + return QueryResult_BaseItemDto.fromJson(response).items!; } /// Gets the playback info for an item, such as format and bitrate. Usually, I'd require a BaseItemDto as an argument /// but since this will be run inside of [MusicPlayerBackgroundTask], I've just set the raw id as an argument. Future?> getPlaybackInfo(String itemId) async { - Response response = await jellyfinApi.getPlaybackInfo( + var response = await jellyfinApi.getPlaybackInfo( id: itemId, userId: _finampUserHelper.currentUser!.id, ); - if (response.isSuccessful) { - // getPlaybackInfo returns a PlaybackInfoResponse. We only need the List in it so we convert it here and - // return that List. - final PlaybackInfoResponse decodedResponse = - PlaybackInfoResponse.fromJson(response.body); - return decodedResponse.mediaSources; - } else { - return Future.error(response); - } + // getPlaybackInfo returns a PlaybackInfoResponse. We only need the List in it so we convert it here and + // return that List. + final PlaybackInfoResponse decodedResponse = + PlaybackInfoResponse.fromJson(response); + return decodedResponse.mediaSources; } /// Starts an instant mix using the data from the item provided. Future?> getInstantMix(BaseItemDto? parentItem) async { - Response response = await jellyfinApi.getInstantMix( + var response = await jellyfinApi.getInstantMix( id: parentItem!.id, userId: _finampUserHelper.currentUser!.id, limit: 200); - if (response.isSuccessful) { - return (QueryResult_BaseItemDto.fromJson(response.body).items); - } else { - return Future.error(response); - } + return (QueryResult_BaseItemDto.fromJson(response).items); } /// Tells the Jellyfin server that playback has started Future reportPlaybackStart( PlaybackProgressInfo playbackProgressInfo) async { - Response response = await jellyfinApi.startPlayback(playbackProgressInfo); - - if (!response.isSuccessful) { - return Future.error(response); - } + await jellyfinApi.startPlayback(playbackProgressInfo); } /// Updates player progress so that Jellyfin can track what we're listening to Future updatePlaybackProgress( PlaybackProgressInfo playbackProgressInfo) async { - Response response = - await jellyfinApi.playbackStatusUpdate(playbackProgressInfo); - - if (!response.isSuccessful) { - return Future.error(response); - } + await jellyfinApi.playbackStatusUpdate(playbackProgressInfo); } /// Tells Jellyfin that we've stopped listening to music (called when the audio service is stopped) Future stopPlaybackProgress( PlaybackProgressInfo playbackProgressInfo) async { - Response response = - await jellyfinApi.playbackStatusStopped(playbackProgressInfo); - - if (!response.isSuccessful) { - return Future.error(response); - } + await jellyfinApi.playbackStatusStopped(playbackProgressInfo); } /// Gets an item from a user's library. Future getItemById(String itemId) async { - final Response response = await jellyfinApi.getItemById( + var response = await jellyfinApi.getItemById( userId: _finampUserHelper.currentUser!.id, itemId: itemId, ); - if (response.isSuccessful) { - return (BaseItemDto.fromJson(response.body)); - } else { - return Future.error(response); - } + return (BaseItemDto.fromJson(response)); } /// Creates a new playlist. Future createNewPlaylist(NewPlaylist newPlaylist) async { - final Response response = await jellyfinApi.createNewPlaylist( + var response = await jellyfinApi.createNewPlaylist( newPlaylist: newPlaylist, ); - if (response.isSuccessful) { - return NewPlaylistResponse.fromJson(response.body); - } else { - return Future.error(response); - } + return NewPlaylistResponse.fromJson(response); } /// Adds items to a playlist. @@ -279,14 +237,10 @@ class JellyfinApiHelper { /// Item ids to add. List? ids, }) async { - final Response response = await jellyfinApi.addItemsToPlaylist( + await jellyfinApi.addItemsToPlaylist( playlistId: playlistId, ids: ids?.join(","), ); - - if (!response.isSuccessful) { - return Future.error(response); - } } /// Remove items to a playlist. @@ -297,14 +251,10 @@ class JellyfinApiHelper { /// Item ids to add. List? entryIds, }) async { - final Response response = await jellyfinApi.removeItemsFromPlaylist( + await jellyfinApi.removeItemsFromPlaylist( playlistId: playlistId, entryIds: entryIds?.join(","), ); - - if (!response.isSuccessful) { - return Future.error(response); - } } /// Updates an item. @@ -316,36 +266,23 @@ class JellyfinApiHelper { /// changed values. required BaseItemDto newItem, }) async { - final Response response = - await jellyfinApi.updateItem(itemId: itemId, newItem: newItem); - - if (!response.isSuccessful) { - return Future.error(response); - } + await jellyfinApi.updateItem(itemId: itemId, newItem: newItem); } /// Marks an item as a favorite. Future addFavourite(String itemId) async { - final Response response = await jellyfinApi.addFavourite( + var response = await jellyfinApi.addFavourite( userId: _finampUserHelper.currentUser!.id, itemId: itemId); - if (response.isSuccessful) { - return UserItemDataDto.fromJson(response.body); - } else { - return Future.error(response); - } + return UserItemDataDto.fromJson(response); } /// Unmarks item as a favorite. Future removeFavourite(String itemId) async { - final Response response = await jellyfinApi.removeFavourite( + var response = await jellyfinApi.removeFavourite( userId: _finampUserHelper.currentUser!.id, itemId: itemId); - if (response.isSuccessful) { - return UserItemDataDto.fromJson(response.body); - } else { - return Future.error(response); - } + return UserItemDataDto.fromJson(response); } void addArtistToMixBuilderList(BaseItemDto item) { @@ -365,7 +302,7 @@ class JellyfinApiHelper { } Future?> getArtistMix(List artistIds) async { - final Response response = await jellyfinApi.getItems( + var response = await jellyfinApi.getItems( userId: _finampUserHelper.currentUser!.id, artistIds: artistIds.join(","), filters: "IsNotFolder", @@ -374,15 +311,11 @@ class JellyfinApiHelper { limit: 300, fields: "Chapters"); - if (response.isSuccessful) { - return (QueryResult_BaseItemDto.fromJson(response.body).items); - } else { - return Future.error(response); - } + return (QueryResult_BaseItemDto.fromJson(response).items); } Future?> getAlbumMix(List albumIds) async { - final Response response = await jellyfinApi.getItems( + var response = await jellyfinApi.getItems( userId: _finampUserHelper.currentUser!.id, albumIds: albumIds.join(","), filters: "IsNotFolder", @@ -391,22 +324,16 @@ class JellyfinApiHelper { limit: 300, fields: "Chapters"); - if (response.isSuccessful) { - return (QueryResult_BaseItemDto.fromJson(response.body).items); - } else { - return Future.error(response); - } + return (QueryResult_BaseItemDto.fromJson(response).items); } /// Removes the current user from the DB and revokes the token on Jellyfin Future logoutCurrentUser() async { - Response? response; - // We put this in a try-catch loop that basically ignores errors so that the // user can still log out during scenarios like wrong IP, no internet etc. try { - response = await jellyfinApi.logout().timeout( + await jellyfinApi.logout().timeout( const Duration(seconds: 3), onTimeout: () => _jellyfinApiHelperLogger.warning( "Logout request timed out. Logging out anyway, but be aware that Jellyfin may have not got the signal."), @@ -416,14 +343,6 @@ class JellyfinApiHelper { "Jellyfin logout failed. Logging out anyway, but be aware that Jellyfin may have not got the signal.", e); } finally { - // If the logout response wasn't successful, warn the user in the logs. - // We continue anyway since this will mostly be for when the client becomes - // unauthorised, which will return 401. - if (response?.isSuccessful == false) { - _jellyfinApiHelperLogger.warning( - "Jellyfin logout returned ${response!.statusCode}. Logging out anyway, but be aware that Jellyfin may still consider this device logged in."); - } - // If we're unauthorised, the logout command will fail but we're already // basically logged out so we shouldn't fail. _finampUserHelper.removeUser(_finampUserHelper.currentUser!.id); @@ -436,8 +355,6 @@ class JellyfinApiHelper { if (currentUser == null) { return null; - } else { - return currentUser.accessToken; } } diff --git a/pubspec.lock b/pubspec.lock index 7f033bcb3..6a04256b3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -181,10 +181,10 @@ packages: dependency: "direct main" description: name: chopper - sha256: "8595c4cffe04a348e9fd7fdadb6b53f810915fed52343a943a344b5aa22516d4" + sha256: d1457197abb29ee354889fda35a7ac2e752eb5a687562148afb1faa78a61e36d url: "https://pub.dev" source: hosted - version: "7.1.1+1" + version: "7.1.1" chopper_generator: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index c6d52b644..453968a20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: sdk: flutter json_annotation: ^4.8.0 - chopper: ^7.0.3 + chopper: 7.1.1 get_it: ^7.2.0 just_audio: ^0.9.32 audio_service: ^0.18.9 @@ -77,7 +77,7 @@ dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.3.3 - chopper_generator: ^7.0.1 + chopper_generator: 7.1.1 hive_generator: ^2.0.0 json_serializable: ^6.6.1 flutter_launcher_icons: ^0.13.0 From cb0dfe48f9d3d8bfb977ae08abe73d3c8342c860 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 27 Feb 2024 13:36:55 +0000 Subject: [PATCH 002/102] Fix iOS build on Flutter 3.19 --- ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Podfile | 4 ++-- ios/Podfile.lock | 23 ++++++++----------- ios/Runner.xcodeproj/project.pbxproj | 14 +++++------ .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index cb6be3098..cae654377 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/ios/Podfile b/ios/Podfile index 5b8cb550c..2736914d0 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '11.0' +platform :ios, '12.0' # Fixing DKImagePickerController Bug use_modular_headers! @@ -94,4 +94,4 @@ post_install do |installer| end end -end \ No newline at end of file +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 22dfef11c..0c8c8ab24 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -61,9 +61,6 @@ PODS: - Flutter (1.0.0) - flutter_downloader (0.0.1): - Flutter - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - just_audio (0.0.1): - Flutter - package_info_plus (0.4.5): @@ -71,7 +68,7 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - permission_handler_apple (9.1.1): + - permission_handler_apple (9.3.0): - Flutter - SDWebImage (5.13.4): - SDWebImage/Core (= 5.13.4) @@ -80,7 +77,7 @@ PODS: - Flutter - sqflite (0.0.3): - Flutter - - FMDB (>= 2.7.5) + - FlutterMacOS - SwiftyGif (5.4.3) DEPENDENCIES: @@ -96,7 +93,7 @@ DEPENDENCIES: - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - - sqflite (from `.symlinks/plugins/sqflite/ios`) + - sqflite (from `.symlinks/plugins/sqflite/darwin`) SPEC REPOS: trunk: @@ -104,7 +101,6 @@ SPEC REPOS: - DKCamera - DKImagePickerController - DKPhotoGallery - - FMDB - SDWebImage - SwiftyGif @@ -132,7 +128,7 @@ EXTERNAL SOURCES: share_plus: :path: ".symlinks/plugins/share_plus/ios" sqflite: - :path: ".symlinks/plugins/sqflite/ios" + :path: ".symlinks/plugins/sqflite/darwin" SPEC CHECKSUMS: audio_service: f509d65da41b9521a61f1c404dd58651f265a567 @@ -143,18 +139,17 @@ SPEC CHECKSUMS: DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: ce3938a0df3cc1ef404671531facef740d03f920 - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_downloader: b7301ae057deadd4b1650dc7c05375f10ff12c39 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + permission_handler_apple: 036b856153a2b1f61f21030ff725f3e6fece2b78 SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3 share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 - sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a + sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 -PODFILE CHECKSUM: 063e508f261fd49adc2e97f5d1ac1a2bc0e8e8ac +PODFILE CHECKSUM: 2129ec44a346995e229add1d94a10fae8b953738 COCOAPODS: 1.13.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5ac1c8fee..385278ea0 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -224,7 +224,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -502,7 +502,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +527,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -593,7 +593,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -643,7 +643,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -670,7 +670,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -705,7 +705,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a6b826db2..5e31d3d34 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Wed, 28 Feb 2024 12:30:19 +0000 Subject: [PATCH 003/102] Enable Impeller on iOS in main this time lol --- ios/Runner/Info-Debug.plist | 2 -- ios/Runner/Info-Profile.plist | 2 -- ios/Runner/Info-Release.plist | 2 -- 3 files changed, 6 deletions(-) diff --git a/ios/Runner/Info-Debug.plist b/ios/Runner/Info-Debug.plist index 5eae98546..c475a18de 100644 --- a/ios/Runner/Info-Debug.plist +++ b/ios/Runner/Info-Debug.plist @@ -70,8 +70,6 @@ Required for debugging CADisableMinimumFrameDurationOnPhone - FLTEnableImpeller - UIFileSharingEnabled diff --git a/ios/Runner/Info-Profile.plist b/ios/Runner/Info-Profile.plist index 5eae98546..c475a18de 100644 --- a/ios/Runner/Info-Profile.plist +++ b/ios/Runner/Info-Profile.plist @@ -70,8 +70,6 @@ Required for debugging CADisableMinimumFrameDurationOnPhone - FLTEnableImpeller - UIFileSharingEnabled diff --git a/ios/Runner/Info-Release.plist b/ios/Runner/Info-Release.plist index 0d5caecb7..e9b113db7 100644 --- a/ios/Runner/Info-Release.plist +++ b/ios/Runner/Info-Release.plist @@ -68,8 +68,6 @@ UIViewControllerBasedStatusBarAppearance - FLTEnableImpeller - UIFileSharingEnabled From 59a95e3e25588af9c83f6709482564dd851d6d2d Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 28 Feb 2024 12:34:10 +0000 Subject: [PATCH 004/102] Sneaky build number bump I pushed an iOS build last night, need to include Impeller again --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 453968a20..64e05dced 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.20+41 +version: 0.6.20+42 environment: sdk: ">=2.19.4 <3.0.0" From b998ffc105d619c84ebedd2b83e50de1b88e9cf4 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:38:16 +0000 Subject: [PATCH 005/102] Remove funding URL --- .github/FUNDING.yml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index b232ff453..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,13 +0,0 @@ -# These are supported funding model platforms - -github: jmshrv -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 775ee80cbade4fe9fe99722672f279c9df93058a Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Fri, 15 Mar 2024 20:25:06 +0100 Subject: [PATCH 006/102] fix playlists not being returned for Jellyfin 10.9+ --- .../MusicScreen/music_screen_tab_view.dart | 8 +++---- .../.plugin_symlinks/device_info_plus | 1 + .../.plugin_symlinks/package_info_plus | 1 + .../.plugin_symlinks/path_provider_linux | 1 + .../ephemeral/.plugin_symlinks/share_plus | 1 + .../.plugin_symlinks/url_launcher_linux | 1 + linux/flutter/generated_plugin_registrant.cc | 15 ++++++++++++ linux/flutter/generated_plugin_registrant.h | 15 ++++++++++++ linux/flutter/generated_plugins.cmake | 24 +++++++++++++++++++ .../ephemeral/Flutter-Generated.xcconfig | 11 +++++++++ .../ephemeral/flutter_export_environment.sh | 12 ++++++++++ 11 files changed, 85 insertions(+), 5 deletions(-) create mode 120000 linux/flutter/ephemeral/.plugin_symlinks/device_info_plus create mode 120000 linux/flutter/ephemeral/.plugin_symlinks/package_info_plus create mode 120000 linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux create mode 120000 linux/flutter/ephemeral/.plugin_symlinks/share_plus create mode 120000 linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux create mode 100644 linux/flutter/generated_plugin_registrant.cc create mode 100644 linux/flutter/generated_plugin_registrant.h create mode 100644 linux/flutter/generated_plugins.cmake create mode 100644 macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100644 macos/Flutter/ephemeral/flutter_export_environment.sh diff --git a/lib/components/MusicScreen/music_screen_tab_view.dart b/lib/components/MusicScreen/music_screen_tab_view.dart index 764842542..49d253916 100644 --- a/lib/components/MusicScreen/music_screen_tab_view.dart +++ b/lib/components/MusicScreen/music_screen_tab_view.dart @@ -81,11 +81,9 @@ class _MusicScreenTabViewState extends State final sortOrder = widget.sortOrder?.toString() ?? SortOrder.ascending.toString(); final newItems = await _jellyfinApiHelper.getItems( - // If no parent item is specified, we try the view given as an argument. - // If the view argument is null, fall back to the user's current view. - parentItem: widget.parentItem ?? - widget.view ?? - _finampUserHelper.currentUser?.currentView, + // starting with Jellyfin 10.9, only automatically created playlists will have a specific library as parent. user-created playlists will not be returned anymore + // this condition fixes this by not providing a parentId when fetching playlists + parentItem: widget.tabContentType == TabContentType.playlists ? null : widget.view, includeItemTypes: _includeItemTypes(widget.tabContentType), // If we're on the songs tab, sort by "Album,SortName". This is what the diff --git a/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus b/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus new file mode 120000 index 000000000..33522580b --- /dev/null +++ b/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus @@ -0,0 +1 @@ +C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus-9.1.2/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus b/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus new file mode 120000 index 000000000..5acf87bd2 --- /dev/null +++ b/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus @@ -0,0 +1 @@ +C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/package_info_plus-4.2.0/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux new file mode 120000 index 000000000..135efa0b7 --- /dev/null +++ b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux @@ -0,0 +1 @@ +C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/share_plus b/linux/flutter/ephemeral/.plugin_symlinks/share_plus new file mode 120000 index 000000000..20e14aaf3 --- /dev/null +++ b/linux/flutter/ephemeral/.plugin_symlinks/share_plus @@ -0,0 +1 @@ +C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/share_plus-7.2.2/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux b/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux new file mode 120000 index 000000000..37feaccf8 --- /dev/null +++ b/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux @@ -0,0 +1 @@ +C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/url_launcher_linux-3.1.1/ \ No newline at end of file diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..f6f23bfe9 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..e0f0a47bc --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 000000000..f16b4c342 --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 000000000..f2cc55f69 --- /dev/null +++ b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=C:\flutter +FLUTTER_APPLICATION_PATH=D:\Code\Flutter\finamp +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=0.6.20 +FLUTTER_BUILD_NUMBER=41 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100644 index 000000000..7a828ab9c --- /dev/null +++ b/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=C:\flutter" +export "FLUTTER_APPLICATION_PATH=D:\Code\Flutter\finamp" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=0.6.20" +export "FLUTTER_BUILD_NUMBER=41" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" From 30c5f5486dce31708f9f70240ef24a8586da80fc Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Mon, 18 Mar 2024 23:11:02 +0100 Subject: [PATCH 007/102] fix authorization for downloads --- lib/services/downloads_helper.dart | 9 +++++---- lib/services/jellyfin_api.dart | 3 +-- lib/services/jellyfin_api_helper.dart | 9 --------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/lib/services/downloads_helper.dart b/lib/services/downloads_helper.dart index edee54857..f7c176acc 100644 --- a/lib/services/downloads_helper.dart +++ b/lib/services/downloads_helper.dart @@ -11,6 +11,7 @@ import 'package:path/path.dart' as path_helper; import 'finamp_settings_helper.dart'; import 'finamp_user_helper.dart'; +import 'jellyfin_api.dart'; import 'jellyfin_api_helper.dart'; import 'get_internal_song_dir.dart'; import '../models/jellyfin_models.dart'; @@ -147,13 +148,13 @@ class DownloadsHelper { downloadDir = Directory(downloadLocation.path); } - String? tokenHeader = _jellyfinApiData.getTokenHeader(); + String authHeader = await getAuthHeader(); String? songDownloadId = await FlutterDownloader.enqueue( url: songUrl, savedDir: downloadDir.path, headers: { - if (tokenHeader != null) "X-Emby-Token": tokenHeader, + "Authorization": authHeader, }, fileName: fileName, openFileFromNotification: false, @@ -1113,7 +1114,7 @@ class DownloadsHelper { quality: null, format: null, ); - final tokenHeader = _jellyfinApiData.getTokenHeader(); + final authHeader = await getAuthHeader(); final relativePath = path_helper.relative(downloadDir.path, from: downloadLocation.path); @@ -1125,7 +1126,7 @@ class DownloadsHelper { url: imageUrl.toString(), savedDir: downloadDir.path, headers: { - if (tokenHeader != null) "X-Emby-Token": tokenHeader, + "Authorization": authHeader, }, fileName: fileName, openFileFromNotification: false, diff --git a/lib/services/jellyfin_api.dart b/lib/services/jellyfin_api.dart index b0c581355..d243edf0b 100644 --- a/lib/services/jellyfin_api.dart +++ b/lib/services/jellyfin_api.dart @@ -375,7 +375,6 @@ abstract class JellyfinApi extends ChopperService { final finampUserHelper = GetIt.instance(); String authHeader = await getAuthHeader(); - String? tokenHeader = jellyfinApiHelper.getTokenHeader(); // If baseUrlTemp is null, use the baseUrl of the current user. // If baseUrlTemp is set, we're setting up a new user and should use it instead. @@ -405,7 +404,7 @@ abstract class JellyfinApi extends ChopperService { } } -/// Creates the X-Emby-Authorization header +/// Creates the Authorization header Future getAuthHeader() async { final notAsciiRegex = RegExp(r'[^\x00-\x7F]+'); diff --git a/lib/services/jellyfin_api_helper.dart b/lib/services/jellyfin_api_helper.dart index 8cbd0d449..91741a1b4 100644 --- a/lib/services/jellyfin_api_helper.dart +++ b/lib/services/jellyfin_api_helper.dart @@ -349,15 +349,6 @@ class JellyfinApiHelper { } } - /// Creates the X-Emby-Token header - String? getTokenHeader() { - final currentUser = _finampUserHelper.currentUser; - - if (currentUser == null) { - return null; - } - } - /// Returns the correct image URL for the given item, or null if there is no /// image. Uses [getImageId] to get the actual id. [maxWidth] and [maxHeight] /// can be specified to return a smaller image. [quality] can be modified to From f335dbee9632c78086dcfae4883b9687ebd2193d Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Tue, 19 Mar 2024 00:09:01 +0100 Subject: [PATCH 008/102] fix track sorting for downloaded albums/playlists - uses lists instead of hashmaps, which will reduce performance but result in a stable sort --- lib/services/sync_helper.dart | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/services/sync_helper.dart b/lib/services/sync_helper.dart index e59f8c3a7..66e6ea0ee 100644 --- a/lib/services/sync_helper.dart +++ b/lib/services/sync_helper.dart @@ -14,7 +14,7 @@ class SyncState { final Set toAdd; final Set toRemove; final Set toUpdate; - final Map addItemCache; + final List addItemCache; SyncState(this.toAdd, this.toRemove, this.toUpdate, this.addItemCache); } @@ -42,7 +42,11 @@ class DownloadsSyncHelper { DownloadLocation location = FinampSettingsHelper.finampSettings.downloadLocationsMap.values.first; // we include update items in case any items have been orphaned for (String itemToAdd in {...syncState.toAdd, ...syncState.toUpdate}) { - BaseItemDto? item = syncState.addItemCache.remove(itemToAdd); + final cacheIndex = syncState.addItemCache.indexWhere((element) => element.id == itemToAdd); + BaseItemDto? item; + if (cacheIndex != -1) { + item = syncState.addItemCache.removeAt(cacheIndex); + } if (item != null) { await downloadsHelper.addDownloads( items: [item], @@ -71,12 +75,15 @@ class DownloadsSyncHelper { SyncState _getSyncState(String playlistParentId, List existingPlaylistItems) { List downloadedSongs = downloadsHelper.downloadedItems.toList(); - Map downloadedSongsCache = HashMap(); - Map playlistItems = HashMap(); + List downloadedSongsCache = []; + List playlistItems = []; for (BaseItemDto item in existingPlaylistItems) { // songs actively in playlist logger.info("Song in playlist id ${item.id} name ${item.name}"); - playlistItems.putIfAbsent(item.id, () => item); + // playlistItems.putIfAbsent(item.id, () => item); + if (playlistItems.indexWhere((element) => element.id == item.id) == -1) { + playlistItems.add(item); + } } for (DownloadedSong downloadedSong in downloadedSongs) { @@ -84,16 +91,19 @@ class DownloadsSyncHelper { downloadedSong.requiredBy.contains(playlistParentId)) { // songs actively downloaded logger.info("Downloaded song playlist id ${downloadedSong.mediaSourceInfo.id} name ${downloadedSong.mediaSourceInfo.name} requiredBy ${downloadedSong.requiredBy.toString()}"); - downloadedSongsCache.putIfAbsent(downloadedSong.mediaSourceInfo.id!, () => downloadedSong); + // downloadedSongsCache.putIfAbsent(downloadedSong.mediaSourceInfo.id!, () => downloadedSong); + if (downloadedSongsCache.indexWhere((element) => element.mediaSourceInfo.id == downloadedSong.mediaSourceInfo.id) == -1) { + downloadedSongsCache.add(downloadedSong); + } } } - Set playlistIds = playlistItems.keys.toSet(); - Set downloadedIds = downloadedSongsCache.keys.toSet(); + Set playlistIds = playlistItems.map((e) => e.id).toSet(); + Set downloadedIds = downloadedSongsCache.map((e) => e.mediaSourceInfo.id!).toSet(); return SyncState( playlistIds.difference(downloadedIds), downloadedIds.difference(playlistIds), playlistIds.intersection(downloadedIds), playlistItems); } -} \ No newline at end of file +} From ccc038786e9c70a82b5e14205790c81283865346 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Thu, 4 Apr 2024 19:19:34 +0100 Subject: [PATCH 009/102] Add link to redesign beta --- ios/Podfile.lock | 6 ++++ .../MusicScreen/music_screen_drawer.dart | 7 ++++ lib/l10n/app_en.arb | 5 +-- .../.plugin_symlinks/device_info_plus | 2 +- .../.plugin_symlinks/package_info_plus | 2 +- .../.plugin_symlinks/path_provider_linux | 2 +- .../ephemeral/.plugin_symlinks/share_plus | 2 +- .../.plugin_symlinks/url_launcher_linux | 2 +- pubspec.lock | 32 +++++++++++++++++++ pubspec.yaml | 1 + 10 files changed, 54 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0c8c8ab24..248479174 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -79,6 +79,8 @@ PODS: - Flutter - FlutterMacOS - SwiftyGif (5.4.3) + - url_launcher_ios (0.0.1): + - Flutter DEPENDENCIES: - audio_service (from `.symlinks/plugins/audio_service/ios`) @@ -94,6 +96,7 @@ DEPENDENCIES: - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) SPEC REPOS: trunk: @@ -129,6 +132,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/share_plus/ios" sqflite: :path: ".symlinks/plugins/sqflite/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: audio_service: f509d65da41b9521a61f1c404dd58651f265a567 @@ -149,6 +154,7 @@ SPEC CHECKSUMS: share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 + url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 PODFILE CHECKSUM: 2129ec44a346995e229add1d94a10fae8b953738 diff --git a/lib/components/MusicScreen/music_screen_drawer.dart b/lib/components/MusicScreen/music_screen_drawer.dart index 7e24022b8..674c18309 100644 --- a/lib/components/MusicScreen/music_screen_drawer.dart +++ b/lib/components/MusicScreen/music_screen_drawer.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:get_it/get_it.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../services/finamp_user_helper.dart'; import '../../screens/downloads_screen.dart'; @@ -73,6 +74,12 @@ class MusicScreenDrawer extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ const Divider(), + ListTile( + leading: const Icon(Icons.science), + title: Text(AppLocalizations.of(context)!.redesignBeta), + onTap: () async => await launchUrl(Uri.parse( + "https://github.com/jmshrv/finamp/releases/tag/0.9.2-beta")), + ), ListTile( leading: const Icon(Icons.warning), title: Text(AppLocalizations.of(context)!.logs), diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 3e3b124e1..a9c39e5d4 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -530,5 +530,6 @@ "swipeInsertQueueNext": "Play Swiped Song Next", "@swipeInsertQueueNext": {}, "swipeInsertQueueNextSubtitle": "Enable to insert a song as next item in queue when swiped in song list instead of appending it to the end.", - "@swipeInsertQueueNextSubtitle": {} -} + "@swipeInsertQueueNextSubtitle": {}, + "redesignBeta": "Redesign Beta" +} \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus b/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus index 33522580b..68c46f709 120000 --- a/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus +++ b/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus @@ -1 +1 @@ -C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus-9.1.2/ \ No newline at end of file +/Users/james/.pub-cache/hosted/pub.dev/device_info_plus-9.1.2/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus b/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus index 5acf87bd2..0a8e28670 120000 --- a/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus +++ b/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus @@ -1 +1 @@ -C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/package_info_plus-4.2.0/ \ No newline at end of file +/Users/james/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux index 135efa0b7..ee3d1dabd 120000 --- a/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux +++ b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux @@ -1 +1 @@ -C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file +/Users/james/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/share_plus b/linux/flutter/ephemeral/.plugin_symlinks/share_plus index 20e14aaf3..e2614ca41 120000 --- a/linux/flutter/ephemeral/.plugin_symlinks/share_plus +++ b/linux/flutter/ephemeral/.plugin_symlinks/share_plus @@ -1 +1 @@ -C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/share_plus-7.2.2/ \ No newline at end of file +/Users/james/.pub-cache/hosted/pub.dev/share_plus-7.2.2/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux b/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux index 37feaccf8..79a19f963 120000 --- a/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux +++ b/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux @@ -1 +1 @@ -C:/Users/Chaphasilor/AppData/Local/Pub/Cache/hosted/pub.dev/url_launcher_linux-3.1.1/ \ No newline at end of file +/Users/james/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/ \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 6a04256b3..4d8683947 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1076,6 +1076,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" + url: "https://pub.dev" + source: hosted + version: "6.2.5" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + url: "https://pub.dev" + source: hosted + version: "6.2.5" url_launcher_linux: dependency: transitive description: @@ -1084,6 +1108,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 64e05dced..ca3fb282a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,6 +72,7 @@ dependencies: url: https://github.com/lamarios/locale_names.git ref: cea057c220f4ee7e09e8f1fc7036110245770948 mini_music_visualizer: ^1.0.2 + url_launcher: ^6.2.5 dev_dependencies: flutter_test: From 0a96c1711ef4dcc46647ed51b94312de6298e70b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Tue, 27 Feb 2024 18:14:03 +0000 Subject: [PATCH 010/102] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (187 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hans/ --- lib/l10n/app_zh.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index ae3d32bf0..d4f221a58 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -527,5 +527,11 @@ "syncDownloadedPlaylists": "同步下载的播放列表", "@syncDownloadedPlaylists": {}, "showFastScroller": "显示快速滚动条", - "@showFastScroller": {} + "@showFastScroller": {}, + "swipeInsertQueueNext": "播放滑动的下一首歌曲", + "@swipeInsertQueueNext": {}, + "interactions": "交互", + "@interactions": {}, + "swipeInsertQueueNextSubtitle": "在歌曲列表中滑动时,可以将歌曲作为队列中的下一个项目插入,而不是将其附加到末尾。", + "@swipeInsertQueueNextSubtitle": {} } From 707c05ba940b125367dbd48df7c07de87ba0878a Mon Sep 17 00:00:00 2001 From: Fjuro Date: Tue, 27 Feb 2024 10:20:03 +0000 Subject: [PATCH 011/102] Translated using Weblate (Czech) Currently translated at 100.0% (187 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/cs/ --- lib/l10n/app_cs.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index 404a5ea08..9355faaea 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -527,5 +527,11 @@ "confirm": "Potvrdit", "@confirm": {}, "noMusicLibrariesBody": "Finamp nenalezl žádné hudební knihovny. Ujistěte se prosím, že váš server Jellyfin obsahuje alespoň jednu knihovnu s typem obsahu nastaveným na „Hudba“.", - "@noMusicLibrariesBody": {} + "@noMusicLibrariesBody": {}, + "swipeInsertQueueNextSubtitle": "Zapněte pro vložení skladby jako další položku do fronty po posunutí prstem na skladbě v seznamu skladeb, místo jejího přiřazení na konec.", + "@swipeInsertQueueNextSubtitle": {}, + "interactions": "Interakce", + "@interactions": {}, + "swipeInsertQueueNext": "Přehrát posunutou skladbu jako další", + "@swipeInsertQueueNext": {} } From 9298c89d67269d72db8119819e6e3a3bfab7cd2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Tue, 27 Feb 2024 16:47:16 +0000 Subject: [PATCH 012/102] Translated using Weblate (Turkish) Currently translated at 100.0% (187 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/tr/ --- lib/l10n/app_tr.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index e28844b4d..3b9a484d5 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -527,5 +527,11 @@ "syncDownloadedPlaylists": "İndirilen çalma listelerini eşzamanla", "@syncDownloadedPlaylists": {}, "showFastScroller": "Hızlı kaydırıcıyı göster", - "@showFastScroller": {} + "@showFastScroller": {}, + "interactions": "Etkileşimler", + "@interactions": {}, + "swipeInsertQueueNext": "Kaydırılan Şarkıyı Ardından Oynat", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "Şarkı listesinde kaydırıldığında bir şarkıyı sona eklemek yerine sıradaki öge olarak eklemeyi etkinleştirin.", + "@swipeInsertQueueNextSubtitle": {} } From 4e76f7180fb8b41078dbd53ceee1327c3de261b9 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 28 Feb 2024 11:34:05 +0000 Subject: [PATCH 013/102] Translated using Weblate (Spanish) Currently translated at 100.0% (187 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/es/ --- lib/l10n/app_es.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 9162bdad8..219bc3ffc 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -527,5 +527,11 @@ "showFastScroller": "Mostrar desplazamiento rápido", "@showFastScroller": {}, "syncDownloadedPlaylists": "Sincroniza las listas de reproducción descargadas", - "@syncDownloadedPlaylists": {} + "@syncDownloadedPlaylists": {}, + "swipeInsertQueueNextSubtitle": "Permite insertar una canción como siguiente elemento en la cola cuando se desliza en la lista de reproducción en lugar de añadirla al final.", + "@swipeInsertQueueNextSubtitle": {}, + "interactions": "Interacciones", + "@interactions": {}, + "swipeInsertQueueNext": "Reproducir la siguiente canción al deslizarla", + "@swipeInsertQueueNext": {} } From 3cb6f68c78802787b98b6207d8af73f9782158a6 Mon Sep 17 00:00:00 2001 From: Mistify Date: Wed, 28 Feb 2024 20:13:29 +0000 Subject: [PATCH 014/102] Translated using Weblate (Polish) Currently translated at 100.0% (187 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/pl/ --- lib/l10n/app_pl.arb | 50 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index cdd764257..7aaaaa594 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -139,9 +139,9 @@ "@noErrors": {}, "addFavourite": "Dodaj do ulubionych", "@addFavourite": {}, - "addToPlaylistTooltip": "Dodaj do listy odtwarzania", + "addToPlaylistTooltip": "Dodaj do playlisty", "@addToPlaylistTooltip": {}, - "addToPlaylistTitle": "Dodaj do listy odtwarzania", + "addToPlaylistTitle": "Dodaj do Playlisty", "@addToPlaylistTitle": {}, "updateButtonLabel": "AKTUALIZUJ", "@updateButtonLabel": {}, @@ -434,7 +434,7 @@ "@transcode": {}, "applicationLegalese": "Licencja Mozilla Public License 2.0. Kod źródłowy dostępny na:\n\ngithub.com/jmshrv/finamp", "@applicationLegalese": {}, - "errorScreenError": "Wystąpił błąd podczas pobierania listy błędów. Utwórz zgłoszenie na portalu GitHub", + "errorScreenError": "Wystąpił błąd podczas pobierania listy błędów. Utwórz zgłoszenie na portalu GitHub i usuń dane aplikacji", "@errorScreenError": {}, "internalExternalIpExplanation": "Jeśli chcesz uzyskać dostęp do zdalnej instancji Jellyfin, musisz posiadać zewnętrzne IP.\n\nJeśli serwer jest dostępny na portach HTTP(S) (80/443), nie musisz określać portu.", "@internalExternalIpExplanation": { @@ -491,5 +491,47 @@ "playNext": "Następne", "@playNext": { "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." - } + }, + "interactions": "Interakcje", + "@interactions": {}, + "insertedIntoQueue": "Dodano do kolejki.", + "@insertedIntoQueue": { + "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." + }, + "noMusicLibrariesTitle": "Brak bibliotek muzycznych", + "@noMusicLibrariesTitle": { + "description": "Title for message that shows on the views screen when no music libraries could be found." + }, + "deleteDownloadsConfirmButtonText": "Usuń", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "Cofnij", + "@deleteDownloadsAbortButtonText": {}, + "syncDownloadedPlaylists": "Synchronizuj pobrane playlisty", + "@syncDownloadedPlaylists": {}, + "showFastScroller": "Pokaż szybkie przewijanie", + "@showFastScroller": {}, + "refresh": "ODŚWIEŻ", + "@refresh": {}, + "swipeInsertQueueNext": "Odtwórz Przewiniętą Piosenkę Następnie", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "Włącz wstawianie utworu jako następnego elementu w kolejce po przesunięciu palcem na liście utworów zamiast dołączania go na końcu.", + "@swipeInsertQueueNextSubtitle": {}, + "deleteDownloadsPrompt": "Czy napewno chcesz usunąć {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}' z tego urządzenia?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "noMusicLibrariesBody": "Finamp nie mógł znaleźć żadnych bibliotek muzycznych. Upewnij się, że serwer Jellyfin zawiera co najmniej jedną bibliotekę z typem zawartości ustawionym na \"Muzyka\".", + "@noMusicLibrariesBody": {} } From 115c90acfaade9b015b2dadb76d652ee5a78adc2 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Wed, 28 Feb 2024 19:07:03 +0000 Subject: [PATCH 015/102] Translated using Weblate (Croatian) Currently translated at 100.0% (187 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/hr/ --- lib/l10n/app_hr.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index 7475939f2..866669b19 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -527,5 +527,11 @@ } }, "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." - } + }, + "swipeInsertQueueNextSubtitle": "Omogući umetanje pjesme kao sljedeću pjesmu u redu reprodukcije povlačenjem pjesme iz popisa pjesama umjesto dodavanja pjesme na kraj popisa.", + "@swipeInsertQueueNextSubtitle": {}, + "interactions": "Interakcije", + "@interactions": {}, + "swipeInsertQueueNext": "Reproduciraj pjesmu kao sljedeću povlačenjem", + "@swipeInsertQueueNext": {} } From 918244ccb7e1c2d7b9824edfabddab5f70b21ad8 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Fri, 1 Mar 2024 07:34:28 +0000 Subject: [PATCH 016/102] Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 98.9% (185 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant_HK/ --- lib/l10n/app_zh_Hant_HK.arb | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_zh_Hant_HK.arb b/lib/l10n/app_zh_Hant_HK.arb index f7d147ac5..b25180852 100644 --- a/lib/l10n/app_zh_Hant_HK.arb +++ b/lib/l10n/app_zh_Hant_HK.arb @@ -503,5 +503,31 @@ "noMusicLibrariesTitle": "沒有音樂類媒體庫", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." - } + }, + "interactions": "互動", + "@interactions": {}, + "deleteDownloadsConfirmButtonText": "刪除", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsPrompt": "你是否確定從裝置中刪除 {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}'?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "deleteDownloadsAbortButtonText": "取消", + "@deleteDownloadsAbortButtonText": {}, + "syncDownloadedPlaylists": "同步已下載播放清單", + "@syncDownloadedPlaylists": {}, + "showFastScroller": "顯示快速卷軸", + "@showFastScroller": {} } From 3c149bac1baa6effa3ce05afbe16715c798e314b Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Sat, 2 Mar 2024 18:38:39 +0000 Subject: [PATCH 017/102] Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 98.9% (185 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant_HK/ --- lib/l10n/app_zh_Hant_HK.arb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/l10n/app_zh_Hant_HK.arb b/lib/l10n/app_zh_Hant_HK.arb index b25180852..d58170af6 100644 --- a/lib/l10n/app_zh_Hant_HK.arb +++ b/lib/l10n/app_zh_Hant_HK.arb @@ -217,9 +217,9 @@ "@message": {}, "pathReturnSlashErrorMessage": "不能使用「/」路徑", "@pathReturnSlashErrorMessage": {}, - "portrait": "垂直", + "portrait": "直向", "@portrait": {}, - "gridCrossAxisCountSubtitle": "使用{value}顯示模式時,每行的方格(歌曲、歌手等)數量。", + "gridCrossAxisCountSubtitle": "屏幕在{value}顯示時,每行所顯示的資訊數量(例如歌曲、歌手等)。", "@gridCrossAxisCountSubtitle": { "description": "List tile subtitle for grid cross axis count. Value will either be the portrait or landscape key.", "placeholders": { @@ -229,9 +229,9 @@ } } }, - "showTextOnGridView": "在方格內顯示文字", + "showTextOnGridView": "在網絡內顯示文字", "@showTextOnGridView": {}, - "showTextOnGridViewSubtitle": "使用格狀顯示方式時,是否在方格內顯示歌曲資訊(名稱、歌手等)。", + "showTextOnGridViewSubtitle": "使用格狀顯示模式時,是否在網絡內顯示歌曲資訊(名稱、歌手等)。", "@showTextOnGridViewSubtitle": {}, "showCoverAsPlayerBackground": "模糊化封面作為播放器的背景", "@showCoverAsPlayerBackground": {}, @@ -433,17 +433,17 @@ "@customLocation": {}, "customLocationsBuggy": "現時,自訂位置功能因權限問題而未能完全正常運作。如非必要,建議不要使用。", "@customLocationsBuggy": {}, - "viewTypeSubtitle": "顯示歌曲的方式", + "viewTypeSubtitle": "顯示資訊的方式", "@viewTypeSubtitle": {}, - "viewType": "顯示方式", + "viewType": "顯示模式", "@viewType": {}, "grid": "格狀", "@grid": {}, "list": "清單", "@list": {}, - "landscape": "水平", + "landscape": "橫向", "@landscape": {}, - "gridCrossAxisCount": "{value}顯示模式的方格數量", + "gridCrossAxisCount": "{value}顯示網格數量", "@gridCrossAxisCount": { "description": "List tile title for grid cross axis count. Value will either be the portrait or landscape key.", "placeholders": { @@ -482,7 +482,7 @@ }, "language": "語言", "@language": {}, - "showUncensoredLogMessage": "紀錄檔內包含你的登入資訊。顯示?", + "showUncensoredLogMessage": "紀錄檔內包含你的登入資訊。你是否確認要顯示?", "@showUncensoredLogMessage": {}, "confirm": "確定", "@confirm": {}, From 5b86785ae43c87b7132afd228bb80f1d4d72ceb0 Mon Sep 17 00:00:00 2001 From: Felipe Silva Date: Sat, 2 Mar 2024 22:05:46 +0000 Subject: [PATCH 018/102] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.4% (186 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/pt_BR/ --- lib/l10n/app_pt_BR.arb | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 7fd327183..b8626d148 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -380,7 +380,7 @@ }, "budget": "Orçamento", "@budget": {}, - "errorScreenError": "Um erro ocorreu acessando a lista de erros! A este ponto, você deveria provavelmente catalogar um defeito no Github e apagar os dados do aplicativo", + "errorScreenError": "Um erro ocorreu acessando a lista de erros! A este ponto, você provavelmente deve criar um defeito (issue) no GitHub e apagar os dados do aplicativo", "@errorScreenError": {}, "error": "Erro", "@error": {}, @@ -503,5 +503,33 @@ "noMusicLibrariesTitle": "Sem Bibliotecas de Música", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." - } + }, + "interactions": "Interações", + "@interactions": {}, + "swipeInsertQueueNext": "Tocar Música Deslizada em Seguida", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "Adicionar uma música como próximo item na lista quando for deslizada, ao invés de adicionar no final.", + "@swipeInsertQueueNextSubtitle": {}, + "deleteDownloadsPrompt": "Você tem certeza que quer deletar {itemType, select, album{o álbum} playlist{a lista de reprodução} artist{o artista} genre{o gênero} track{a música} other{}} '{itemName}' desse dispositivo?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "deleteDownloadsConfirmButtonText": "Deletar", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "Cancelar", + "@deleteDownloadsAbortButtonText": {}, + "syncDownloadedPlaylists": "Sincronizar listas de reprodução baixadas", + "@syncDownloadedPlaylists": {} } From 34bdf6f98b1dd82ca4ab7a682c656a7cc424dc03 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 4 Mar 2024 20:27:05 +0000 Subject: [PATCH 019/102] Translated using Weblate (Russian) Currently translated at 96.2% (180 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 34e3f889f..a82e90bdc 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -13,7 +13,7 @@ "@urlTrailingSlash": { "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" }, - "selectMusicLibraries": "Выбрать библиотеку", + "selectMusicLibraries": "Выбрать музыкальные библиотеки", "@selectMusicLibraries": { "description": "App bar title for library select screen" }, @@ -267,7 +267,7 @@ "@newPlaylist": {}, "noAlbum": "Нет альбома", "@noAlbum": {}, - "addFavourite": "В избранное", + "addFavourite": "Добавить в избранное", "@addFavourite": {}, "anErrorHasOccured": "Произошла ошибка.", "@anErrorHasOccured": {}, @@ -499,5 +499,15 @@ "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." }, "noMusicLibrariesBody": "Finamp не смог найти ни одной музыкальной библиотеки. Убедитесь, что на вашем сервере Jellyfin есть хотя бы одна библиотека с типом содержимого \"Музыка\".", - "@noMusicLibrariesBody": {} + "@noMusicLibrariesBody": {}, + "deleteDownloadsConfirmButtonText": "Удалить", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "Отмена", + "@deleteDownloadsAbortButtonText": {}, + "noMusicLibrariesTitle": "Нет музыкальных библиотек", + "@noMusicLibrariesTitle": { + "description": "Title for message that shows on the views screen when no music libraries could be found." + } } From 780c66093fbcf7f03936e7e38e9ced62cf98e541 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 6 Mar 2024 21:18:45 +0000 Subject: [PATCH 020/102] Translated using Weblate (Russian) Currently translated at 96.7% (181 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index a82e90bdc..381fd1183 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -400,7 +400,7 @@ "@addDownloads": {}, "noErrors": "Ошибок нет!", "@noErrors": {}, - "errorScreenError": "Ошибка получения списка ошибок. Скорее всего, вам нужно сбросить приложение и сообщить о данной ошибке на Github", + "errorScreenError": "Ошибка при получении списка ошибок! Скорее всего, вам нужно сбросить приложение и сообщить о данной ошибке на Github", "@errorScreenError": {}, "location": "Расположение", "@location": {}, @@ -509,5 +509,23 @@ "noMusicLibrariesTitle": "Нет музыкальных библиотек", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." + }, + "syncDownloadedPlaylists": "Синхронизировать загруженные плейлисты", + "@syncDownloadedPlaylists": {}, + "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить песню в качестве следующего элемента в очереди при пролистывании списка песен вместо добавления ее в конец.", + "@swipeInsertQueueNextSubtitle": {}, + "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, альбом{album} плейлист{playlist} исполнителя{artist} жанр{genre} трек{song} другое{}} '{itemName}' с этого устройства?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." } } From 855f12e0c54ab185121b7c917a99db564559c1e1 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Thu, 7 Mar 2024 15:56:47 +0000 Subject: [PATCH 021/102] Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 98.9% (185 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant_HK/ --- lib/l10n/app_zh_Hant_HK.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_zh_Hant_HK.arb b/lib/l10n/app_zh_Hant_HK.arb index d58170af6..b582972f4 100644 --- a/lib/l10n/app_zh_Hant_HK.arb +++ b/lib/l10n/app_zh_Hant_HK.arb @@ -9,7 +9,7 @@ "@urlStartWithHttps": { "description": "Error message that shows when the user submits a server URL that doesn't start with http:// or https:// (for example, ftp://0.0.0.0" }, - "urlTrailingSlash": "URL 不能以「/」結尾", + "urlTrailingSlash": "URL 不能以「/」作結", "@urlTrailingSlash": { "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" }, @@ -367,7 +367,7 @@ "@couldNotFindLibraries": { "description": "Error message when the user does not have any libraries" }, - "internalExternalIpExplanation": "如果您需要在局部區域網絡(LAN)以外的地方連接 Jellyfin,請使用伺服器的區域網絡(WAN)IP。\n\n如果目標伺服器使用的連接埠(port)是 HTTP port(80/433),則毋須填寫連接埠。", + "internalExternalIpExplanation": "如果您需要在局部區域網絡(LAN)以外的地方連接 Jellyfin,請使用伺服器的區域網絡(WAN)IP。\n\n如果目標伺服器使用的連接埠(port)是 HTTP 的預設連接埠(80/433),則毋須填寫連接埠。", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, From 4dcd9ec32e25f9cff949dc9bfb6e1475693dfaac Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 10 Mar 2024 09:09:34 +0000 Subject: [PATCH 022/102] Translated using Weblate (Russian) Currently translated at 96.2% (180 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 381fd1183..1f7250811 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -125,7 +125,7 @@ "@downloadLocations": {}, "audioService": "Аудиосервис", "@audioService": {}, - "layoutAndTheme": "Тема", + "layoutAndTheme": "Макет и тема", "@layoutAndTheme": {}, "logOut": "Выйти", "@logOut": {}, @@ -173,7 +173,7 @@ "@landscape": {}, "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "Отображать исполнителя трека на странице альбома, если он совпадает с исполнителем альбома.", "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, - "theme": "Тема", + "theme": "Тема оформления", "@theme": {}, "system": "Системная", "@system": {}, @@ -527,5 +527,9 @@ } }, "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." - } + }, + "interactions": "Взаимодействия", + "@interactions": {}, + "swipeInsertQueueNext": "", + "@swipeInsertQueueNext": {} } From 504a34028e1555e3ce94157b2a111d4f7c7e4416 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 14 Mar 2024 17:38:40 +0000 Subject: [PATCH 023/102] Translated using Weblate (Russian) Currently translated at 96.2% (180 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 1f7250811..caf85c5fc 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -514,7 +514,7 @@ "@syncDownloadedPlaylists": {}, "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить песню в качестве следующего элемента в очереди при пролистывании списка песен вместо добавления ее в конец.", "@swipeInsertQueueNextSubtitle": {}, - "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, альбом{album} плейлист{playlist} исполнителя{artist} жанр{genre} трек{song} другое{}} '{itemName}' с этого устройства?", + "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {Тип элемента, выбор, альбом{album} плейлист{playlist} исполнителя{artist} жанр{genre} трек{song} другое{}} '{itemName}' с этого устройства?", "@deleteDownloadsPrompt": { "placeholders": { "itemName": { From 50a5e1d23a87106720704ebe5de8634e7b9c1acd Mon Sep 17 00:00:00 2001 From: full name Date: Sat, 16 Mar 2024 15:24:13 +0000 Subject: [PATCH 024/102] Translated using Weblate (German) Currently translated at 99.4% (186 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 1a951574b..53913d317 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -519,5 +519,19 @@ "swipeInsertQueueNext": "Gewischtes Lied als nächstes abspielen.", "@swipeInsertQueueNext": {}, "swipeInsertQueueNextSubtitle": "Aktivieren um das in der Liste nach links/rechts gewischte Lied als nächstes abzuspielen.", - "@swipeInsertQueueNextSubtitle": {} + "@swipeInsertQueueNextSubtitle": {}, + "playNext": "Als Nächstes abspielen", + "@playNext": { + "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." + }, + "noMusicLibrariesTitle": "Keine Musik-Bibliotheken", + "@noMusicLibrariesTitle": { + "description": "Title for message that shows on the views screen when no music libraries could be found." + }, + "refresh": "AKTUALISIEREN", + "@refresh": {}, + "noMusicLibrariesBody": "Finamp konnte keine Musikbibliotheken finden. Bitte stelle sicher, dass dein Jellyfin-Server mindestens eine Bibliothek mit dem Medientyp \"Musik\" enthält.", + "@noMusicLibrariesBody": {}, + "interactions": "Interaktionen", + "@interactions": {} } From bd3d76dd864121cb7649a919f4b00f8c8a240c06 Mon Sep 17 00:00:00 2001 From: bittin1ddc447d824349b2 Date: Tue, 19 Mar 2024 04:29:36 +0000 Subject: [PATCH 025/102] Translated using Weblate (Swedish) Currently translated at 98.3% (184 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/sv/ --- lib/l10n/app_sv.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index ce6634360..739d630aa 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -525,5 +525,7 @@ "deleteDownloadsAbortButtonText": "Avbryt", "@deleteDownloadsAbortButtonText": {}, "syncDownloadedPlaylists": "Synkronisera nedladdade spellistor", - "@syncDownloadedPlaylists": {} + "@syncDownloadedPlaylists": {}, + "interactions": "Interaktioner", + "@interactions": {} } From d122be6c982aaaf39fe8c10b2306d71617f25efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivano=C3=A9=20Megnin-Preiss?= Date: Tue, 19 Mar 2024 15:45:12 +0000 Subject: [PATCH 026/102] Translated using Weblate (French) Currently translated at 97.3% (182 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fr/ --- lib/l10n/app_fr.arb | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index ee73897d0..bb4f12474 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -503,5 +503,27 @@ "noMusicLibrariesTitle": "Pas de bibliothèque musicale", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." - } + }, + "deleteDownloadsPrompt": "Voulez-vous vraiment supprimer {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}' de cet appareil ?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "deleteDownloadsConfirmButtonText": "Supprimer", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "Annuler", + "@deleteDownloadsAbortButtonText": {}, + "syncDownloadedPlaylists": "Synchroniser les playlist téléchargées", + "@syncDownloadedPlaylists": {} } From 1ef2b826eb7d218ca03064c480f756b910e3641d Mon Sep 17 00:00:00 2001 From: I Date: Sat, 30 Mar 2024 19:36:26 +0000 Subject: [PATCH 027/102] Translated using Weblate (Italian) Currently translated at 97.3% (182 of 187 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/it/ --- lib/l10n/app_it.arb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 7ff31ccd8..2d044a878 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -315,7 +315,7 @@ "@bitrateSubtitle": {}, "shuffleAllSongCountSubtitle": "Numero di brani da caricare quando si usa il tasto per la riproduzione casuale di tutti i brani.", "@shuffleAllSongCountSubtitle": {}, - "errorScreenError": "Si è verificato un errore mentre tentavo di ottenere la lista degli errori! A questo punto probabilmente puoi solo aprire una issue su GitHub e cancellare i dati dell'app", + "errorScreenError": "Si è verificato un errore mentre tentavo di ottenere la lista degli errori! A questo punto probabilmente dovresti aprire una issue su GitHub e cancellare i dati dell'app", "@errorScreenError": {}, "anErrorHasOccured": "Si è verificato un errore.", "@anErrorHasOccured": {}, @@ -503,5 +503,13 @@ "noMusicLibrariesTitle": "Nessuna raccolta musicale", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." - } + }, + "syncDownloadedPlaylists": "Sincronizza playlists scaricate", + "@syncDownloadedPlaylists": {}, + "deleteDownloadsConfirmButtonText": "Elimina", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "Annulla", + "@deleteDownloadsAbortButtonText": {} } From f1bb96212e262a92641e170bff33e85158e590d7 Mon Sep 17 00:00:00 2001 From: Mistify Date: Fri, 5 Apr 2024 21:20:07 +0000 Subject: [PATCH 028/102] Translated using Weblate (Polish) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/pl/ --- lib/l10n/app_pl.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 7aaaaa594..56f997618 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -533,5 +533,7 @@ "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." }, "noMusicLibrariesBody": "Finamp nie mógł znaleźć żadnych bibliotek muzycznych. Upewnij się, że serwer Jellyfin zawiera co najmniej jedną bibliotekę z typem zawartości ustawionym na \"Muzyka\".", - "@noMusicLibrariesBody": {} + "@noMusicLibrariesBody": {}, + "redesignBeta": "Przeprojektowanie Beta", + "@redesignBeta": {} } From 3651f46729b218f3b11cfbf2c0dc4dae018ab85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Sat, 6 Apr 2024 03:30:14 +0000 Subject: [PATCH 029/102] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hans/ --- lib/l10n/app_zh.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index d4f221a58..26a64ca07 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -533,5 +533,7 @@ "interactions": "交互", "@interactions": {}, "swipeInsertQueueNextSubtitle": "在歌曲列表中滑动时,可以将歌曲作为队列中的下一个项目插入,而不是将其附加到末尾。", - "@swipeInsertQueueNextSubtitle": {} + "@swipeInsertQueueNextSubtitle": {}, + "redesignBeta": "重新设计测试版", + "@redesignBeta": {} } From 410e083a54614684b21b8028f325dcacdd35bc98 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Fri, 5 Apr 2024 09:35:41 +0000 Subject: [PATCH 030/102] Translated using Weblate (Czech) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/cs/ --- lib/l10n/app_cs.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index 9355faaea..a6691f58c 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -533,5 +533,7 @@ "interactions": "Interakce", "@interactions": {}, "swipeInsertQueueNext": "Přehrát posunutou skladbu jako další", - "@swipeInsertQueueNext": {} + "@swipeInsertQueueNext": {}, + "redesignBeta": "Nový design (beta)", + "@redesignBeta": {} } From a17a1986adef4421bff1349f8f55c4b2bd29921f Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sat, 6 Apr 2024 13:07:12 +0000 Subject: [PATCH 031/102] Translated using Weblate (Spanish) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/es/ --- lib/l10n/app_es.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 219bc3ffc..785201801 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -533,5 +533,7 @@ "interactions": "Interacciones", "@interactions": {}, "swipeInsertQueueNext": "Reproducir la siguiente canción al deslizarla", - "@swipeInsertQueueNext": {} + "@swipeInsertQueueNext": {}, + "redesignBeta": "Nuevo diseño (beta)", + "@redesignBeta": {} } From d2bdaa91f84d94ebc7a28b1c00425fac7a9b00f2 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Fri, 12 Apr 2024 09:48:41 +0000 Subject: [PATCH 032/102] Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 99.4% (187 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant_HK/ --- lib/l10n/app_zh_Hant_HK.arb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_zh_Hant_HK.arb b/lib/l10n/app_zh_Hant_HK.arb index b582972f4..279a9a06b 100644 --- a/lib/l10n/app_zh_Hant_HK.arb +++ b/lib/l10n/app_zh_Hant_HK.arb @@ -529,5 +529,9 @@ "syncDownloadedPlaylists": "同步已下載播放清單", "@syncDownloadedPlaylists": {}, "showFastScroller": "顯示快速卷軸", - "@showFastScroller": {} + "@showFastScroller": {}, + "redesignBeta": "新介面測試版", + "@redesignBeta": {}, + "swipeInsertQueueNext": "滑動插播", + "@swipeInsertQueueNext": {} } From 807e2df3cfe6c8c2e147aa759fd68f7c61b346c3 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Wed, 17 Apr 2024 19:05:27 +0000 Subject: [PATCH 033/102] Translated using Weblate (Croatian) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/hr/ --- lib/l10n/app_hr.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index 866669b19..b41168684 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -533,5 +533,7 @@ "interactions": "Interakcije", "@interactions": {}, "swipeInsertQueueNext": "Reproduciraj pjesmu kao sljedeću povlačenjem", - "@swipeInsertQueueNext": {} + "@swipeInsertQueueNext": {}, + "redesignBeta": "Redizajn beta verzije", + "@redesignBeta": {} } From 9573e7a0e43d7e8e1eb9f35b5a529b2954e5a15b Mon Sep 17 00:00:00 2001 From: HanaO00 Date: Fri, 19 Apr 2024 20:45:56 +0000 Subject: [PATCH 034/102] Translated using Weblate (French) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fr/ --- lib/l10n/app_fr.arb | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index bb4f12474..3ea321441 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -285,7 +285,7 @@ "@unknownError": {}, "shuffleAllSongCount": "Nombre pour lecture aléatoire", "@shuffleAllSongCount": {}, - "errorScreenError": "Une erreur s'est produite pendant la récupération de la liste des erreurs! Vu la situation, vous devriez juste créer une issue sur Github et supprimer les données de l'application.", + "errorScreenError": "Une erreur s'est produite pendant la récupération de la liste des erreurs ! Vu la situation, vous devriez créer une issue sur Github et supprimer les données de l'application.", "@errorScreenError": {}, "jellyfinUsesAACForTranscoding": "Jellyfin utilise AAC pour le transcodage", "@jellyfinUsesAACForTranscoding": {}, @@ -379,7 +379,7 @@ } } }, - "addedToQueue": "Ajouté à la file d'attente", + "addedToQueue": "Ajouté à la file d'attente.", "@addedToQueue": {}, "addFavourite": "Ajouter aux favoris", "@addFavourite": {}, @@ -525,5 +525,15 @@ "deleteDownloadsAbortButtonText": "Annuler", "@deleteDownloadsAbortButtonText": {}, "syncDownloadedPlaylists": "Synchroniser les playlist téléchargées", - "@syncDownloadedPlaylists": {} + "@syncDownloadedPlaylists": {}, + "showFastScroller": "Afficher la barre de défilement rapide", + "@showFastScroller": {}, + "swipeInsertQueueNext": "Jouer la chanson glissée ensuite", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "Permet d'insérer une chanson comme élément suivant dans la file d'attente lorsqu'elle est glissée dans la liste des chansons au lieu de l'ajouter à la fin de la liste.", + "@swipeInsertQueueNextSubtitle": {}, + "redesignBeta": "Refonte bêta", + "@redesignBeta": {}, + "interactions": "Interactions", + "@interactions": {} } From 61037ec9613eb3ee996e317504acc54e9bfff87d Mon Sep 17 00:00:00 2001 From: Felipe Silva Date: Mon, 22 Apr 2024 13:46:26 +0000 Subject: [PATCH 035/102] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.4% (187 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/pt_BR/ --- lib/l10n/app_pt_BR.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index b8626d148..68ae22839 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -531,5 +531,7 @@ "deleteDownloadsAbortButtonText": "Cancelar", "@deleteDownloadsAbortButtonText": {}, "syncDownloadedPlaylists": "Sincronizar listas de reprodução baixadas", - "@syncDownloadedPlaylists": {} + "@syncDownloadedPlaylists": {}, + "showFastScroller": "Mostrar rolagem rápida", + "@showFastScroller": {} } From cac89bc03e4e60a23a3ebb7fce4f7e9f69371205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sun, 21 Apr 2024 17:17:31 +0000 Subject: [PATCH 036/102] Translated using Weblate (Turkish) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/tr/ --- lib/l10n/app_tr.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 3b9a484d5..e61c3a59c 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -533,5 +533,7 @@ "swipeInsertQueueNext": "Kaydırılan Şarkıyı Ardından Oynat", "@swipeInsertQueueNext": {}, "swipeInsertQueueNextSubtitle": "Şarkı listesinde kaydırıldığında bir şarkıyı sona eklemek yerine sıradaki öge olarak eklemeyi etkinleştirin.", - "@swipeInsertQueueNextSubtitle": {} + "@swipeInsertQueueNextSubtitle": {}, + "redesignBeta": "Yeniden Tasarım Beta", + "@redesignBeta": {} } From 0c51844e71cb378019a963eda6374a64380198e9 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:07:00 +0100 Subject: [PATCH 037/102] Fix Russian translation syntax --- lib/l10n/app_ru.arb | 4 ++-- .../ephemeral/.plugin_symlinks/device_info_plus | 1 - .../ephemeral/.plugin_symlinks/package_info_plus | 1 - .../ephemeral/.plugin_symlinks/path_provider_linux | 1 - linux/flutter/ephemeral/.plugin_symlinks/share_plus | 1 - .../ephemeral/.plugin_symlinks/url_launcher_linux | 1 - macos/Flutter/ephemeral/Flutter-Generated.xcconfig | 11 ----------- .../Flutter/ephemeral/flutter_export_environment.sh | 12 ------------ 8 files changed, 2 insertions(+), 30 deletions(-) delete mode 120000 linux/flutter/ephemeral/.plugin_symlinks/device_info_plus delete mode 120000 linux/flutter/ephemeral/.plugin_symlinks/package_info_plus delete mode 120000 linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux delete mode 120000 linux/flutter/ephemeral/.plugin_symlinks/share_plus delete mode 120000 linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux delete mode 100644 macos/Flutter/ephemeral/Flutter-Generated.xcconfig delete mode 100644 macos/Flutter/ephemeral/flutter_export_environment.sh diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index caf85c5fc..217367ae6 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -514,7 +514,7 @@ "@syncDownloadedPlaylists": {}, "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить песню в качестве следующего элемента в очереди при пролистывании списка песен вместо добавления ее в конец.", "@swipeInsertQueueNextSubtitle": {}, - "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {Тип элемента, выбор, альбом{album} плейлист{playlist} исполнителя{artist} жанр{genre} трек{song} другое{}} '{itemName}' с этого устройства?", + "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{альбом} playlist{плейлист} artist{исполнителя} genre{жанр} song{трек} other{}} '{itemName}' с этого устройства?", "@deleteDownloadsPrompt": { "placeholders": { "itemName": { @@ -532,4 +532,4 @@ "@interactions": {}, "swipeInsertQueueNext": "", "@swipeInsertQueueNext": {} -} +} \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus b/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus deleted file mode 120000 index 68c46f709..000000000 --- a/linux/flutter/ephemeral/.plugin_symlinks/device_info_plus +++ /dev/null @@ -1 +0,0 @@ -/Users/james/.pub-cache/hosted/pub.dev/device_info_plus-9.1.2/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus b/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus deleted file mode 120000 index 0a8e28670..000000000 --- a/linux/flutter/ephemeral/.plugin_symlinks/package_info_plus +++ /dev/null @@ -1 +0,0 @@ -/Users/james/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux deleted file mode 120000 index ee3d1dabd..000000000 --- a/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux +++ /dev/null @@ -1 +0,0 @@ -/Users/james/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/share_plus b/linux/flutter/ephemeral/.plugin_symlinks/share_plus deleted file mode 120000 index e2614ca41..000000000 --- a/linux/flutter/ephemeral/.plugin_symlinks/share_plus +++ /dev/null @@ -1 +0,0 @@ -/Users/james/.pub-cache/hosted/pub.dev/share_plus-7.2.2/ \ No newline at end of file diff --git a/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux b/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux deleted file mode 120000 index 79a19f963..000000000 --- a/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux +++ /dev/null @@ -1 +0,0 @@ -/Users/james/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/ \ No newline at end of file diff --git a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig deleted file mode 100644 index f2cc55f69..000000000 --- a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=C:\flutter -FLUTTER_APPLICATION_PATH=D:\Code\Flutter\finamp -COCOAPODS_PARALLEL_CODE_SIGN=true -FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=0.6.20 -FLUTTER_BUILD_NUMBER=41 -DART_OBFUSCATION=false -TRACK_WIDGET_CREATION=true -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh deleted file mode 100644 index 7a828ab9c..000000000 --- a/macos/Flutter/ephemeral/flutter_export_environment.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=C:\flutter" -export "FLUTTER_APPLICATION_PATH=D:\Code\Flutter\finamp" -export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=0.6.20" -export "FLUTTER_BUILD_NUMBER=41" -export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=true" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" From 7689ca04eba089f319ca44a312d87560229f947c Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:35:33 +0100 Subject: [PATCH 038/102] Remove accidentally pushed desktop stuff --- linux/flutter/generated_plugin_registrant.cc | 15 ------------ linux/flutter/generated_plugin_registrant.h | 15 ------------ linux/flutter/generated_plugins.cmake | 24 -------------------- 3 files changed, 54 deletions(-) delete mode 100644 linux/flutter/generated_plugin_registrant.cc delete mode 100644 linux/flutter/generated_plugin_registrant.h delete mode 100644 linux/flutter/generated_plugins.cmake diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index f6f23bfe9..000000000 --- a/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include - -void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); - url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); -} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47bc..000000000 --- a/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake deleted file mode 100644 index f16b4c342..000000000 --- a/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST - url_launcher_linux -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) From 568ccbe29c5462c80cca68ef0c4d854d47a1ae11 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:36:16 +0100 Subject: [PATCH 039/102] Bump version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index ca3fb282a..aa85f8d50 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.20+42 +version: 0.6.21+43 environment: sdk: ">=2.19.4 <3.0.0" From 1f87a2ef6988313d580540ddd5258cf4bcd16f78 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 23 Apr 2024 18:10:37 +0100 Subject: [PATCH 040/102] Upgrade Android SDK --- android/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ef5d8ad44..ea4ba9982 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -32,7 +32,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion 34 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -46,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.unicornsonlsd.finamp" minSdkVersion 21 - targetSdkVersion 33 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } From 99c10486fa091b381d36b33bd89a619cb3675da8 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 23 Apr 2024 18:10:42 +0100 Subject: [PATCH 041/102] Add F-Droid metadata --- fastlane/metadata/android/en-US/changelogs/43.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/43.txt diff --git a/fastlane/metadata/android/en-US/changelogs/43.txt b/fastlane/metadata/android/en-US/changelogs/43.txt new file mode 100644 index 000000000..6cab8bda7 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/43.txt @@ -0,0 +1 @@ +New features and bug fixes. Full changelog at https://github.com/jmshrv/finamp/releases/tag/0.6.21 \ No newline at end of file From 727b0d7eb43f5f2f896024946dbf8ca2bca5da6f Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:26:11 +0100 Subject: [PATCH 042/102] Bring back widget.parentItem when getting items Fixes #697 --- lib/components/MusicScreen/music_screen_tab_view.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/components/MusicScreen/music_screen_tab_view.dart b/lib/components/MusicScreen/music_screen_tab_view.dart index 49d253916..623fa0a6e 100644 --- a/lib/components/MusicScreen/music_screen_tab_view.dart +++ b/lib/components/MusicScreen/music_screen_tab_view.dart @@ -83,7 +83,11 @@ class _MusicScreenTabViewState extends State final newItems = await _jellyfinApiHelper.getItems( // starting with Jellyfin 10.9, only automatically created playlists will have a specific library as parent. user-created playlists will not be returned anymore // this condition fixes this by not providing a parentId when fetching playlists - parentItem: widget.tabContentType == TabContentType.playlists ? null : widget.view, + parentItem: widget.tabContentType == TabContentType.playlists + ? null + : widget.parentItem ?? + widget.view ?? + _finampUserHelper.currentUser?.currentView, includeItemTypes: _includeItemTypes(widget.tabContentType), // If we're on the songs tab, sort by "Album,SortName". This is what the From efae80712c2b5952fba6ae5817b357685e28d14c Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:27:59 +0100 Subject: [PATCH 043/102] Bump version, F-Droid metadata --- fastlane/metadata/android/en-US/changelogs/44.txt | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/44.txt diff --git a/fastlane/metadata/android/en-US/changelogs/44.txt b/fastlane/metadata/android/en-US/changelogs/44.txt new file mode 100644 index 000000000..50f0de586 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/44.txt @@ -0,0 +1 @@ +Fixed a bug where the artist screen would show albums from the whole library instead of the specific artist. \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index aa85f8d50..560c901c5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.21+43 +version: 0.6.22+44 environment: sdk: ">=2.19.4 <3.0.0" From d870d40c3312fa4c074b0886d571d6809852889d Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:31:29 +0100 Subject: [PATCH 044/102] Update flutterw --- .flutter | 2 +- pubspec.lock | 128 +++++++++++++++++++++++++-------------------------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/.flutter b/.flutter index abb292a07..54e66469a 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit abb292a07e20d696c4568099f918f6c5f330e6b0 +Subproject commit 54e66469a933b60ddf175f858f82eaeb97e48c8d diff --git a/pubspec.lock b/pubspec.lock index 4d8683947..b891bb873 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.0" async: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: "direct main" description: name: audio_service - sha256: a4d989f1225ea9621898d60f23236dcbfc04876fa316086c23c5c4af075dbac4 + sha256: "4547c312a94f9cb2c48b60823fb190767cbd63454a83c73049384d5d3cba4650" url: "https://pub.dev" source: hosted - version: "0.18.12" + version: "0.18.13" audio_service_platform_interface: dependency: transitive description: @@ -69,18 +69,18 @@ packages: dependency: transitive description: name: audio_service_web - sha256: "523e64ddc914c714d53eec2da85bba1074f08cf26c786d4efb322de510815ea7" + sha256: "9d7d5ae5f98a5727f2580fad73062f2484f400eef6cef42919413268e62a363e" url: "https://pub.dev" source: hosted - version: "0.1.1" + version: "0.1.2" audio_session: dependency: "direct main" description: name: audio_session - sha256: "6fdf255ed3af86535c96452c33ecff1245990bb25a605bfb1958661ccc3d467f" + sha256: a49af9981eec5d7cd73b37bacb6ee73f8143a6a9f9bd5b6021e6c346b9b6cf4e url: "https://pub.dev" source: hosted - version: "0.1.18" + version: "0.1.19" auto_size_text: dependency: "direct main" description: @@ -133,10 +133,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.9" build_runner_core: dependency: transitive description: @@ -157,10 +157,10 @@ packages: dependency: transitive description: name: built_value - sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb url: "https://pub.dev" source: hosted - version: "8.9.1" + version: "8.9.2" characters: dependency: transitive description: @@ -261,18 +261,18 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.8" dart_style: dependency: transitive description: name: dart_style - sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.6" device_info_plus: dependency: "direct main" description: @@ -392,18 +392,18 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.0.19" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod - sha256: "4bce556b7ecbfea26109638d5237684538d4abc509d253e6c5c4c5733b360098" + sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" url: "https://pub.dev" source: hosted - version: "2.4.10" + version: "2.5.1" flutter_staggered_grid_view: dependency: transitive description: @@ -434,18 +434,18 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" get_it: dependency: "direct main" description: name: get_it - sha256: e6017ce7fdeaf218dc51a100344d8cb70134b80e28b760f8bb23c242437bafd7 + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 url: "https://pub.dev" source: hosted - version: "7.6.7" + version: "7.7.0" glob: dependency: transitive description: @@ -546,10 +546,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.1" json_annotation: dependency: "direct main" description: @@ -570,10 +570,10 @@ packages: dependency: "direct main" description: name: just_audio - sha256: b607cd1a43bac03d85c3aaee00448ff4a589ef2a77104e3d409889ff079bf823 + sha256: b7cb6bbf3750caa924d03f432ba401ec300fd90936b3f73a9b33d58b1e96286b url: "https://pub.dev" source: hosted - version: "0.9.36" + version: "0.9.37" just_audio_platform_interface: dependency: transitive description: @@ -731,18 +731,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.4" path_provider_foundation: dependency: transitive description: @@ -779,10 +779,10 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44" + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" url: "https://pub.dev" source: hosted - version: "11.3.0" + version: "11.3.1" permission_handler_android: dependency: transitive description: @@ -795,10 +795,10 @@ packages: dependency: transitive description: name: permission_handler_apple - sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b + sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "9.4.4" permission_handler_html: dependency: transitive description: @@ -811,10 +811,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78" + sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.2.1" permission_handler_windows: dependency: transitive description: @@ -851,10 +851,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" url: "https://pub.dev" source: hosted - version: "3.7.4" + version: "3.9.0" pool: dependency: transitive description: @@ -867,10 +867,10 @@ packages: dependency: "direct main" description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" pub_semver: dependency: transitive description: @@ -891,10 +891,10 @@ packages: dependency: transitive description: name: riverpod - sha256: "548e2192eb7aeb826eb89387f814edb76594f3363e2c0bb99dd733d795ba3589" + sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.5.1" rxdart: dependency: "direct main" description: @@ -915,10 +915,10 @@ packages: dependency: transitive description: name: share_plus_platform_interface - sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" shelf: dependency: transitive description: @@ -984,18 +984,18 @@ packages: dependency: transitive description: name: sqflite - sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 + sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.3" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" stack_trace: dependency: transitive description: @@ -1080,18 +1080,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" + sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.2.6" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 + sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_ios: dependency: transitive description: @@ -1128,10 +1128,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" url_launcher_windows: dependency: transitive description: @@ -1184,34 +1184,34 @@ packages: dependency: transitive description: name: web - sha256: "1d9158c616048c38f712a6646e317a3426da10e884447626167240d45209cbad" + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.5.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2" + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" win32: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.4.0" win32_registry: dependency: transitive description: name: win32_registry - sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" + sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.3" xdg_directories: dependency: transitive description: From 4a280a4abc4e00166e1cdb978458749942075a36 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Fri, 26 Apr 2024 00:37:04 +0100 Subject: [PATCH 045/102] Bump build number because I guess Apple forgot to process the last build --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 560c901c5..e6954763e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.22+44 +version: 0.6.22+45 environment: sdk: ">=2.19.4 <3.0.0" From e5a9561e97fe44e1b01f9b627eec8c9a7449105d Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:33:25 +0100 Subject: [PATCH 046/102] Add F-Droid metadata --- fastlane/metadata/android/en-US/changelogs/45.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/45.txt diff --git a/fastlane/metadata/android/en-US/changelogs/45.txt b/fastlane/metadata/android/en-US/changelogs/45.txt new file mode 100644 index 000000000..50f0de586 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/45.txt @@ -0,0 +1 @@ +Fixed a bug where the artist screen would show albums from the whole library instead of the specific artist. \ No newline at end of file From d5de094494c5a6a36b7dcf066406fd34bbd47163 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:34:47 +0100 Subject: [PATCH 047/102] Add even more F-Droid metadata --- fastlane/metadata/android/en-US/changelogs/46.txt | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/46.txt diff --git a/fastlane/metadata/android/en-US/changelogs/46.txt b/fastlane/metadata/android/en-US/changelogs/46.txt new file mode 100644 index 000000000..8a6a0fdf5 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/46.txt @@ -0,0 +1 @@ +Reverted to Android API 33 since 34 seems to break background playback diff --git a/pubspec.yaml b/pubspec.yaml index e6954763e..fd0363495 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.22+45 +version: 0.6.23+46 environment: sdk: ">=2.19.4 <3.0.0" From d1ae8153583a740b90bec1e9a2f36b09f6029d07 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Sun, 28 Apr 2024 01:35:44 +0100 Subject: [PATCH 048/102] Set targetSdkVersion to 33 Fixes #703 and #704, will have to look into why this happens --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ea4ba9982..76735f615 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -46,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.unicornsonlsd.finamp" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } From 2b086439e585efc2dc7511698124474d054da2f3 Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Sat, 11 May 2024 22:26:12 +0200 Subject: [PATCH 049/102] updated readme --- GitHub_Banner.png | Bin 0 -> 218594 bytes README.md | 17 ++++++----------- 2 files changed, 6 insertions(+), 11 deletions(-) create mode 100644 GitHub_Banner.png diff --git a/GitHub_Banner.png b/GitHub_Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2a35ecdd392d03e592267d574cb7811d887ace GIT binary patch literal 218594 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 886fe0b9d..7840ef28a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Several screenshots of the app showing off different screens and features in both light and dark mode](./Showcase.png) +![Banner](./GitHub_Banner.png) #### Redesign Beta @@ -12,19 +12,20 @@ Please note that the beta is still work-in-progress, so the UI and functionality Some of its features include: - A welcoming user interface that looks modern & unique, but still familiar -- Downloading files for offline listening and saving mobile data +- Downloading files for offline listening and saving mobile data. Can use transcoded downloads to save even more space. - Transcoded streaming for saving mobile data - Beautiful dynamic colors that adapt to your media - Audio volume normalization ("ReplayGain") (Jellyfin 10.9+) +- Lyrics (Jellyfin 10.9+) - Gapless playback -- Android Auto support (experimental, only works when installed via Google Play) +- Android Auto support (coming soon™) - Full support for Jellyfin's "Playback Reporting" feature and plugin, letting you keep track of your listening activity ***You need your own Jellyfin server to use Finamp. If you don't have one yet, take a look at [Jellyfin's website](https://jellyfin.org/) to learn more about it and how to set it up.*** ## Getting Finamp -

+
[Get it on F-Droid Date: Thu, 25 Apr 2024 21:24:15 +0000 Subject: [PATCH 050/102] Translated using Weblate (Russian) Currently translated at 96.8% (182 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 217367ae6..cdfae5ed3 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -531,5 +531,7 @@ "interactions": "Взаимодействия", "@interactions": {}, "swipeInsertQueueNext": "", - "@swipeInsertQueueNext": {} -} \ No newline at end of file + "@swipeInsertQueueNext": {}, + "redesignBeta": "Бета-версия с редизайном", + "@redesignBeta": {} +} From 0b02a12c67bfda339af7774e0ea11c7fdce6750f Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 5 May 2024 19:47:36 +0000 Subject: [PATCH 051/102] Translated using Weblate (Russian) Currently translated at 96.8% (182 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index cdfae5ed3..6a4eda30c 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -514,7 +514,7 @@ "@syncDownloadedPlaylists": {}, "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить песню в качестве следующего элемента в очереди при пролистывании списка песен вместо добавления ее в конец.", "@swipeInsertQueueNextSubtitle": {}, - "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{альбом} playlist{плейлист} artist{исполнителя} genre{жанр} song{трек} other{}} '{itemName}' с этого устройства?", + "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{альбом} playlist{плейлист} artist{исполнителя} genre{жанр} song{песня} other{}} '{itemName}' с этого устройства?", "@deleteDownloadsPrompt": { "placeholders": { "itemName": { From d19c02ef19ca8064f12ad467b7de33a3af6eef73 Mon Sep 17 00:00:00 2001 From: tomechio Date: Mon, 13 May 2024 18:10:50 +0200 Subject: [PATCH 052/102] Added translation using Weblate (Finnish) --- lib/l10n/app_fi.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/l10n/app_fi.arb diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/lib/l10n/app_fi.arb @@ -0,0 +1 @@ +{} From 7400b9d4c8ff92b0e9cf79ade6444692e9bff5d0 Mon Sep 17 00:00:00 2001 From: tomechio Date: Mon, 13 May 2024 19:50:49 +0000 Subject: [PATCH 053/102] Translated using Weblate (Finnish) Currently translated at 39.8% (75 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 191 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 190 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 0967ef424..170e1050a 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -1 +1,190 @@ -{} +{ + "unknownError": "Tuntematon virhe", + "@unknownError": {}, + "removedFromPlaylist": "Poistettu soittolistalta", + "@removedFromPlaylist": {}, + "addFavourite": "Lisää suosikki", + "@addFavourite": {}, + "goToAlbum": "Mene albumiin", + "@goToAlbum": {}, + "downloads": "Lataukset", + "@downloads": {}, + "settings": "Asetukset", + "@settings": {}, + "shareLogs": "Jaa lokit", + "@shareLogs": {}, + "removeFavourite": "Poista suosikki", + "@removeFavourite": {}, + "playNext": "Toista seuraava", + "@playNext": { + "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." + }, + "confirm": "Vahvista", + "@confirm": {}, + "language": "Kieli", + "@language": {}, + "refresh": "PÄIVITÄ", + "@refresh": {}, + "serverUrl": "Palvelimen URL", + "@serverUrl": {}, + "emptyServerUrl": "Palvelimen URL ei voi olla tyhjä", + "@emptyServerUrl": { + "description": "Error message that shows when the user submits a login without a server URL" + }, + "urlStartWithHttps": "URL pitää alkaa http:// tai https://", + "@urlStartWithHttps": { + "description": "Error message that shows when the user submits a server URL that doesn't start with http:// or https:// (for example, ftp://0.0.0.0" + }, + "urlTrailingSlash": "URL ei saa päättyä vinoviivaan", + "@urlTrailingSlash": { + "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" + }, + "username": "Käyttäjätunnus", + "@username": {}, + "password": "Salasana", + "@password": {}, + "logs": "Lokit", + "@logs": {}, + "next": "Seuraava", + "@next": {}, + "selectMusicLibraries": "Valitse musiikkikirjastot", + "@selectMusicLibraries": { + "description": "App bar title for library select screen" + }, + "couldNotFindLibraries": "Yhtään kirjastoa ei löytynyt", + "@couldNotFindLibraries": { + "description": "Error message when the user does not have any libraries" + }, + "unknownName": "Tuntematon nimi", + "@unknownName": {}, + "songs": "Kappaleet", + "@songs": {}, + "albums": "Albumit", + "@albums": {}, + "artists": "Artistit", + "@artists": {}, + "genres": "Tyylilajit", + "@genres": {}, + "playlists": "Soittolistat", + "@playlists": {}, + "music": "Musiikki", + "@music": {}, + "clear": "Tyhjennä", + "@clear": {}, + "favourites": "Suosikit", + "@favourites": {}, + "offlineMode": "Offline tila", + "@offlineMode": {}, + "finamp": "Finamp", + "@finamp": {}, + "sortOrder": "Lajittelujärjestys", + "@sortOrder": {}, + "album": "Albumi", + "@album": {}, + "albumArtist": "Albumin artisti", + "@albumArtist": {}, + "artist": "Artisti", + "@artist": {}, + "name": "Nimi", + "@name": {}, + "random": "Satunnainen", + "@random": {}, + "criticRating": "Kriitikoiden arvostelu", + "@criticRating": {}, + "downloadMissingImages": "Lataa puuttuvat kuvat", + "@downloadMissingImages": {}, + "syncDownloadedPlaylists": "Synkronoi ladatut soittolistat", + "@syncDownloadedPlaylists": {}, + "downloadErrors": "Latauksen virheet", + "@downloadErrors": {}, + "dlFailed": "{count} epäonnistui", + "@dlFailed": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dlComplete": "{count} valmistunut", + "@dlComplete": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dlRunning": "{count} käynnissä", + "@dlRunning": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadErrorsTitle": "Latauksen virheet", + "@downloadErrorsTitle": {}, + "noErrors": "Ei virheitä!", + "@noErrors": {}, + "deleteDownloadsConfirmButtonText": "Poista", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "Peruuta", + "@deleteDownloadsAbortButtonText": {}, + "error": "Virhe", + "@error": {}, + "playButtonLabel": "TOISTA", + "@playButtonLabel": {}, + "shuffleButtonLabel": "SEKOITA", + "@shuffleButtonLabel": {}, + "discNumber": "Levy {number}", + "@discNumber": { + "placeholders": { + "number": { + "type": "int" + } + } + }, + "editPlaylistNameTitle": "Muokkaa soittolistan nimeä", + "@editPlaylistNameTitle": {}, + "editPlaylistNameTooltip": "Muokkaa soittolistan nimeä", + "@editPlaylistNameTooltip": {}, + "playlistNameUpdated": "Soittolistan nimi päivitetty.", + "@playlistNameUpdated": {}, + "favourite": "Suosikki", + "@favourite": {}, + "addDownloads": "Lisää lataukset", + "@addDownloads": {}, + "updateButtonLabel": "PÄIVITÄ", + "@updateButtonLabel": {}, + "downloadsDeleted": "Lataukset poistettu.", + "@downloadsDeleted": {}, + "location": "Sijainti", + "@location": {}, + "downloadsAdded": "Lataukset lisätty.", + "@downloadsAdded": {}, + "addButtonLabel": "LISÄÄ", + "@addButtonLabel": {}, + "logsCopied": "Lokit kopioitu.", + "@logsCopied": {}, + "message": "Viesti", + "@message": {}, + "downloadLocations": "Latauksen sijainnit", + "@downloadLocations": {}, + "transcoding": "Transkoodaus", + "@transcoding": {}, + "notAvailableInOfflineMode": "Ei saatavilla offline tilassa", + "@notAvailableInOfflineMode": {}, + "areYouSure": "Oletko varma?", + "@areYouSure": {}, + "logOut": "Kirjaudu ulos", + "@logOut": {}, + "downloadedSongsWillNotBeDeleted": "Ladattuja kappaleita ei poisteta", + "@downloadedSongsWillNotBeDeleted": {}, + "jellyfinUsesAACForTranscoding": "Jellyfin käyttää AAC:tä transkoodaukseen", + "@jellyfinUsesAACForTranscoding": {}, + "enableTranscoding": "Ota transkoodaus käyttöön", + "@enableTranscoding": {}, + "enableTranscodingSubtitle": "Transkoodaa musiikin suoratoiston palvelimen päässä.", + "@enableTranscodingSubtitle": {} +} From ecc65733da7394ad9ebd5caec1fbc7e28ff463a4 Mon Sep 17 00:00:00 2001 From: tomechio Date: Sun, 19 May 2024 19:42:42 +0000 Subject: [PATCH 054/102] Translated using Weblate (Finnish) Currently translated at 65.4% (123 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 110 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 170e1050a..9c4b51026 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -186,5 +186,113 @@ "enableTranscoding": "Ota transkoodaus käyttöön", "@enableTranscoding": {}, "enableTranscodingSubtitle": "Transkoodaa musiikin suoratoiston palvelimen päässä.", - "@enableTranscodingSubtitle": {} + "@enableTranscodingSubtitle": {}, + "shuffleAll": "Sekoita kaikki", + "@shuffleAll": {}, + "budget": "Budjetti", + "@budget": {}, + "communityRating": "Yhteisön arvostelu", + "@communityRating": {}, + "dateAdded": "Lisäämisen päivämäärä", + "@dateAdded": {}, + "datePlayed": "Toiston päivämäärä", + "@datePlayed": {}, + "playCount": "Toistolaskuri", + "@playCount": {}, + "productionYear": "Tuotantovuosi", + "@productionYear": {}, + "revenue": "Tulot", + "@revenue": {}, + "runtime": "Kesto", + "@runtime": {}, + "dlEnqueued": "{count} Jonossa", + "@dlEnqueued": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "required": "Pakollinen", + "@required": {}, + "layoutAndTheme": "Asettelu ja Teema", + "@layoutAndTheme": {}, + "viewType": "Näkymän Tyyppi", + "@viewType": {}, + "list": "Lista", + "@list": {}, + "grid": "Ruudukko", + "@grid": {}, + "portrait": "Pysty", + "@portrait": {}, + "landscape": "Vaaka", + "@landscape": {}, + "showTextOnGridView": "Näytä teksti ruudukkonäkymässä", + "@showTextOnGridView": {}, + "theme": "Teema", + "@theme": {}, + "system": "Järjestelmä", + "@system": {}, + "light": "Vaalea", + "@light": {}, + "tabs": "Välilehdet", + "@tabs": {}, + "cancelSleepTimer": "Peruuta uniajastin?", + "@cancelSleepTimer": {}, + "yesButtonLabel": "KYLLÄ", + "@yesButtonLabel": {}, + "setSleepTimer": "Aseta uniajastin", + "@setSleepTimer": {}, + "minutes": "Minuutit", + "@minutes": {}, + "sleepTimerTooltip": "Uniajastin", + "@sleepTimerTooltip": {}, + "addToPlaylistTooltip": "Lisää soittolistalle", + "@addToPlaylistTooltip": {}, + "removeFromPlaylistTooltip": "Poista soittolistalta", + "@removeFromPlaylistTooltip": {}, + "removeFromPlaylistTitle": "Poista soittolistalta", + "@removeFromPlaylistTitle": {}, + "direct": "SUORA", + "@direct": {}, + "queue": "Jono", + "@queue": {}, + "addedToQueue": "Lisätty jonoon.", + "@addedToQueue": { + "description": "Snackbar message that shows when the user successfully adds items to the end of the play queue." + }, + "anErrorHasOccured": "Tapahtui virhe.", + "@anErrorHasOccured": {}, + "bufferDuration": "Puskurin kesto", + "@bufferDuration": {}, + "dark": "Tumma", + "@dark": {}, + "noButtonLabel": "EI", + "@noButtonLabel": {}, + "newPlaylist": "Uusi soittolista", + "@newPlaylist": {}, + "createButtonLabel": "LUO", + "@createButtonLabel": {}, + "noAlbum": "Ei albumia", + "@noAlbum": {}, + "addToPlaylistTitle": "Lisää soittolistalle", + "@addToPlaylistTitle": {}, + "playlistCreated": "Soittolista on luotu.", + "@playlistCreated": {}, + "noArtist": "Ei Artistia", + "@noArtist": {}, + "unknownArtist": "Tuntematon artisti", + "@unknownArtist": {}, + "downloaded": "LADATTU", + "@downloaded": {}, + "addToQueue": "Lisää jonoon", + "@addToQueue": { + "description": "Popup menu item title for adding an item to the end of the play queue." + }, + "resetTabs": "Nollaa välilehdet", + "@resetTabs": {}, + "noMusicLibrariesTitle": "Ei musiikkikirjastoja", + "@noMusicLibrariesTitle": { + "description": "Title for message that shows on the views screen when no music libraries could be found." + } } From fb23a1ba1275236fb6cd52d295eadd84b5b01b35 Mon Sep 17 00:00:00 2001 From: tomechio Date: Fri, 24 May 2024 16:15:39 +0000 Subject: [PATCH 055/102] Translated using Weblate (Finnish) Currently translated at 65.4% (123 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 9c4b51026..398d38fad 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -51,11 +51,11 @@ "@selectMusicLibraries": { "description": "App bar title for library select screen" }, - "couldNotFindLibraries": "Yhtään kirjastoa ei löytynyt", + "couldNotFindLibraries": "Yhtään kirjastoa ei löytynyt.", "@couldNotFindLibraries": { "description": "Error message when the user does not have any libraries" }, - "unknownName": "Tuntematon nimi", + "unknownName": "Tuntematon Nimi", "@unknownName": {}, "songs": "Kappaleet", "@songs": {}, From 392362a8302821fb4efbe5c6044f0e2782d231e2 Mon Sep 17 00:00:00 2001 From: hugoalh Date: Tue, 4 Jun 2024 05:50:37 +0000 Subject: [PATCH 056/102] Translated using Weblate (Chinese (Traditional)) Currently translated at 94.6% (178 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant/ --- lib/l10n/app_zh_Hant.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/app_zh_Hant.arb b/lib/l10n/app_zh_Hant.arb index ea4f244f7..9972a502f 100644 --- a/lib/l10n/app_zh_Hant.arb +++ b/lib/l10n/app_zh_Hant.arb @@ -1,5 +1,5 @@ { - "serverUrl": "服務器 URL", + "serverUrl": "伺服器 URL", "@serverUrl": {}, "showTextOnGridViewSubtitle": "是否在網格音樂螢幕上顯示文字(標題、歌手等)。", "@showTextOnGridViewSubtitle": {}, @@ -13,11 +13,11 @@ } } }, - "internalExternalIpExplanation": "如果您希望能夠遠程訪問您的 Jellyfin 服務器,則需要使用您的外部 IP。\n\n如果您的服務器位於 HTTP 端口 (80/443) 上,則不必指定端口。 如果您的服務器位於反向代理後面,則可能會出現這種情況。", + "internalExternalIpExplanation": "如果您希望能夠遠程訪問您的 Jellyfin 伺服器,則需要使用您的外部 IP。\n\n如果您的伺服器位於 HTTP 端口 (80/443) 上,則不必指定端口。 如果您的伺服器位於反向代理後面,則可能會出現這種情況。", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, - "emptyServerUrl": "服務器 URL 不能為空", + "emptyServerUrl": "伺服器 URL 不能為空", "@emptyServerUrl": { "description": "Error message that shows when the user submits a login without a server URL" }, @@ -282,7 +282,7 @@ "@jellyfinUsesAACForTranscoding": {}, "enableTranscoding": "啓用轉碼", "@enableTranscoding": {}, - "enableTranscodingSubtitle": "如果啓用,音樂流將由服務器轉碼。", + "enableTranscodingSubtitle": "如果啓用,音樂流將由伺服器轉碼。", "@enableTranscodingSubtitle": {}, "bitrate": "位元速率", "@bitrate": {}, From 1906367bafdc59279e3cec7d705468fc24b1f8e2 Mon Sep 17 00:00:00 2001 From: some1 Date: Tue, 11 Jun 2024 13:22:43 +0000 Subject: [PATCH 057/102] Translated using Weblate (Portuguese) Currently translated at 97.3% (183 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/pt/ --- lib/l10n/app_pt.arb | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index b042d9229..1ab0a68b8 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -9,11 +9,11 @@ "@addFavourite": {}, "addedToQueue": "Adicionado à fila.", "@addedToQueue": {}, - "internalExternalIpExplanation": "Se quer acessar o seu servidor Jellyfin remotamente, precisa usar o seu IP externo.\n\nSe o seu servidor está numa porta HTTP (80/443), não precisa especificar a porta. Esse será o caso se o servidor estiver atrás de um proxy reverso.", + "internalExternalIpExplanation": "Se pretende aceder ao seu servidor Jellyfin remotamente, será necessário utilizar o seu IP público.\n\nNo caso do seu servidor utilizar uma das portas padrão do HTTP (80/443), não vai precisar de indicar uma porta. Este será o caso mais provável caso utilize um proxy inverso.", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, - "urlStartWithHttps": "URL deve começar com http:// ou https://", + "urlStartWithHttps": "O URL deverá começar com http:// ou https://", "@urlStartWithHttps": { "description": "Error message that shows when the user submits a server URL that doesn't start with http:// or https:// (for example, ftp://0.0.0.0" }, @@ -25,7 +25,7 @@ "@next": {}, "noErrors": "Sem erros!", "@noErrors": {}, - "errorScreenError": "Um erro ocorreu a aceder a lista de erros! A este ponto, deveria provavelmente catalogar um defeito no Github e apagar os dados da app", + "errorScreenError": "Ocorreu um erro ao aceder à lista de erros! Neste caso, recomendados que abra um issue no nosso GitHub e que limpe os dados da aplicação", "@errorScreenError": {}, "shuffleButtonLabel": "MISTURAR", "@shuffleButtonLabel": {}, @@ -73,11 +73,11 @@ "@addToMix": {}, "serverUrl": "URL do servidor", "@serverUrl": {}, - "emptyServerUrl": "URL de servidor não pode ser vazia", + "emptyServerUrl": "O URL do servidor não pode estar em branco", "@emptyServerUrl": { "description": "Error message that shows when the user submits a login without a server URL" }, - "urlTrailingSlash": "URL não pode incluir a barra final", + "urlTrailingSlash": "O URL não pode ter uma barra no fim", "@urlTrailingSlash": { "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" }, @@ -89,7 +89,7 @@ }, "unknownName": "Nome desconhecido", "@unknownName": {}, - "selectMusicLibraries": "Selecione a biblioteca de Músicas", + "selectMusicLibraries": "Seleccione as suas bibliotecas de música", "@selectMusicLibraries": { "description": "App bar title for library select screen" }, @@ -99,11 +99,11 @@ "@albums": {}, "artists": "Artistas", "@artists": {}, - "genres": "Gêneros", + "genres": "Géneros", "@genres": {}, "playlists": "Listas de Reprodução", "@playlists": {}, - "startMix": "Começar Miscelânea", + "startMix": "Iniciar Mistura", "@startMix": {}, "music": "Música", "@music": {}, @@ -111,13 +111,13 @@ "@clear": {}, "favourites": "Favoritos", "@favourites": {}, - "shuffleAll": "Embaralhar todas", + "shuffleAll": "Misturar todas", "@shuffleAll": {}, "finamp": "Finamp", "@finamp": {}, - "downloads": "Descargas", + "downloads": "Transferências", "@downloads": {}, - "settings": "Configurações", + "settings": "Definições", "@settings": {}, "offlineMode": "Modo Offline", "@offlineMode": {}, @@ -155,11 +155,11 @@ "@revenue": {}, "runtime": "Duração", "@runtime": {}, - "downloadMissingImages": "Descarregar imagens ausentes", + "downloadMissingImages": "Transferir imagens inexistentes", "@downloadMissingImages": {}, "downloadErrors": "Erros de transferência", "@downloadErrors": {}, - "downloadedMissingImages": "{count,plural, =0{Nenhuma imagem ausente encontrada} =1{{count} imagem ausente descarregada} other{{count} imagens ausentes descarregadas}}", + "downloadedMissingImages": "{count,plural, =0{Não foram encontradas imagens em falta} =1{{count} imagem em falta transferida} other{{count} imagens em falta descarregadas}}", "@downloadedMissingImages": { "description": "Message that shows when the user downloads missing images", "placeholders": { @@ -206,7 +206,7 @@ } } }, - "dlEnqueued": "{count} enfileiradas", + "dlEnqueued": "{count} em espera", "@dlEnqueued": { "placeholders": { "count": { @@ -224,7 +224,7 @@ }, "downloadErrorsTitle": "Erros de Transferência", "@downloadErrorsTitle": {}, - "failedToGetSongFromDownloadId": "Falha em adquirir música do ID da descarga", + "failedToGetSongFromDownloadId": "Falha ao adquirir música do ID da descarga", "@failedToGetSongFromDownloadId": {}, "error": "Erro", "@error": {}, @@ -244,7 +244,7 @@ "@editPlaylistNameTitle": {}, "required": "Obrigatório", "@required": {}, - "updateButtonLabel": "ATUALIZAÇÃO", + "updateButtonLabel": "ACTUALIZAR", "@updateButtonLabel": {}, "playlistNameUpdated": "Nome da lista de reprodução atualizado.", "@playlistNameUpdated": {}, @@ -406,7 +406,7 @@ "@removedFromPlaylist": {}, "hideSongArtistsIfSameAsAlbumArtists": "Ocultar artistas da música se forem iguais aos artistas do álbum", "@hideSongArtistsIfSameAsAlbumArtists": {}, - "startMixNoSongsAlbum": "Mantenha pressionado um álbum para adicioná-lo ou removê-lo do criador de mixagens antes de iniciar uma mixagem", + "startMixNoSongsAlbum": "Antes de iniciar uma mistura, faça um toque longo num álbum para adicioná-lo ao editor de misturas", "@startMixNoSongsAlbum": { "description": "Snackbar message that shows when the user presses the instant mix button with no albums selected" }, @@ -438,7 +438,7 @@ }, "showCoverAsPlayerBackground": "Mostrar capa desfocada como plano de fundo do player", "@showCoverAsPlayerBackground": {}, - "startMixNoSongsArtist": "Mantenha pressionado um artista para adicioná-lo ou removê-lo do construtor de mixagem antes de iniciar uma mixagem", + "startMixNoSongsArtist": "Antes de iniciar uma mistura, faça um toque longo num artista para adicionar ou remover o mesmo do editor de misturas", "@startMixNoSongsArtist": { "description": "Snackbar message that shows when the user presses the instant mix button with no artists selected" }, @@ -486,7 +486,7 @@ }, "disableGestureSubtitle": "Se deseja desativar gestos.", "@disableGestureSubtitle": {}, - "startupError": "Algo correu mal durante a inicialização da aplicação. O erro foi:{error}\n\nPor favor crie um \"Issue\" em github.com/UnicornsOnLSD/finamp com uma captura de ecrã desta página. Se o problema persistir, pode tentar limpar os dados do aplicativo para redefini-lo.", + "startupError": "Ocorreu um erro durante o arranque da aplicação. O erro foi:{error}\n\nPor favor, abra um \"Issue\" em github.com/UnicornsOnLSD/finamp que contenha uma captura deste ecrã. Caso o problema persista, tente limpar os dados da aplicação para a repor para o estado original.", "@startupError": { "description": "The error message that shows when startup fails.", "placeholders": { @@ -496,7 +496,7 @@ } } }, - "refresh": "ATUALIZAR", + "refresh": "ACTUALIZAR", "@refresh": {}, "noMusicLibrariesBody": "A Finamp não encontrou nenhuma biblioteca musical. Certifique-se de que seu servidor Jellyfin contenha pelo menos uma biblioteca com o tipo de conteúdo definido como “Música”.", "@noMusicLibrariesBody": {}, From d6c25a5a2ba0643d1b552141cf8c1e7f52ddf916 Mon Sep 17 00:00:00 2001 From: Retch Date: Sun, 23 Jun 2024 09:49:47 +0000 Subject: [PATCH 058/102] Translated using Weblate (German) Currently translated at 99.4% (187 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 53913d317..7bea35422 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -533,5 +533,7 @@ "noMusicLibrariesBody": "Finamp konnte keine Musikbibliotheken finden. Bitte stelle sicher, dass dein Jellyfin-Server mindestens eine Bibliothek mit dem Medientyp \"Musik\" enthält.", "@noMusicLibrariesBody": {}, "interactions": "Interaktionen", - "@interactions": {} + "@interactions": {}, + "redesignBeta": "Neugestaltung der Oberfläche Beta", + "@redesignBeta": {} } From 283bc9465280826ff9cb41ffc3e4bb971f002996 Mon Sep 17 00:00:00 2001 From: musenq Date: Tue, 2 Jul 2024 13:46:50 +0000 Subject: [PATCH 059/102] Translated using Weblate (Japanese) Currently translated at 97.8% (184 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ja/ --- lib/l10n/app_ja.arb | 75 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index a9e889df1..598be9458 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -5,11 +5,11 @@ "@error": {}, "serverUrl": "サーバー URL", "@serverUrl": {}, - "internalExternalIpExplanation": "Jellyfinサーバーをリモートでアクセスするには、外部 IP を指定して下さい。\n\nサーバーが HTTP ポート(80/443)で動いてる場合はポートを指定する必要はありません。サーバーがリバースプロクシの後段にある場合これが一般的です。", + "internalExternalIpExplanation": "リモートからJellyfinサーバーにアクセスするには外部IPを指定する必要があります。\n\nサーバーがHTTPポート(80/443)で動いている場合にはポートは不要です。サーバーがリバースプロキシの後ろにある場合はこれが一般的です。", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, - "emptyServerUrl": "サーバー URL は空であってはなりません", + "emptyServerUrl": "サーバーURLを入力してください", "@emptyServerUrl": { "description": "Error message that shows when the user submits a login without a server URL" }, @@ -61,11 +61,11 @@ "@startMix": {}, "favourites": "お気に入り", "@favourites": {}, - "startMixNoSongsArtist": "アーティスト名をロングプレスして、ミックス開始前にミックスビルダーに追加や外すことができます", + "startMixNoSongsArtist": "アーティスト名を長押しすることでミックス対象に追加または削除できます", "@startMixNoSongsArtist": { "description": "Snackbar message that shows when the user presses the instant mix button with no artists selected" }, - "startMixNoSongsAlbum": "アーティスト名をロングプレスして、ミックス開始前にミックスビルダーに追加や外すことができます", + "startMixNoSongsAlbum": "アルバムを長押しすることでミックス対象に追加または削除できます", "@startMixNoSongsAlbum": { "description": "Snackbar message that shows when the user presses the instant mix button with no albums selected" }, @@ -417,7 +417,7 @@ "@bufferDuration": {}, "language": "言語", "@language": {}, - "finamp": "フィナンプ", + "finamp": "Finamp", "@finamp": {}, "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", "@downloadedItemsImagesCount": { @@ -435,7 +435,7 @@ }, "areYouSure": "よろしいですか?", "@areYouSure": {}, - "appDirectory": "アプリディレクトリ", + "appDirectory": "Appのディレクトリ", "@appDirectory": {}, "shuffleAllSongCount": "曲がシャッフル化される回数", "@shuffleAllSongCount": {}, @@ -453,7 +453,7 @@ } } }, - "customLocation": "カスタム場所", + "customLocation": "指定の場所", "@customLocation": {}, "refresh": "リフレッシュ", "@refresh": {}, @@ -464,5 +464,64 @@ "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." }, "resetTabs": "タブリセット", - "@resetTabs": {} + "@resetTabs": {}, + "viewTypeSubtitle": "ミュージック画面の表示形式", + "@viewTypeSubtitle": {}, + "deleteDownloadsPrompt": "このデバイスから{itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}'を削除してもよろしいですか?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "insertedIntoQueue": "キューに挿入されました。", + "@insertedIntoQueue": { + "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." + }, + "responseError401": "{error} Status code {statusCode}. ユーザー名/パスワードが間違っているか、クライアントがログインしていません。", + "@responseError401": { + "placeholders": { + "error": { + "type": "String", + "example": "Unauthorized" + }, + "statusCode": { + "type": "int", + "example": "401" + } + } + }, + "noMusicLibrariesBody": "Finamp は音楽ライブラリを見つけることができませんでした。Jellyfin サーバーに、コンテンツ タイプが「音楽」に設定されているライブラリが少なくとも 1 つ含まれていることを確認してください。", + "@noMusicLibrariesBody": {}, + "swipeInsertQueueNextSubtitle": "曲リストでスワイプしたときに、曲を最後に追加するのではなく、キューの次の項目として挿入できるようにします。", + "@swipeInsertQueueNextSubtitle": {}, + "deleteDownloadsAbortButtonText": "キャンセル", + "@deleteDownloadsAbortButtonText": {}, + "showUncensoredLogMessage": "このログはあなたのログイン情報を含みます。表示しますか?", + "@showUncensoredLogMessage": {}, + "syncDownloadedPlaylists": "ダウンロードしたプレイリストの同期", + "@syncDownloadedPlaylists": {}, + "deleteDownloadsConfirmButtonText": "削除", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "applicationLegalese": "Mozilla Public License 2.0 でライセンスされています。ソース コードは以下から入手できます:\n\ngithub.com/jmshrv/finamp", + "@applicationLegalese": {}, + "customLocationsBuggy": "カスタムの場所は、権限の問題により、非常にバグが多くなります。これを修正する方法を考えていますが、今のところは使用しないことをお勧めします。", + "@customLocationsBuggy": {}, + "showFastScroller": "高速スクロールを表示", + "@showFastScroller": {}, + "swipeInsertQueueNext": "スワイプした曲を再生する", + "@swipeInsertQueueNext": {}, + "noMusicLibrariesTitle": "音楽ライブラリなし", + "@noMusicLibrariesTitle": { + "description": "Title for message that shows on the views screen when no music libraries could be found." + } } From 7b682c4f8bfc297c973900fb4f36b429aff7a91e Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Thu, 11 Jul 2024 02:56:34 +0000 Subject: [PATCH 060/102] Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant_HK/ --- lib/l10n/app_zh_Hant_HK.arb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/l10n/app_zh_Hant_HK.arb b/lib/l10n/app_zh_Hant_HK.arb index 279a9a06b..2bf803a35 100644 --- a/lib/l10n/app_zh_Hant_HK.arb +++ b/lib/l10n/app_zh_Hant_HK.arb @@ -67,7 +67,7 @@ "@playCount": {}, "premiereDate": "推出日期", "@premiereDate": {}, - "productionYear": "推出年份", + "productionYear": "製作年份", "@productionYear": {}, "name": "名稱", "@name": {}, @@ -207,7 +207,7 @@ "@appDirectory": {}, "enterLowPriorityStateOnPause": "暫停播放時會進入「低優先」狀態", "@enterLowPriorityStateOnPause": {}, - "enterLowPriorityStateOnPauseSubtitle": "在停止播放時,允許「通知」能被「滑動移除」及關閉應用程式(適用於 Android 裝置)。", + "enterLowPriorityStateOnPauseSubtitle": "在停止播放時,允許本程式的「通知」能被掃走及關閉應用程式(適用於 Android 裝置)。", "@enterLowPriorityStateOnPauseSubtitle": {}, "shuffleAllSongCount": "隨機播放上限", "@shuffleAllSongCount": {}, @@ -350,7 +350,7 @@ } } }, - "downloadedMissingImages": "{count,plural, =0{沒有缺失的圖片} =1{已下載{count}張圖片} other{已下載{count}張圖片}}", + "downloadedMissingImages": "{count,plural, =0{沒有缺少的圖片} =1{已下載{count}張圖片} other{已下載{count}張圖片}}", "@downloadedMissingImages": { "description": "Message that shows when the user downloads missing images", "placeholders": { @@ -395,7 +395,7 @@ } } }, - "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", + "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", "@downloadedItemsImagesCount": { "description": "This is for merging downloadedItemsCount and downloadedImagesCount as Flutter's intl stuff doesn't support multiple plurals in one string. https://github.com/flutter/flutter/issues/86906", "placeholders": { @@ -533,5 +533,7 @@ "redesignBeta": "新介面測試版", "@redesignBeta": {}, "swipeInsertQueueNext": "滑動插播", - "@swipeInsertQueueNext": {} + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "在歌曲列表中輕掃歌曲時,將其插入至播放佇列的最頭而不是最後。", + "@swipeInsertQueueNextSubtitle": {} } From 8a0e95c10f7253c7d44d9289ef4ad2a4ec5aa213 Mon Sep 17 00:00:00 2001 From: tomechio Date: Sat, 13 Jul 2024 07:59:28 +0000 Subject: [PATCH 061/102] Translated using Weblate (Finnish) Currently translated at 70.7% (133 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 67 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 398d38fad..47c420461 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -294,5 +294,70 @@ "noMusicLibrariesTitle": "Ei musiikkikirjastoja", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." - } + }, + "downloadedItemsCount": "{count,plural,=1{{count} item} muu{{count} items}}", + "@downloadedItemsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadCount": "{count,plural, =1{{count} download} muu{{count} downloads}}", + "@downloadCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", + "@downloadedItemsImagesCount": { + "description": "This is for merging downloadedItemsCount and downloadedImagesCount as Flutter's intl stuff doesn't support multiple plurals in one string. https://github.com/flutter/flutter/issues/86906", + "placeholders": { + "downloadedItems": { + "type": "String", + "example": "12 downloads" + }, + "downloadedImages": { + "type": "String", + "example": "1 image" + } + } + }, + "downloadedImagesCount": "{count,plural,=1{{count} image} muu{{count} images}}", + "@downloadedImagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "showCoverAsPlayerBackground": "Näytä sumennettu kansikuva soittimen taustakuvana", + "@showCoverAsPlayerBackground": {}, + "hideSongArtistsIfSameAsAlbumArtists": "Piilota kappaleen artistit, jos samat kuin albumin artistit", + "@hideSongArtistsIfSameAsAlbumArtists": {}, + "insertedIntoQueue": "Lisätty jonoon.", + "@insertedIntoQueue": { + "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." + }, + "responseError": "{error} Tilakoodi {statusCode}.", + "@responseError": { + "placeholders": { + "error": { + "type": "String", + "example": "Forbidden" + }, + "statusCode": { + "type": "int", + "example": "403" + } + } + }, + "showUncensoredLogMessage": "Tämä loki sisältää kirjautumistietosi. Näytä?", + "@showUncensoredLogMessage": {}, + "directoryMustBeEmpty": "Hakemiston pitää olla tyhjä", + "@directoryMustBeEmpty": {}, + "selectDirectory": "Valitse hakemisto", + "@selectDirectory": {} } From dfc7d202eeec01d4d4b987860effb28dd37357dc Mon Sep 17 00:00:00 2001 From: tomechio Date: Sun, 14 Jul 2024 15:32:19 +0000 Subject: [PATCH 062/102] Translated using Weblate (Finnish) Currently translated at 71.2% (134 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 47c420461..a8768f8cc 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -359,5 +359,13 @@ "directoryMustBeEmpty": "Hakemiston pitää olla tyhjä", "@directoryMustBeEmpty": {}, "selectDirectory": "Valitse hakemisto", - "@selectDirectory": {} + "@selectDirectory": {}, + "songCount": "{count,plural,=1{{count} Song} muu{{count} Kappaleita}}", + "@songCount": { + "placeholders": { + "count": { + "type": "int" + } + } + } } From 1e35542d414024ca908c8ec04d1508952397ec79 Mon Sep 17 00:00:00 2001 From: tomechio Date: Sun, 21 Jul 2024 08:50:58 +0000 Subject: [PATCH 063/102] Translated using Weblate (Finnish) Currently translated at 79.7% (150 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index a8768f8cc..6a4383a85 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -367,5 +367,37 @@ "type": "int" } } - } + }, + "sortBy": "Järjestä", + "@sortBy": {}, + "premiereDate": "Ensiesityspäivä", + "@premiereDate": {}, + "interactions": "Vuorovaikutukset", + "@interactions": {}, + "audioService": "Äänipalvelu", + "@audioService": {}, + "bitrate": "Bitrate", + "@bitrate": {}, + "bitrateSubtitle": "Suurempi bitrate antaa laadukkaamman äänen, mutta sen käyttämä kaistanleveys on suurempi.", + "@bitrateSubtitle": {}, + "customLocation": "Mukautettu sijainti", + "@customLocation": {}, + "appDirectory": "Sovelluksen hakemisto", + "@appDirectory": {}, + "addDownloadLocation": "Lisää latauksen hakemisto", + "@addDownloadLocation": {}, + "pathReturnSlashErrorMessage": "Polkuja jotka palauttavat \"/\" ei voi käyttää", + "@pathReturnSlashErrorMessage": {}, + "disableGesture": "Poista eleet käytöstä", + "@disableGesture": {}, + "disableGestureSubtitle": "Poistaa eleet käytöstä.", + "@disableGestureSubtitle": {}, + "invalidNumber": "Virheellinen numero", + "@invalidNumber": {}, + "noItem": "Ei kohdetta", + "@noItem": {}, + "streaming": "SUORATOISTAA", + "@streaming": {}, + "transcode": "TRANSKOODI", + "@transcode": {} } From 5d4c57d04019c94996d2c243cc2229902ece220f Mon Sep 17 00:00:00 2001 From: tomechio Date: Sun, 21 Jul 2024 09:50:14 +0000 Subject: [PATCH 064/102] Translated using Weblate (Finnish) Currently translated at 85.1% (160 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 6a4383a85..63d2bd496 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -399,5 +399,25 @@ "streaming": "SUORATOISTAA", "@streaming": {}, "transcode": "TRANSKOODI", - "@transcode": {} + "@transcode": {}, + "noMusicLibrariesBody": "Finamp ei löytänyt musiikkikirjastoja. Varmista, että Jellyfin-palvelimellasi on vähintään yksi kirjasto, jonka sisältötyypiksi on asetettu \"Musiikki\".", + "@noMusicLibrariesBody": {}, + "instantMix": "Välitön Sekoitus", + "@instantMix": {}, + "replaceQueue": "Korvaa Jono", + "@replaceQueue": {}, + "queueReplaced": "Jono korvattu.", + "@queueReplaced": {}, + "startingInstantMix": "Käynnistetään välitön sekoitus.", + "@startingInstantMix": {}, + "addToMix": "Lisää Sekoitukseen", + "@addToMix": {}, + "removeFromMix": "Poista Sekoituksesta", + "@removeFromMix": {}, + "bufferDurationSubtitle": "Kuinka paljon soittimen pitäisi puskuroida, sekunteina. Vaatii uudelleenkäynnistyksen.", + "@bufferDurationSubtitle": {}, + "redesignBeta": "Uusi Design Beta", + "@redesignBeta": {}, + "swipeInsertQueueNext": "Toista Pyyhkäisty Kappale Seuraavaksi", + "@swipeInsertQueueNext": {} } From 51131ee226c7cc763e30259acacd04be4ab3c2ed Mon Sep 17 00:00:00 2001 From: Ekapol Tassaneeyasin Date: Fri, 26 Jul 2024 05:03:43 +0000 Subject: [PATCH 065/102] Translated using Weblate (Thai) Currently translated at 98.4% (185 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/th/ --- lib/l10n/app_th.arb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index b0157b292..4395a21ee 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -525,5 +525,9 @@ "deleteDownloadsAbortButtonText": "ยกเลิก", "@deleteDownloadsAbortButtonText": {}, "showFastScroller": "แสดงตัวเลื่อนแบบเร็ว", - "@showFastScroller": {} + "@showFastScroller": {}, + "syncDownloadedPlaylists": "ซิงก์เพลลิสต์ที่ดาวน์โหลดแล้ว", + "@syncDownloadedPlaylists": {}, + "interactions": "การกระทำ", + "@interactions": {} } From 790c69d62da31a0195f018681fd45fe70ed22af5 Mon Sep 17 00:00:00 2001 From: motty Date: Sun, 28 Jul 2024 07:59:07 +0000 Subject: [PATCH 066/102] Translated using Weblate (Japanese) Currently translated at 98.4% (185 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ja/ --- lib/l10n/app_ja.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 598be9458..78b83cfb2 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -381,9 +381,9 @@ }, "goToAlbum": "アルバムに行く", "@goToAlbum": {}, - "errorScreenError": "エラーリスト取得時にエラーが発生しました!この時点では、GitHub でイシューを作成し、アプリデータを削除することをお勧めします", + "errorScreenError": "エラーリスト取得時にエラーが発生しました!この時点では、GitHub で issue を作成し、アプリデータを削除することをお勧めします", "@errorScreenError": {}, - "startupError": "起動時に問題が起こりました。エラー: {error}\n\ngithub.com/UnicornsOnLSD/finamp でイシューを作成し、このページのスクリーンショットを付けてください。問題が継続した場合はアプリデータをクリアしてアプリを初期化して下さい。", + "startupError": "起動時に問題が起こりました。エラー内容: {error}\n\ngithub.com/UnicornsOnLSD/finamp でイシューを作成し、このページのスクリーンショットを付けてください。問題が継続した場合はアプリデータをクリアしてアプリを初期化して下さい。", "@startupError": { "description": "The error message that shows when startup fails.", "placeholders": { From 5580416a92a36c16cd527408b34095249205f39c Mon Sep 17 00:00:00 2001 From: tomechio Date: Sat, 27 Jul 2024 12:05:27 +0000 Subject: [PATCH 067/102] Translated using Weblate (Finnish) Currently translated at 88.2% (166 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 63d2bd496..9e61235c8 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -419,5 +419,17 @@ "redesignBeta": "Uusi Design Beta", "@redesignBeta": {}, "swipeInsertQueueNext": "Toista Pyyhkäisty Kappale Seuraavaksi", - "@swipeInsertQueueNext": {} + "@swipeInsertQueueNext": {}, + "startMix": "Aloita sekoitus", + "@startMix": {}, + "failedToGetSongFromDownloadId": "Kappaleen nouto lataus ID:stä epäonnistui", + "@failedToGetSongFromDownloadId": {}, + "stackTrace": "Pinon jäljitys", + "@stackTrace": {}, + "applicationLegalese": "Lisensoitu Mozilla Public License 2.0 -lisenssillä. Lähdekoodi saatavilla osoitteessa:\n\ngithub.com/jmshrv/finamp", + "@applicationLegalese": {}, + "customLocationsBuggy": "Mukautetut sijainnit ovat erittäin bugisia käyttöoikeusongelmien vuoksi. Mietin tapoja korjata tämä, mutta toistaiseksi en suosittele niiden käyttöä.", + "@customLocationsBuggy": {}, + "enterLowPriorityStateOnPauseSubtitle": "Sallii ilmoituksen pyyhkäisemisen pois, kun toisto on pysäytetty. Antaa myös Androidin lopettaa palvelun, kun toisto on keskeytetty.", + "@enterLowPriorityStateOnPauseSubtitle": {} } From acdb63ee82870e8007831945ea17ebb720be9e37 Mon Sep 17 00:00:00 2001 From: tomechio Date: Mon, 29 Jul 2024 18:57:04 +0000 Subject: [PATCH 068/102] Translated using Weblate (Finnish) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/fi/ --- lib/l10n/app_fi.arb | 124 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 116 insertions(+), 8 deletions(-) diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 9e61235c8..a8d4e32c2 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -1,7 +1,7 @@ { "unknownError": "Tuntematon virhe", "@unknownError": {}, - "removedFromPlaylist": "Poistettu soittolistalta", + "removedFromPlaylist": "Poistettu soittolistalta.", "@removedFromPlaylist": {}, "addFavourite": "Lisää suosikki", "@addFavourite": {}, @@ -23,7 +23,7 @@ "@confirm": {}, "language": "Kieli", "@language": {}, - "refresh": "PÄIVITÄ", + "refresh": "VIRKISTÄ", "@refresh": {}, "serverUrl": "Palvelimen URL", "@serverUrl": {}, @@ -295,7 +295,7 @@ "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." }, - "downloadedItemsCount": "{count,plural,=1{{count} item} muu{{count} items}}", + "downloadedItemsCount": "{count,plural,=1{{count} kohde} other{{count} kohteet}}", "@downloadedItemsCount": { "placeholders": { "count": { @@ -303,7 +303,7 @@ } } }, - "downloadCount": "{count,plural, =1{{count} download} muu{{count} downloads}}", + "downloadCount": "{count,plural, =1{{count} lataus} other{{count} lataukset}}", "@downloadCount": { "placeholders": { "count": { @@ -325,7 +325,7 @@ } } }, - "downloadedImagesCount": "{count,plural,=1{{count} image} muu{{count} images}}", + "downloadedImagesCount": "{count,plural,=1{{count} kuva} other{{count} kuvat}}", "@downloadedImagesCount": { "placeholders": { "count": { @@ -337,7 +337,7 @@ "@showCoverAsPlayerBackground": {}, "hideSongArtistsIfSameAsAlbumArtists": "Piilota kappaleen artistit, jos samat kuin albumin artistit", "@hideSongArtistsIfSameAsAlbumArtists": {}, - "insertedIntoQueue": "Lisätty jonoon.", + "insertedIntoQueue": "Asetettu jonoon.", "@insertedIntoQueue": { "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." }, @@ -360,7 +360,7 @@ "@directoryMustBeEmpty": {}, "selectDirectory": "Valitse hakemisto", "@selectDirectory": {}, - "songCount": "{count,plural,=1{{count} Song} muu{{count} Kappaleita}}", + "songCount": "{count,plural,=1{{count} Kappale} other{{count} Kappaleita}}", "@songCount": { "placeholders": { "count": { @@ -431,5 +431,113 @@ "customLocationsBuggy": "Mukautetut sijainnit ovat erittäin bugisia käyttöoikeusongelmien vuoksi. Mietin tapoja korjata tämä, mutta toistaiseksi en suosittele niiden käyttöä.", "@customLocationsBuggy": {}, "enterLowPriorityStateOnPauseSubtitle": "Sallii ilmoituksen pyyhkäisemisen pois, kun toisto on pysäytetty. Antaa myös Androidin lopettaa palvelun, kun toisto on keskeytetty.", - "@enterLowPriorityStateOnPauseSubtitle": {} + "@enterLowPriorityStateOnPauseSubtitle": {}, + "startupError": "Jokin meni pieleen sovelluksen käynnistyksen aikana. Virhe oli: {error}\n\nOle hyvä ja luo virheilmoitus osoitteessa github.com/UnicornsOnLSD/finamp, jossa on kuvakaappaus tästä sivusta. Jos ongelma jatkuu, voit tyhjentää sovelluksen tiedot nollataksesi sovelluksen.", + "@startupError": { + "description": "The error message that shows when startup fails.", + "placeholders": { + "error": { + "type": "String", + "example": "Failed to open download DB" + } + } + }, + "internalExternalIpExplanation": "Jos haluat käyttää Jellyfin-palvelintasi etänä, sinun on käytettävä ulkoista IP-osoitettasi.\n\nJos palvelimesi käyttää HTTP-porttia (80/443), sinun ei tarvitse määrittää porttia. Näin on todennäköisesti, jos palvelimesi on reverse proxyn takana.", + "@internalExternalIpExplanation": { + "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." + }, + "startMixNoSongsAlbum": "Paina albumia pitkään lisätäksesi tai poistaaksesi sen miksaukseen ennen miksauksen aloittamista", + "@startMixNoSongsAlbum": { + "description": "Snackbar message that shows when the user presses the instant mix button with no albums selected" + }, + "downloadedMissingImages": "{count,plural, =0{Puuttuvia kuvia ei löytynyt} =1{Ladattu {count} puuttuvaa kuvaa} other{ladattu {count} puuttuvia kuvia}}", + "@downloadedMissingImages": { + "description": "Message that shows when the user downloads missing images", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "errorScreenError": "Virhe tapahtui virheiden luettelon hakemisessa! Tässä vaiheessa sinun pitäisi luultavasti vain luoda virheilmoitus GitHubiin ja poistaa sovelluksen tiedot", + "@errorScreenError": {}, + "deleteDownloadsPrompt": "Oletko varma, että haluat poistaa {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}' tästä laitteesta?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "enterLowPriorityStateOnPause": "Siirtyminen matalan prioriteetin tilaan tauon aikana", + "@enterLowPriorityStateOnPause": {}, + "shuffleAllSongCount": "Kaikkien sekoitettujen kappaleiden määrä", + "@shuffleAllSongCount": {}, + "shuffleAllSongCountSubtitle": "Ladattavien kappaleiden määrä, kun käytät sekoita kaikki kappaleet painiketta.", + "@shuffleAllSongCountSubtitle": {}, + "gridCrossAxisCount": "{value} Ruudukon poikittaisakselien lukumäärä", + "@gridCrossAxisCount": { + "description": "List tile title for grid cross axis count. Value will either be the portrait or landscape key.", + "placeholders": { + "value": { + "type": "String", + "example": "Portrait" + } + } + }, + "gridCrossAxisCountSubtitle": "Rivikohtaisesti käytettävien ruudukkotiilien määrä, kun {value}.", + "@gridCrossAxisCountSubtitle": { + "description": "List tile subtitle for grid cross axis count. Value will either be the portrait or landscape key.", + "placeholders": { + "value": { + "type": "String", + "example": "landscape" + } + } + }, + "showTextOnGridViewSubtitle": "Näytetäänkö teksti (nimi, artisti jne.) ruudukon musiikkinäytöllä vai ei.", + "@showTextOnGridViewSubtitle": {}, + "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "Näytetäänkö kappaleiden artistit albumin näytöllä, jos ne eivät poikkea albumin artisteista.", + "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, + "showFastScroller": "Näytä nopea vieritin", + "@showFastScroller": {}, + "statusError": "TILAVIRHE", + "@statusError": {}, + "responseError401": "{error} Tilakoodi {statusCode}. Tämä tarkoittaa todennäköisesti, että olet käyttänyt väärää käyttäjätunnusta/salasanaa tai että sovellus ei ole enää kirjautuneena sisään.", + "@responseError401": { + "placeholders": { + "error": { + "type": "String", + "example": "Unauthorized" + }, + "statusCode": { + "type": "int", + "example": "401" + } + } + }, + "redownloadedItems": "{count,plural, =0{Ei tarvitse ladata uudelleen.} =1{Uudelleenladattu {count} kohde} other{Uudelleenladatut {count} kohteet}}", + "@redownloadedItems": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "swipeInsertQueueNextSubtitle": "Mahdollistaa kappaleen lisäämisen jonon seuraavaksi kohteeksi, kun sitä pyyhkäistään kappaleiden luettelossa sen sijaan, että se liitettäisiin loppuun.", + "@swipeInsertQueueNextSubtitle": {}, + "startMixNoSongsArtist": "Paina pitkään artistia lisätäksesi tai poistaaksesi sen miksaukseen ennen miksauksen aloittamista", + "@startMixNoSongsArtist": { + "description": "Snackbar message that shows when the user presses the instant mix button with no artists selected" + }, + "viewTypeSubtitle": "Musiikkinäytön näkymätyyppi", + "@viewTypeSubtitle": {}, + "showCoverAsPlayerBackgroundSubtitle": "Käytetäänkö sumeaa kansikuvitusta taustana soittimen näytöllä vai ei.", + "@showCoverAsPlayerBackgroundSubtitle": {} } From 5ad64d2a326a409c14216b2ec28e702cefef2479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=95=D1=80=D0=BC=D0=B0=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Mon, 19 Aug 2024 22:34:48 +0000 Subject: [PATCH 069/102] Translated using Weblate (Russian) Currently translated at 96.8% (182 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 6a4eda30c..9ef959404 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -285,7 +285,7 @@ "@offlineMode": {}, "startMix": "Начать Микс", "@startMix": {}, - "internalExternalIpExplanation": "Чтобы получить доступ к вашему серверу Jellyfin необходимо использовать внешний IP.\n\nЕсли ваш сервер работает на HTTP портах (80/443) вам не нужно его укзывать, например, если вы используете обратный прокси.", + "internalExternalIpExplanation": "Чтобы получить доступ к вашему серверу Jellyfin необходимо использовать внешний IP.\n\nЕсли ваш сервер работает на HTTP портах (80/443) вам не нужно его укfзывать, например, если вы используете обратный прокси.", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, From 0ecf1119feb1c6616608891001d846ca8b1b6865 Mon Sep 17 00:00:00 2001 From: Max Rumpf Date: Thu, 22 Aug 2024 13:40:18 +0000 Subject: [PATCH 070/102] Translated using Weblate (German) Currently translated at 99.4% (187 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 7bea35422..bc36b4a13 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -390,7 +390,7 @@ "@logsCopied": {}, "downloadsAdded": "Downloads hinzugefügt.", "@downloadsAdded": {}, - "addButtonLabel": "HINZUFÜGEN", + "addButtonLabel": "Hinzufügen", "@addButtonLabel": {}, "applicationLegalese": "Lizensiert mit der Mozilla Public License 2.0. Quellcode verfügbar unter:\n\ngithub.com/jmshrv/finamp", "@applicationLegalese": {}, @@ -484,7 +484,7 @@ "@language": {}, "confirm": "Bestätigen", "@confirm": {}, - "showUncensoredLogMessage": "Dieses Protokoll enthält Ihre Anmeldeinformationen. Anzeigen?", + "showUncensoredLogMessage": "Dieses Protokoll enthält deine Anmeldedaten. Anzeigen?", "@showUncensoredLogMessage": {}, "resetTabs": "Tabs zurücksetzen", "@resetTabs": {}, @@ -516,9 +516,9 @@ "@syncDownloadedPlaylists": {}, "showFastScroller": "Schnellen Scroller anzeigen", "@showFastScroller": {}, - "swipeInsertQueueNext": "Gewischtes Lied als nächstes abspielen.", + "swipeInsertQueueNext": "Gewischtes Lied als Nächstes abspielen", "@swipeInsertQueueNext": {}, - "swipeInsertQueueNextSubtitle": "Aktivieren um das in der Liste nach links/rechts gewischte Lied als nächstes abzuspielen.", + "swipeInsertQueueNextSubtitle": "Aktivieren, um das in der Liste nach links/rechts gewischte Lied als Nächstes abzuspielen, statt es am Ende der Warteschlange einzufügen.", "@swipeInsertQueueNextSubtitle": {}, "playNext": "Als Nächstes abspielen", "@playNext": { From ace4d46121e747b9979b65a9f6ab254ba9c33f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=95=D1=80=D0=BC=D0=B0=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Mon, 2 Sep 2024 09:58:11 +0000 Subject: [PATCH 071/102] Translated using Weblate (Russian) Currently translated at 98.4% (185 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 9ef959404..90bec24d5 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -53,7 +53,7 @@ "@random": {}, "downloadErrors": "Ошибки Скачивания", "@downloadErrors": {}, - "downloadedImagesCount": "{count,plural,=1{{count} изображение} other{{count} изображения}}", + "downloadedImagesCount": "{count,plural,=1{{count} изображение} few{{count} изображения} other{{count} изображений}}", "@downloadedImagesCount": { "placeholders": { "count": { @@ -85,7 +85,7 @@ "@playButtonLabel": {}, "shuffleButtonLabel": "СЛУЧАЙНО", "@shuffleButtonLabel": {}, - "songCount": "{count,plural,=1{{count} Трек} other{{count} Треки}}", + "songCount": "{count,plural,=1{{count} трек} few{{count} трека} other{{count} треков}}", "@songCount": { "placeholders": { "count": { @@ -93,9 +93,9 @@ } } }, - "editPlaylistNameTooltip": "Отредактировать название плейлиста", + "editPlaylistNameTooltip": "Изменить название плейлиста", "@editPlaylistNameTooltip": {}, - "editPlaylistNameTitle": "Отредактировать название плейлиста", + "editPlaylistNameTitle": "Изменить название плейлиста", "@editPlaylistNameTitle": {}, "required": "Необходимо", "@required": {}, @@ -331,7 +331,7 @@ "@revenue": {}, "runtime": "Время проката", "@runtime": {}, - "downloadedMissingImages": "{count,plural, =0{Не найдено отсутствующих изображений} =1{Скачано {count} отсутствующее изображение} other{Скачано {count} отсутствующих изображений}}", + "downloadedMissingImages": "{count,plural, =0{Не найдено отсутствующих изображений} =1{Скачано {count} отсутствующее изображение} few{Скачано {count} отсутствующих изображения} other{Скачано {count} отсутствующих изображений}}", "@downloadedMissingImages": { "description": "Message that shows when the user downloads missing images", "placeholders": { @@ -340,7 +340,7 @@ } } }, - "downloadCount": "{count,plural, =1{{count} загрузка} other{{count} загрузки}}", + "downloadCount": "{count,plural, =1{{count} загрузка} few{{count} загрузки} other{{count} загрузок}}", "@downloadCount": { "placeholders": { "count": { @@ -348,7 +348,7 @@ } } }, - "downloadedItemsCount": "{count,plural,=1{{count} файл} other{{count} файлы}}", + "downloadedItemsCount": "{count,plural,=1{{count} файл} few{{count} файла} other{{count} файлы}}", "@downloadedItemsCount": { "placeholders": { "count": { @@ -356,7 +356,7 @@ } } }, - "dlFailed": "{count} ошибка загрузки", + "dlFailed": "{count} не удалось", "@dlFailed": { "placeholders": { "count": { @@ -400,7 +400,7 @@ "@addDownloads": {}, "noErrors": "Ошибок нет!", "@noErrors": {}, - "errorScreenError": "Ошибка при получении списка ошибок! Скорее всего, вам нужно сбросить приложение и сообщить о данной ошибке на Github", + "errorScreenError": "Ошибка при получении списка ошибок! Скорее всего, вам нужно очистить данные приложения и сообщить о данной ошибке на Github", "@errorScreenError": {}, "location": "Расположение", "@location": {}, @@ -458,7 +458,7 @@ }, "minutes": "Минуты", "@minutes": {}, - "redownloadedItems": "{count,plural, =0{Скачивание заново не требуеться.} =1{Заново скачен {count} предмет} other{Заново скачено {count} предметов}}", + "redownloadedItems": "{count,plural, =0{Скачивание заново не требуется.} =1{Заново скачен {count} предмет} few{Заново скачен {count} предмета} other{Заново скачено {count} предметов}}", "@redownloadedItems": { "placeholders": { "count": { @@ -512,7 +512,7 @@ }, "syncDownloadedPlaylists": "Синхронизировать загруженные плейлисты", "@syncDownloadedPlaylists": {}, - "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить песню в качестве следующего элемента в очереди при пролистывании списка песен вместо добавления ее в конец.", + "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить трек в качестве следующего элемента в очереди при свайпе в списке треков вместо добавления в конец.", "@swipeInsertQueueNextSubtitle": {}, "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{альбом} playlist{плейлист} artist{исполнителя} genre{жанр} song{песня} other{}} '{itemName}' с этого устройства?", "@deleteDownloadsPrompt": { @@ -530,7 +530,7 @@ }, "interactions": "Взаимодействия", "@interactions": {}, - "swipeInsertQueueNext": "", + "swipeInsertQueueNext": "Играть свайпнутый трек следующим", "@swipeInsertQueueNext": {}, "redesignBeta": "Бета-версия с редизайном", "@redesignBeta": {} From 817caef443a52e26bd8eebfb0eeb8ae14721b7ad Mon Sep 17 00:00:00 2001 From: Boan Chen Date: Wed, 11 Sep 2024 14:40:43 +0000 Subject: [PATCH 072/102] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant/ --- lib/l10n/app_zh_Hant.arb | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_zh_Hant.arb b/lib/l10n/app_zh_Hant.arb index 9972a502f..aa2a0f04c 100644 --- a/lib/l10n/app_zh_Hant.arb +++ b/lib/l10n/app_zh_Hant.arb @@ -3,7 +3,7 @@ "@serverUrl": {}, "showTextOnGridViewSubtitle": "是否在網格音樂螢幕上顯示文字(標題、歌手等)。", "@showTextOnGridViewSubtitle": {}, - "startupError": "應用程序啓動期間出現問題! 錯誤是:{error}\n\n請在 github.com/UnicornsOnLSD/finamp 上創建一個 Github 問題,並附上此頁面的螢幕截圖。 如果此頁面一直顯示,請清除您的應用數據以重置應用。", + "startupError": "應用程序啓動期間出現問題! 錯誤是:{error}\n\n請在 github.com/UnicornsOnLSD/finamp 上提出一個 Github 問題,並附上此頁面的螢幕截圖。 如果此頁面一直顯示,請清除您的應用數據以重置應用。", "@startupError": { "description": "The error message that shows when startup fails.", "placeholders": { @@ -204,7 +204,7 @@ "@downloadErrorsTitle": {}, "noErrors": "沒有錯誤!", "@noErrors": {}, - "errorScreenError": "獲取錯誤列表時出錯! 現在您可能應該在 GitHub 上創建一個問題並清除應用數據", + "errorScreenError": "獲取錯誤列表時出錯!您可以在 GitHub 上提出問題並清除應用數據", "@errorScreenError": {}, "failedToGetSongFromDownloadId": "從下載 ID 獲取歌曲失敗", "@failedToGetSongFromDownloadId": {}, @@ -503,5 +503,37 @@ "noMusicLibrariesTitle": "尚無音樂庫", "@noMusicLibrariesTitle": { "description": "Title for message that shows on the views screen when no music libraries could be found." - } + }, + "redesignBeta": "重新設計的Beta測試版", + "@redesignBeta": {}, + "deleteDownloadsPrompt": "您確定要將 {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}'從設備中刪除嗎?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "deleteDownloadsConfirmButtonText": "刪除", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "deleteDownloadsAbortButtonText": "取消", + "@deleteDownloadsAbortButtonText": {}, + "syncDownloadedPlaylists": "同步已下載的播放清", + "@syncDownloadedPlaylists": {}, + "interactions": "互動", + "@interactions": {}, + "showFastScroller": "顯示快速滾動條", + "@showFastScroller": {}, + "swipeInsertQueueNext": "滑動歌曲接著播放", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "開啟後滑動清單中的歌曲,可以將歌曲接著播放,而不是加到播放清單的最後一首。", + "@swipeInsertQueueNextSubtitle": {} } From 7624859c32425140d7b9c21e79b33b79bcfd7a7e Mon Sep 17 00:00:00 2001 From: "Yolkis (TEST)" Date: Wed, 18 Sep 2024 07:18:56 +0000 Subject: [PATCH 073/102] Translated using Weblate (Russian) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 90bec24d5..02d39212c 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -17,7 +17,7 @@ "@selectMusicLibraries": { "description": "App bar title for library select screen" }, - "couldNotFindLibraries": "Не было найдено библиотек.", + "couldNotFindLibraries": "Библиотеки не найдены.", "@couldNotFindLibraries": { "description": "Error message when the user does not have any libraries" }, @@ -29,7 +29,7 @@ "@music": {}, "finamp": "Finamp", "@finamp": {}, - "albumArtist": "Исполнитель альбома", + "albumArtist": "Исполнитель Альбома", "@albumArtist": {}, "artist": "Исполнитель", "@artist": {}, @@ -93,7 +93,7 @@ } } }, - "editPlaylistNameTooltip": "Изменить название плейлиста", + "editPlaylistNameTooltip": "Редактировать название плейлиста", "@editPlaylistNameTooltip": {}, "editPlaylistNameTitle": "Изменить название плейлиста", "@editPlaylistNameTitle": {}, @@ -281,11 +281,11 @@ "@addToMix": {}, "downloadMissingImages": "Скачать отсутствующие изображения", "@downloadMissingImages": {}, - "offlineMode": "Режим без интернета", + "offlineMode": "Автономный режим", "@offlineMode": {}, "startMix": "Начать Микс", "@startMix": {}, - "internalExternalIpExplanation": "Чтобы получить доступ к вашему серверу Jellyfin необходимо использовать внешний IP.\n\nЕсли ваш сервер работает на HTTP портах (80/443) вам не нужно его укfзывать, например, если вы используете обратный прокси.", + "internalExternalIpExplanation": "Чтобы получить удалённый доступ к серверу Jellyfin, используйте внешний IP-адрес.\n\nЕсли ваш сервер работает на портах HTTP(S) 80/443, указывать порт не нужно. Это обычно так, если сервер находится за обратным прокси-сервером.", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, @@ -309,17 +309,17 @@ "@sortBy": {}, "next": "Далее", "@next": {}, - "startMixNoSongsArtist": "Зажмите исполнителя, чтобы добавить или убрать его из составителя микса, прежде чем запустить микс", + "startMixNoSongsArtist": "Чтобы добавить или удалить исполнителя из микса, нажмите и удерживайте его имя", "@startMixNoSongsArtist": { "description": "Snackbar message that shows when the user presses the instant mix button with no artists selected" }, - "startMixNoSongsAlbum": "Зажмите альбом, чтобы добавить или убрать его из составителя микса, прежде чем запустить микс", + "startMixNoSongsAlbum": "Чтобы добавить или удалить альбом из микса, нажмите и удерживайте его", "@startMixNoSongsAlbum": { "description": "Snackbar message that shows when the user presses the instant mix button with no albums selected" }, "favourites": "Избранное", "@favourites": {}, - "shuffleAll": "Проиграть все в случайном порядке", + "shuffleAll": "Перемешать всё", "@shuffleAll": {}, "downloads": "Загрузки", "@downloads": {}, @@ -329,7 +329,7 @@ "@productionYear": {}, "revenue": "Доход", "@revenue": {}, - "runtime": "Время проката", + "runtime": "Время выполнения", "@runtime": {}, "downloadedMissingImages": "{count,plural, =0{Не найдено отсутствующих изображений} =1{Скачано {count} отсутствующее изображение} few{Скачано {count} отсутствующих изображения} other{Скачано {count} отсутствующих изображений}}", "@downloadedMissingImages": { @@ -446,7 +446,7 @@ "@showCoverAsPlayerBackgroundSubtitle": {}, "hideSongArtistsIfSameAsAlbumArtists": "Не отображать одинаковых исполнителей для трека и альбома", "@hideSongArtistsIfSameAsAlbumArtists": {}, - "startupError": "Что-то пошло не так во время запуска приложения. Ошибка: {error}\n\nПожалуйста, опубликуйте ошибку на github.com/UnicornsOnLSD/finamp со скриншотом данной страницы. Если данная ошибка продолжит появляться, очистите данные, чтобы сбросить настройки приложения.", + "startupError": "Что-то пошло не так во время запуска приложения. Возникла ошибка: {error}\n\nПожалуйста, создайте \"issue\" на github.com/UnicornsOnLSD/finamp и приложите скриншот этой страницы. Если проблема будет повторяться, вы можете очистить данные приложения, чтобы сбросить его настройки.", "@startupError": { "description": "The error message that shows when startup fails.", "placeholders": { @@ -514,7 +514,7 @@ "@syncDownloadedPlaylists": {}, "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить трек в качестве следующего элемента в очереди при свайпе в списке треков вместо добавления в конец.", "@swipeInsertQueueNextSubtitle": {}, - "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{альбом} playlist{плейлист} artist{исполнителя} genre{жанр} song{песня} other{}} '{itemName}' с этого устройства?", + "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}' с этого устройства?", "@deleteDownloadsPrompt": { "placeholders": { "itemName": { @@ -533,5 +533,7 @@ "swipeInsertQueueNext": "Играть свайпнутый трек следующим", "@swipeInsertQueueNext": {}, "redesignBeta": "Бета-версия с редизайном", - "@redesignBeta": {} + "@redesignBeta": {}, + "showFastScroller": "Показать быструю прокрутку", + "@showFastScroller": {} } From 24bb0f82e61ea4c48fab88a3636fdb8b36ffa2d5 Mon Sep 17 00:00:00 2001 From: "Yolkis (TEST)" Date: Wed, 18 Sep 2024 08:14:51 +0000 Subject: [PATCH 074/102] Translated using Weblate (Russian) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ru/ --- lib/l10n/app_ru.arb | 58 ++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 02d39212c..a86b3522c 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -183,13 +183,13 @@ "@dark": {}, "tabs": "Вкладки", "@tabs": {}, - "cancelSleepTimer": "Выключить таймер?", + "cancelSleepTimer": "Выключить Таймер?", "@cancelSleepTimer": {}, "yesButtonLabel": "ДА", "@yesButtonLabel": {}, "noButtonLabel": "НЕТ", "@noButtonLabel": {}, - "setSleepTimer": "Поставить таймер", + "setSleepTimer": "Поставить Таймер", "@setSleepTimer": {}, "sleepTimerTooltip": "Таймер", "@sleepTimerTooltip": {}, @@ -197,9 +197,9 @@ "@createButtonLabel": {}, "playlistCreated": "Плейлист создан.", "@playlistCreated": {}, - "noItem": "Нет файлов", + "noItem": "Нет Элементов", "@noItem": {}, - "noArtist": "Нет исполнителя", + "noArtist": "Нет Исполнителя", "@noArtist": {}, "unknownArtist": "Неизвестный Исполнитель", "@unknownArtist": {}, @@ -215,21 +215,21 @@ "@statusError": {}, "queue": "Очередь", "@queue": {}, - "addToQueue": "Добавить в очередь", + "addToQueue": "Добавить в Очередь", "@addToQueue": {}, - "replaceQueue": "Заменить очередь", + "replaceQueue": "Заменить Очередь", "@replaceQueue": {}, - "instantMix": "Мгновенный микс", + "instantMix": "Мгновенный Микс", "@instantMix": {}, - "goToAlbum": "Перейти к альбому", + "goToAlbum": "Перейти к Альбому", "@goToAlbum": {}, "addedToQueue": "Добавлено в очередь.", "@addedToQueue": {}, "queueReplaced": "Очередь заменена.", "@queueReplaced": {}, - "startingInstantMix": "Мгновенный микс запущен.", + "startingInstantMix": "Запуск мгновенного микса.", "@startingInstantMix": {}, - "responseError": "{error} Код ошибки {statusCode}.", + "responseError": "{error} Код состояния {statusCode}.", "@responseError": { "placeholders": { "error": { @@ -242,7 +242,7 @@ } } }, - "responseError401": "{error} Код ошибки {statusCode}. Это, скорее всего, значит, что либо вы неправильно указали логин или пароль, либо ваш клиент более не авторизирован.", + "responseError401": "{error} Код состояния {statusCode}. Возможно, вы использовали неверное имя пользователя/пароль или ваш клиент больше не авторизован.", "@responseError401": { "placeholders": { "error": { @@ -255,19 +255,19 @@ } } }, - "removeFromMix": "Удалить из микса", + "removeFromMix": "Удалить из Микса", "@removeFromMix": {}, - "invalidNumber": "Неправильное число", + "invalidNumber": "Неправильное Число", "@invalidNumber": {}, "addToPlaylistTooltip": "Добавить в плейлист", "@addToPlaylistTooltip": {}, - "addToPlaylistTitle": "Добавить в плейлист", + "addToPlaylistTitle": "Добавить в Плейлист", "@addToPlaylistTitle": {}, - "newPlaylist": "Новый плейлист", + "newPlaylist": "Новый Плейлист", "@newPlaylist": {}, - "noAlbum": "Нет альбома", + "noAlbum": "Нет Альбома", "@noAlbum": {}, - "addFavourite": "Добавить в избранное", + "addFavourite": "Добавить в Избранное", "@addFavourite": {}, "anErrorHasOccured": "Произошла ошибка.", "@anErrorHasOccured": {}, @@ -275,9 +275,9 @@ "@clear": {}, "settings": "Настройки", "@settings": {}, - "removeFavourite": "Удалить из избранного", + "removeFavourite": "Удалить из Избранного", "@removeFavourite": {}, - "addToMix": "Добавить в микс", + "addToMix": "Добавить в Микс", "@addToMix": {}, "downloadMissingImages": "Скачать отсутствующие изображения", "@downloadMissingImages": {}, @@ -458,7 +458,7 @@ }, "minutes": "Минуты", "@minutes": {}, - "redownloadedItems": "{count,plural, =0{Скачивание заново не требуется.} =1{Заново скачен {count} предмет} few{Заново скачен {count} предмета} other{Заново скачено {count} предметов}}", + "redownloadedItems": "{count,plural, =0{Не требуется повторная загрузка.} =1{Повторно загружен {count} элемент} few{Повторно загружены {count} элемента} other{Повторно загружено {count} элементов}}", "@redownloadedItems": { "placeholders": { "count": { @@ -468,13 +468,13 @@ }, "disableGesture": "Отключить жесты", "@disableGesture": {}, - "disableGestureSubtitle": "Нужно ли отключить жесты.", + "disableGestureSubtitle": "Стоит ли отключать жесты.", "@disableGestureSubtitle": {}, "bufferDuration": "Длительность буферизации", "@bufferDuration": {}, - "bufferDurationSubtitle": "Сколько секунд плеер будет буферизовать. Необходим перезапуск.", + "bufferDurationSubtitle": "Размер буфера плеера (в секундах). Требуется перезапуск.", "@bufferDurationSubtitle": {}, - "removedFromPlaylist": "Удалено из Плейлиста.", + "removedFromPlaylist": "Удалено из плейлиста.", "@removedFromPlaylist": {}, "removeFromPlaylistTooltip": "Удалить из плейлиста", "@removeFromPlaylistTooltip": {}, @@ -484,7 +484,7 @@ "@language": {}, "confirm": "Подтвердить", "@confirm": {}, - "showUncensoredLogMessage": "Этот журнал содержит вашу регистрационную информацию. Показать?", + "showUncensoredLogMessage": "Этот лог содержит ваши данные для входа. Показать?", "@showUncensoredLogMessage": {}, "resetTabs": "Сбросить вкладки", "@resetTabs": {}, @@ -494,11 +494,11 @@ }, "refresh": "ОБНОВИТЬ", "@refresh": {}, - "playNext": "Воспроизвести следующее", + "playNext": "Воспроизвести Следующей", "@playNext": { "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." }, - "noMusicLibrariesBody": "Finamp не смог найти ни одной музыкальной библиотеки. Убедитесь, что на вашем сервере Jellyfin есть хотя бы одна библиотека с типом содержимого \"Музыка\".", + "noMusicLibrariesBody": "Finamp не обнаружил музыкальных библиотек. Убедитесь, что на вашем сервере Jellyfin есть хотя бы одна библиотека с типом контента \"Музыка\".", "@noMusicLibrariesBody": {}, "deleteDownloadsConfirmButtonText": "Удалить", "@deleteDownloadsConfirmButtonText": { @@ -512,7 +512,7 @@ }, "syncDownloadedPlaylists": "Синхронизировать загруженные плейлисты", "@syncDownloadedPlaylists": {}, - "swipeInsertQueueNextSubtitle": "Включите этот параметр, чтобы вставить трек в качестве следующего элемента в очереди при свайпе в списке треков вместо добавления в конец.", + "swipeInsertQueueNextSubtitle": "Разрешить вставлять песню следующей в очереди при свайпе в списке песен, а не добавлять ее в конец.", "@swipeInsertQueueNextSubtitle": {}, "deleteDownloadsPrompt": "Вы уверены, что хотите удалить {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}' с этого устройства?", "@deleteDownloadsPrompt": { @@ -530,9 +530,9 @@ }, "interactions": "Взаимодействия", "@interactions": {}, - "swipeInsertQueueNext": "Играть свайпнутый трек следующим", + "swipeInsertQueueNext": "Воспроизвести смахнутую песню следующей", "@swipeInsertQueueNext": {}, - "redesignBeta": "Бета-версия с редизайном", + "redesignBeta": "Новый дизайн (бета)", "@redesignBeta": {}, "showFastScroller": "Показать быструю прокрутку", "@showFastScroller": {} From 374224f9f16a538891d8c30d051eee0ab236fb97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=ED=98=95=EB=9E=98?= Date: Mon, 23 Sep 2024 14:38:45 +0200 Subject: [PATCH 075/102] Added translation using Weblate (Korean) --- lib/l10n/app_ko.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/l10n/app_ko.arb diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/lib/l10n/app_ko.arb @@ -0,0 +1 @@ +{} From 81252bd57b2253f79e9fa9ec1d6d89c8f69be316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=ED=98=95=EB=9E=98?= Date: Mon, 23 Sep 2024 12:56:41 +0000 Subject: [PATCH 076/102] Translated using Weblate (Korean) Currently translated at 100.0% (188 of 188 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ko/ --- lib/l10n/app_ko.arb | 544 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 543 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 0967ef424..4ec12bd8f 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -1 +1,543 @@ -{} +{ + "internalExternalIpExplanation": "귀하의 Jellyfin 서버에 원격으로 접속하려면, 외부 IP 주소를 사용해야 합니다.\n\n귀하의 서버가 HTTP 포트(80/443)에 있거나 역방향 프록시(Reverse Proxy) 뒤에 있는 경우, 포트를 지정할 필요는 없습니다.", + "@internalExternalIpExplanation": { + "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." + }, + "next": "다음", + "@next": {}, + "selectMusicLibraries": "음악 라이브러리 선택", + "@selectMusicLibraries": { + "description": "App bar title for library select screen" + }, + "genres": "장르", + "@genres": {}, + "startMix": "믹스 시작하기", + "@startMix": {}, + "serverUrl": "서버 URL", + "@serverUrl": {}, + "emptyServerUrl": "서버 URL은 필수값 입니다", + "@emptyServerUrl": { + "description": "Error message that shows when the user submits a login without a server URL" + }, + "urlStartWithHttps": "URL은 \"http://\" 또는 \"https://\"로 시작해야 합니다", + "@urlStartWithHttps": { + "description": "Error message that shows when the user submits a server URL that doesn't start with http:// or https:// (for example, ftp://0.0.0.0" + }, + "urlTrailingSlash": "URL 끝부분에 슬래시(/, 후행 슬래시)를 붙이지 마세요", + "@urlTrailingSlash": { + "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" + }, + "username": "사용자 이름(아이디)", + "@username": {}, + "password": "암호", + "@password": {}, + "logs": "로그(사용기록)", + "@logs": {}, + "couldNotFindLibraries": "라이브러리를 찾을 수 없습니다.", + "@couldNotFindLibraries": { + "description": "Error message when the user does not have any libraries" + }, + "unknownName": "알 수 없는 이름", + "@unknownName": {}, + "songs": "노래", + "@songs": {}, + "albums": "앨범", + "@albums": {}, + "artists": "아티스트", + "@artists": {}, + "playlists": "플레이리스트", + "@playlists": {}, + "startMixNoSongsAlbum": "믹스를 시작하기 전에 '앨범'을 길게 탭하여 믹스 빌더에서 추가하거나 제거하세요", + "@startMixNoSongsAlbum": { + "description": "Snackbar message that shows when the user presses the instant mix button with no albums selected" + }, + "music": "음악", + "@music": {}, + "clear": "삭제(비우기)", + "@clear": {}, + "shuffleAll": "임의 재생(모두)", + "@shuffleAll": {}, + "finamp": "핀앰프(Finamp)", + "@finamp": {}, + "sortOrder": "정렬 순서", + "@sortOrder": {}, + "sortBy": "정렬 기준", + "@sortBy": {}, + "budget": "예산", + "@budget": {}, + "communityRating": "커뮤니티 평점", + "@communityRating": {}, + "criticRating": "비평가 평점", + "@criticRating": {}, + "dateAdded": "추가된 날짜", + "@dateAdded": {}, + "datePlayed": "재생한 날짜", + "@datePlayed": {}, + "premiereDate": "초연(프리미어) 날짜", + "@premiereDate": {}, + "productionYear": "제작년도", + "@productionYear": {}, + "name": "이름", + "@name": {}, + "random": "랜덤", + "@random": {}, + "revenue": "수익", + "@revenue": {}, + "runtime": "런타임(상영 시간)", + "@runtime": {}, + "syncDownloadedPlaylists": "다운로드한 플레이리스트 동기화", + "@syncDownloadedPlaylists": {}, + "downloadMissingImages": "누락된 이미지 다운로드", + "@downloadMissingImages": {}, + "downloadErrors": "다운로드 에러", + "@downloadErrors": {}, + "downloadCount": "{count,plural, =1{{count}건 다운로드} other{{count}건 다운로드}}", + "@downloadCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedItemsCount": "{count,plural,=1{{count} 아이템} other{{count} 아이템}}", + "@downloadedItemsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dlComplete": "{count}건 완료", + "@dlComplete": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dlFailed": "{count}건 실패", + "@dlFailed": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dlEnqueued": "{count}건 대기열에 추가됨", + "@dlEnqueued": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dlRunning": "{count}건 진행중", + "@dlRunning": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadErrorsTitle": "다운로드 오류", + "@downloadErrorsTitle": {}, + "noErrors": "오류가 없습니다!", + "@noErrors": {}, + "failedToGetSongFromDownloadId": "다운로드 ID에서 노래를 가져오지 못했습니다", + "@failedToGetSongFromDownloadId": {}, + "deleteDownloadsPrompt": "이 기기에서 {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}'를 삭제하시겠습니까?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + }, + "deleteDownloadsConfirmButtonText": "삭제", + "@deleteDownloadsConfirmButtonText": { + "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + }, + "playButtonLabel": "재생", + "@playButtonLabel": {}, + "shuffleButtonLabel": "임의 재생", + "@shuffleButtonLabel": {}, + "songCount": "{count,plural,=1{{count} 곡} other{{count} 곡}}", + "@songCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editPlaylistNameTooltip": "플레이리스트 이름 수정", + "@editPlaylistNameTooltip": {}, + "required": "필수 항목", + "@required": {}, + "updateButtonLabel": "업데이트", + "@updateButtonLabel": {}, + "favourite": "즐겨찾기", + "@favourite": {}, + "addDownloads": "다운로드 추가", + "@addDownloads": {}, + "location": "위치", + "@location": {}, + "shareLogs": "로그(사용기록) 공유", + "@shareLogs": {}, + "logsCopied": "로그(사용기록) 복사함.", + "@logsCopied": {}, + "message": "메시지", + "@message": {}, + "stackTrace": "스택 추적", + "@stackTrace": {}, + "applicationLegalese": "Mozilla Public License 2.0에 따라 라이선스가 부여됐습니다. 소스 코드는 다음에서 확인할 수 있습니다:\n\ngithub.com/jmshrv/finamp", + "@applicationLegalese": {}, + "transcoding": "트랜스코딩", + "@transcoding": {}, + "downloadLocations": "다운로드 위치", + "@downloadLocations": {}, + "interactions": "상호작용", + "@interactions": {}, + "layoutAndTheme": "레이아웃 & 테마", + "@layoutAndTheme": {}, + "downloadedSongsWillNotBeDeleted": "다운로드한 노래는 삭제되지 않습니다", + "@downloadedSongsWillNotBeDeleted": {}, + "areYouSure": "확실한가요?", + "@areYouSure": {}, + "jellyfinUsesAACForTranscoding": "Jellyfin은 트랜스코딩에 AAC를 사용합니다", + "@jellyfinUsesAACForTranscoding": {}, + "enableTranscoding": "트랜스코딩 활성화", + "@enableTranscoding": {}, + "enableTranscodingSubtitle": "서버 측에서 음악 스트리밍을 트랜스코딩 합니다.", + "@enableTranscodingSubtitle": {}, + "bitrate": "비트레이트", + "@bitrate": {}, + "customLocation": "사용자 지정 위치", + "@customLocation": {}, + "unknownError": "알수 없는 오류", + "@unknownError": {}, + "directoryMustBeEmpty": "디렉토리는 비어 있어야 합니다", + "@directoryMustBeEmpty": {}, + "shuffleAllSongCount": "전곡 임의 재생시 곡 수", + "@shuffleAllSongCount": {}, + "shuffleAllSongCountSubtitle": "'전곡 임의 재생' 버튼을 사용할 때 불러올 곡의 개수입니다.", + "@shuffleAllSongCountSubtitle": {}, + "viewTypeSubtitle": "음악 화면 보기 유형", + "@viewTypeSubtitle": {}, + "list": "목록", + "@list": {}, + "grid": "그리드(격자)", + "@grid": {}, + "portrait": "세로 보기", + "@portrait": {}, + "landscape": "가로 보기", + "@landscape": {}, + "gridCrossAxisCount": "{value} 그리드 열 갯수", + "@gridCrossAxisCount": { + "description": "List tile title for grid cross axis count. Value will either be the portrait or landscape key.", + "placeholders": { + "value": { + "type": "String", + "example": "Portrait" + } + } + }, + "showTextOnGridView": "그리드 보기에서 텍스트를 보여줌", + "@showTextOnGridView": {}, + "showCoverAsPlayerBackground": "흐릿한 커버를 재생 화면 배경으로 보여줌", + "@showCoverAsPlayerBackground": {}, + "hideSongArtistsIfSameAsAlbumArtists": "앨범 아티스트와 동일한 경우, 곡 아티스트를 숨김", + "@hideSongArtistsIfSameAsAlbumArtists": {}, + "showTextOnGridViewSubtitle": "그리드 음악 화면에서 '텍스트(곡목, 아티스트 등)' 표시 여부를 설정합니다.", + "@showTextOnGridViewSubtitle": {}, + "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "앨범 화면에서 앨범 아티스트와 동일한 '곡 아티스트' 표시 여부를 설정합니다.", + "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, + "disableGesture": "제스처 비활성화", + "@disableGesture": {}, + "disableGestureSubtitle": "제스처 비활성화 여부를 설정합니다.", + "@disableGestureSubtitle": {}, + "showFastScroller": "빠른 스크롤 표시", + "@showFastScroller": {}, + "theme": "테마", + "@theme": {}, + "system": "시스템", + "@system": {}, + "light": "밝은 테마", + "@light": {}, + "tabs": "탭", + "@tabs": {}, + "yesButtonLabel": "네", + "@yesButtonLabel": {}, + "noButtonLabel": "아니오", + "@noButtonLabel": {}, + "setSleepTimer": "취침 타이머 설정", + "@setSleepTimer": {}, + "minutes": "분", + "@minutes": {}, + "invalidNumber": "잘못된 숫자", + "@invalidNumber": {}, + "addToPlaylistTooltip": "플레이리스트에 추가", + "@addToPlaylistTooltip": {}, + "addToPlaylistTitle": "플레이리스트에 추가", + "@addToPlaylistTitle": {}, + "removeFromPlaylistTooltip": "플레이리스트에서 삭제", + "@removeFromPlaylistTooltip": {}, + "newPlaylist": "새 플레이리스트", + "@newPlaylist": {}, + "createButtonLabel": "만들기", + "@createButtonLabel": {}, + "noAlbum": "앨범 없음", + "@noAlbum": {}, + "noItem": "곡 없음", + "@noItem": {}, + "noArtist": "아티스트 없음", + "@noArtist": {}, + "unknownArtist": "알 수 없는 아티스트", + "@unknownArtist": {}, + "streaming": "스트리밍", + "@streaming": {}, + "downloaded": "다운로드됨", + "@downloaded": {}, + "transcode": "트랜스코딩", + "@transcode": {}, + "statusError": "상태 오류", + "@statusError": {}, + "queue": "대기열", + "@queue": {}, + "addToQueue": "대기열에 추가", + "@addToQueue": { + "description": "Popup menu item title for adding an item to the end of the play queue." + }, + "instantMix": "인스턴트 믹스", + "@instantMix": {}, + "goToAlbum": "앨범으로 이동", + "@goToAlbum": {}, + "addFavourite": "즐겨찾기 추가", + "@addFavourite": {}, + "insertedIntoQueue": "대기열 중간에 추가.", + "@insertedIntoQueue": { + "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." + }, + "queueReplaced": "대기열이 교체됨.", + "@queueReplaced": {}, + "startingInstantMix": "인스턴트 믹스 시작.", + "@startingInstantMix": {}, + "anErrorHasOccured": "오류가 발생했습니다.", + "@anErrorHasOccured": {}, + "responseError": "{error} 상태 코드 {statusCode}.", + "@responseError": { + "placeholders": { + "error": { + "type": "String", + "example": "Forbidden" + }, + "statusCode": { + "type": "int", + "example": "403" + } + } + }, + "responseError401": "{error} 상태 코드 {statusCode}. 이것은 아마도 잘못된 로그인 정보를 사용했거나, 더 이상 로그인되어 있지 않음을 의미합니다.", + "@responseError401": { + "placeholders": { + "error": { + "type": "String", + "example": "Unauthorized" + }, + "statusCode": { + "type": "int", + "example": "401" + } + } + }, + "removeFromMix": "믹스에서 삭제", + "@removeFromMix": {}, + "addToMix": "믹스에 추가", + "@addToMix": {}, + "redownloadedItems": "{count,plural, =0{다시 다운로드할 필요가 없습니다.} =1{{count} 아이템 다시 다운로드함} other{{count} 아이템 다시 다운로드함}}", + "@redownloadedItems": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bufferDuration": "버퍼 시간", + "@bufferDuration": {}, + "bufferDurationSubtitle": "플레이어가 버퍼링해야 하는 시간(초) 입니다. 다시 시작해야 합니다.", + "@bufferDurationSubtitle": {}, + "language": "언어", + "@language": {}, + "showUncensoredLogMessage": "이 로그(사용기록)는 귀하의 로그인 정보를 포함합니다. 표시할까요?", + "@showUncensoredLogMessage": {}, + "resetTabs": "탭 초기화", + "@resetTabs": {}, + "noMusicLibrariesTitle": "음악 라이브러리 없음", + "@noMusicLibrariesTitle": { + "description": "Title for message that shows on the views screen when no music libraries could be found." + }, + "noMusicLibrariesBody": "Finamp가 음악 라이브러리를 찾을 수 없습니다. 귀하의 Jellyfin 서버에 콘텐츠 유형이 \"음악\"으로 설정된 라이브러리가 하나 이상 있는지 확인하세요.", + "@noMusicLibrariesBody": {}, + "startMixNoSongsArtist": "믹스를 시작하기 전에 '아티스트'를 길게 탭하여 믹스 빌더에서 추가하거나 제거하세요", + "@startMixNoSongsArtist": { + "description": "Snackbar message that shows when the user presses the instant mix button with no artists selected" + }, + "playCount": "재생 횟수", + "@playCount": {}, + "downloadedMissingImages": "{count,plural, =0{누락된 이미지 없음} =1{누락된 이미지 {count}건 다운로드} other{누락된 이미지 {count}건 다운로드}}", + "@downloadedMissingImages": { + "description": "Message that shows when the user downloads missing images", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "favourites": "즐겨찾기", + "@favourites": {}, + "album": "앨범", + "@album": {}, + "downloads": "다운로드", + "@downloads": {}, + "settings": "설정", + "@settings": {}, + "offlineMode": "오프라인 모드", + "@offlineMode": {}, + "albumArtist": "앨범 아티스트", + "@albumArtist": {}, + "artist": "아티스트", + "@artist": {}, + "downloadedImagesCount": "{count,plural,=1{이미지 {count}건} other{이미지 {count}건}}", + "@downloadedImagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", + "@downloadedItemsImagesCount": { + "description": "This is for merging downloadedItemsCount and downloadedImagesCount as Flutter's intl stuff doesn't support multiple plurals in one string. https://github.com/flutter/flutter/issues/86906", + "placeholders": { + "downloadedItems": { + "type": "String", + "example": "12 downloads" + }, + "downloadedImages": { + "type": "String", + "example": "1 image" + } + } + }, + "refresh": "새로고침", + "@refresh": {}, + "redesignBeta": "신상 베타 버전", + "@redesignBeta": {}, + "errorScreenError": "오류 목록을 가져오지 못했습니다! 이 시점에서는 GitHub에 문제를 등록하고 앱 데이터를 삭제해야 합니다", + "@errorScreenError": {}, + "deleteDownloadsAbortButtonText": "취소", + "@deleteDownloadsAbortButtonText": {}, + "error": "오류", + "@error": {}, + "discNumber": "디스크 {number}", + "@discNumber": { + "placeholders": { + "number": { + "type": "int" + } + } + }, + "downloadsDeleted": "다운로드 항목을 삭제했습니다.", + "@downloadsDeleted": {}, + "editPlaylistNameTitle": "플레이리스트 이름 수정", + "@editPlaylistNameTitle": {}, + "playlistNameUpdated": "플레이리스트 이름을 갱신했습니다.", + "@playlistNameUpdated": {}, + "downloadsAdded": "다운로드를 추가했습니다.", + "@downloadsAdded": {}, + "addButtonLabel": "추가", + "@addButtonLabel": {}, + "audioService": "오디오 서비스", + "@audioService": {}, + "notAvailableInOfflineMode": "오프라인 모드에서는 사용할 수 없습니다", + "@notAvailableInOfflineMode": {}, + "logOut": "로그아웃", + "@logOut": {}, + "bitrateSubtitle": "비트레이트가 높으면 고품질의 음악을 들을 수 있습니다. 데이터 사용량도 증가합니다.", + "@bitrateSubtitle": {}, + "appDirectory": "앱 디렉토리", + "@appDirectory": {}, + "addDownloadLocation": "다운로드 위치 추가", + "@addDownloadLocation": {}, + "selectDirectory": "디렉토리 선택", + "@selectDirectory": {}, + "pathReturnSlashErrorMessage": "\"/(슬래시)\"로 끝나는 경로는 사용할 수 없습니다", + "@pathReturnSlashErrorMessage": {}, + "gridCrossAxisCountSubtitle": "{value} 일때 한 행당 그리드 타일의 개수.", + "@gridCrossAxisCountSubtitle": { + "description": "List tile subtitle for grid cross axis count. Value will either be the portrait or landscape key.", + "placeholders": { + "value": { + "type": "String", + "example": "landscape" + } + } + }, + "showCoverAsPlayerBackgroundSubtitle": "재생 화면에서 '흐릿한 앨범 커버 배경' 사용 여부를 설정합니다.", + "@showCoverAsPlayerBackgroundSubtitle": {}, + "customLocationsBuggy": "사용자 지정 위치는 권한 문제 때문에 버그가 매우 많습니다. 이 문제를 해결할 방법을 찾을 때 까지는 사용을 권장하지 않습니다.", + "@customLocationsBuggy": {}, + "enterLowPriorityStateOnPause": "일시 중지시 낮은 우선순위 상태로 전환합니다", + "@enterLowPriorityStateOnPause": {}, + "enterLowPriorityStateOnPauseSubtitle": "일시 중지시 알림창을 밀어서 사라지게 합니다. 안드로이드(OS)에서는 일시 중지시 서비스를 강제 종료할 수 있게 합니다.", + "@enterLowPriorityStateOnPauseSubtitle": {}, + "viewType": "보기 유형", + "@viewType": {}, + "dark": "어두운 테마", + "@dark": {}, + "sleepTimerTooltip": "취침 타이머", + "@sleepTimerTooltip": {}, + "cancelSleepTimer": "취침 타이머를 취소할까요?", + "@cancelSleepTimer": {}, + "removeFromPlaylistTitle": "플레이리스트에서 삭제", + "@removeFromPlaylistTitle": {}, + "playlistCreated": "플레이리스트 생성됨.", + "@playlistCreated": {}, + "direct": "다이렉트", + "@direct": {}, + "replaceQueue": "대기열 교체", + "@replaceQueue": {}, + "addedToQueue": "대기열 끝에 추가.", + "@addedToQueue": { + "description": "Snackbar message that shows when the user successfully adds items to the end of the play queue." + }, + "removedFromPlaylist": "플레이리스트에서 삭제됨.", + "@removedFromPlaylist": {}, + "playNext": "다음 곡 재생", + "@playNext": { + "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." + }, + "removeFavourite": "즐겨찾기 삭제", + "@removeFavourite": {}, + "confirm": "확인", + "@confirm": {}, + "swipeInsertQueueNext": "스와이프한 노래 재생", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "노래 목록에서 스와이프 했을 때, 노래를 대기열 끝에 추가하는 대신 바로 다음 곡으로 삽입할 수 있습니다.", + "@swipeInsertQueueNextSubtitle": {}, + "startupError": "앱 시작중에 문제가 발생했습니다. 오류 내용:{error}\n\n\"github.com/UnicornsOnLSD/finamp\"에 이 페이지의 캡처 화면을 첨부하여 '이슈'를 등록 해주세요. 이 문제가 지속되면 당신은 앱 데이터를 삭제하여 앱을 초기화 할 수 있습니다.", + "@startupError": { + "description": "The error message that shows when startup fails.", + "placeholders": { + "error": { + "type": "String", + "example": "Failed to open download DB" + } + } + } +} From 81908575e9b31cce5e7d9218b25638bbf7386b2b Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Mon, 14 Oct 2024 10:53:09 +0100 Subject: [PATCH 077/102] Update intl dependency --- pubspec.lock | 32 ++++++++++++++++---------------- pubspec.yaml | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b891bb873..4c8e2bbd5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -530,10 +530,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -594,26 +594,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -651,18 +651,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.15.0" mime: dependency: transitive description: @@ -1056,10 +1056,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.2" timing: dependency: transitive description: @@ -1168,10 +1168,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.5" watcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fd0363495..d4394603c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -60,7 +60,7 @@ dependencies: cupertino_icons: ^1.0.5 path: ^1.8.2 android_id: ^0.3.5 - intl: ^0.18.0 + intl: ^0.19.0 auto_size_text: ^3.0.0 flutter_riverpod: ^2.3.4 # locale_names: From c09c010eaffe365d2b6dac9c597ca120372c1486 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:14:06 +0100 Subject: [PATCH 078/102] Fix build for new Flutter --- ios/Podfile.lock | 20 +- ios/Runner.xcodeproj/project.pbxproj | 18 ++ ios/Runner/AppDelegate.swift | 2 +- pubspec.lock | 277 +++++++++++++++------------ 4 files changed, 186 insertions(+), 131 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 248479174..f53ebb31a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -75,7 +75,7 @@ PODS: - SDWebImage/Core (5.13.4) - share_plus (0.0.1): - Flutter - - sqflite (0.0.3): + - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - SwiftyGif (5.4.3) @@ -95,7 +95,7 @@ DEPENDENCIES: - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) SPEC REPOS: @@ -130,14 +130,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/permission_handler_apple/ios" share_plus: :path: ".symlinks/plugins/share_plus/ios" - sqflite: - :path: ".symlinks/plugins/sqflite/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: audio_service: f509d65da41b9521a61f1c404dd58651f265a567 - audio_session: 4f3e461722055d21515cf3261b64c973c062f345 + audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207 CropViewController: 58fb440f30dac788b129d2a1f24cffdcb102669c device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 DKCamera: a902b66921fca14b7a75266feb8c7568aa7caa71 @@ -148,14 +148,14 @@ SPEC CHECKSUMS: flutter_downloader: b7301ae057deadd4b1650dc7c05375f10ff12c39 just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c - permission_handler_apple: 036b856153a2b1f61f21030ff725f3e6fece2b78 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3 share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 - sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec + sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 - url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe PODFILE CHECKSUM: 2129ec44a346995e229add1d94a10fae8b953738 -COCOAPODS: 1.13.0 +COCOAPODS: 1.15.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 385278ea0..fbc394f76 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -208,6 +208,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, EA10DADE9639BB3D0A9BCBCE /* [CP] Embed Pods Frameworks */, + 2F42A0A37AC8A77603350B7A /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -298,6 +299,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 2F42A0A37AC8A77603350B7A /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index ec17768cf..36ae74491 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -2,7 +2,7 @@ import UIKit import Flutter import flutter_downloader -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, diff --git a/pubspec.lock b/pubspec.lock index 4c8e2bbd5..d664012ac 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: "https://pub.dev" source: hosted - version: "67.0.0" + version: "72.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.7.0" android_id: dependency: "direct main" description: @@ -29,10 +34,10 @@ packages: dependency: transitive description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.4.10" + version: "3.6.1" args: dependency: transitive description: @@ -53,10 +58,10 @@ packages: dependency: "direct main" description: name: audio_service - sha256: "4547c312a94f9cb2c48b60823fb190767cbd63454a83c73049384d5d3cba4650" + sha256: "9dd5ba7e77567b290c35908b1950d61485b4dfdd3a0ac398e98cfeec04651b75" url: "https://pub.dev" source: hosted - version: "0.18.13" + version: "0.18.15" audio_service_platform_interface: dependency: transitive description: @@ -69,18 +74,18 @@ packages: dependency: transitive description: name: audio_service_web - sha256: "9d7d5ae5f98a5727f2580fad73062f2484f400eef6cef42919413268e62a363e" + sha256: "4cdc2127cd4562b957fb49227dc58e3303fafb09bde2573bc8241b938cf759d9" url: "https://pub.dev" source: hosted - version: "0.1.2" + version: "0.1.3" audio_session: dependency: "direct main" description: name: audio_session - sha256: a49af9981eec5d7cd73b37bacb6ee73f8143a6a9f9bd5b6021e6c346b9b6cf4e + sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" url: "https://pub.dev" source: hosted - version: "0.1.19" + version: "0.1.21" auto_size_text: dependency: "direct main" description: @@ -117,10 +122,10 @@ packages: dependency: transitive description: name: build_daemon - sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" build_resolvers: dependency: transitive description: @@ -133,18 +138,18 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.4.13" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.2" built_collection: dependency: transitive description: @@ -245,18 +250,18 @@ packages: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" cupertino_icons: dependency: "direct main" description: @@ -269,10 +274,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" url: "https://pub.dev" source: hosted - version: "2.3.6" + version: "2.3.7" device_info_plus: dependency: "direct main" description: @@ -285,10 +290,10 @@ packages: dependency: transitive description: name: device_info_plus_platform_interface - sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" equatable: dependency: transitive description: @@ -309,18 +314,18 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" file_picker: dependency: "direct main" description: @@ -392,18 +397,18 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" + sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" url: "https://pub.dev" source: hosted - version: "2.0.19" + version: "2.0.23" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod - sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" + sha256: "711d916456563f715bde1e139d7cfdca009f8264befab3ac9f8ded8b6ec26405" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.5.3" flutter_staggered_grid_view: dependency: transitive description: @@ -458,10 +463,10 @@ packages: dependency: transitive description: name: graphs - sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" hive: dependency: "direct main" description: @@ -490,10 +495,10 @@ packages: dependency: transitive description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_multi_server: dependency: transitive description: @@ -514,10 +519,10 @@ packages: dependency: transitive description: name: image - sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.dev" source: hosted - version: "4.1.7" + version: "4.2.0" infinite_scroll_pagination: dependency: "direct main" description: @@ -554,42 +559,42 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b url: "https://pub.dev" source: hosted - version: "6.7.1" + version: "6.8.0" just_audio: dependency: "direct main" description: name: just_audio - sha256: b7cb6bbf3750caa924d03f432ba401ec300fd90936b3f73a9b33d58b1e96286b + sha256: b41646a8241688f1d99c2e69c4da2bb26aa4b3a99795f6ff205c2a165e033fda url: "https://pub.dev" source: hosted - version: "0.9.37" + version: "0.9.41" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - sha256: c3dee0014248c97c91fe6299edb73dc4d6c6930a2f4f713579cd692d9e47f4a1 + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.0" just_audio_web: dependency: transitive description: name: just_audio_web - sha256: "134356b0fe3d898293102b33b5fd618831ffdc72bb7a1b726140abdf22772b70" + sha256: "9a98035b8b24b40749507687520ec5ab404e291d2b0937823ff45d92cb18d448" url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.13" leak_tracker: dependency: transitive description: @@ -639,6 +644,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" matcher: dependency: transitive description: @@ -667,18 +680,18 @@ packages: dependency: transitive description: name: mime - sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.6" mini_music_visualizer: dependency: "direct main" description: name: mini_music_visualizer - sha256: "095b3c5e12f4c045544432829a044a7fe1c5a7789a6d0003347c73d9bf3170cc" + sha256: "779a957424ce9a09cc00989a8cf9b7541ec22316d9781a43e701afa6acacf274" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.4" nested: dependency: transitive description: @@ -691,10 +704,10 @@ packages: dependency: "direct main" description: name: octo_image - sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" package_config: dependency: transitive description: @@ -731,26 +744,26 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.12" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -771,10 +784,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" permission_handler: dependency: "direct main" description: @@ -787,34 +800,34 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" + sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" url: "https://pub.dev" source: hosted - version: "12.0.5" + version: "12.0.12" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 url: "https://pub.dev" source: hosted - version: "9.4.4" + version: "9.4.5" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" + sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 url: "https://pub.dev" source: hosted - version: "0.1.1" + version: "0.1.3+2" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.2.3" permission_handler_windows: dependency: transitive description: @@ -835,10 +848,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -847,14 +860,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" - url: "https://pub.dev" - source: hosted - version: "3.9.0" pool: dependency: transitive description: @@ -883,18 +888,18 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" riverpod: dependency: transitive description: name: riverpod - sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d + sha256: c86fedfb45dd1da98ee6493dd9374325cdf494e7d523ebfb0c387eecc5f7b5c9 url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.5.3" rxdart: dependency: "direct main" description: @@ -931,10 +936,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.0" simple_gesture_detector: dependency: "direct main" description: @@ -984,18 +989,42 @@ packages: dependency: transitive description: name: sqflite - sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c" + sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.0" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" + sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.4+5" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027" + url: "https://pub.dev" + source: hosted + version: "2.4.1-1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: @@ -1040,10 +1069,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" url: "https://pub.dev" source: hosted - version: "3.1.0+1" + version: "3.3.0+3" term_glyph: dependency: transitive description: @@ -1080,42 +1109,42 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" + sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.12" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.1" url_launcher_platform_interface: dependency: transitive description: @@ -1128,18 +1157,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: "direct main" description: @@ -1184,42 +1213,50 @@ packages: dependency: transitive description: name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "2.4.5" + version: "3.0.1" win32: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: e5c39a90447e7c81cfec14b041cdbd0d0916bd9ebbc7fe02ab69568be703b9bd url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.6.0" win32_registry: dependency: transitive description: name: win32_registry - sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb" + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.1.5" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" xml: dependency: transitive description: @@ -1237,5 +1274,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.3.0 <4.0.0" - flutter: ">=3.19.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" From d58083e2a1169e975b3fec5886da5f2b5ce01789 Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Wed, 16 Oct 2024 23:45:04 +0200 Subject: [PATCH 079/102] add missing accessibility labels --- .gitignore | 9 ++- lib/components/AlbumScreen/delete_button.dart | 1 + .../sync_album_or_playlist_button.dart | 4 ++ .../ArtistScreen/artist_download_button.dart | 2 + .../ArtistScreen/artist_play_button.dart | 7 ++- .../ArtistScreen/artist_shuffle_button.dart | 5 ++ .../PlayerScreen/player_buttons.dart | 14 ++++- lib/l10n/app_en.arb | 56 ++++++++++++++++++- lib/screens/settings_screen.dart | 1 + 9 files changed, 94 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index c140ebe08..6917edaaf 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,8 @@ unlinked_spec.ds # macOS **/macos/Flutter/GeneratedPluginRegistrant.swift +macos/Flutter/ephemeral/flutter_export_environment.sh +macos/Flutter/ephemeral/Flutter-Generated.xcconfig # Coverage coverage/ @@ -95,4 +97,9 @@ app.*.symbols !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -!/dev/ci/**/Gemfile.lock \ No newline at end of file +!/dev/ci/**/Gemfile.lock + +# Not-yet supported platforms +windows/ +linux/ + diff --git a/lib/components/AlbumScreen/delete_button.dart b/lib/components/AlbumScreen/delete_button.dart index b8f224a92..5619ca3f7 100644 --- a/lib/components/AlbumScreen/delete_button.dart +++ b/lib/components/AlbumScreen/delete_button.dart @@ -44,6 +44,7 @@ class _DeleteButtonState extends State { bool? isOffline = box.get("FinampSettings")?.isOffline; return IconButton( + tooltip: AppLocalizations.of(context)!.deleteFromDevice, icon: const Icon(Icons.delete), // If offline, we don't allow the user to delete items. // If we did, we'd have to implement listeners for MusicScreenTabView so that the user can't delete a parent, go back, and select the same parent. diff --git a/lib/components/AlbumScreen/sync_album_or_playlist_button.dart b/lib/components/AlbumScreen/sync_album_or_playlist_button.dart index d52a20d96..93e560ab4 100644 --- a/lib/components/AlbumScreen/sync_album_or_playlist_button.dart +++ b/lib/components/AlbumScreen/sync_album_or_playlist_button.dart @@ -4,6 +4,7 @@ import 'package:finamp/services/sync_helper.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:logging/logging.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class SyncAlbumOrPlaylistButton extends StatefulWidget { const SyncAlbumOrPlaylistButton({ @@ -39,6 +40,9 @@ class _SyncAlbumOrPlaylistButtonState Widget build(BuildContext context) { isAlbumDownloaded = _downloadHelper.isAlbumDownloaded(widget.parent.id); return IconButton( + tooltip: isAlbumDownloaded + ? AppLocalizations.of(context)!.sync + : AppLocalizations.of(context)!.download, onPressed: () => syncAlbumOrPlaylist(), icon: isAlbumDownloaded ? const Icon(Icons.sync) : diff --git a/lib/components/ArtistScreen/artist_download_button.dart b/lib/components/ArtistScreen/artist_download_button.dart index f9fe0ea05..c8f97346f 100644 --- a/lib/components/ArtistScreen/artist_download_button.dart +++ b/lib/components/ArtistScreen/artist_download_button.dart @@ -68,6 +68,8 @@ class _ArtistDownloadButtonState extends State { deleteAlbums = undownloadedAlbums.isEmpty; return IconButton( + tooltip: AppLocalizations.of(context)! + .downloadArtist(widget.artist.name ?? "Unknown Artist"), icon: deleteAlbums ? const Icon(Icons.delete) : const Icon(Icons.download), diff --git a/lib/components/ArtistScreen/artist_play_button.dart b/lib/components/ArtistScreen/artist_play_button.dart index 374b44708..4ac7cafa6 100644 --- a/lib/components/ArtistScreen/artist_play_button.dart +++ b/lib/components/ArtistScreen/artist_play_button.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:hive/hive.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../../models/jellyfin_models.dart'; @@ -66,6 +67,8 @@ class _ArtistPlayButtonState extends State { }); return IconButton( + tooltip: AppLocalizations.of(context)! + .playArtist(widget.artist.name ?? "Unknown Artist"), onPressed: () async { await _audioServiceHelper .replaceQueueWithItem(itemList: sortedSongs); @@ -87,6 +90,8 @@ class _ArtistPlayButtonState extends State { final List items = snapshot.data!; return IconButton( + tooltip: AppLocalizations.of(context)! + .playArtist(widget.artist.name ?? "Unknown Artist"), onPressed: () async { await _audioServiceHelper .replaceQueueWithItem(itemList: items); @@ -102,4 +107,4 @@ class _ArtistPlayButtonState extends State { }, ); } -} \ No newline at end of file +} diff --git a/lib/components/ArtistScreen/artist_shuffle_button.dart b/lib/components/ArtistScreen/artist_shuffle_button.dart index 95af6d867..28d1f31e6 100644 --- a/lib/components/ArtistScreen/artist_shuffle_button.dart +++ b/lib/components/ArtistScreen/artist_shuffle_button.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:hive/hive.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../../models/jellyfin_models.dart'; @@ -55,6 +56,8 @@ class _ArtistShuffleButtonState extends State { } return IconButton( + tooltip: AppLocalizations.of(context)! + .shuffleArtist(widget.artist.name ?? "Unknown Artist"), onPressed: () async { await _audioServiceHelper .replaceQueueWithItem(itemList: artistsSongs, shuffle: true); @@ -76,6 +79,8 @@ class _ArtistShuffleButtonState extends State { final List items = snapshot.data!; return IconButton( + tooltip: AppLocalizations.of(context)! + .shuffleArtist(widget.artist.name ?? "Unknown Artist"), onPressed: () async { await _audioServiceHelper .replaceQueueWithItem(itemList: items, shuffle: true, initialIndex: Random().nextInt(items.length)); diff --git a/lib/components/PlayerScreen/player_buttons.dart b/lib/components/PlayerScreen/player_buttons.dart index 5140aae29..0ec108249 100644 --- a/lib/components/PlayerScreen/player_buttons.dart +++ b/lib/components/PlayerScreen/player_buttons.dart @@ -1,6 +1,7 @@ import 'package:audio_service/audio_service.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../../services/music_player_background_task.dart'; @@ -20,6 +21,9 @@ class PlayerButtons extends StatelessWidget { textDirection: TextDirection.ltr, children: [ IconButton( + tooltip: playbackState?.shuffleMode == AudioServiceShuffleMode.all + ? AppLocalizations.of(context)!.playbackOrderShuffledTooltip + : AppLocalizations.of(context)!.playbackOrderLinearTooltip, icon: _getShufflingIcon( playbackState == null ? AudioServiceShuffleMode.none @@ -41,6 +45,7 @@ class PlayerButtons extends StatelessWidget { iconSize: 20, ), IconButton( + tooltip: AppLocalizations.of(context)!.skipToPrevious, icon: const Icon(Icons.skip_previous), onPressed: playbackState != null ? () async => await audioHandler.skipToPrevious() @@ -51,6 +56,7 @@ class PlayerButtons extends StatelessWidget { height: 56, width: 56, child: FloatingActionButton( + tooltip: AppLocalizations.of(context)!.togglePlayback, // We set a heroTag because otherwise the play button on AlbumScreenContent will do hero widget stuff heroTag: "PlayerScreenFAB", backgroundColor: Theme.of(context).colorScheme.primary, @@ -75,12 +81,18 @@ class PlayerButtons extends StatelessWidget { ), ), IconButton( + tooltip: AppLocalizations.of(context)!.skipToNext, icon: const Icon(Icons.skip_next), onPressed: playbackState != null ? () async => audioHandler.skipToNext() : null, iconSize: 36), IconButton( + tooltip: playbackState?.repeatMode == AudioServiceRepeatMode.all + ? AppLocalizations.of(context)!.loopModeAllTooltip + : playbackState?.repeatMode == AudioServiceRepeatMode.one + ? AppLocalizations.of(context)!.loopModeOneTooltip + : AppLocalizations.of(context)!.loopModeNoneTooltip, icon: _getRepeatingIcon( playbackState == null ? AudioServiceRepeatMode.none @@ -131,4 +143,4 @@ class PlayerButtons extends StatelessWidget { return const Icon(Icons.shuffle); } } -} \ No newline at end of file +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a9c39e5d4..0442e7593 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -531,5 +531,57 @@ "@swipeInsertQueueNext": {}, "swipeInsertQueueNextSubtitle": "Enable to insert a song as next item in queue when swiped in song list instead of appending it to the end.", "@swipeInsertQueueNextSubtitle": {}, - "redesignBeta": "Redesign Beta" -} \ No newline at end of file + "redesignBeta": "Try the Beta", + "@redesignBeta": {}, + "playbackOrderShuffledTooltip": "Shuffling. Tap to toggle.", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "Playing in order. Tap to toggle.", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "Looping all. Tap to toggle.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "Looping one. Tap to toggle.", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "Not looping. Tap to toggle.", + "@loopModeNoneTooltip": {}, + "skipToPrevious": "Skip to Previous Song", + "@skipToPrevious": {}, + "skipToNext": "Skip to Next Song", + "@skipToNext": {}, + "togglePlayback": "Toggle Playback", + "@togglePlayback": {}, + "playArtist": "Play all albums by {artist}", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "Shuffle all albums by {artist}", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "downloadArtist": "Download all albums by {artist}", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "deleteFromDevice": "Delete from Device", + "@deleteFromDevice": {}, + "download": "Download", + "@download": {}, + "sync": "Synchronize with Server", + "@sync": {}, + "about": "About Finamp", + "@about": {} +} diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 553eeffca..5c63e6902 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -26,6 +26,7 @@ class SettingsScreen extends StatelessWidget { title: Text(AppLocalizations.of(context)!.settings), actions: [ IconButton( + tooltip: AppLocalizations.of(context)!.about, icon: const Icon(Icons.info), onPressed: () async { final applicationLegalese = From 110e007c6851fd07aad40f7b2d2a16f4e4dc7f86 Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Wed, 16 Oct 2024 23:45:17 +0200 Subject: [PATCH 080/102] bump version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d4394603c..fbdc2748e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.23+46 +version: 0.6.24+47 environment: sdk: ">=2.19.4 <3.0.0" From fa45a219bd4eff5fa60bae187d085d84d3244766 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:16:03 +0100 Subject: [PATCH 081/102] Bump version, update F-Droid metadata --- fastlane/metadata/android/en-US/changelogs/47.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/47.txt diff --git a/fastlane/metadata/android/en-US/changelogs/47.txt b/fastlane/metadata/android/en-US/changelogs/47.txt new file mode 100644 index 000000000..16d5294f2 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/47.txt @@ -0,0 +1 @@ +Updated translations, rebuilt with a newer version of Flutter. Changes are now only happening on the redesign beta, check it out on GitHub! From 2b47152dba0274a71eb71503a16f37d7169fcb1b Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Mon, 4 Nov 2024 00:04:15 +0100 Subject: [PATCH 082/102] use debug app ID suffix on Android - kept uninstalling my daily use version... --- android/app/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/app/build.gradle b/android/app/build.gradle index 76735f615..e52df4659 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -64,6 +64,9 @@ android { // shrinkResources false // minifyEnabled false } + debug { + applicationIdSuffix '.debug' + } } } From a7f823566182656707caba1ce7fe1a321a5db744 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:23:27 +0000 Subject: [PATCH 083/102] Fight Gradle to the death --- android/app/build.gradle | 7 +++++++ android/gradle/wrapper/gradle-wrapper.properties | 2 +- pubspec.lock | 6 +++--- pubspec.yaml | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e52df4659..a45dcb3a5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -68,6 +68,13 @@ android { applicationIdSuffix '.debug' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } } flutter { diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index dcf0f19c5..7bb2df6ba 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip diff --git a/pubspec.lock b/pubspec.lock index d664012ac..723a0f404 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -367,11 +367,11 @@ packages: dependency: "direct main" description: path: "." - ref: ac9b9e917e874f1f86f52ddd74fb57e4e2af3639 - resolved-ref: ac9b9e917e874f1f86f52ddd74fb57e4e2af3639 + ref: db66f36ec48dc50117e510e2f37995cc17b44534 + resolved-ref: db66f36ec48dc50117e510e2f37995cc17b44534 url: "https://github.com/jmshrv/flutter_downloader.git" source: git - version: "1.10.2" + version: "1.10.4" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index fbdc2748e..b093a1a64 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: flutter_downloader: git: url: https://github.com/jmshrv/flutter_downloader.git - ref: "ac9b9e917e874f1f86f52ddd74fb57e4e2af3639" + ref: "db66f36ec48dc50117e510e2f37995cc17b44534" path_provider: ^2.0.14 hive: ^2.2.3 hive_flutter: ^1.1.0 From 5f136050de6d0563da63f2cafe660b9d2c8cb046 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:35:38 +0000 Subject: [PATCH 084/102] Upgrade Android target SDK to 34 Was set to 33 by d1ae8153583a740b90bec1e9a2f36b09f6029d07, doesn't look like this happens anymore? I hope not, since Google Play now requires API 34 --- android/app/build.gradle | 2 +- pubspec.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index a45dcb3a5..e862f7e97 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -46,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.unicornsonlsd.finamp" minSdkVersion 21 - targetSdkVersion 33 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/pubspec.lock b/pubspec.lock index 723a0f404..16fdf7e2d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -575,10 +575,10 @@ packages: dependency: "direct main" description: name: just_audio - sha256: b41646a8241688f1d99c2e69c4da2bb26aa4b3a99795f6ff205c2a165e033fda + sha256: a49e7120b95600bd357f37a2bb04cd1e88252f7cdea8f3368803779b925b1049 url: "https://pub.dev" source: hosted - version: "0.9.41" + version: "0.9.42" just_audio_platform_interface: dependency: transitive description: From b24525200cb528167aa12d7079f53658637b0be6 Mon Sep 17 00:00:00 2001 From: Chaphasilor Date: Tue, 19 Nov 2024 18:21:35 +0100 Subject: [PATCH 085/102] force recent just_audio dependencies --- pubspec.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index b093a1a64..c91c151a7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,9 +29,9 @@ dependencies: json_annotation: ^4.8.0 chopper: 7.1.1 get_it: ^7.2.0 - just_audio: ^0.9.32 - audio_service: ^0.18.9 - audio_session: ^0.1.13 + just_audio: ^0.9.42 + audio_service: ^0.18.15 + audio_session: ^0.1.21 rxdart: ^0.27.7 simple_gesture_detector: ^0.2.0 flutter_downloader: From 3bff07053889dc19e841d748d3755f63989037d8 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:38:54 +0000 Subject: [PATCH 086/102] Bump build number --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c91c151a7..a8cd0f3ec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.24+47 +version: 0.6.24+48 environment: sdk: ">=2.19.4 <3.0.0" From 84cdec3bccac70f4652aad9bc90b192c46f36639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Wed, 16 Oct 2024 22:12:22 +0000 Subject: [PATCH 087/102] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hans/ --- lib/l10n/app_zh.arb | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 26a64ca07..220a1d650 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -534,6 +534,57 @@ "@interactions": {}, "swipeInsertQueueNextSubtitle": "在歌曲列表中滑动时,可以将歌曲作为队列中的下一个项目插入,而不是将其附加到末尾。", "@swipeInsertQueueNextSubtitle": {}, - "redesignBeta": "重新设计测试版", - "@redesignBeta": {} + "redesignBeta": "试用 Beta 版", + "@redesignBeta": {}, + "loopModeOneTooltip": "循环播放一首。点击即可切换。", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "不循环。点击即可切换。", + "@loopModeNoneTooltip": {}, + "skipToNext": "跳至下一首歌曲", + "@skipToNext": {}, + "togglePlayback": "切换播放", + "@togglePlayback": {}, + "playArtist": "播放 {artist} 的所有专辑", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "随机播放 {artist} 的所有专辑", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "deleteFromDevice": "从设备中删除", + "@deleteFromDevice": {}, + "playbackOrderShuffledTooltip": "随机播放。点击即可切换。", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "按顺序播放。点击即可切换。", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "全部循环播放。点击即可切换。", + "@loopModeAllTooltip": {}, + "download": "下载", + "@download": {}, + "skipToPrevious": "跳至上一首歌曲", + "@skipToPrevious": {}, + "downloadArtist": "下载 {artist} 的所有专辑", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "sync": "与服务器同步", + "@sync": {}, + "about": "关于 Finamp", + "@about": {} } From 0b81a41198da7c5f4e28d6d9cfc77a1c66de7e8c Mon Sep 17 00:00:00 2001 From: Fjuro Date: Thu, 17 Oct 2024 06:02:33 +0000 Subject: [PATCH 088/102] Translated using Weblate (Czech) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/cs/ --- lib/l10n/app_cs.arb | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index a6691f58c..b87a04a57 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -534,6 +534,57 @@ "@interactions": {}, "swipeInsertQueueNext": "Přehrát posunutou skladbu jako další", "@swipeInsertQueueNext": {}, - "redesignBeta": "Nový design (beta)", - "@redesignBeta": {} + "redesignBeta": "Vyzkoušejte beta verzi", + "@redesignBeta": {}, + "playbackOrderShuffledTooltip": "Náhodně. Klepnutím přepnete.", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "Přehrávání v pořadí. Klepnutím přepnete.", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "Opakování všeho. Klepnutím přepnete.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "Opakování jedné. Klepnutím přepnete.", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "Bez opakování. Klepnutím přepnete.", + "@loopModeNoneTooltip": {}, + "skipToPrevious": "Přeskočit na předchozí skladbu", + "@skipToPrevious": {}, + "skipToNext": "Přeskočit na další skladbu", + "@skipToNext": {}, + "togglePlayback": "Přepnout přehrávání", + "@togglePlayback": {}, + "downloadArtist": "Stáhnout všechna alba umělce {artist}", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "Přehrát náhodně všechna alba umělce {artist}", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "playArtist": "Přehrát všechna alba umělce {artist}", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "deleteFromDevice": "Smazat ze zařízení", + "@deleteFromDevice": {}, + "download": "Stáhnout", + "@download": {}, + "sync": "Synchronizovat se serverem", + "@sync": {}, + "about": "O aplikaci Finamp", + "@about": {} } From 57cef4f2ee31b1a70227eff3f83b7ff1189317d1 Mon Sep 17 00:00:00 2001 From: Benediktisda Date: Sun, 20 Oct 2024 13:21:14 +0000 Subject: [PATCH 089/102] Translated using Weblate (German) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index bc36b4a13..017e0b013 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -15,15 +15,15 @@ "@artist": {}, "bitrate": "Bitrate", "@bitrate": {}, - "emptyServerUrl": "Server Webadresse darf nicht leer sein", + "emptyServerUrl": "Server-URL darf nicht leer sein", "@emptyServerUrl": { "description": "Error message that shows when the user submits a login without a server URL" }, - "urlStartWithHttps": "Webadresse muss mit http:// oder https:// beginnen", + "urlStartWithHttps": "URL muss mit http:// oder https:// beginnen", "@urlStartWithHttps": { "description": "Error message that shows when the user submits a server URL that doesn't start with http:// or https:// (for example, ftp://0.0.0.0" }, - "urlTrailingSlash": "Webadresse darf keinen Schrägstrich am Ende enthalten", + "urlTrailingSlash": "URL darf keinen Schrägstrich am Ende enthalten", "@urlTrailingSlash": { "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" }, @@ -39,7 +39,7 @@ }, "clear": "Entfernen", "@clear": {}, - "internalExternalIpExplanation": "Wenn du deinen Jellyfin Server aus der Ferne erreichen möchtest, benötigst du eine externe IP.\n\nWenn dein Server einen HTTP Port (80/443) benutzt, musst du keinen Port festlegen. Dies ist vermutlich der Fall wenn dein Server sich hinter einem Reverse Proxy befindet.", + "internalExternalIpExplanation": "Wenn du deinen Jellyfin Server aus der Ferne erreichen möchtest, benötigst du eine externe IP.\n\nWenn dein Server einen HTTP Port (80/443) benutzt, musst du keinen Port festlegen. Dies ist vermutlich der Fall wenn dein Server sich hinter einer Reverse Proxy befindet.", "@internalExternalIpExplanation": { "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." }, @@ -135,7 +135,7 @@ "@selectMusicLibraries": { "description": "App bar title for library select screen" }, - "startupError": "Während dem Starten der App ist etwas schief gelaufen. Der Fehler war: {error}\n\nBitte öffne einen Issue auf github.com/UnicornsOnLSD/finamp mit einem Bildschirmfoto von dieser Seite. Wenn dieses Problem weiterhin besteht, kannst du deine App-Daten löschen, um die App zurückzusetzen.", + "startupError": "Während dem Starten der App ist etwas schief gelaufen. Der Fehler war: {error}\n\nBitte öffne ein Issue auf github.com/UnicornsOnLSD/finamp mit einem Bildschirmfoto von dieser Seite. Wenn dieses Problem weiterhin besteht, kannst du deine App-Daten löschen, um die App zurückzusetzen.", "@startupError": { "description": "The error message that shows when startup fails.", "placeholders": { @@ -145,7 +145,7 @@ } } }, - "serverUrl": "Server Webadresse", + "serverUrl": "Server-URL", "@serverUrl": {}, "shuffleAll": "Alle mischen", "@shuffleAll": {}, @@ -167,7 +167,7 @@ "@runtime": {}, "downloadMissingImages": "Fehlende Bilder herunterladen", "@downloadMissingImages": {}, - "downloadErrors": "Downloadfehler", + "downloadErrors": "Download-Fehler", "@downloadErrors": {}, "downloadCount": "{count,plural, =1{{count} Download} other{{count} Downloads}}", "@downloadCount": { @@ -209,7 +209,7 @@ } } }, - "downloadErrorsTitle": "Downloadfehler", + "downloadErrorsTitle": "Download-Fehler", "@downloadErrorsTitle": {}, "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", "@downloadedItemsImagesCount": { @@ -520,7 +520,7 @@ "@swipeInsertQueueNext": {}, "swipeInsertQueueNextSubtitle": "Aktivieren, um das in der Liste nach links/rechts gewischte Lied als Nächstes abzuspielen, statt es am Ende der Warteschlange einzufügen.", "@swipeInsertQueueNextSubtitle": {}, - "playNext": "Als Nächstes abspielen", + "playNext": "Als Nächstes wiedergeben", "@playNext": { "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." }, @@ -535,5 +535,9 @@ "interactions": "Interaktionen", "@interactions": {}, "redesignBeta": "Neugestaltung der Oberfläche Beta", - "@redesignBeta": {} + "@redesignBeta": {}, + "playbackOrderShuffledTooltip": "Mischen. Zum Umschalten tippen.", + "@playbackOrderShuffledTooltip": {}, + "togglePlayback": "Wiedergabe umschalten", + "@togglePlayback": {} } From 9b1cef36cfcb80f6c8f108da8c205ffa1a05ec35 Mon Sep 17 00:00:00 2001 From: Whoever4976 Date: Sat, 19 Oct 2024 21:23:05 +0000 Subject: [PATCH 090/102] Translated using Weblate (German) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 51 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 017e0b013..0dc3467dc 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -534,10 +534,57 @@ "@noMusicLibrariesBody": {}, "interactions": "Interaktionen", "@interactions": {}, - "redesignBeta": "Neugestaltung der Oberfläche Beta", + "redesignBeta": "Probier die Beta", "@redesignBeta": {}, "playbackOrderShuffledTooltip": "Mischen. Zum Umschalten tippen.", "@playbackOrderShuffledTooltip": {}, "togglePlayback": "Wiedergabe umschalten", - "@togglePlayback": {} + "@togglePlayback": {}, + "playbackOrderLinearTooltip": "Abspielen in Reihenfolge. Zum umschalten tippen.", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "Wiederhole alle. Zum umschalten tippen.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "Wiederhole einen. Zum umschalten tippen.", + "@loopModeOneTooltip": {}, + "skipToNext": "Springe zum nächsten Lied", + "@skipToNext": {}, + "skipToPrevious": "Springe zum vorherigen Lied", + "@skipToPrevious": {}, + "playArtist": "Spiele alle Alben von {artist}", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "Spiele alle Alben von {artist} in zufälliger Reihenfolge", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "download": "Herunterladen", + "@download": {}, + "about": "Über Finamp", + "@about": {}, + "downloadArtist": "Lade alle Alben von {artist} herunter", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "loopModeNoneTooltip": "Wiederholt nicht. Zum umschalten tippen.", + "@loopModeNoneTooltip": {}, + "deleteFromDevice": "Vom Gerät Löschen", + "@deleteFromDevice": {}, + "sync": "Mit Server synchronisieren", + "@sync": {} } From 5ed8527615f30d27cf51da303d2d1a31fa8b6ee6 Mon Sep 17 00:00:00 2001 From: Retch Date: Mon, 21 Oct 2024 07:18:24 +0000 Subject: [PATCH 091/102] Translated using Weblate (German) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 0dc3467dc..8e736f817 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -534,7 +534,7 @@ "@noMusicLibrariesBody": {}, "interactions": "Interaktionen", "@interactions": {}, - "redesignBeta": "Probier die Beta", + "redesignBeta": "Teste die Beta", "@redesignBeta": {}, "playbackOrderShuffledTooltip": "Mischen. Zum Umschalten tippen.", "@playbackOrderShuffledTooltip": {}, From 1d4870a68b2a5964d2ad81329b9868aae42afc0f Mon Sep 17 00:00:00 2001 From: Whoever4976 Date: Sun, 20 Oct 2024 16:17:36 +0000 Subject: [PATCH 092/102] Translated using Weblate (German) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/de/ --- lib/l10n/app_de.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 8e736f817..46d861b6a 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -478,7 +478,7 @@ "@removeFromPlaylistTitle": {}, "removedFromPlaylist": "Aus der Wiedergabeliste entfernt.", "@removedFromPlaylist": {}, - "bufferDurationSubtitle": "Wie viele Sekunden der Player vorladen soll. Benötigt einen Neustart.", + "bufferDurationSubtitle": "Wie viel gepuffert werden soll, in Sekunden. Neustart erforderlich.", "@bufferDurationSubtitle": {}, "language": "Sprache", "@language": {}, From a01ee422b38dc7c531fb72d4a38adfd4680337b7 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 24 Oct 2024 13:51:07 +0000 Subject: [PATCH 093/102] Translated using Weblate (Spanish) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/es/ --- lib/l10n/app_es.arb | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 785201801..c6b94075f 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -534,6 +534,57 @@ "@interactions": {}, "swipeInsertQueueNext": "Reproducir la siguiente canción al deslizarla", "@swipeInsertQueueNext": {}, - "redesignBeta": "Nuevo diseño (beta)", - "@redesignBeta": {} + "redesignBeta": "Prueba la versión Beta", + "@redesignBeta": {}, + "playbackOrderShuffledTooltip": "Mezclando. Toca para alternar.", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "Reproducción en orden. Toca para alternar.", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "Repitiendo todo. Toca para alternar.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "En bucle. Toca para alternar.", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "No se reproduce en bucle. Toca para alternar.", + "@loopModeNoneTooltip": {}, + "skipToPrevious": "Saltar a la canción anterior", + "@skipToPrevious": {}, + "skipToNext": "Saltar a la siguiente canción", + "@skipToNext": {}, + "togglePlayback": "Alternar reproducción", + "@togglePlayback": {}, + "playArtist": "Reproducir todos los álbumes de {artist}", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "Reproducir aleatoriamente todos los álbumes de {artist}", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "downloadArtist": "Descargar todos los álbumes de {artist}", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "deleteFromDevice": "Eliminar del dispositivo", + "@deleteFromDevice": {}, + "download": "Descargar", + "@download": {}, + "sync": "Sincronizar con el servidor", + "@sync": {}, + "about": "Acerca de Finamp", + "@about": {} } From eeb211ee3a7753ec771e346b3e4797783d815076 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Dos Santos Garcia Date: Mon, 28 Oct 2024 06:43:06 +0000 Subject: [PATCH 094/102] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/pt_BR/ --- lib/l10n/app_pt_BR.arb | 55 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 68ae22839..772880da9 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -533,5 +533,58 @@ "syncDownloadedPlaylists": "Sincronizar listas de reprodução baixadas", "@syncDownloadedPlaylists": {}, "showFastScroller": "Mostrar rolagem rápida", - "@showFastScroller": {} + "@showFastScroller": {}, + "redesignBeta": "Teste o beta", + "@redesignBeta": {}, + "playbackOrderLinearTooltip": "Tocando em ordem. Aperte para ativar.", + "@playbackOrderLinearTooltip": {}, + "playbackOrderShuffledTooltip": "Embaralhando. Aperte para ativar.", + "@playbackOrderShuffledTooltip": {}, + "loopModeAllTooltip": "Repetir tudo. Aperte para ativar.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "Repetir uma. Aperte para ativar.", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "Sem repetição. Aperte para ativar.", + "@loopModeNoneTooltip": {}, + "skipToNext": "Pular para próxima música", + "@skipToNext": {}, + "skipToPrevious": "Pular para música anterior", + "@skipToPrevious": {}, + "deleteFromDevice": "Remover do dispositivo", + "@deleteFromDevice": {}, + "download": "Baixar", + "@download": {}, + "sync": "Sincronizar com servidor", + "@sync": {}, + "downloadArtist": "Baixar todos os álbuns de {artist}", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "Tocar todos os álbuns de {artist} em modo aleatório", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "playArtist": "Tocar todos os álbuns de {artist}", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "togglePlayback": "Ativar reprodução", + "@togglePlayback": {}, + "about": "Sobre Finamp", + "@about": {} } From 69f205c88eb576439617126b7841fa72a1872924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=ED=98=95=EB=9E=98?= Date: Sun, 27 Oct 2024 07:22:04 +0000 Subject: [PATCH 095/102] Translated using Weblate (Korean) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/ko/ --- lib/l10n/app_ko.arb | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 4ec12bd8f..a08151bcc 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -436,7 +436,7 @@ }, "refresh": "새로고침", "@refresh": {}, - "redesignBeta": "신상 베타 버전", + "redesignBeta": "베타 버전 사용해보기", "@redesignBeta": {}, "errorScreenError": "오류 목록을 가져오지 못했습니다! 이 시점에서는 GitHub에 문제를 등록하고 앱 데이터를 삭제해야 합니다", "@errorScreenError": {}, @@ -539,5 +539,56 @@ "example": "Failed to open download DB" } } - } + }, + "playbackOrderShuffledTooltip": "임의 재생. 전환하려면 탭하세요.", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "순차 재생. 전환하려면 탭하세요.", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "모두 반복. 전환하려면 탭하세요.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "한곡 반복. 전환하려면 탭하세요.", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "반복 안 함. 전환하려면 탭하세요.", + "@loopModeNoneTooltip": {}, + "skipToPrevious": "이전 곡으로 넘기기", + "@skipToPrevious": {}, + "skipToNext": "다음 곡으로 넘기기", + "@skipToNext": {}, + "togglePlayback": "재생 전환하기", + "@togglePlayback": {}, + "playArtist": "{artist}의 모든 앨범 재생", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "{artist}의 모든 앨범 임의 재생", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "downloadArtist": "{artist}의 모든 앨범 다운로드", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "deleteFromDevice": "기기에서 삭제하기", + "@deleteFromDevice": {}, + "download": "다운로드", + "@download": {}, + "sync": "서버와 동기화하기", + "@sync": {}, + "about": "Finamp(핀앰프) 소개", + "@about": {} } From d74585227fb3fd7839d5a343b25d2e3dae460d72 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Tue, 29 Oct 2024 04:36:44 +0000 Subject: [PATCH 096/102] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 97.0% (197 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/zh_Hant_HK/ --- lib/l10n/app_zh_Hant_HK.arb | 51 ++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/lib/l10n/app_zh_Hant_HK.arb b/lib/l10n/app_zh_Hant_HK.arb index 2bf803a35..a6c2c5b45 100644 --- a/lib/l10n/app_zh_Hant_HK.arb +++ b/lib/l10n/app_zh_Hant_HK.arb @@ -219,7 +219,7 @@ "@pathReturnSlashErrorMessage": {}, "portrait": "直向", "@portrait": {}, - "gridCrossAxisCountSubtitle": "屏幕在{value}顯示時,每行所顯示的資訊數量(例如歌曲、歌手等)。", + "gridCrossAxisCountSubtitle": "屏幕在{value}顯示時,每行顯示的資訊數量(例如歌曲、歌手等)。", "@gridCrossAxisCountSubtitle": { "description": "List tile subtitle for grid cross axis count. Value will either be the portrait or landscape key.", "placeholders": { @@ -231,15 +231,15 @@ }, "showTextOnGridView": "在網絡內顯示文字", "@showTextOnGridView": {}, - "showTextOnGridViewSubtitle": "使用格狀顯示模式時,是否在網絡內顯示歌曲資訊(名稱、歌手等)。", + "showTextOnGridViewSubtitle": "使用格狀顯示時,在網格內顯示歌曲資訊(名稱、歌手等)。", "@showTextOnGridViewSubtitle": {}, "showCoverAsPlayerBackground": "模糊化封面作為播放器的背景", "@showCoverAsPlayerBackground": {}, - "showCoverAsPlayerBackgroundSubtitle": "是否以模糊化的專輯封面圖片作為應用程式內的播放頁面的背景。", + "showCoverAsPlayerBackgroundSubtitle": "以模糊化的專輯封面作為應用程式內的播放頁面的背景。", "@showCoverAsPlayerBackgroundSubtitle": {}, "hideSongArtistsIfSameAsAlbumArtists": "隱藏與專輯歌手同名的歌手名稱", "@hideSongArtistsIfSameAsAlbumArtists": {}, - "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "當專輯的歌手與專輯歌曲的歌手名稱相同時,是否隱藏歌曲的歌手名稱。", + "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "當專輯的歌手與歌曲的歌手相同時,隱藏歌曲的歌手名稱。", "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, "disableGesture": "禁用「手勢」功能", "@disableGesture": {}, @@ -530,10 +530,49 @@ "@syncDownloadedPlaylists": {}, "showFastScroller": "顯示快速卷軸", "@showFastScroller": {}, - "redesignBeta": "新介面測試版", + "redesignBeta": "測試版", "@redesignBeta": {}, "swipeInsertQueueNext": "滑動插播", "@swipeInsertQueueNext": {}, "swipeInsertQueueNextSubtitle": "在歌曲列表中輕掃歌曲時,將其插入至播放佇列的最頭而不是最後。", - "@swipeInsertQueueNextSubtitle": {} + "@swipeInsertQueueNextSubtitle": {}, + "skipToNext": "下一首歌", + "@skipToNext": {}, + "skipToPrevious": "上一首歌", + "@skipToPrevious": {}, + "download": "下載", + "@download": {}, + "deleteFromDevice": "從裝置中刪除", + "@deleteFromDevice": {}, + "downloadArtist": "下載 {artist}所有的專輯", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "playArtist": "播放{artist}所有的專輯", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "shuffleArtist": "隨機播放{artist}的專輯", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "about": "關於 Finamp", + "@about": {}, + "sync": "與伺服器同步", + "@sync": {} } From 792ec365b37cf0af2bf90221756c64f5573e4bda Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Tue, 19 Nov 2024 15:04:08 +0000 Subject: [PATCH 097/102] Translated using Weblate (Croatian) Currently translated at 95.0% (193 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/hr/ --- lib/l10n/app_hr.arb | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index b41168684..87bcc6af0 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -59,15 +59,15 @@ "@logOut": {}, "unknownError": "Nepoznata greška", "@unknownError": {}, - "pathReturnSlashErrorMessage": "Staze koje vraćaju \"/\" se ne mogu koristiti", + "pathReturnSlashErrorMessage": "Staze sa znakom „/” se ne mogu koristiti", "@pathReturnSlashErrorMessage": {}, - "shuffleAllSongCount": "Izmiješaj sve pjesme", + "shuffleAllSongCount": "Broj pjesama za miješanje", "@shuffleAllSongCount": {}, "list": "Popis", "@list": {}, - "portrait": "Uspravni", + "portrait": "Uspravno", "@portrait": {}, - "landscape": "Ležeći", + "landscape": "Polegnuto", "@landscape": {}, "gridCrossAxisCount": "{value} broj rešetkastih linija", "@gridCrossAxisCount": { @@ -333,7 +333,7 @@ "@layoutAndTheme": {}, "customLocationsBuggy": "Prilagođene lokacije su izrazito pune grešaka zbog problema oko dozvola. Razmišljam o načinima da ovo ispravim, ali za sada ne bih preporučio korištenje.", "@customLocationsBuggy": {}, - "shuffleAllSongCountSubtitle": "Količina pjesama koja se učitava kada se koristi gumb „Izmiješaj sve pjesme”.", + "shuffleAllSongCountSubtitle": "Broj pjesama koje se učitavaju kada se koristi gumb „Izmiješaj sve pjesme”.", "@shuffleAllSongCountSubtitle": {}, "noArtist": "Nema izvođača", "@noArtist": {}, @@ -417,7 +417,7 @@ "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, "disableGestureSubtitle": "Da li deaktivirati geste.", "@disableGestureSubtitle": {}, - "system": "Sistem", + "system": "Sustav", "@system": {}, "light": "Svijetla", "@light": {}, @@ -534,6 +534,16 @@ "@interactions": {}, "swipeInsertQueueNext": "Reproduciraj pjesmu kao sljedeću povlačenjem", "@swipeInsertQueueNext": {}, - "redesignBeta": "Redizajn beta verzije", - "@redesignBeta": {} + "redesignBeta": "Probaj beta verziju", + "@redesignBeta": {}, + "skipToPrevious": "Prijeđi na prethodnu pjesmu", + "@skipToPrevious": {}, + "skipToNext": "Prijeđi na sljedeću pjesmu", + "@skipToNext": {}, + "deleteFromDevice": "Izbriši s uređaja", + "@deleteFromDevice": {}, + "download": "Preuzmi", + "@download": {}, + "sync": "Sinkroniziraj sa serverom", + "@sync": {} } From d8b91563448996e18e37f3723ccd92e0dd0bbd84 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Wed, 20 Nov 2024 08:50:34 +0000 Subject: [PATCH 098/102] Translated using Weblate (Croatian) Currently translated at 100.0% (203 of 203 strings) Translation: Finamp/Finamp Translate-URL: https://hosted.weblate.org/projects/finamp/finamp/hr/ --- lib/l10n/app_hr.arb | 81 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index 87bcc6af0..142f70653 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -37,7 +37,7 @@ "@revenue": {}, "runtime": "Vrijeme trajanja", "@runtime": {}, - "downloadMissingImages": "Preuzmi nedostajuće fotografije", + "downloadMissingImages": "Preuzmi nedostajuće slike", "@downloadMissingImages": {}, "noErrors": "Nema grešaka!", "@noErrors": {}, @@ -91,7 +91,7 @@ "@streaming": {}, "statusError": "GREŠKA STANJA", "@statusError": {}, - "removedFromPlaylist": "Uklonjeno iz popisa pjesama.", + "removedFromPlaylist": "Uklonjeno iz playliste.", "@removedFromPlaylist": {}, "startingInstantMix": "Pokretanje instant miksa.", "@startingInstantMix": {}, @@ -150,7 +150,7 @@ "@couldNotFindLibraries": { "description": "Error message when the user does not have any libraries" }, - "playlists": "Popisi pjesama", + "playlists": "Playliste", "@playlists": {}, "startMix": "Pokreni miks", "@startMix": {}, @@ -196,7 +196,7 @@ "@premiereDate": {}, "criticRating": "Ocjena kritičara", "@criticRating": {}, - "downloadedMissingImages": "{count,plural, =0{Nema nedostajućih fotografija} =1{Preuzeta je {count} nedostajuća fotografija} few{Preuzete su {count} nedostajuće fotografije} other{Preuzeto je {count} nedostajućih fotografija}}", + "downloadedMissingImages": "{count,plural, =0{Nema nedostajućih slika} =1{Preuzeta je {count} nedostajuća slika} few{Preuzete su {count} nedostajuće slike} other{Preuzeto je {count} nedostajućih slika}}", "@downloadedMissingImages": { "description": "Message that shows when the user downloads missing images", "placeholders": { @@ -205,7 +205,7 @@ } } }, - "editPlaylistNameTitle": "Uredi ime popisa pjesama", + "editPlaylistNameTitle": "Uredi ime playliste", "@editPlaylistNameTitle": {}, "customLocation": "Prilagođena lokacija", "@customLocation": {}, @@ -251,7 +251,7 @@ } } }, - "downloadedImagesCount": "{count,plural,=1{{count} fotografija} few{{count} fotografije} other{{count} fotografija}}", + "downloadedImagesCount": "{count,plural,=1{{count} slika} few{{count} slike} other{{count} slika}}", "@downloadedImagesCount": { "placeholders": { "count": { @@ -277,11 +277,11 @@ }, "downloadErrorsTitle": "Greške preuzimanja", "@downloadErrorsTitle": {}, - "editPlaylistNameTooltip": "Uredi ime popisa pjesama", + "editPlaylistNameTooltip": "Uredi ime playliste", "@editPlaylistNameTooltip": {}, - "playlistNameUpdated": "Ime popisa pjesama je ažurirano.", + "playlistNameUpdated": "Ime playliste je ažurirano.", "@playlistNameUpdated": {}, - "dlEnqueued": "{count} u redu čekanja", + "dlEnqueued": "{count} dodano u red", "@dlEnqueued": { "placeholders": { "count": { @@ -289,7 +289,7 @@ } } }, - "dlRunning": "{count} pokrenuto", + "dlRunning": "{count} u tijeku", "@dlRunning": { "placeholders": { "count": { @@ -379,7 +379,7 @@ "@enableTranscoding": {}, "enableTranscodingSubtitle": "Transkodira stream glazbe na server strani.", "@enableTranscodingSubtitle": {}, - "addToPlaylistTooltip": "Dodaj u popis pjesama", + "addToPlaylistTooltip": "Dodaj u playlistu", "@addToPlaylistTooltip": {}, "goToAlbum": "Idi na album", "@goToAlbum": {}, @@ -407,11 +407,11 @@ "@createButtonLabel": {}, "sleepTimerTooltip": "Odbrojavanje", "@sleepTimerTooltip": {}, - "addToPlaylistTitle": "Dodaj u popis pjesama", + "addToPlaylistTitle": "Dodaj u playlistu", "@addToPlaylistTitle": {}, - "removeFromPlaylistTitle": "Ukloni iz popisa pjesama", + "removeFromPlaylistTitle": "Ukloni iz playliste", "@removeFromPlaylistTitle": {}, - "newPlaylist": "Novi popis pjesama", + "newPlaylist": "Nova playlista", "@newPlaylist": {}, "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "Da li prikazati izvođače pjesama na ekranu albuma ako se ne razlikuju od izvođača albuma.", "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, @@ -429,13 +429,13 @@ "@noButtonLabel": {}, "invalidNumber": "Neispravan broj", "@invalidNumber": {}, - "removeFromPlaylistTooltip": "Ukloni iz popisa pjesama", + "removeFromPlaylistTooltip": "Ukloni iz playliste", "@removeFromPlaylistTooltip": {}, "unknownArtist": "Nepoznat izvođač", "@unknownArtist": {}, "transcode": "TRANSKODIRAJ", "@transcode": {}, - "playlistCreated": "Popis pjesama je stvoren.", + "playlistCreated": "Playlista je stvorena.", "@playlistCreated": {}, "noAlbum": "Nema albuma", "@noAlbum": {}, @@ -492,7 +492,7 @@ "@insertedIntoQueue": { "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." }, - "playNext": "Reproduciraj sljedeću", + "playNext": "Reproduciraj kao sljedeću", "@playNext": { "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." }, @@ -508,13 +508,13 @@ "@deleteDownloadsConfirmButtonText": { "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." }, - "syncDownloadedPlaylists": "Sinkroniziraj preuzete popise pjesama", + "syncDownloadedPlaylists": "Sinkroniziraj preuzete playliste", "@syncDownloadedPlaylists": {}, "deleteDownloadsAbortButtonText": "Odustani", "@deleteDownloadsAbortButtonText": {}, "showFastScroller": "Prikaži traku za brzo listanje", "@showFastScroller": {}, - "deleteDownloadsPrompt": "Stvarno želiš izbrisati {itemType, select, album{album } playlist{playlistu } artist{izvođača } genre{žanr } track{pjesmu } other{}}'{itemName}' s ovog uređaja?", + "deleteDownloadsPrompt": "Stvarno želiš izbrisati {itemType, select, album{album} playlist{playlistu} artist{izvođača} genre{žanr} track{pjesmu} other{}} '{itemName}' s ovog uređaja?", "@deleteDownloadsPrompt": { "placeholders": { "itemName": { @@ -545,5 +545,46 @@ "download": "Preuzmi", "@download": {}, "sync": "Sinkroniziraj sa serverom", - "@sync": {} + "@sync": {}, + "playbackOrderShuffledTooltip": "Miješanje. Uključi/isključi dodirom.", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "Reprodukcija redom. Uključi/isključi dodirom.", + "@playbackOrderLinearTooltip": {}, + "togglePlayback": "Uključi/isključi reprodukciju", + "@togglePlayback": {}, + "loopModeAllTooltip": "Ponavljanje svih. Uključi/isključi dodirom.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "Ponavljanje jedne. Uključi/isključi dodirom.", + "@loopModeOneTooltip": {}, + "about": "O aplikaciji Finamp", + "@about": {}, + "shuffleArtist": "Izmiješaj sve albume od {artist}", + "@shuffleArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "playArtist": "Reproduciraj sve albume od {artist}", + "@playArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "downloadArtist": "Preuzmi sve albume od {artist}", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } + }, + "loopModeNoneTooltip": "Bez ponavljanja. Uključi/isključi dodirom.", + "@loopModeNoneTooltip": {} } From cbc41b447ddcce2d520cb542a7110e5a3e209721 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:46:23 +0000 Subject: [PATCH 099/102] Update dependencies in pubspec.lock --- ios/Podfile.lock | 2 +- pubspec.lock | 92 ++++++++++++++++++++++++------------------------ 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f53ebb31a..b5b55130a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -152,7 +152,7 @@ SPEC CHECKSUMS: permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3 share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 - sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe diff --git a/pubspec.lock b/pubspec.lock index 16fdf7e2d..9930ce356 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -42,10 +42,10 @@ packages: dependency: transitive description: name: args - sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.0" async: dependency: transitive description: @@ -202,10 +202,10 @@ packages: dependency: transitive description: name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.4.2" clipboard: dependency: "direct main" description: @@ -226,10 +226,10 @@ packages: dependency: transitive description: name: code_builder - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" url: "https://pub.dev" source: hosted - version: "4.10.0" + version: "4.10.1" collection: dependency: transitive description: @@ -242,10 +242,10 @@ packages: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" cross_file: dependency: transitive description: @@ -258,10 +258,10 @@ packages: dependency: transitive description: name: crypto - sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -346,10 +346,10 @@ packages: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -405,10 +405,10 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: "711d916456563f715bde1e139d7cfdca009f8264befab3ac9f8ded8b6ec26405" + sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.6.1" flutter_staggered_grid_view: dependency: transitive description: @@ -519,18 +519,18 @@ packages: dependency: transitive description: name: image - sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.3.0" infinite_scroll_pagination: dependency: "direct main" description: name: infinite_scroll_pagination - sha256: b68bce20752fcf36c7739e60de4175494f74e99e9a69b4dd2fe3a1dd07a7f16a + sha256: "4047eb8191e8b33573690922a9e995af64c3949dc87efc844f936b039ea279df" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" intl: dependency: "direct main" description: @@ -567,10 +567,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c url: "https://pub.dev" source: hosted - version: "6.8.0" + version: "6.9.0" just_audio: dependency: "direct main" description: @@ -640,10 +640,10 @@ packages: dependency: "direct main" description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" macros: dependency: transitive description: @@ -744,10 +744,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: transitive description: @@ -800,10 +800,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" url: "https://pub.dev" source: hosted - version: "12.0.12" + version: "12.0.13" permission_handler_apple: dependency: transitive description: @@ -816,10 +816,10 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + sha256: "6b9cb54b7135073841a35513fba39e598b421702d5f4d92319992fd6eb5532a9" url: "https://pub.dev" source: hosted - version: "0.1.3+2" + version: "0.1.3+4" permission_handler_platform_interface: dependency: transitive description: @@ -848,10 +848,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: @@ -896,10 +896,10 @@ packages: dependency: transitive description: name: riverpod - sha256: c86fedfb45dd1da98ee6493dd9374325cdf494e7d523ebfb0c387eecc5f7b5c9 + sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.6.1" rxdart: dependency: "direct main" description: @@ -989,10 +989,10 @@ packages: dependency: transitive description: name: sqflite - sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62" + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" sqflite_android: dependency: transitive description: @@ -1013,10 +1013,10 @@ packages: dependency: transitive description: name: sqflite_darwin - sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027" + sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474" url: "https://pub.dev" source: hosted - version: "2.4.1-1" + version: "2.4.1" sqflite_platform_interface: dependency: transitive description: @@ -1101,10 +1101,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" url_launcher: dependency: "direct main" description: @@ -1117,10 +1117,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" url: "https://pub.dev" source: hosted - version: "6.3.12" + version: "6.3.14" url_launcher_ios: dependency: transitive description: @@ -1133,10 +1133,10 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_macos: dependency: transitive description: @@ -1165,10 +1165,10 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" uuid: dependency: "direct main" description: @@ -1237,10 +1237,10 @@ packages: dependency: transitive description: name: win32 - sha256: e5c39a90447e7c81cfec14b041cdbd0d0916bd9ebbc7fe02ab69568be703b9bd + sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2" url: "https://pub.dev" source: hosted - version: "5.6.0" + version: "5.8.0" win32_registry: dependency: transitive description: From f7f1a2825455c2e46cad255a6580532510939736 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:50:02 +0000 Subject: [PATCH 100/102] Bump version --- fastlane/metadata/android/en-US/changelogs/49.txt | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/49.txt diff --git a/fastlane/metadata/android/en-US/changelogs/49.txt b/fastlane/metadata/android/en-US/changelogs/49.txt new file mode 100644 index 000000000..312d95a60 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/49.txt @@ -0,0 +1 @@ +Updated dependencies, fixed F-Droid build. Changes are now only happening on the redesign beta, check it out on GitHub! diff --git a/pubspec.yaml b/pubspec.yaml index a8cd0f3ec..6ae1a5199 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.24+48 +version: 0.6.25+49 environment: sdk: ">=2.19.4 <3.0.0" From 62c83fbbd91001b428363b8097e21a814e01ce78 Mon Sep 17 00:00:00 2001 From: James Harvey <44349936+jmshrv@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:55:18 +0000 Subject: [PATCH 101/102] Update flutterw --- .flutter | 2 +- pubspec.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.flutter b/.flutter index 54e66469a..dec2ee5c1 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit 54e66469a933b60ddf175f858f82eaeb97e48c8d +Subproject commit dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 diff --git a/pubspec.lock b/pubspec.lock index 9930ce356..592d6cf76 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -816,10 +816,10 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: "6b9cb54b7135073841a35513fba39e598b421702d5f4d92319992fd6eb5532a9" + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+4" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: From 107d3363af099e59d71eff5e0eaec66e6eeb44aa Mon Sep 17 00:00:00 2001 From: YiraSan <45128167+YiraSan@users.noreply.github.com> Date: Thu, 12 Dec 2024 17:01:19 +0100 Subject: [PATCH 102/102] Native french translation of Finamp (#973) * a french translation made by a french native * translation patch thanks to pinsarda reviews * togglePlayback translation missing --- lib/l10n/app_fr.arb | 680 ++++++++++++++++++++++++-------------------- 1 file changed, 364 insertions(+), 316 deletions(-) diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 3ea321441..59373ec2e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1,144 +1,134 @@ { - "communityRating": "Note de la communauté", - "@communityRating": {}, - "criticRating": "Note des critiques", - "@criticRating": {}, - "addButtonLabel": "AJOUTER", - "@addButtonLabel": {}, - "downloadsAdded": "Téléchargements ajoutés.", - "@downloadsAdded": {}, - "name": "Nom", - "@name": {}, - "noButtonLabel": "NON", - "@noButtonLabel": {}, - "noAlbum": "Aucun album", - "@noAlbum": {}, - "noArtist": "Aucun artiste", - "@noArtist": {}, - "noItem": "Pas d'élément", - "@noItem": {}, - "logs": "Journaux", - "@logs": {}, - "next": "Suivant", - "@next": {}, - "albums": "Albums", - "@albums": {}, - "artists": "Artistes", - "@artists": {}, - "downloads": "Téléchargements", - "@downloads": {}, - "albumArtist": "Artiste d'album", - "@albumArtist": {}, - "budget": "Budget", - "@budget": {}, - "noErrors": "Aucune erreur !", - "@noErrors": {}, - "error": "Erreur", - "@error": {}, - "downloadsDeleted": "Téléchargements supprimés.", - "@downloadsDeleted": {}, - "audioService": "Service audio", - "@audioService": {}, - "location": "Emplacement", - "@location": {}, - "logOut": "Déconnexion", - "@logOut": {}, - "logsCopied": "Journaux copiés.", - "@logsCopied": {}, - "bitrate": "Débit", - "@bitrate": {}, - "addDownloadLocation": "Ajouter un emplacement de téléchargement", - "@addDownloadLocation": {}, - "createButtonLabel": "CRÉER", - "@createButtonLabel": {}, - "newPlaylist": "Nouvelle liste de lecture", - "@newPlaylist": {}, - "responseError": "{error} Code d'erreur {statusCode}.", - "@responseError": { - "placeholders": { - "error": { - "type": "String", - "example": "Forbidden" - }, - "statusCode": { - "type": "int", - "example": "403" - } - } - }, - "couldNotFindLibraries": "Aucune bibliothèque trouvée.", - "@couldNotFindLibraries": { - "description": "Error message when the user does not have any libraries" - }, - "failedToGetSongFromDownloadId": "Impossible de récupérer le titre depuis l'ID de téléchargement", - "@failedToGetSongFromDownloadId": {}, - "genres": "Genres", - "@genres": {}, - "favourite": "Favoris", - "@favourite": {}, - "favourites": "Favoris", - "@favourites": {}, - "album": "Album", - "@album": {}, - "grid": "Mosaïque", - "@grid": {}, - "sleepTimerTooltip": "Minuterie de veille", - "@sleepTimerTooltip": {}, - "startupError": "Quelque chose s'est mal passé pendant le démarrage de l'application ! L'erreur en cause était : {error}\n\nVeuillez créer une issue sur Github à l'adresse github.com/UnicornsOnLSD/finamp avec une capture d'écran de cette page. Si le problème persiste, supprimez les données de l'application pour la réinitialiser.", + "startupError": "Une erreur est survenue lors du démarrage de l'application. L'erreur est: {error}\n\nPlease create an issue on github.com/UnicornsOnLSD/finamp with a screenshot of this page. If this problem persists you can clear your app data to reset the app.", "@startupError": { - "description": "The error message that shows when startup fails.", + "description": "Le message d'erreur affiché lorsque le démarrage de l'application échoue.", "placeholders": { "error": { "type": "String", - "example": "Failed to open download DB" + "example": "Impossible d'accéder aux données de téléchargement" } } }, - "music": "Musique", - "@music": {}, - "serverUrl": "URL du serveur", + "serverUrl": "Adresse du serveur", "@serverUrl": {}, - "urlStartWithHttps": "L'URL doit commencer par http:// ou https://", + "internalExternalIpExplanation": "Si vous souhaitez pouvoir accéder à votre serveur Jellyfin à distance, vous devez utiliser votre adresse IP externe.\n\nSi votre serveur utilise un port HTTP (80/443), vous n'avez pas besoin de spécifier de port. C'est probablement le cas si votre serveur est derrière un reverse proxy.", + "@internalExternalIpExplanation": { + "description": "Informations supplémentaires sur l'IP à utiliser pour l'accès à distance, et sur la nécessité ou non de spécifier un port" + }, + "emptyServerUrl": "Vous devez indiquez l'adresse du serveur.", + "@emptyServerUrl": { + "description": "Cette erreur intervient lorsque l'utilisateur tente de se connecter sans indiquer l'adresse du serveur" + }, + "urlStartWithHttps": "L'adresse doit commencer par http:// ou https://", "@urlStartWithHttps": { - "description": "Error message that shows when the user submits a server URL that doesn't start with http:// or https:// (for example, ftp://0.0.0.0" + "description": "Cette erreur intervient lorsque l'utilisateur soumet une adresse qui ne commence pas par http:// ou https:// (par exemple, ftp://0.0.0.0)" }, - "urlTrailingSlash": "L'URL ne doit pas se terminer pas une barre oblique", + "urlTrailingSlash": "L'adresse ne doit pas inclure de slash final.", "@urlTrailingSlash": { - "description": "Error message that shows when the user submits a server URL that ends with a trailing slash (for example, http://0.0.0.0/)" + "description": "Cette erreur intervient lorsque l'utilisateur soumet une adresse qui se termine par une barre oblique finale (par exemple, http://0.0.0.0/)" }, "username": "Nom d'utilisateur", "@username": {}, "password": "Mot de passe", "@password": {}, - "selectMusicLibraries": "Sélection des bibliothèques de musiques", + "logs": "Logs", + "@logs": {}, + "next": "Prochain", + "@next": {}, + "selectMusicLibraries": "Selectionner des bibliothèques", "@selectMusicLibraries": { - "description": "App bar title for library select screen" + "description": "Titre de l'écran de sélection de bibliothèque" + }, + "couldNotFindLibraries": "Aucune bibliothèque trouvée", + "@couldNotFindLibraries": { + "description": "Cette erreur intervient lorsque l'utilisateur n'a pas de bibliothèque" }, "unknownName": "Nom inconnu", "@unknownName": {}, "songs": "Titres", "@songs": {}, - "playlists": "Listes de lecture", + "albums": "Albums", + "@albums": {}, + "artists": "Artistes", + "@artists": {}, + "genres": "Genres", + "@genres": {}, + "playlists": "Playlists", "@playlists": {}, + "startMix": "Commencer un Mix", + "@startMix": {}, + "startMixNoSongsArtist": "Appuyer longuement sur un artiste pour l'ajouter ou le retirer du mix avant de commencer", + "@startMixNoSongsArtist": { + "description": "Notification qui intervient quand l'utilisateur lance le mix instantané sans avoir sélectionné des artistes" + }, + "startMixNoSongsAlbum": "Appuyer longuement sur un album pour l'ajouter ou le retirer du mix avant de commencer", + "@startMixNoSongsAlbum": { + "description": "Notification qui intervient quand l'utilisateur lance le mix instantané sans avoir sélectionné des albums" + }, + "music": "Musique", + "@music": {}, "clear": "Effacer", "@clear": {}, - "settings": "Paramètres", + "favourites": "Favoris", + "@favourites": {}, + "shuffleAll": "Tout mélanger", + "@shuffleAll": {}, + "finamp": "Finamp", + "@finamp": {}, + "downloads": "Téléchargements", + "@downloads": {}, + "settings": "Réglages", "@settings": {}, + "offlineMode": "Mode hors-ligne", + "@offlineMode": {}, "sortOrder": "Ordre de tri", "@sortOrder": {}, "sortBy": "Trier par", "@sortBy": {}, + "album": "Album", + "@album": {}, + "albumArtist": "Artiste de l'album", + "@albumArtist": {}, + "artist": "Artiste", + "@artist": {}, + "budget": "Budget", + "@budget": {}, + "communityRating": "Note de la communauté", + "@communityRating": {}, + "criticRating": "Note de la critique", + "@criticRating": {}, "dateAdded": "Date d'ajout", "@dateAdded": {}, - "datePlayed": "Date de dernière lecture", + "datePlayed": "Date de lecture", "@datePlayed": {}, - "playCount": "Nombre de lectures", + "playCount": "nombre de lectures", "@playCount": {}, + "premiereDate": "Date de première", + "@premiereDate": {}, + "productionYear": "Date de production", + "@productionYear": {}, + "name": "Nom", + "@name": {}, "random": "Aléatoire", "@random": {}, + "revenue": "Recettes", + "@revenue": {}, + "runtime": "Durée d'exécution", + "@runtime": {}, + "syncDownloadedPlaylists": "Synchroniser les playlists téléchargées", + "@syncDownloadedPlaylists": {}, "downloadMissingImages": "Télécharger les images manquantes", "@downloadMissingImages": {}, - "downloadErrors": "Erreurs de téléchargement", + "downloadedMissingImages": "{count,plural, =0{Pas d'image manquante} =1{{count} image téléchargée} other{{count} images téléchargées}", + "@downloadedMissingImages": { + "description": "Message affiché lorsque l'utilisateur télécharge des images manquantes", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadErrors": "Télécharger les erreurs", "@downloadErrors": {}, "downloadCount": "{count,plural, =1{{count} téléchargement} other{{count} téléchargements}}", "@downloadCount": { @@ -164,69 +154,46 @@ } } }, - "offlineMode": "Mode hors ligne", - "@offlineMode": {}, - "internalExternalIpExplanation": "Si vous voulez pouvoir accéder à votre serveur Jellyfin hors de votre réseau local, vous devez utiliser votre IP externe.\n\nSi votre serveur est sur un port HTTP (80/443), vous n'avez pas besoin de spécifier de port. Ce sera surement le cas si votre serveur est derrière un reverse proxy.", - "@internalExternalIpExplanation": { - "description": "Extra info for which IP to use for remote access, and info on whether or not the user needs to specify a port." - }, - "emptyServerUrl": "L'URL du serveur ne peut pas être vide", - "@emptyServerUrl": { - "description": "Error message that shows when the user submits a login without a server URL" - }, - "startMixNoSongsAlbum": "Appuyez longuement sur un album pour l'ajouter ou l'enlever du générateur de mix, avant de le lancer", - "@startMixNoSongsAlbum": { - "description": "Snackbar message that shows when the user presses the instant mix button with no albums selected" - }, - "shuffleAll": "Lecture aléatoire", - "@shuffleAll": {}, - "finamp": "Finamp", - "@finamp": {}, - "artist": "Artiste", - "@artist": {}, - "startMixNoSongsArtist": "Appuyez longuement sur un artiste pour l'ajouter ou l'enlever du générateur de mix, avant de le lancer", - "@startMixNoSongsArtist": { - "description": "Snackbar message that shows when the user presses the instant mix button with no artists selected" - }, - "productionYear": "Année de production", - "@productionYear": {}, - "premiereDate": "Date de sortie", - "@premiereDate": {}, - "downloadedMissingImages": "{count,plural, =0{Aucune image manquante trouvée} =1{{count} image manquante téléchargée} other{{count} images manquantes téléchargées}}", - "@downloadedMissingImages": { - "description": "Message that shows when the user downloads missing images", + "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", + "@downloadedItemsImagesCount": { + "description": "Sert à fusionner downloadedItemsCount et downloadedImagesCount car les outils intl de Flutter ne supportent pas plusieurs pluriels dans une seule chaîne de caractères. https://github.com/flutter/flutter/issues/86906", "placeholders": { - "count": { - "type": "int" + "downloadedItems": { + "type": "String", + "example": "12 téléchargements" + }, + "downloadedImages": { + "type": "String", + "example": "1 image" } } }, - "dlRunning": "{count} en cours", - "@dlRunning": { + "dlComplete": "{count,plural,=1{{count} complété} other{{count} complétés}}", + "@dlComplete": { "placeholders": { "count": { "type": "int" } } }, - "dlComplete": "{count} terminés", - "@dlComplete": { + "dlFailed": "{count,plural,=1{{count} échec} other{{count} échecs}}", + "@dlFailed": { "placeholders": { "count": { "type": "int" } } }, - "dlFailed": "{count} échoués", - "@dlFailed": { + "dlEnqueued": "{count} en attente", + "@dlEnqueued": { "placeholders": { "count": { "type": "int" } } }, - "dlEnqueued": "{count} en attente", - "@dlEnqueued": { + "dlRunning": "{count} en cours", + "@dlRunning": { "placeholders": { "count": { "type": "int" @@ -235,6 +202,33 @@ }, "downloadErrorsTitle": "Erreurs de téléchargement", "@downloadErrorsTitle": {}, + "noErrors": "Pas d'erreur!", + "@noErrors": {}, + "errorScreenError": "Une erreur est survenue lors de la récupération de la liste des erreurs ! À ce stade, il serait probablement préférable de créer une issue sur GitHub et de supprimer les données de l'application.", + "@errorScreenError": {}, + "failedToGetSongFromDownloadId": "Échec de récupération de la chanson à partir de l'ID de téléchargement", + "@failedToGetSongFromDownloadId": {}, + "deleteDownloadsPrompt": "Êtes vour sûr de vouloir supprimer {itemType, select, album{l'album} playlist{la playlist} artist{l'artiste} genre{le genre} track{le titre} other{}} '{itemName}' de cet appareil ?", + "@deleteDownloadsPrompt": { + "placeholders": { + "itemName": { + "type": "String", + "example": "Abandon Ship" + }, + "itemType": { + "type": "String", + "example": "album" + } + }, + "description": "Invite de confirmation affichée avant de supprimer les médias téléchargés du périphérique local, action destructrice, n'affecte pas les médias sur le serveur." + }, + "deleteDownloadsConfirmButtonText": "Supprimer", + "@deleteDownloadsConfirmButtonText": { + "description": "Affiché dans la boîte de dialogue de confirmation pour la suppression des médias téléchargés du périphérique local." + }, + "deleteDownloadsAbortButtonText": "Annuler", + "error": "Erreur", + "@error": {}, "discNumber": "Disque {number}", "@discNumber": { "placeholders": { @@ -243,7 +237,7 @@ } } }, - "playButtonLabel": "LECTURE", + "playButtonLabel": "LIRE", "@playButtonLabel": {}, "shuffleButtonLabel": "ALÉATOIRE", "@shuffleButtonLabel": {}, @@ -255,101 +249,105 @@ } } }, - "editPlaylistNameTitle": "Modifier le nom de la liste de lecture", + "editPlaylistNameTooltip": "Modifier le titre de la playlist", + "@editPlaylistNameTooltip": {}, + "editPlaylistNameTitle": "Edit Playlist Name", "@editPlaylistNameTitle": {}, - "required": "Obligatoire", + "required": "Requis", "@required": {}, - "updateButtonLabel": "RAFRAÎCHIR", + "updateButtonLabel": "METTRE À JOUR", "@updateButtonLabel": {}, - "playlistNameUpdated": "Le nom de la liste de lecture a été mis à jour.", + "playlistNameUpdated": "Titre de la playlist mis à jour.", "@playlistNameUpdated": {}, - "addDownloads": "Ajouter des téléchargements", + "favourite": "Favoris", + "@favourite": {}, + "downloadsDeleted": "Téléchargements supprimés.", + "@downloadsDeleted": {}, + "addDownloads": "Ajouter les téléchargements", "@addDownloads": {}, + "location": "Emplacement", + "@location": {}, + "downloadsAdded": "Téléchargements ajoutés.", + "@downloadsAdded": {}, + "addButtonLabel": "AJOUTER", + "@addButtonLabel": {}, + "shareLogs": "Partager les journaux.", + "@shareLogs": {}, + "logsCopied": "Journaux copiés.", + "@logsCopied": {}, "message": "Message", "@message": {}, - "shareLogs": "Partager les journaux", - "@shareLogs": {}, - "applicationLegalese": "Sous licence \"Mozilla Public License 2.0\". Le code source est disponible à l'adresse suivante :\n\ngithub.com/jmshrv/finamp", + "stackTrace": "Stack Trace", + "@stackTrace": {}, + "applicationLegalese": "Soumis à la licence Mozilla Public License 2.0. Le code source est disponible sur :\n\ngithub.com/jmshrv/finamp", "@applicationLegalese": {}, - "downloadLocations": "Emplacements de téléchargement", + "transcoding": "Transcodage", + "@transcoding": {}, + "downloadLocations": "Emplacements des téléchargements", "@downloadLocations": {}, - "areYouSure": "Êtes-vous sûr·e ?", + "audioService": "Service audio", + "@audioService": {}, + "interactions": "Intéractions", + "@interactions": {}, + "layoutAndTheme": "Disposition & Apparence", + "@layoutAndTheme": {}, + "notAvailableInOfflineMode": "Indisponible en mode hors-ligne", + "@notAvailableInOfflineMode": {}, + "logOut": "Déconnexion", + "@logOut": {}, + "downloadedSongsWillNotBeDeleted": "Les chansons téléchargées ne seront pas supprimées", + "@downloadedSongsWillNotBeDeleted": {}, + "areYouSure": "Êtes-vous sûr ?", "@areYouSure": {}, + "jellyfinUsesAACForTranscoding": "Jellyfin utilise AAC lors du transcodage", + "@jellyfinUsesAACForTranscoding": {}, + "enableTranscoding": "Activer le transcodage", + "@enableTranscoding": {}, + "enableTranscodingSubtitle": "Transcode les flux musicaux côté serveur.", + "@enableTranscodingSubtitle": {}, + "bitrate": "Débit binaire", + "@bitrate": {}, + "bitrateSubtitle": "Un débit binaire plus élevé offre une meilleure qualité audio au prix d'une bande passante plus importante.", + "@bitrateSubtitle": {}, "customLocation": "Emplacement personnalisé", "@customLocation": {}, - "appDirectory": "Dossier de l'application", + "appDirectory": "Répertoire de l'application", "@appDirectory": {}, - "selectDirectory": "Sélectionner un dossier", + "addDownloadLocation": "Ajouter un emplacement de téléchargement", + "@addDownloadLocation": {}, + "selectDirectory": "Sélectionner un répertoire", "@selectDirectory": {}, "unknownError": "Erreur inconnue", "@unknownError": {}, - "shuffleAllSongCount": "Nombre pour lecture aléatoire", - "@shuffleAllSongCount": {}, - "errorScreenError": "Une erreur s'est produite pendant la récupération de la liste des erreurs ! Vu la situation, vous devriez créer une issue sur Github et supprimer les données de l'application.", - "@errorScreenError": {}, - "jellyfinUsesAACForTranscoding": "Jellyfin utilise AAC pour le transcodage", - "@jellyfinUsesAACForTranscoding": {}, - "editPlaylistNameTooltip": "Modifier le nom de la liste de lecture", - "@editPlaylistNameTooltip": {}, - "layoutAndTheme": "Disposition et apparence", - "@layoutAndTheme": {}, - "downloadedSongsWillNotBeDeleted": "Les titres téléchargés ne seront pas supprimés", - "@downloadedSongsWillNotBeDeleted": {}, "pathReturnSlashErrorMessage": "Les chemins qui retournent \"/\" ne peuvent pas être utilisés", "@pathReturnSlashErrorMessage": {}, - "transcoding": "Transcodage", - "@transcoding": {}, - "notAvailableInOfflineMode": "Non disponible en mode hors ligne", - "@notAvailableInOfflineMode": {}, - "enableTranscoding": "Activer le transcodage", - "@enableTranscoding": {}, - "customLocationsBuggy": "Les emplacements personnalisés sont extrêmement bogués à cause de problèmes avec les autorisations du système. Il n'est pas conseillé de les utiliser avant que ce problème ne soit réglé.", - "@customLocationsBuggy": {}, - "enableTranscodingSubtitle": "Transcode les flux musicaux du côté du serveur.", - "@enableTranscodingSubtitle": {}, - "directoryMustBeEmpty": "Le dossier doit être vide", + "directoryMustBeEmpty": "Le répertoire doit être vide", "@directoryMustBeEmpty": {}, - "startMix": "Lancer un mix", - "@startMix": {}, - "revenue": "Recette box-office", - "@revenue": {}, - "runtime": "Temps d'exécution", - "@runtime": {}, - "downloadedItemsImagesCount": "{downloadedItems}, {downloadedImages}", - "@downloadedItemsImagesCount": { - "description": "This is for merging downloadedItemsCount and downloadedImagesCount as Flutter's intl stuff doesn't support multiple plurals in one string. https://github.com/flutter/flutter/issues/86906", - "placeholders": { - "downloadedItems": { - "type": "String", - "example": "12 downloads" - }, - "downloadedImages": { - "type": "String", - "example": "1 image" - } - } - }, - "stackTrace": "Suivi de la pile", - "@stackTrace": {}, - "bitrateSubtitle": "Un débit binaire plus élevé donne une meilleure qualité de l'audio, mais consomme plus de données.", - "@bitrateSubtitle": {}, - "shuffleAllSongCountSubtitle": "Nombre de titres à charger lorsque le bouton \"Lecture aléatoire\" est utilisé.", + "customLocationsBuggy": "Les emplacements personnalisés sont très bogués en raison de problèmes de permissions. Je réfléchis à des solutions pour corriger cela, mais pour l'instant, je ne recommande pas de les utiliser.", + "@customLocationsBuggy": {}, + "enterLowPriorityStateOnPause": "Faible priorité de l'application lorsque la lecture est en pause", + "@enterLowPriorityStateOnPause": {}, + "enterLowPriorityStateOnPauseSubtitle": "Permet de supprimer la notification lorsque la lecture est en pause. Permet également à Android de fermer le service lorsqu'il est en pause.", + "@enterLowPriorityStateOnPauseSubtitle": {}, + "shuffleAllSongCount": "Nombre de chansons à mélanger", + "@shuffleAllSongCount": {}, + "shuffleAllSongCountSubtitle": "Nombre de chansons à charger lors de l'utilisation du bouton 'Tout mélanger'.", "@shuffleAllSongCountSubtitle": {}, - "viewType": "Type d'affichage", + "viewType": "Disposition de l'affichage", "@viewType": {}, - "viewTypeSubtitle": "Type d'affichage pour l'écran des musiques", + "viewTypeSubtitle": "Règle la manière dont les musiques sont diposées", "@viewTypeSubtitle": {}, "list": "Liste", "@list": {}, + "grid": "Grille", + "@grid": {}, "portrait": "Portrait", "@portrait": {}, "landscape": "Paysage", "@landscape": {}, - "showTextOnGridView": "Afficher le texte dans la vue en mosaïque", - "@showTextOnGridView": {}, "gridCrossAxisCount": "Nombre de tuiles par ligne en orientation {value}", "@gridCrossAxisCount": { - "description": "List tile title for grid cross axis count. Value will either be the portrait or landscape key.", + "description": "Titre de l'élément de liste pour le nombre d'axes croisés de la grille. La valeur sera soit la clé 'portrait', soit la clé 'paysage'.", "placeholders": { "value": { "type": "String", @@ -357,61 +355,85 @@ } } }, - "showTextOnGridViewSubtitle": "Afficher ou non du texte (titre, artiste...) sur les tuiles en mode mosaïque.", - "@showTextOnGridViewSubtitle": {}, - "showCoverAsPlayerBackground": "Afficher la couverture floutée en arrière-plan du lecteur", - "@showCoverAsPlayerBackground": {}, - "addToPlaylistTooltip": "Ajouter à une liste de lecture", - "@addToPlaylistTooltip": {}, - "addToPlaylistTitle": "Ajouter à une liste de lecture", - "@addToPlaylistTitle": {}, - "addToQueue": "Ajouter à la liste d'attente", - "@addToQueue": {}, - "anErrorHasOccured": "Une erreur s'est produite.", - "@anErrorHasOccured": {}, "gridCrossAxisCountSubtitle": "Le nombre de tuiles à utiliser par rangée en orientation {value} lorsque l'affichage est en mode mosaïque.", "@gridCrossAxisCountSubtitle": { - "description": "List tile subtitle for grid cross axis count. Value will either be the portrait or landscape key.", + "description": "Sous-titre de l'élément de liste pour le nombre d'axes croisés de la grille. La valeur sera soit la clé 'portrait', soit la clé 'paysage'.", "placeholders": { "value": { "type": "String", - "example": "landscape" + "example": "Paysage" } } }, - "addedToQueue": "Ajouté à la file d'attente.", - "@addedToQueue": {}, - "addFavourite": "Ajouter aux favoris", - "@addFavourite": {}, - "enterLowPriorityStateOnPause": "Passage à l'état de basse priorité en cas de pause", - "@enterLowPriorityStateOnPause": {}, - "showCoverAsPlayerBackgroundSubtitle": "Utiliser ou non une couverture floutée comme arrière-plan sur l'écran du lecteur.", + "showTextOnGridView": "Afficher le texte dans la grille de vue", + "@showTextOnGridView": {}, + "showTextOnGridViewSubtitle": "Afficher ou non le texte (titre, artiste, etc.) sur l'écran de la grille musicale.", + "@showTextOnGridViewSubtitle": {}, + "showCoverAsPlayerBackground": "Afficher la couverture floutée en arrière-plan du lecteur", + "@showCoverAsPlayerBackground": {}, + "showCoverAsPlayerBackgroundSubtitle": "Choisir d'utiliser ou non l'illustration floutée comme arrière-plan sur l'écran du lecteur.", "@showCoverAsPlayerBackgroundSubtitle": {}, - "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "Indique si les artistes des chansons doivent être affichés sur l'écran de l'album s'ils ne diffèrent pas des artistes de l'album.", + "hideSongArtistsIfSameAsAlbumArtists": "Masquer les artistes des chansons si identiques aux artistes de l'album", + "@hideSongArtistsIfSameAsAlbumArtists": {}, + "hideSongArtistsIfSameAsAlbumArtistsSubtitle": "Afficher ou non les artistes des chansons sur l'écran de l'album si différents des artistes de l'album.", "@hideSongArtistsIfSameAsAlbumArtistsSubtitle": {}, + "disableGesture": "Désactiver les gestes", + "@disableGesture": {}, + "disableGestureSubtitle": "Indique si les gestes doivent être désactivés.", + "@disableGestureSubtitle": {}, + "showFastScroller": "Afficher le défileur rapide", + "@showFastScroller": {}, "theme": "Thème", "@theme": {}, "system": "Système", "@system": {}, - "light": "Lumineux", + "light": "Claire", "@light": {}, "dark": "Sombre", "@dark": {}, "tabs": "Onglets", "@tabs": {}, - "cancelSleepTimer": "Annuler la minuterie de veille ?", + "cancelSleepTimer": "Annuler le minuteur de sommeil ?", "@cancelSleepTimer": {}, "yesButtonLabel": "OUI", "@yesButtonLabel": {}, - "setSleepTimer": "Réglage de la minuterie de veille", + "noButtonLabel": "NON", + "@noButtonLabel": {}, + "setSleepTimer": "Configurer le minuteur de sommeil", "@setSleepTimer": {}, + "minutes": "Minutes", + "@minutes": {}, "invalidNumber": "Nombre invalide", "@invalidNumber": {}, + "sleepTimerTooltip": "Minuteur de sommeil", + "@sleepTimerTooltip": {}, + "addToPlaylistTooltip": "Ajouter à une playlist", + "@addToPlaylistTooltip": {}, + "addToPlaylistTitle": "Ajouter à une playlist", + "@addToPlaylistTitle": {}, + "removeFromPlaylistTooltip": "Retirer de la playlist", + "@removeFromPlaylistTooltip": {}, + "removeFromPlaylistTitle": "Retirer de la playlist", + "@removeFromPlaylistTitle": {}, + "newPlaylist": "Nouvelle Playlist", + "@newPlaylist": {}, + "createButtonLabel": "CRÉER", + "@createButtonLabel": {}, + "playlistCreated": "Playlist créée.", + "@playlistCreated": {}, + "noAlbum": "Aucun album", + "@noAlbum": {}, + "noItem": "Aucun élément", + "@noItem": {}, + "noArtist": "Aucun artiste", + "@noArtist": {}, "unknownArtist": "Artiste inconnu", "@unknownArtist": {}, "streaming": "STREAMING", "@streaming": {}, - "transcode": "TRANSCODE", + "downloaded": "TÉLÉCHARGÉ", + "@downloaded": {}, + "transcode": "TRANSCODAGE", "@transcode": {}, "direct": "DIRECT", "@direct": {}, @@ -419,26 +441,59 @@ "@statusError": {}, "queue": "File d'attente", "@queue": {}, + "addToQueue": "Ajouter à la file d'attente", + "@addToQueue": { + "description": "Titre de l'élément du menu contextuel pour ajouter un élément à la fin de la file d'attente." + }, + "playNext": "Lire ensuite", + "@playNext": { + "description": "Titre de l'élément du menu contextuel pour insérer un élément dans la file d'attente de lecture après l'élément en cours de lecture." + }, + "replaceQueue": "Remplacer la file d'attente", + "@replaceQueue": {}, "instantMix": "Mix instantané", "@instantMix": {}, + "goToAlbum": "Voir l'album", + "@goToAlbum": {}, + "removeFavourite": "Retirer des favoris", + "@removeFavourite": {}, + "addFavourite": "Ajouter aux favoris", + "@addFavourite": {}, + "addedToQueue": "Ajouté à la fin de la file d'attente.", + "@addedToQueue": { + "description": "Notification affichée lorsque l'utilisateur ajoute avec succès des éléments à la fin de la file d'attente de lecture." + }, + "insertedIntoQueue": "Ajouté à la file d'attente.", + "@insertedIntoQueue": { + "description": "Notification affichée lorsque l'utilisateur insère avec succès des éléments dans la file d'attente de lecture à un endroit qui n'est pas nécessairement à la fin." + }, "queueReplaced": "File d'attente remplacée.", "@queueReplaced": {}, - "startingInstantMix": "Démarrage du mix instantané.", + "removedFromPlaylist": "Retiré de la playlist.", + "@removedFromPlaylist": {}, + "startingInstantMix": "Mix instantané lancé.", "@startingInstantMix": {}, - "enterLowPriorityStateOnPauseSubtitle": "Permet de faire glisser la notification lorsqu'elle est en pause. Permet également à Android de tuer le service lorsqu'il est en pause.", - "@enterLowPriorityStateOnPauseSubtitle": {}, - "playlistCreated": "Liste de lecture créée.", - "@playlistCreated": {}, - "downloaded": "TÉLÉCHARGÉ", - "@downloaded": {}, - "replaceQueue": "Remplacer la file d'attente", - "@replaceQueue": {}, - "responseError401": "{error} Code d'état {statusCode}. Cela signifie probablement que vous avez utilisé un mauvais nom d'utilisateur/mot de passe, ou que votre client n'est plus authentifié.", + "anErrorHasOccured": "Une erreur s'est produite.", + "@anErrorHasOccured": {}, + "responseError": "{error} Status code {statusCode}.", + "@responseError": { + "placeholders": { + "error": { + "type": "String", + "example": "Interdit" + }, + "statusCode": { + "type": "int", + "example": "403" + } + } + }, + "responseError401": "{error} Code de statut {statusCode}. Cela signifie probablement que vous avez utilisé un mauvais nom d'utilisateur/mot de passe, ou que votre client n'est plus connecté.", "@responseError401": { "placeholders": { "error": { "type": "String", - "example": "Unauthorized" + "example": "Non autorisé" }, "statusCode": { "type": "int", @@ -446,19 +501,11 @@ } } }, - "goToAlbum": "Aller à l'album", - "@goToAlbum": {}, - "removeFavourite": "Supprimer des favoris", - "@removeFavourite": {}, - "hideSongArtistsIfSameAsAlbumArtists": "Masquer les artistes des chansons s'ils sont les mêmes que ceux des albums", - "@hideSongArtistsIfSameAsAlbumArtists": {}, - "addToMix": "Ajouter au mix", - "@addToMix": {}, - "removeFromMix": "Enlever du mix", + "removeFromMix": "Retirer du Mix", "@removeFromMix": {}, - "minutes": "Minutes", - "@minutes": {}, - "redownloadedItems": "{count,plural, =0{Aucun re-téléchargement nécessaire.} =1{{count} élément re-téléchargé} other{{count} éléments re-téléchargés}}", + "addToMix": "Ajouter au Mix", + "@addToMix": {}, + "redownloadedItems": "{count,plural, =0{Aucun re-téléchargement nécessaire} =1{{count} élément re-téléchargé} other{{count} éléments re-téléchargés}}", "@redownloadedItems": { "placeholders": { "count": { @@ -466,74 +513,75 @@ } } }, - "bufferDuration": "Durée du tampon", + "bufferDuration": "Taille du tampon", "@bufferDuration": {}, - "bufferDurationSubtitle": "Combien de temps le lecteur doit mettre en mémoire tampon, en secondes. Nécessite un redémarrage.", + "bufferDurationSubtitle": "Taille du tampon du lecteur, en secondes. Changer ce paramètre nécessite un redémarrage.", "@bufferDurationSubtitle": {}, - "disableGesture": "Désactiver les gestes", - "@disableGesture": {}, - "removeFromPlaylistTooltip": "Retirer de la playlist", - "@removeFromPlaylistTooltip": {}, - "removeFromPlaylistTitle": "Retirer de la playlist", - "@removeFromPlaylistTitle": {}, - "removedFromPlaylist": "Retirer de la playlist.", - "@removedFromPlaylist": {}, - "disableGestureSubtitle": "Option permettant de désactiver les gestes.", - "@disableGestureSubtitle": {}, - "showUncensoredLogMessage": "Ce journal contient vos informations de connexion. L'afficher ?", - "@showUncensoredLogMessage": {}, - "insertedIntoQueue": "Ajouter à la file d'attente.", - "@insertedIntoQueue": { - "description": "Snackbar message that shows when the user successfully inserts items into the play queue at a location that is not necessarily the end." - }, - "refresh": "ACTUALISER", - "@refresh": {}, - "confirm": "Confirmer", - "@confirm": {}, "language": "Langue", - "@language": {}, - "playNext": "Lire à la suite", - "@playNext": { - "description": "Popup menu item title for inserting an item into the play queue after the currently-playing item." - }, + "confirm": "Confirmé", + "showUncensoredLogMessage": "Ce journal contient vos informations de connexion. Afficher tout de même ?", "resetTabs": "Réinitialiser les onglets", - "@resetTabs": {}, - "noMusicLibrariesBody": "Finamp n'a trouvé aucune bibliothèque musicale. Assurez-vous que votre serveur Jellyfin contient au moins une médiathèque de type \"Musique\".", - "@noMusicLibrariesBody": {}, - "noMusicLibrariesTitle": "Pas de bibliothèque musicale", + "noMusicLibrariesTitle": "Aucune bibliothèque musicale", "@noMusicLibrariesTitle": { - "description": "Title for message that shows on the views screen when no music libraries could be found." + "description": "Titre du message affiché sur l'écran de vues lorsque aucune bibliothèque musicale n'a été trouvée." }, - "deleteDownloadsPrompt": "Voulez-vous vraiment supprimer {itemType, select, album{album} playlist{playlist} artist{artist} genre{genre} track{song} other{}} '{itemName}' de cet appareil ?", - "@deleteDownloadsPrompt": { + "noMusicLibrariesBody": "Finamp n'a pas trouvé de bibliothèques musicales. Veuillez vous assurer que votre serveur Jellyfin contient au moins une bibliothèque avec le type de contenu défini sur \"Musique\".", + "refresh": "RAFRAÎCHIR", + "swipeInsertQueueNext": "Lire la chanson balayée en prochain", + "@swipeInsertQueueNext": {}, + "swipeInsertQueueNextSubtitle": "Activer l'insertion d'une chanson comme élément suivant dans la file d'attente lorsqu'elle est balayée dans la liste des chansons, au lieu de l'ajouter à la fin.", + "@swipeInsertQueueNextSubtitle": {}, + "redesignBeta": "Essayer la bêta", + "@redesignBeta": {}, + "playbackOrderShuffledTooltip": "Lecture en aléatoire. Touchez pour activer/désactiver.", + "@playbackOrderShuffledTooltip": {}, + "playbackOrderLinearTooltip": "Lecture dans l'ordre. Touchez pour activer/désactiver.", + "@playbackOrderLinearTooltip": {}, + "loopModeAllTooltip": "Lecture en boucle de l'ensemble. Touchez pour activer/désactiver.", + "@loopModeAllTooltip": {}, + "loopModeOneTooltip": "Lecture en boucle d'un seul. Touchez pour activer/désactiver.", + "@loopModeOneTooltip": {}, + "loopModeNoneTooltip": "Ne pas lire en boucle. Touchez pour activer/désactiver.", + "@loopModeNoneTooltip": {}, + "skipToPrevious": "Passer à la chanson précédente", + "@skipToPrevious": {}, + "skipToNext": "Passer à la chanson suivante", + "@skipToNext": {}, + "togglePlayback": "Activer/désactiver la lecture", + "@togglePlayback": {}, + "playArtist": "Lire tous les albums de {artist}", + "@playArtist": { "placeholders": { - "itemName": { + "artist": { "type": "String", - "example": "Abandon Ship" - }, - "itemType": { + "example": "The Beatles" + } + } + }, + "shuffleArtist": "Lire aléatoirement tous les albums de {artist}", + "@shuffleArtist": { + "placeholders": { + "artist": { "type": "String", - "example": "album" + "example": "The Beatles" } - }, - "description": "Confirmation prompt shown before deleting downloaded media from the local device, destructive action, doesn't affect the media on the server." + } }, - "deleteDownloadsConfirmButtonText": "Supprimer", - "@deleteDownloadsConfirmButtonText": { - "description": "Shown in the confirmation dialog for deleting downloaded media from the local device." + "downloadArtist": "Télécharger tous les albums de {artist}", + "@downloadArtist": { + "placeholders": { + "artist": { + "type": "String", + "example": "The Beatles" + } + } }, - "deleteDownloadsAbortButtonText": "Annuler", - "@deleteDownloadsAbortButtonText": {}, - "syncDownloadedPlaylists": "Synchroniser les playlist téléchargées", - "@syncDownloadedPlaylists": {}, - "showFastScroller": "Afficher la barre de défilement rapide", - "@showFastScroller": {}, - "swipeInsertQueueNext": "Jouer la chanson glissée ensuite", - "@swipeInsertQueueNext": {}, - "swipeInsertQueueNextSubtitle": "Permet d'insérer une chanson comme élément suivant dans la file d'attente lorsqu'elle est glissée dans la liste des chansons au lieu de l'ajouter à la fin de la liste.", - "@swipeInsertQueueNextSubtitle": {}, - "redesignBeta": "Refonte bêta", - "@redesignBeta": {}, - "interactions": "Interactions", - "@interactions": {} + "deleteFromDevice": "Supprimer de l'appareil", + "@deleteFromDevice": {}, + "download": "Télécharger", + "@download": {}, + "sync": "Synchroniser avec le serveur", + "@sync": {}, + "about": "À propos de Finamp", + "@about": {} }