From 17df300a182a5e075b51541edd2f8ced3f6dcfcf Mon Sep 17 00:00:00 2001 From: exttex Date: Tue, 22 Sep 2020 19:13:54 +0200 Subject: [PATCH] Downloads fix, Spanish translation --- lib/api/deezer.dart | 17 ++-- lib/api/definitions.dart | 9 +- lib/api/definitions.g.dart | 2 + lib/api/download.dart | 76 +++++++++----- lib/api/player.dart | 4 +- lib/languages/en_us.dart | 4 +- lib/languages/es_es.dart | 172 +++++++++++++++++++++++++++++++ lib/languages/fil_ph.dart | 190 +++++++++++++++++++++++++++++++++++ lib/languages/it_it.dart | 42 ++++---- lib/languages/ru_ru.dart | 79 ++++++++------- lib/translations.i18n.dart | 8 +- lib/ui/details_screens.dart | 10 ++ lib/ui/downloads_screen.dart | 5 +- lib/ui/player_screen.dart | 1 - lib/ui/search.dart | 4 + lib/ui/settings_screen.dart | 24 ++++- pubspec.lock | 2 +- pubspec.yaml | 2 +- 18 files changed, 548 insertions(+), 103 deletions(-) create mode 100644 lib/languages/es_es.dart create mode 100644 lib/languages/fil_ph.dart diff --git a/lib/api/deezer.dart b/lib/api/deezer.dart index c41a896..5a37f10 100644 --- a/lib/api/deezer.dart +++ b/lib/api/deezer.dart @@ -123,7 +123,7 @@ class DeezerAPI { Map data = await callApi('deezer.pageAlbum', params: { 'alb_id': id, 'header': true, - 'lang': 'us' + 'lang': settings.deezerLanguage??'en' }); return Album.fromPrivateJson(data['results']['DATA'], songsJson: data['results']['SONGS']); } @@ -132,7 +132,7 @@ class DeezerAPI { Future artist(String id) async { Map data = await callApi('deezer.pageArtist', params: { 'art_id': id, - 'lang': 'us', + 'lang': settings.deezerLanguage??'en', }); return Artist.fromPrivateJson( data['results']['DATA'], @@ -145,7 +145,7 @@ class DeezerAPI { Future> playlistTracksPage(String id, int start, {int nb = 50}) async { Map data = await callApi('deezer.pagePlaylist', params: { 'playlist_id': id, - 'lang': 'us', + 'lang': settings.deezerLanguage??'en', 'nb': nb, 'tags': true, 'start': start @@ -157,7 +157,7 @@ class DeezerAPI { Future playlist(String id, {int nb = 100}) async { Map data = await callApi('deezer.pagePlaylist', params: { 'playlist_id': id, - 'lang': 'us', + 'lang': settings.deezerLanguage??'en', 'nb': nb, 'tags': true, 'start': 0 @@ -167,6 +167,10 @@ class DeezerAPI { //Get playlist with all tracks Future fullPlaylist(String id) async { + return await playlist(id, nb: 100000); + + //OLD WORKAROUND + /* Playlist p = await playlist(id, nb: 200); for (int i=200; i artists.map((art) => art.name).join(', '); Duration get duration => Duration(seconds: tracks.fold(0, (v, t) => v += t.duration.inSeconds)); @@ -210,7 +212,8 @@ class Album { tracks: (songsJson['data']??[]).map((dynamic track) => Track.fromPrivateJson(track)).toList(), fans: json['NB_FAN'], library: library, - type: type + type: type, + releaseDate: json['DIGITAL_RELEASE_DATE']??json['PHYSICAL_RELEASE_DATE'] ); } Map toSQL({off = false}) => { @@ -281,7 +284,7 @@ class Artist { albums: (albumsJson['data']??[]).map((dynamic data) => Album.fromPrivateJson(data)).toList(), topTracks: (topJson['data']??[]).map((dynamic data) => Track.fromPrivateJson(data)).toList(), library: library, - radio: _radio + radio: _radio, ); } Map toSQL({off = false}) => { diff --git a/lib/api/definitions.g.dart b/lib/api/definitions.g.dart index 274fd13..bbc0d72 100644 --- a/lib/api/definitions.g.dart +++ b/lib/api/definitions.g.dart @@ -70,6 +70,7 @@ Album _$AlbumFromJson(Map json) { offline: json['offline'] as bool, library: json['library'] as bool, type: _$enumDecodeNullable(_$AlbumTypeEnumMap, json['type']), + releaseDate: json['releaseDate'] as String, ); } @@ -83,6 +84,7 @@ Map _$AlbumToJson(Album instance) => { 'offline': instance.offline, 'library': instance.library, 'type': _$AlbumTypeEnumMap[instance.type], + 'releaseDate': instance.releaseDate, }; T _$enumDecode( diff --git a/lib/api/download.dart b/lib/api/download.dart index 724089e..87286a6 100644 --- a/lib/api/download.dart +++ b/lib/api/download.dart @@ -132,10 +132,23 @@ class DownloadManager { } ).catchError((e, st) async { if (stopped) return; - print('Download error: $e\n$st'); - //Catch download errors - _download = null; _cancelNotifications = true; + + //Deezer error - track is unavailable + if (queue[0].state == DownloadState.DEEZER_ERROR) { + await db.rawUpdate('UPDATE downloads SET state = 4 WHERE trackId = ?', [queue[0].track.id]); + queue.removeAt(0); + _cancelNotifications = false; + _download = null; + updateQueue(); + return; + } + + //Clean + _download = null; + stopped = true; + print('Download error: $e\n$st'); + queue[0].state = DownloadState.NONE; //Shift to end queue.add(queue[0]); @@ -442,7 +455,7 @@ class DownloadManager { Future> getFinishedDownloads() async { //Fetch from db - List data = await db.rawQuery("SELECT * FROM downloads INNER JOIN tracks ON tracks.id = downloads.trackId WHERE downloads.state = 1"); + List data = await db.rawQuery("SELECT * FROM downloads INNER JOIN tracks ON tracks.id = downloads.trackId WHERE downloads.state = 1 OR downloads.state > 3"); List downloads = data.map((d) => Download.fromSQL(d, parseTrack: true)).toList(); return downloads; } @@ -545,6 +558,12 @@ class Download { try {rawTrackPublic = await deezerAPI.callPublicApi('track/${this.track.id}');} catch (e) {rawTrackPublic = {};} try {rawAlbumPublic = await deezerAPI.callPublicApi('album/${this.track.album.id}');} catch (e) {rawAlbumPublic = {};} + //Global block check + if (rawTrackPublic['available_countries'] != null && rawTrackPublic['available_countries'].length == 0) { + this.state = DownloadState.DEEZER_ERROR; + throw Exception('Download error - not on Deezer'); + } + //Get path if public RegExp sanitize = RegExp(r'[\/\\\?\%\*\:\|\"\<\>]'); //Download path @@ -608,6 +627,10 @@ class Download { //Download this.state = DownloadState.DOWNLOADING; + //Quality fallback + if (this.url == null) + await _fallback(); + //Create download file File downloadFile = File(this.path + '.ENC'); //Get start position @@ -616,26 +639,32 @@ class Download { FileStat stat = await downloadFile.stat(); start = stat.size; } else { - //Create file if doesnt exist + //Create file if doesn't exist await downloadFile.create(recursive: true); } - //Quality fallback - if (this.url == null) - await _fallback(); - //Download _cancel = CancelToken(); - Response response = await dio.get( - this.url, - options: Options( - responseType: ResponseType.stream, - headers: { - 'Range': 'bytes=$start-' - }, - ), - cancelToken: _cancel - ); + Response response; + try { + response = await dio.get( + this.url, + options: Options( + responseType: ResponseType.stream, + headers: { + 'Range': 'bytes=$start-' + }, + ), + cancelToken: _cancel + ); + } on DioError catch (e) { + //Deezer fetch error + if (e.response.statusCode == 403 || e.response.statusCode == 404) { + this.state = DownloadState.DEEZER_ERROR; + } + throw Exception('Download error - Deezer blocked.'); + } + //Size this.total = int.parse(response.headers['Content-Length'][0]) + start; this.received = start; @@ -655,7 +684,6 @@ class Download { await _outSink.close(); _cancel = null; - this.state = DownloadState.POST; //Decrypt await platformChannel.invokeMethod('decryptTrack', {'id': track.id, 'path': path}); @@ -754,21 +782,23 @@ class Download { 'trackId': track.id, 'path': path, 'url': url, - 'state': state == DownloadState.DONE ? 1:0, + 'state': state.index, 'private': private?1:0 }; factory Download.fromSQL(Map data, {parseTrack = false}) => Download( track: parseTrack?Track.fromSQL(data):Track(id: data['trackId']), path: data['path'], url: data['url'], - state: data['state'] == 1 ? DownloadState.DONE:DownloadState.NONE, + state: DownloadState.values[data['state']], private: data['private'] == 1 ); } enum DownloadState { NONE, + DONE, DOWNLOADING, POST, - DONE + DEEZER_ERROR, + ERROR } \ No newline at end of file diff --git a/lib/api/player.dart b/lib/api/player.dart index d09fd78..eac704a 100644 --- a/lib/api/player.dart +++ b/lib/api/player.dart @@ -485,7 +485,9 @@ class AudioPlayerTask extends BackgroundAudioTask { //Load queue after some initialization in frontend if (name == 'load') await this._loadQueueFile(); //Shuffle - if (name == 'shuffle') await _player.setShuffleModeEnabled(args); + if (name == 'shuffle') { + await _player.setShuffleModeEnabled(args); + } //Android auto callback if (name == 'screenAndroidAuto' && _androidAutoCallback != null) { _androidAutoCallback.complete(jsonDecode(args).map((m) => MediaItem.fromJson(m)).toList()); diff --git a/lib/languages/en_us.dart b/lib/languages/en_us.dart index b858c8c..2c43c1d 100644 --- a/lib/languages/en_us.dart +++ b/lib/languages/en_us.dart @@ -180,8 +180,8 @@ const language_en_us = { "Language changed, please restart Freezer to apply!", "Importing...": "Importing...", "Radio": "Radio", - "Flow": "Flow", - + "Track is not available on Deezer!": "Track is not available on Deezer!", + "Failed to download track! Please restart.": "Failed to download track! Please restart." } }; diff --git a/lib/languages/es_es.dart b/lib/languages/es_es.dart new file mode 100644 index 0000000..8fb8874 --- /dev/null +++ b/lib/languages/es_es.dart @@ -0,0 +1,172 @@ +/* + +Translated by: ArcherDelta & PetFix + +*/ + +const language_es_es = { + "es_es": { + "Home": "Inicio", + "Search": "Buscar", + "Library": "Biblioteca", + "Offline mode, can't play flow or smart track lists.": "Modo sin conexión, no se puede reproducir el flow o las listas de pistas inteligentes.", + "Added to library": "Agregado a la biblioteca", + "Download": "Descargar", + "Disk": "Disco", + "Offline": "Sin conexión", + "Top Tracks": "Los mejores temas", + "Show more tracks": "Mostrar más pistas", + "Top": "Top", + "Top Albums": "Mejores álbumes", + "Show all albums": "Mostrar todos los álbumes", + "Discography": "Discografía", + "Default": "Predeterminado", + "Reverse": "Invertir", + "Alphabetic": "Alfabético", + "Artist": "Artista", + "Post processing...": "Post procesamiento...", + "Done": "Hecho", + "Delete": "Eliminar", + "Are you sure you want to delete this download?": "¿Estás seguro de que quieres borrar esta descarga?", + "Cancel": "Cancelar", + "Downloads": "Descargas", + "Clear queue": "Limpiar la cola", + "This won't delete currently downloading item": "Esto no borrará el elemento que se está descargando actualmente", + "Are you sure you want to delete all queued downloads?": "¿Estás seguro de que quieres borrar todas las descargas en cola?", + "Clear downloads history": "Borrar el historial de descargas", + "WARNING: This will only clear non-offline (external downloads)": "ADVERTENCIA: Esto sólo borrará las descargas que no están en modo sin conexión (descargas externas).", + "Please check your connection and try again later...": "Por favor, compruebe su conexión y vuelva a intentarlo más tarde...", + "Show more": "Mostrar más", + "Importer": "Importador", + "Currently supporting only Spotify, with 100 tracks limit": "Actualmente sólo se soporta Spotify, con un límite de 100 pistas", + "Due to API limitations": "Debido a limitaciones de API", + "Enter your playlist link below": "Ingrese el enlace de su lista de reproducción a continuación", + "Error loading URL!": "¡Error al cargar la URL!", + "Convert": "Convertir", + "Download only": "Sólo descargar", + "Downloading is currently stopped, click here to resume.": "La descarga está actualmente detenida, haga clic aquí para reanudarla.", + "Tracks": "Pistas", + "Albums": "Álbumes", + "Artists": "Artistas", + "Playlists": "Listas de reproducción", + "Import": "Importar", + "Import playlists from Spotify": "Importar listas de reproducción de Spotify", + "Statistics": "Estadísticas", + "Offline tracks": "Pistas sin conexión", + "Offline albums": "Álbumes sin conexión", + "Offline playlists": "Listas de reproducción sin conexión", + "Offline size": "El tamaño sin conexión", + "Free space": "Espacio libre", + "Loved tracks": "Pistas favoritas", + "Favorites": "Favoritas", + "All offline tracks": "Todas las pistas fuera de línea", + "Create new playlist": "Crear nueva lista de reproducción", + "Cannot create playlists in offline mode": "No se pueden crear listas de reproducción en el modo sin conexión", + "Error": "Error", + "Error logging in! Please check your token and internet connection and try again.": "¡Error al iniciar la sesión! Por favor, compruebe su token y su conexión a Internet e inténtelo de nuevo.", + "Dismiss": "Descartar", + "Welcome to": "Bienvenido a", + "Please login using your Deezer account.": "Por favor, inicie sesión con su cuenta de Deezer.", + "Login using browser": "Ingresar usando el navegador", + "Login using token": "Ingresar usando token", + "Enter ARL": "Ingrese ARL", + "Token (ARL)": "Token (ARL)", + "Save": "Guardar", + "If you don't have account, you can register on deezer.com for free.": "Si no tienes una cuenta, puedes registrarte en deezer.com de forma gratuita.", + "Open in browser": "Abrir en el navegador", + "By using this app, you don't agree with the Deezer ToS": "Al usar esta aplicación, no está de acuerdo con las Condiciones de servicio de Deezer", + "Play next": "Reproducir siguiente", + "Add to queue": "Añadir a la cola", + "Add track to favorites": "Agregar pista a favoritos", + "Add to playlist": "Agregar a la lista de reproducción", + "Select playlist": "Seleccionar lista de reproducción", + "Track added to": "Pista agregada a", + "Remove from playlist": "Quitar de la lista de reproducción", + "Track removed from": "Pista eliminada de", + "Remove favorite": "Eliminar favorito", + "Track removed from library": "Pista eliminada de la biblioteca", + "Go to": "Ir a", + "Make offline": "Hacerlo sin conexión", + "Add to library": "Agregar a la biblioteca", + "Remove album": "Eliminar álbum", + "Album removed": "Álbum eliminado", + "Remove from favorites": "Eliminar de favoritos", + "Artist removed from library": "Artista eliminado de la biblioteca", + "Add to favorites": "Agregar a favoritos", + "Remove from library": "Eliminar de la biblioteca", + "Add playlist to library": "Agregar lista de reproducción a la biblioteca", + "Added playlist to library": "Lista de reproducción agregada a la biblioteca", + "Make playlist offline": "Hacer lista de reproducción sin conexión", + "Download playlist": "Descargar lista de reproducción", + "Create playlist": "Crear lista de reproducción", + "Title": "Título", + "Description": "Descripción", + "Private": "Privado", + "Collaborative": "Colaborativo", + "Create": "Crear", + "Playlist created!": "Lista de reproducción creada!", + "Playing from:": "Reproduciendo desde:", + "Queue": "Cola", + "Offline search": "Búsqueda sin conexión", + "Search Results": "Resultados de la búsqueda", + "No results!": "No hay resultados!", + "Show all tracks": "Mostrar todas las pistas", + "Show all playlists": "Mostrar todas las listas de reproducción", + "Settings": "Ajustes", + "General": "General", + "Appearance": "Apariencia", + "Quality": "Calidad", + "Deezer": "Deezer", + "Theme": "Tema", + "Currently": "Actualmente", + "Select theme": "Seleccione el tema", + "Light (default)": "Claro (predeterminado)", + "Dark": "Oscuro", + "Black (AMOLED)": "Negro (AMOLED)", + "Deezer (Dark)": "Deezer (oscuro)", + "Primary color": "Color primario", + "Selected color": "Color seleccionado", + "Use album art primary color": "Usar el color primario de la carátula del álbum", + "Warning: might be buggy": "Advertencia: podría tener errores", + "Mobile streaming": "Transmisión móvil", + "Wifi streaming": "Transmisión WiFi", + "External downloads": "Descargas externas", + "Content language": "Lenguaje del contenido", + "Not app language, used in headers. Now": "No es un lenguaje de la aplicación, se usa en los encabezados. Ahora", + "Select language": "Seleccione el idioma", + "Content country": "País del contenido", + "Country used in headers. Now": "País utilizado en los encabezados. Ahora", + "Log tracks": "Seguimiento de las pistas", + "Send track listen logs to Deezer, enable it for features like Flow to work properly": "Envía los registros de escucha de las pistas a Deezer, habilítalo para que funciones como Flow funcionen correctamente", + "Offline mode": "Modo sin conexión", + "Will be overwritten on start.": "Se sobrescribirá al inicio.", + "Error logging in, check your internet connections.": "Error al iniciar sesión, verifique su conexión a internet.", + "Logging in...": "Ingresando...", + "Download path": "Ruta de las descargas", + "Downloads naming": "Nombramiento de las descargas", + "Downloaded tracks filename": "Nombre de archivo de las pistas descargadas", + "Valid variables are": "Las variables válidas son", + "Reset": "Reiniciar", + "Clear": "Limpiar", + "Create folders for artist": "Crear carpetas por artista", + "Create folders for albums": "Crear carpetas por álbumes", + "Separate albums by discs": "Separar los álbumes por discos", + "Overwrite already downloaded files": "Sobrescribir los archivos ya descargados", + "Copy ARL": "Copiar ARL", + "Copy userToken/ARL Cookie for use in other apps.": "Copia el Token de usuario/Cookie ARL para su uso en otras aplicaciones.", + "Copied": "Copiado", + "Log out": "Cerrar sesión", + "Due to plugin incompatibility, login using browser is unavailable without restart.": "Debido a la incompatibilidad de los plugins, no se puede iniciar la sesión con el navegador sin reiniciar.", + "(ARL ONLY) Continue": "Continuar (SÓLO ARL)", + "Log out & Exit": "Cerrar sesión y salir", + "Pick-a-Path": "Escoja una ruta", + "Select storage": "Seleccionar el almacenamiento", + "Go up": "Subir", + "Permission denied": "Permiso denegado", + "Language": "Idioma", + "Language changed, please restart Freezer to apply!": "¡El idioma ha cambiado, por favor reinicie Freezer para aplicarlo!", + "Importing...": "Importando...", + "Radio": "Radio", + "Flow": "Flow", + } +}; \ No newline at end of file diff --git a/lib/languages/fil_ph.dart b/lib/languages/fil_ph.dart new file mode 100644 index 0000000..3235235 --- /dev/null +++ b/lib/languages/fil_ph.dart @@ -0,0 +1,190 @@ +/* + +Translated by: Chino Pacia + +*/ + +const language_fil_ph = { + "fil_ph": { + "Home": "Home", + "Search": "Maghanap", + "Library": "Library", + "Offline mode, can't play flow or smart track lists.": + "Ikaw ay naka-offline mode, hindi maaaring maka-play ng flow o smart track.", + "Added to library": "Idinagdag sa library", + "Download": "I-download", + "Disk": "Disk", + "Offline": "Offline", + "Top Tracks": "Mga Nangungunang Track", + "Show more tracks": "Ipakita ang maraming track", + "Top": "Nangunguna", + "Top Albums": "Nangungunang mga Album", + "Show all albums": "Ipakita lahat ng album", + "Discography": "Discography", + "Default": "Default", + "Reverse": "Pabalik", + "Alphabetic": "Alphabetic", + "Artist": "Artista", + "Post processing...": "Pagtatapos ng proseso...", + "Done": "Tapos na", + "Delete": "Burahin", + "Are you sure you want to delete this download?": + "Sigurado ka bang buburahin mo itong download?", + "Cancel": "I-kansel", + "Downloads": "Mga Download", + "Clear queue": "I-clear ang queue", + "This won't delete currently downloading item": + "Hindi nito buburahin ng kasalukuyang dina-download na item", + "Are you sure you want to delete all queued downloads?": + "Sigurado ka bang buburahin mo lahat ng nakapilang mga download?", + "Clear downloads history": "I-clear ang kasaysayan ng mga download", + "WARNING: This will only clear non-offline (external downloads)": + "BABALA: Buburahin lang nito ang hindi naka-offline (eksternal na download)", + "Please check your connection and try again later...": + "Pakitignan ang iyong koneksiyon at subukan ulit mamaya...", + "Show more": "Higit pa", + "Importer": "Taga-import", + "Currently supporting only Spotify, with 100 tracks limit": + "Kasalukuyang suportado lang ang Spotify, na limitado sa 100 track", + "Due to API limitations": "Dahil sa limitasyon ng API", + "Enter your playlist link below": "Ilagay dito ang iyong link ng playlist", + "Error loading URL!": "Hindi maikarga ang URL!", + "Convert": "I-convert", + "Download only": "Download lang", + "Downloading is currently stopped, click here to resume.": + "Nahinto ang iyong download, i-click dito para magpatuloy", + "Tracks": "Mga Track", + "Albums": "Mga Album", + "Artists": "Mga Artist", + "Playlists": "Mga Playlist", + "Import": "I-import", + "Import playlists from Spotify": "I_import ang mga playlist galing sa Spotify", + "Statistics": "Statistics", + "Offline tracks": "Mga offline na track", + "Offline albums": "Mga offline na album", + "Offline playlists": "Mga offline playlist", + "Offline size": "Laki ng offline", + "Free space": "Natitirang space", + "Loved tracks": "Pinusuang mga track", + "Favorites": "Mga paborito", + "All offline tracks": "Lahat ng track na offline", + "Create new playlist": "Gumawa ng bagong playlist", + "Cannot create playlists in offline mode": + "Hindi makagagawa ng playlist habang naka-offline mode", + "Error": "Error", + "Error logging in! Please check your token and internet connection and try again.": + "Hindi maka-login! Pakitignan ang iyong token at koneksiyon at subukang muli.", + "Dismiss": "I-Dismiss", + "Welcome to": "Welcome sa", + "Please login using your Deezer account.": "Paki-login ng iyong account sa Deezer", + "Login using browser": "Mag-login gamit ng browser", + "Login using token": "Mag-login gamit ng token", + "Enter ARL": "Ilagay ang ARL", + "Token (ARL)": "Token (ARL)", + "Save": "I-Save", + "If you don't have account, you can register on deezer.com for free.": + "Kung wala kang account, maaaring mag-rehistro ng libre sa deezer.com", + "Open in browser": "Buksan sa browser", + "By using this app, you don't agree with the Deezer ToS": + "Sa paggamit ng app na ito, ikaw ay hindi sumasang-ayon sa Deezer ToS", + "Play next": "I-play ang kasunod", + "Add to queue": "Idagdag sa pila", + "Add track to favorites": "Magdagdag ng track sa mga paborito", + "Add to playlist": "Idagdag sa playlist", + "Select playlist": "Piliin ang playlist", + "Track added to": "Idinagdag ang track sa", + "Remove from playlist": "Tinanggal sa playlist", + "Track removed from": "Tinanggal ang track sa", + "Remove favorite": "Tanggalin ang paborito", + "Track removed from library": "Tinanggal ang track sa library", + "Go to": "Pumunta sa", + "Make offline": "Gawing offline", + "Add to library": "Idagdag sa library", + "Remove album": "Tanggalin ang album", + "Album removed": "Tinanggal ang album", + "Remove from favorites": "Tanggalin sa mga paborito", + "Artist removed from library": "Tinanggal ang artist sa library", + "Add to favorites": "Idagdag sa mga paborito", + "Remove from library": "Tanggalin sa library", + "Add playlist to library": "Idagdag ang playlist sa library", + "Added playlist to library": "Idinagdag ang playlist sa library", + "Make playlist offline": "Gawing offline ang playlist", + "Download playlist": "I-download ang playlist", + "Create playlist": "Gumawa ng playlist", + "Title": "Pamagat", + "Description": "Deskripsiyon", + "Private": "Pribado", + "Collaborative": "Kolaboratib", + "Create": "Gawin", + "Playlist created!": "Nagawa na ang playlist!", + "Playing from:": "Nagpa-play galing sa:", + "Queue": "Pila", + "Offline search": "Offline na paghahanap", + "Search Results": "Resulta sa Paghahanap", + "No results!": "Walang maipakitang resulta!", + "Show all tracks": "Ipakita lahat ng mga track", + "Show all playlists": "Ipakita lahat ng mga playlist", + "Settings": "Mga Setting", + "General": "Pangkalahatan", + "Appearance": "Itsura", + "Quality": "Kalidad", + "Deezer": "Deezer", + "Theme": "Tema", + "Currently": "Ngayon", + "Select theme": "Piliin ang Tema", + "Light (default)": "Puti (Default)", + "Dark": "Dark", + "Black (AMOLED)": "Maitim (AMOLED)", + "Deezer (Dark)": "Deezer (Madilim)", + "Primary color": "Pangunahing kulay", + "Selected color": "Piniling kulay", + "Use album art primary color": "Gamitin ang art ng album para sa pangunahing kulay", + "Warning: might be buggy": "Babala: Maaaring magkaroon ng palagiang bug", + "Mobile streaming": "Pag-stream gamit ng mobile", + "Wifi streaming": "Pag-stream gamit ng Wifi", + "External downloads": "Eksternal na download", + "Content language": "Wika ng nilalaman", + "Not app language, used in headers. Now": + "gagamitin ang wika sa mga header, hindi sa app. Ngayon", + "Select language": "Piliin ang wika", + "Content country": "Bansa ng nilalaman", + "Country used in headers. Now": "Gagamitin ang bansa sa mga header. Ngayon", + "Log tracks": "Log ng mga track", + "Send track listen logs to Deezer, enable it for features like Flow to work properly": + "Ipadala ang mga log ng pinakinggang mga track sa Deezer, paganahin ito para sa mga feature kagaya ng Flow para mai-ayos", + "Offline mode": "Offline mode", + "Will be overwritten on start.": "Sasapawan sa simula pa lang.", + "Error logging in, check your internet connections.": + "Nagkaroon ng problema sa pag-login. Pakitignan ang iyong koneksiyon.", + "Logging in...": "Nagla-login...", + "Download path": "Paglalagyan ng download", + "Downloads naming": "Pagpangalan sa download", + "Downloaded tracks filename": "Pangalan ng file sa mga nadownload na track", + "Valid variables are": "Ang mga pwede lang ay", + "Reset": "I-Reset", + "Clear": "I-Clear", + "Create folders for artist": "Gumawa ng folder para sa mga artista", + "Create folders for albums": "Gumawa ng folder para sa mga album", + "Separate albums by discs": "Ihiwalay ang mga album base sa disk", + "Overwrite already downloaded files": "Sapawan ang mga file na nai-download", + "Copy ARL": "Kopyahin ang ARL", + "Copy userToken/ARL Cookie for use in other apps.": + "Kopyahin ang userToken/ARL Cookie para gamitin sa iba pang app.", + "Copied": "Nakopya na", + "Log out": "Mag-Log out", + "Due to plugin incompatibility, login using browser is unavailable without restart.": + "Hindi ka makakapag-login gamit ng browser kung hindi mo ito ire-restart dahil hindi pa maayos ang ginagamit na plugin sa ngayon", + "(ARL ONLY) Continue": "(ARL LANG) Ituloy", + "Log out & Exit": "Mag-Log out at Lumabas", + "Pick-a-Path": "Pumili-ng-Path", + "Select storage": "Piliin ang storage", + "Go up": "Pumunta sa itaas", + "Permission denied": "Hindi pinapayagan", + "Language": "Wika", + "Language changed, please restart Freezer to apply!": + "Pinalitan ang wika, pakibuksan muli ang Freezer para magamit!", + "Importing...": "Ini-import...", + "Radio": "Radyo", + "Flow": "Flow", + } +}; \ No newline at end of file diff --git a/lib/languages/it_it.dart b/lib/languages/it_it.dart index b21ef0b..8ecc837 100644 --- a/lib/languages/it_it.dart +++ b/lib/languages/it_it.dart @@ -10,7 +10,7 @@ const language_it_it = { "Search": "Cerca", "Library": "Libreria", "Offline mode, can't play flow or smart track lists.": - "Modalità offline, non è possibile riprodurre flow o tracklist smart", + "Modalità offline, non è possibile riprodurre flow o tracklist smart", "Added to library": "Aggiunto alla libreria", "Download": "Scarica", "Disk": "Disco", @@ -29,31 +29,31 @@ const language_it_it = { "Done": "Fatto", "Delete": "Cancellare", "Are you sure you want to delete this download?": - "Sei sicuro di voler cancellare questo download?", + "Sei sicuro di voler cancellare questo download?", "Cancel": "Annulla", "Downloads": "Download", "Clear queue": "Pulisci la coda", "This won't delete currently downloading item": - "Questa azione non cancellerà i download", + "Questa azione non cancellerà i download", "Are you sure you want to delete all queued downloads?": - "Sei sicuro di voler cancellare tutti i download in coda?", + "Sei sicuro di voler cancellare tutti i download in coda?", "Clear downloads history": "Pulisci la cronologia dei download", "WARNING: This will only clear non-offline (external downloads)": - "ATTENZIONE: Questa azione, pulirà solo i files che non sono offline (download esterni)", + "ATTENZIONE: Questa azione, pulirà solo i files che non sono offline (download esterni)", "Please check your connection and try again later...": - "Per favore controlla la tua connessione e riprova più tardi...", + "Per favore controlla la tua connessione e riprova più tardi...", "Show more": "Mostra di più", "Importer": "Importa", "Currently supporting only Spotify, with 100 tracks limit": - "Attualmente supporta solo Spotify, con un limite di 100 brani", + "Attualmente supporta solo Spotify, con un limite di 100 brani", "Due to API limitations": "A causa delle limitazioni delle API", "Enter your playlist link below": - "Inserisci il link della tua playlist qui sotto", + "Inserisci il link della tua playlist qui sotto", "Error loading URL!": "Errore nel caricare l'URL!", "Convert": "Converti", "Download only": "Solo Download", "Downloading is currently stopped, click here to resume.": - "Il download è attualmente interrotto, fare clic qui per riprenderlo.", + "Il download è attualmente interrotto, fare clic qui per riprenderlo.", "Tracks": "Brani", "Albums": "Album", "Artists": "Artisti", @@ -71,24 +71,24 @@ const language_it_it = { "All offline tracks": "Tutte i brani offline", "Create new playlist": "Crea una nuova playlist", "Cannot create playlists in offline mode": - "Impossibile creare playlist in modalità offline", + "Impossibile creare playlist in modalità offline", "Error": "Errore", "Error logging in! Please check your token and internet connection and try again.": - "Errore durante l'accesso! Controlla il token, la tua connessione ad internet e riprova.", + "Errore durante l'accesso! Controlla il token, la tua connessione ad internet e riprova.", "Dismiss": "Chiudi", "Welcome to": "Benvenuto su", "Please login using your Deezer account.": - "Per favore, esegui il login utilizzando il tuo account Deezer.", + "Per favore, esegui il login utilizzando il tuo account Deezer.", "Login using browser": "Login utilizzando il browser", "Login using token": "Login utilizzando il token", "Enter ARL": "Inserisci l'ARL", "Token (ARL)": "Token (ARL)", "Save": "Salva", "If you don't have account, you can register on deezer.com for free.": - "Se non possiedi un account, puoi registrarti sul sito deezer.com gratuitamente.", + "Se non possiedi un account, puoi registrarti sul sito deezer.com gratuitamente.", "Open in browser": "Apri nel browser", "By using this app, you don't agree with the Deezer ToS": - "Utilizzando questa applicazione, non accetti i ToS di Deezer", + "Utilizzando questa applicazione, non accetti i ToS di Deezer", "Play next": "Riproduci subito dopo", "Add to queue": "Aggiungi alla coda", "Add track to favorites": "Aggiungi il brano ai preferiti", @@ -141,24 +141,24 @@ const language_it_it = { "Primary color": "Colore Principale", "Selected color": "Colore Selezionato", "Use album art primary color": - "Usa il colore principale della copertina dell'album", + "Usa il colore principale della copertina dell'album", "Warning: might be buggy": "Attenzione: potrebbe causare problemi", "Mobile streaming": "Streaming con dati", "Wifi streaming": "Streaming con WiFi", "External downloads": "Download esterni", "Content language": "Lingua dei contenuti", "Not app language, used in headers. Now": - "Non la lingua dell'app, utilizzata negli header. Adesso", + "Non la lingua dell'app, utilizzata negli header. Adesso", "Select language": "Seleziona la lingua", "Content country": "Contenuto dal Paese", "Country used in headers. Now": "Paese contenuto negli header. Ora", "Log tracks": "Log delle tracce", "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Invia i log delle canzioni ascoltate a Deezer, abilitalo affinché features come Flow funzionino correttamente", + "Invia i log delle canzioni ascoltate a Deezer, abilitalo affinché features come Flow funzionino correttamente", "Offline mode": "Modalità Offline", "Will be overwritten on start.": "Sarà sovrascritto all'avvio.", "Error logging in, check your internet connections.": - "Errore durante l'accesso, controlla la tua connessione Internet.", + "Errore durante l'accesso, controlla la tua connessione Internet.", "Logging in...": "Accesso in corso...", "Download path": "Percorso di download", "Downloads naming": "Denominazione dei download", @@ -172,11 +172,11 @@ const language_it_it = { "Overwrite already downloaded files": "Sovrascrivi i file già scaricati", "Copy ARL": "Copia ARL", "Copy userToken/ARL Cookie for use in other apps.": - "Copia userToken / ARL Cookie da utilizzare in altre app.", + "Copia userToken / ARL Cookie da utilizzare in altre app.", "Copied": "Copiato", "Log out": "Disconnettiti", "Due to plugin incompatibility, login using browser is unavailable without restart.": - "A causa dell'incompatibilità del plug-in, l'accesso tramite browser non è disponibile senza riavvio.", + "A causa dell'incompatibilità del plug-in, l'accesso tramite browser non è disponibile senza riavvio.", "(ARL ONLY) Continue": "(SOLO ARL) Continua", "Log out & Exit": "Disconnettiti e Esci", "Pick-a-Path": "Scegli un percorso", @@ -185,7 +185,7 @@ const language_it_it = { "Permission denied": "Permesso negato", "Language": "Lingua", "Language changed, please restart Freezer to apply!": - "Lingua cambiata, riavvia Freezer per applicare la modifica!", + "Lingua cambiata, riavvia Freezer per applicare la modifica!", "Importing...": "Importando...", "Radio": "Radio" } diff --git a/lib/languages/ru_ru.dart b/lib/languages/ru_ru.dart index 963d91d..28227a2 100644 --- a/lib/languages/ru_ru.dart +++ b/lib/languages/ru_ru.dart @@ -9,11 +9,12 @@ const language_ru_ru = { "Home": "Главная", "Search": "Поиск", "Library": "Библиотека", - "Offline mode, can't play flow or smart track lists.": "Офлайн режим, нельзя воспроизводить потоки или умные списки треков.", + "Offline mode, can't play flow or smart track lists.": + "Автономный режим, нельзя воспроизводить потоки или умные списки треков.", "Added to library": "Добавить в библиотеку", "Download": "Скачать", - "Disk": "Диск", - "Offline": "Скачанные треки", + "Disk": "Disk", + "Offline": "Офлайн", "Top Tracks": "Лучшие треки", "Show more tracks": "Показать больше треков", "Top": "Top", @@ -23,37 +24,40 @@ const language_ru_ru = { "Default": "По умолчанию", "Reverse": "Обратный", "Alphabetic": "По алфавиту", - "Artist": "Исполнитель", + "Artist": "Артист", "Post processing...": "Постобработка...", "Done": "Готово", "Delete": "Удалить", "Are you sure you want to delete this download?": - "Вы действительно хотите удалить эту загрузку?", + "Вы действительно хотите удалить эту загрузку??", "Cancel": "Отмена", "Downloads": "Загрузки", "Clear queue": "Очистить очередь", - "This won't delete currently downloading item": "Это не удалит загружаемый в данный момент элемент", + "This won't delete currently downloading item": + "Это не удалит загружаемый в данный момент элемент", "Are you sure you want to delete all queued downloads?": - "Вы действительно хотите удалить все загрузки в очереди?", + "Вы действительно хотите удалить все загрузки в очереди?", "Clear downloads history": "Очистить историю загрузок", "WARNING: This will only clear non-offline (external downloads)": - "ВНИМАНИЕ: Это очистит только не офлайн(external downloads)", + "ВНИМАНИЕ: Это очистит только не офлайн(external downloads)", "Please check your connection and try again later...": - "Пожалуйста, проверьте ваше соединение и повторите попытку позже...", + "Пожалуйста, проверьте ваше соединение и повторите попытку позже...", "Show more": "Показать больше", "Importer": "Импортер", - "Currently supporting only Spotify, with 100 tracks limit": "В настоящее время поддерживается только Spotify, с ограничением 100 треков", + "Currently supporting only Spotify, with 100 tracks limit": + "В настоящее время поддерживается только Spotify с ограничением 100 треков", "Due to API limitations": "Из-за ограничений API", "Enter your playlist link below": "Введите ссылку на свой плейлист ниже", "Error loading URL!": "Ошибка загрузки URL!", "Convert": "Перерабатывать", - "Download only": "Только скачанные", - "Downloading is currently stopped, click here to resume.": "В настоящее время загрузка остановлена, нажмите здесь, чтобы возобновить.", + "Download only": "Только скачиные", + "Downloading is currently stopped, click here to resume.": + "В настоящее время загрузка остановлена, нажмите здесь, чтобы возобновить.", "Tracks": "Треки", "Albums": "Альбомы", "Artists": "Артисты", "Playlists": "Плейлисты", - "Import": "Импорт", + "Import": "Import", "Import playlists from Spotify": "Импортировать плейлисты из Spotify", "Statistics": "Статистика", "Offline tracks": "Автономные треки", @@ -63,26 +67,27 @@ const language_ru_ru = { "Free space": "Свободное место", "Loved tracks": "Любимые треки", "Favorites": "Избранное", - "All offline tracks": "Скачанные треки", + "All offline tracks": "Все оффлайн треки", "Create new playlist": "Создать новый плейлист", - "Cannot create playlists in offline mode": "Невозможно создавать плейлисты в автономном режиме", + "Cannot create playlists in offline mode": + "Невозможно создавать плейлисты в автономном режиме", "Error": "Ошибка", "Error logging in! Please check your token and internet connection and try again.": - "Ошибка входа! Проверьте свой токен и подключение к Интернету и повторите попытку.", + "Ошибка входа! Проверьте свой токен и подключение к Интернету и повторите попытку.", "Dismiss": "Отклонить", "Welcome to": "Добро пожаловать в", "Please login using your Deezer account.": - "Пожалуйста, войдите, используя свою учетную запись Deezer.", + "Пожалуйста, войдите, используя свою учетную запись Deezer.", "Login using browser": "Войти через браузер", "Login using token": "Войти с помощью токена", "Enter ARL": "Введите ARL", "Token (ARL)": "Токен (ARL)", "Save": "Сохранить", "If you don't have account, you can register on deezer.com for free.": - "Если у вас нет учетной записи, вы можете бесплатно зарегистрироваться на deezer.com.", + "Если у вас нет учетной записи, вы можете бесплатно зарегистрироваться на deezer.com.", "Open in browser": "Открыть в браузере", "By using this app, you don't agree with the Deezer ToS": - "Используя это приложение, вы не соглашаетесь с Условиями использования Deezer.", + "Используя это приложение, вы не соглашаетесь с Условиями использования Deezer.", "Play next": "Следующая песня", "Add to queue": "Добавить в очередь", "Add track to favorites": "Добавить в избранное", @@ -122,38 +127,39 @@ const language_ru_ru = { "Show all playlists": "Показать все плейлисты", "Settings": "Настройки", "General": "Общее", - "Appearance": "Интерфейс", - "Quality": "Качество звука", + "Appearance": "Внешность", + "Quality": "Качественный", "Deezer": "Deezer", "Theme": "Тема", - "Currently": "Выбрана тема", + "Currently": "В настоящее время", "Select theme": "Выберите тему", "Light (default)": "Светлая (По умолчанию)", - "Dark": "Dark (Темная тема)", + "Dark": "Темная", "Black (AMOLED)": "Черная (AMOLED)", "Deezer (Dark)": "Deezer (Dark)", "Primary color": "Основной цвет", "Selected color": "Выбранный цвет", - "Use album art primary color": "Использовать цвет обложки", + "Use album art primary color": "Использовать основной цвет обложки альбома", "Warning: might be buggy": "Предупреждение: может быть ошибка", - "Mobile streaming": "Мобильная сеть", - "Wifi streaming": "Wifi сеть", + "Mobile streaming": "Мобильная трансляция", + "Wifi streaming": "Wifi трансляция", "External downloads": "Внешние загрузки", "Content language": "Язык содержания", - "Not app language, used in headers. Now": "Используемый в заголовках. Сейчас", + "Not app language, used in headers. Now": + "Не язык приложения, используемый в заголовках. Сейчас", "Select language": "Выберите язык", "Content country": "Страна содержания", "Country used in headers. Now": "Страна, используемая в заголовках. Сейчас", "Log tracks": "Журнал треков", "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Отправьте журналы прослушивания треков в Deezer, включите его, чтобы такие функции, как Flow, работали правильно", - "Offline mode": "Офлайн режим", + "Отправьте журналы прослушивания треков в Deezer, включите его, чтобы такие функции, как Flow, работали правильно", + "Offline mode": "Автономный режим", "Will be overwritten on start.": "Будет перезаписан при запуске.", "Error logging in, check your internet connections.": - "Ошибка при входе, проверьте свои интернет-соединения.", + "Ошибка при входе, проверьте свои интернет-соединения.", "Logging in...": "Происходит вход в систему...", - "Download path": "Путь сохранения файлов", - "Downloads naming": "Название при скачивании", + "Download path": "Скачать путь", + "Downloads naming": "Именование загрузок", "Downloaded tracks filename": "Имя файла загруженных треков", "Valid variables are": "Допустимые переменные:", "Reset": "Сброс", @@ -164,19 +170,20 @@ const language_ru_ru = { "Overwrite already downloaded files": "Перезаписать уже загруженные файлы", "Copy ARL": "Копировать ARL", "Copy userToken/ARL Cookie for use in other apps.": - "Копировать userToken/ARL Cookie для использования в других приложениях.", + "Копировать userToken/ARL Cookie для использования в других приложениях.", "Copied": "Скопировано", "Log out": "Выйти", "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Из-за несовместимости плагинов вход через браузер без перезапуска невозможен.", + "Из-за несовместимости плагинов вход через браузер без перезапуска невозможен.", "(ARL ONLY) Continue": "(ARL ONLY) Продолжать", "Log out & Exit": "Выйти и закрыть", "Pick-a-Path": "Выбери путь", "Select storage": "Выберите хранилище", "Go up": "Подниматься", "Permission denied": "Доступ запрещен", - "Language": "Язык приложения", - "Language changed, please restart Freezer to apply!": "Язык изменен, перезапустите Freezer, чтобы применить!", + "Language": "Язык", + "Language changed, please restart Freezer to apply!": + "Язык изменен, перезапустите Freezer, чтобы применить!", "Importing...": "Импорт...", "Radio": "Радио" } diff --git a/lib/translations.i18n.dart b/lib/translations.i18n.dart index 2c23faa..476d331 100644 --- a/lib/translations.i18n.dart +++ b/lib/translations.i18n.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:freezer/languages/ar_ar.dart'; import 'package:freezer/languages/de_de.dart'; import 'package:freezer/languages/en_us.dart'; +import 'package:freezer/languages/es_es.dart'; +import 'package:freezer/languages/fil_ph.dart'; import 'package:freezer/languages/it_it.dart'; import 'package:freezer/languages/pt_br.dart'; import 'package:freezer/languages/ru_ru.dart'; @@ -13,12 +15,14 @@ const supportedLocales = [ const Locale('pt', 'BR'), const Locale('it', 'IT'), const Locale('de', 'DE'), - const Locale('ru', 'RU') + const Locale('ru', 'RU'), + const Locale('es', 'ES'), + const Locale('fil', 'PH') ]; extension Localization on String { static var _t = Translations.byLocale("en_US") + - language_en_us + language_ar_ar + language_pt_br + language_it_it + language_de_de + language_ru_ru; + language_en_us + language_ar_ar + language_pt_br + language_it_it + language_de_de + language_ru_ru + language_fil_ph + language_es_es; String get i18n => localize(this, _t); } diff --git a/lib/ui/details_screens.dart b/lib/ui/details_screens.dart index dce3930..43913bc 100644 --- a/lib/ui/details_screens.dart +++ b/lib/ui/details_screens.dart @@ -80,6 +80,16 @@ class AlbumDetails extends StatelessWidget { color: Theme.of(context).primaryColor ), ), + Container(height: 4.0), + if (album.releaseDate != null && album.releaseDate.length >= 4) + Text( + album.releaseDate, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12.0, + color: Theme.of(context).disabledColor + ), + ), Container(height: 8.0,), ], ), diff --git a/lib/ui/downloads_screen.dart b/lib/ui/downloads_screen.dart index ec7b677..b4e81e2 100644 --- a/lib/ui/downloads_screen.dart +++ b/lib/ui/downloads_screen.dart @@ -21,6 +21,10 @@ class DownloadTile extends StatelessWidget { return 'Post processing...'.i18n; case DownloadState.DONE: return 'Done'.i18n; //Shouldn't be visible + case DownloadState.DEEZER_ERROR: + return 'Track is not available on Deezer!'.i18n; + case DownloadState.ERROR: + return 'Failed to download track! Please restart.'.i18n; } return ''; } @@ -28,7 +32,6 @@ class DownloadTile extends StatelessWidget { Widget get progressBar { switch (download.state) { case DownloadState.DOWNLOADING: - print(download.track.id); return LinearProgressIndicator(value: download.received / download.total); case DownloadState.POST: return LinearProgressIndicator(); diff --git a/lib/ui/player_screen.dart b/lib/ui/player_screen.dart index 1c13885..58a8d23 100644 --- a/lib/ui/player_screen.dart +++ b/lib/ui/player_screen.dart @@ -42,7 +42,6 @@ class _PlayerScreenState extends State { playerHelper.startService(); return Center(child: CircularProgressIndicator(),); } - return OrientationBuilder( builder: (context, orientation) { //Landscape diff --git a/lib/ui/search.dart b/lib/ui/search.dart index 793382c..14dc785 100644 --- a/lib/ui/search.dart +++ b/lib/ui/search.dart @@ -83,6 +83,10 @@ class _SearchScreenState extends State { IconButton( icon: Icon(Icons.clear), onPressed: () { + setState(() { + _suggestions = []; + _query = ''; + }); _controller.clear(); }, ), diff --git a/lib/ui/settings_screen.dart b/lib/ui/settings_screen.dart index e7cab60..c27003e 100644 --- a/lib/ui/settings_screen.dart +++ b/lib/ui/settings_screen.dart @@ -43,6 +43,21 @@ class _SettingsScreenState extends State { super.initState(); } + List> _languages() { + defaultLanguagesList.add({ + 'name': 'Filipino', + 'isoCode': 'fil' + }); + List> _l = supportedLocales.map>((l) { + Map _lang = defaultLanguagesList.firstWhere((lang) => lang['isoCode'] == l.languageCode); + return { + 'name': _lang['name'] + ' (${l.toString()})', + 'isoCode': _lang['isoCode'] + }; + }).toList(); + return _l; + } + @override Widget build(BuildContext context) { return Scaffold( @@ -90,11 +105,7 @@ class _SettingsScreenState extends State { titlePadding: EdgeInsets.all(8.0), title: Text('Select language'.i18n), isSearchable: false, - languagesList: supportedLocales.map>((l) { - Map _lang = defaultLanguagesList.firstWhere((lang) => lang['isoCode'] == l.languageCode); - _lang['name'] = _lang['name'] + ' (${l.toString()})'; - return _lang; - }).toList(), + languagesList: _languages(), onValuePicked: (Language l) async { setState(() { Locale locale = supportedLocales.firstWhere((_l) => _l.languageCode == l.isoCode); @@ -407,6 +418,9 @@ class _DeezerSettingsState extends State { titlePadding: EdgeInsets.all(8.0), isSearchable: true, title: Text('Select language'.i18n), + languagesList: defaultLanguagesList.map>((l) => { + 'isoCode': l['isoCode'], 'name': l['name'] + ' (${l["isoCode"]})' + }).toList(), onValuePicked: (Language language) { setState(() => settings.deezerLanguage = language.isoCode); settings.save(); diff --git a/pubspec.lock b/pubspec.lock index 293654a..77428ff 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -489,7 +489,7 @@ packages: path: just_audio relative: true source: path - version: "0.3.1" + version: "0.4.4" language_pickers: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0d88cfe..18d292d 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.4.0+1 +version: 0.4.1+1 environment: sdk: ">=2.8.0 <3.0.0"