diff --git a/.gitignore b/.gitignore index 775807d..0eca76c 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ android/app/.cxx /build/ coverage/ pubspec.lock +devtools_options.yaml # Web related lib/generated_plugin_registrant.dart diff --git a/.gitmodules b/.gitmodules index 21ad669..9404432 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,18 +1,20 @@ [submodule "custom_navigator"] path = custom_navigator url = https://github.com/DJDoubleD/custom_navigator.git + branch = master [submodule "equalizer_flutter"] path = equalizer_flutter url = https://github.com/DJDoubleD/equalizer_flutter.git + branch = main [submodule "external_path"] path = external_path url = https://github.com/DJDoubleD/external_path.git -[submodule "marquee"] - path = marquee - url = https://github.com/DJDoubleD/marquee.git + branch = main [submodule "move_to_background"] path = move_to_background url = https://github.com/DJDoubleD/move_to_background.git + branch = master [submodule "scrobblenaut"] path = scrobblenaut url = https://github.com/DJDoubleD/Scrobblenaut.git + branch = main diff --git a/README.md b/README.md index 9cc604d..6272b50 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ [![Release date](https://img.shields.io/github/release-date/DJDoubleD/ReFreezer)](../../releases/latest) [![Downloads Latest](https://img.shields.io/github/downloads/DJDoubleD/ReFreezer/latest/total?color=blue&label=downloads%20latest)](../../releases) [![Downloads Total](https://img.shields.io/github/downloads/DJDoubleD/ReFreezer/total?color=blue&label=downloads%20total)](../../releases) -[![Flutter Version](https://shields.io/badge/Flutter-v3.27.3-darkgreen.svg)](https://docs.flutter.dev/tools/sdk) -[![Dart Version](https://shields.io/badge/Dart-v3.6.1-darkgreen.svg)](https://dart.dev/get-dart) +[![Flutter Version](https://shields.io/badge/Flutter-v3.32.2-darkgreen.svg)](https://docs.flutter.dev/tools/sdk) +[![Dart Version](https://shields.io/badge/Dart-v3.8.1-darkgreen.svg)](https://dart.dev/get-dart) [![Crowdin](https://badges.crowdin.net/refreezer/localized.svg)](https://crowdin.com/project/refreezer) [![License](https://img.shields.io/github/license/DJDoubleD/ReFreezer?flat)](./LICENSE) diff --git a/android/app/build.gradle b/android/app/build.gradle index 0bd8618..c1b72b4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -30,9 +30,9 @@ if (flutterVersionName == null) { android { namespace 'r.r.refreezer' - compileSdk 34 + compileSdk 35 //ndkVersion flutter.ndkVersion - ndkVersion "26.1.10909125" + ndkVersion "27.0.12077973" buildFeatures.buildConfig = true compileOptions { @@ -52,7 +52,7 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. applicationId "r.r.refreezer" minSdk 21 - targetSdk 34 + targetSdk 35 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -90,12 +90,12 @@ android { dependencies { implementation files('libs/extension-flac.aar') // Required for older Android versions (< android 10?) - implementation("androidx.activity:activity-ktx:1.9.0") + implementation("androidx.activity:activity-ktx:1.10.1") //implementation group: 'net.jthink', name: 'jaudiotagger', version: '3.0.1' // requires java 8 so no android 6 implementation group: 'net.jthink', name: 'jaudiotagger', version: '2.2.5' implementation group: 'org.nanohttpd', name: 'nanohttpd', version: '2.3.1' - implementation 'androidx.documentfile:documentfile:1.0.1' - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' + implementation 'androidx.documentfile:documentfile:1.1.0' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' } flutter { diff --git a/android/build.gradle b/android/build.gradle index 29117d1..e5e7806 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,28 +6,30 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.layout.buildDirectory = rootProject.layout.projectDirectory.dir('../build') subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" + project.layout.buildDirectory = rootProject.layout.buildDirectory.dir(project.name) // This will make sure all the sub projects have an android namespace, // if not it will read it from AndroidManifest.xml - // Also sets the compileSdk to 34 and the target javaVersion to 17 + // Also sets the compileSdk to 35 and the target javaVersion to 17 // (needs to be changed manually to the latest in the future) afterEvaluate { // check if android block is available if (it.hasProperty('android')) { if (it.android.namespace == null) { - def manifest = groovy.util.XmlSlurper.parse(file(it.android.sourceSets.main.manifest.srcFile)) + def manifest = groovy.xml.XmlSlurper.parse(file(it.android.sourceSets.main.manifest.srcFile)) def packageName = manifest.@package.text() println("Setting ${packageName} as android namespace") - android.namespace = packageName + it.android { + namespace = packageName + } } def javaVersion = JavaVersion.VERSION_17 android { - def androidApiVersion = 34 + def androidApiVersion = 35 compileSdk androidApiVersion defaultConfig { targetSdk androidApiVersion @@ -52,5 +54,5 @@ subprojects { } tasks.register("clean", Delete) { - delete rootProject.buildDir + delete rootProject.layout.buildDirectory } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c85cfe..b836b84 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-8.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip diff --git a/android/settings.gradle b/android/settings.gradle index 675337f..29af545 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,8 +19,8 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.5.1' apply false - id "org.jetbrains.kotlin.android" version "1.9.24" apply false + id "com.android.application" version '8.10.0' apply false + id "org.jetbrains.kotlin.android" version "2.1.20" apply false } include ":app" \ No newline at end of file diff --git a/custom_navigator b/custom_navigator index bef1bad..37f9fc5 160000 --- a/custom_navigator +++ b/custom_navigator @@ -1 +1 @@ -Subproject commit bef1badfa66f5d1aa265555ef675e65e453bfd5d +Subproject commit 37f9fc56873481680d879c34e5febf0389a56e02 diff --git a/equalizer_flutter b/equalizer_flutter index 2fd74d8..dc9b3e2 160000 --- a/equalizer_flutter +++ b/equalizer_flutter @@ -1 +1 @@ -Subproject commit 2fd74d8a6a95d0e6a07a07210f051c4ead283597 +Subproject commit dc9b3e242569f26300332ff1c84e3affa2c5e23e diff --git a/lib/languages/crowdin.dart b/lib/languages/crowdin.dart index 890ffe9..4f869c5 100644 --- a/lib/languages/crowdin.dart +++ b/lib/languages/crowdin.dart @@ -1,5 +1,5 @@ const crowdin = { - 'ar_ar': { + 'ar-AR': { 'Home': 'القائمة الرئيسية', 'Search': 'بحث', 'Library': 'المكتبة', @@ -400,7 +400,7 @@ const crowdin = { 'ساعد في ترجمة هذا التطبيق على Crowdin!', 'Allow screen to turn off': 'السماح للشاشة بإيقاف التشغيل' }, - 'ast_es': { + 'ast-ES': { 'Home': 'Aniciu', 'Search': 'Buscar', 'Library': 'Biblioteca', @@ -736,7 +736,7 @@ const crowdin = { 'Playlist removed from offline!': '¡La llista quitóse del mou ensin conexón!' }, - 'bul_bg': { + 'bg-BG': { 'Home': 'Начало', 'Search': 'Търсене', 'Library': 'Библиотека', @@ -1146,7 +1146,7 @@ const crowdin = { 'Помогнете за превода на това приложение в Crowdin!', 'Allow screen to turn off': 'Позволете на екрана да се изключи' }, - 'cs_cz': { + 'cs-CZ': { 'Home': 'Domů', 'Search': 'Hledat', 'Library': 'Knihovna', @@ -1370,6 +1370,7 @@ const crowdin = { 'Track count': 'Počet skladeb', "If you want to use custom directory naming - use '/' as directory separator.": "Pokud chcete použít vlastní pojmenování adresářů - použijte '/' jako oddělovač adresářů.", + 'Share': 'Sdílet', 'Save album cover': 'Uložit obal alba', 'Warning': 'Varování', 'Using too many concurrent downloads on older/weaker devices might cause crashes!': @@ -1549,7 +1550,7 @@ const crowdin = { '\nPomozte s překladem této aplikace na Crowdin!', 'Allow screen to turn off': 'Povolit vypnutí obrazovky' }, - 'de_de': { + 'de-DE': { 'Home': 'Startseite', 'Search': 'Suche', 'Library': 'Bibliothek', @@ -1954,7 +1955,7 @@ const crowdin = { 'Helfen Sie mit, diese App auf Crowdin zu übersetzen!', 'Allow screen to turn off': 'Bildschirm ausschalten erlauben' }, - 'el_gr': { + 'el-GR': { 'Home': 'Αρχική', 'Search': 'Αναζήτηση', 'Library': 'Βιβλιοθήκη', @@ -2368,7 +2369,7 @@ const crowdin = { 'Βοηθήστε στη μετάφραση αυτής της εφαρμογής στο Crowdin!', 'Allow screen to turn off': 'Αφήστε την οθόνη να απενεργοποιηθεί' }, - 'es_es': { + 'es-ES': { 'Home': 'Inicio', 'Search': 'Buscar', 'Library': 'Biblioteca', @@ -2765,7 +2766,7 @@ const crowdin = { '¡Ayuda a traducir esta aplicación en Crowdin!', 'Allow screen to turn off': 'Permitir que la pantalla se apague' }, - 'fa_ir': { + 'fa-IR': { 'Home': 'صفحه اصلی', 'Search': 'گشتن', 'Library': 'مجموعه', @@ -3166,7 +3167,7 @@ const crowdin = { 'Help translating this app on Crowdin!': 'به ترجمه این برنامه کمک کنید!', 'Allow screen to turn off': 'مجوز خاموش شدن صفحه نمایش' }, - 'fil_ph': { + 'fil-PH': { 'Home': 'Tahanan', 'Search': 'Hanapin', 'Library': 'Aklatan', @@ -3474,7 +3475,7 @@ const crowdin = { '\"Hindi pinayagan ang permission, kinansel ang download!\"!', 'Crowdin': 'Crowdin' }, - 'fr_fr': { + 'fr-FR': { 'Home': 'Accueil', 'Search': 'Recherche', 'Library': 'Bibliothèque', @@ -3889,7 +3890,7 @@ const crowdin = { 'Aidez-nous à traduire cette application sur Crowdin !', 'Allow screen to turn off': "Permettre à l'écran de s'éteindre" }, - 'he_il': { + 'he-IL': { 'Home': 'מסך הבית', 'Search': 'חיפוש', 'Library': 'הספרייה', @@ -4262,7 +4263,7 @@ const crowdin = { 'Duration': 'משך זמן', 'Sort': 'מיון' }, - 'hi_in': { + 'hi-IN': { 'Home': 'होम', 'Search': 'खोज', 'Library': 'लाइब्रेरी', @@ -4386,6 +4387,7 @@ const crowdin = { 'General': 'सामान्य', 'Appearance': 'दिखावट', 'Quality': 'गुणवत्ता', + 'Deezer': 'डीज़र', 'Theme': 'थीम', 'Currently': 'वर्तमान में', 'Select theme': 'थीम चुने', @@ -4621,9 +4623,50 @@ const crowdin = { 'Track removed from offline!': 'ट्रैक को ऑफ़लाइन से हटा दिया गया!', 'Removed album from offline!': 'एल्बम को ऑफ़लाइन से निकाला गया!', 'Playlist removed from offline!': 'प्लेलिस्ट को ऑफ़लाइन से हटा दिया गया!', - 'Repeat': 'दोहराएँ' + 'Repeat': 'दोहराएँ', + 'Repeat one': 'एक गाने को दोहराएं', + 'Repeat off': 'दोहराना बंद', + 'Love': 'प्यार', + 'Unlove': 'नापसंद', + 'Dislike': 'नापसंद करें', + 'Close': 'बंद करें', + 'Sort playlist': 'प्लेलिस्ट जमाएं', + 'Sort ascending': 'बढ़ते क्रम में जमाएं', + 'Sort descending': 'घटते क्रम में जमाएं', + 'Stop': 'रोकें', + 'Start': 'शुरू करें', + 'Clear all': 'सभी साफ़ करें', + 'Play previous': 'पिछला चलाएं', + 'Play': 'गाना चलाएं', + 'Pause': 'स्थगित करें', + 'Remove': 'हटाएं', + 'Seekbar': 'प्रगति पट्टी', + 'Singles': 'इकलौते गीत', + 'Featured': 'लक्षित', + 'Fans': 'प्रशंसक', + 'Duration': 'अवधि', + 'Sort': 'व्यवस्थित करें', + 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': + 'आपका ए र ल पुराना हो गया हैं। एक नए ए र ल या ब्राउज़र से दोबारा लॉगिन करके देखिए।', + 'The original freezer development team': 'फ्रीज़र के मूल निर्माता', + 'Donate': 'दान करें', + 'You should rather support your favorite artists, instead of this app!': + 'इस ऐप से अच्छा तो, आपको अपने पसंदीदा कलाकारों का समर्थन करना चाहिए!', + 'No really, go support your favorite artists instead ;)': + 'नहीं सच में, जाकर अपने पसंदीदा कलाकारों का समर्थन कीजिए ;)', + 'Storage permission is required to download content.\nPlease open settings and grant storage permission to ReFreezer.': + 'डाउनलोड करने के लिए स्टोरेज की अनुमति चाहिए। कृप्या सेटिंग्स में जाकर रिफ़्रीज़र को अनुमति प्रदान करें।', + 'Open system settings': 'सिस्टम सेटिंग्स खोलें', + 'Application Log': 'आदवेदन संस्करण', + 'Are you sure you want to log out?': 'क्या आप वाकई लॉग आउट करना चाहते हैं?', + 'Download failed!': 'डाउनलोड असफल!', + 'Permission denied, download canceled!': 'अनुमति नहीं मिली, डाउनलोड रद्द!', + 'Crowdin': 'क्राउडिन', + 'Help translating this app on Crowdin!': + 'क्राउडिन पर इस ऐप के अनुवाद में समर्थन करें!', + 'Allow screen to turn off': 'स्क्रीन को बंद होने की अनुमति दें' }, - 'hr_hr': { + 'hr-HR': { 'Home': 'Početna', 'Search': 'Pretraži', 'Library': 'Biblioteka', @@ -5032,7 +5075,7 @@ const crowdin = { 'Pomozite prevesti ovu aplikaciju na Crowdin!', 'Allow screen to turn off': 'Dopusti da se zaslon isključi' }, - 'hu_hu': { + 'hu-HU': { 'Home': 'Kezdőlap', 'Search': 'Keresés', 'Library': 'Kedvencek', @@ -5384,7 +5427,7 @@ const crowdin = { 'Playlist removed from offline!': 'Lejátszási lista eltávolítva a kapcsolat nélküli üzemmódból!' }, - 'id_id': { + 'id-ID': { 'Home': 'Beranda', 'Search': 'Cari', 'Library': 'Koleksi', @@ -5392,6 +5435,8 @@ const crowdin = { 'Mode offline, tidak dapat memutar aliran atau daftar putar pintar.', 'Added to library': 'Ditambahkan ke koleksi', 'Download': 'Unduh', + 'Disk': 'Disk', + 'Offline': 'Offline', 'Top Tracks': 'Lagu Populer', 'Show more tracks': 'Tampilkan lebih banyak lagu', 'Top': 'Populer ', @@ -5459,6 +5504,7 @@ const crowdin = { 'Login using browser': 'Masuk menggunakan browser', 'Login using token': 'Masuk menggunakan token', 'Enter ARL': 'Masukkan ARL', + 'Token (ARL)': 'Token (ARL)', 'Save': 'Simpan', "If you don't have account, you can register on deezer.com for free.": 'Jika Anda tidak memiliki akun, Anda dapat mendaftar di deezer.com secara gratis.', @@ -5506,6 +5552,7 @@ const crowdin = { 'General': 'Umum', 'Appearance': 'Tampilan', 'Quality': 'Kualitas', + 'Deezer': 'Deezer', 'Theme': 'Tema', 'Currently': 'Saat ini', 'Select theme': 'Pilih tema', @@ -5561,6 +5608,7 @@ const crowdin = { 'Language changed, please restart ReFreezer to apply!': 'Bahasa diganti, Mulai ulang aplikasi untuk menerapkannya!', 'Importing...': 'Mengimpor...', + 'Radio': 'Radio', 'Flow': 'Alur', 'Track is not available on Deezer!': 'Lagu tidak tersedia di Deezer!', 'Failed to download track! Please restart.': @@ -5625,6 +5673,7 @@ const crowdin = { 'Ask before downloading': 'Tanyakan sebelum mengunduh', 'Search history': 'Riwayat pencarian', 'Clear search history': 'Bersihkan riwayat pencarian', + 'LastFM': 'LastFM', 'Login to enable scrobbling.': 'Masuk untuk mengaktifkan scrobbling.', 'Login to LastFM': 'Masuk ke LastFM', 'Username': 'Nama Pengguna', @@ -5650,6 +5699,7 @@ const crowdin = { 'Play mix': 'Putar acak', 'Share show': 'Bagikan acara', 'Date added': 'Tanggal ditambahkan', + 'Discord': 'Discord', 'Official Discord server': 'Server Resmi Discord', 'Restart of app is required to properly log out!': 'Perlu memulai ulang aplikasi untuk keluar secara benar!', @@ -5670,6 +5720,7 @@ const crowdin = { 'Blur player background': 'Latar belakang pemutar buram', 'Might have impact on performance': 'Mungkin berdampak pada performa perangkat anda', + 'Font': 'Huruf', 'Select font': 'Pilih font', "This app isn't made for supporting many fonts, it can break layouts and overflow. Use at your own risk!": 'Aplikasi ini tidak dibuat untuk mendukung banyak font, ini dapat merusak tata letak dan tampilan. Gunakan dengan resiko anda sendiri!', @@ -5679,12 +5730,19 @@ const crowdin = { 'Visualizer': 'Visualisasi', 'Show visualizers on lyrics page. WARNING: Requires microphone permission!': 'Tampilkan visualisasi di halaman lirik. PERINGATAN: Dibutuhkan ijin microphone!', + 'Tags': 'Tags', + 'Album': 'Album', 'Track number': 'Nomor lagu', 'Disc number': 'Nomor disk', 'Album artist': 'Album Artis', 'Date/Year': 'Tanggal/Tahun', + 'Label': 'Label', + 'ISRC': 'ISRC', + 'UPC': 'UPC', 'Track total': 'Total lagu', + 'BPM': 'BPM', 'Unsynchronized lyrics': 'Lirik yang tidak tersinkronisasi', + 'Genre': 'Aliran', 'Contributors': 'Kontributor', 'Album art': 'Gambar album', 'Deezer is unavailable in your country, ReFreezer might not work properly. Please use a VPN': @@ -5692,6 +5750,7 @@ const crowdin = { 'Deezer is unavailable': 'Deezer tidak tersedia', 'Continue': 'Lanjutkan', 'Email Login': 'Email Masuk', + 'Email': 'Email', 'Missing email or password!': 'Email atau kata sandi salah!', 'Error logging in using email, please check your credentials.\nError:': 'Kesalahan saat masuk menggunakan email. Silahkan cek datanya lagi.\nKesalahan:', @@ -5699,12 +5758,15 @@ const crowdin = { 'Change display mode': 'Ganti mode tampilan', 'Enable high refresh rates': 'Aktifkan refresh rate tinggi', 'Display mode': 'Mode tampilan', + 'Spotify v1': 'Spotify v1', 'Import Spotify playlists up to 100 tracks without any login.': 'Impor daftar putar Spotify sampai 100 lagu tanpa masuk.', 'Download imported tracks': 'Mengunduh lagu yang diimpor', 'Start import': 'Mulai impor', + 'Spotify v2': 'Spotify v2', 'Import any Spotify playlist, import from own Spotify library. Requires free account.': 'Impor semua daftat putar Spotify, Impor dari koleksi Spotifymu. Dibutuhkan akun gratis.', + 'Spotify Importer v2': 'Pengimpor Spotify v2', 'This importer requires Spotify Client ID and Client Secret. To obtain them:': 'Importer membutuhkan Spotify Client ID dan Client Secret. \nUntuk mendapatkannya:', '1. Go to: developer.spotify.com/dashboard and create an app.': @@ -5713,14 +5775,35 @@ const crowdin = { '2. In the app you just created go to settings, and set the Redirect URL to: ': '2. Di app yang baru kamu buat pergi ke pengaturan, dan atur Redirect URL ke: ', 'Copy the Redirect URL': 'Salin Redirect URL', + 'Client ID': 'ID Klien', + 'Client Secret': 'Rahasia Klien', + 'Authorize': 'Mengesahkan', 'Logged in as: ': 'Masuk sebagai: ', 'Import playlists by URL': 'Impor daftar putar dengan URL', + 'URL': 'URL', 'Options': 'Opsi', 'Invalid/Unsupported URL': 'URL Tidak Valid/Tidak Didukung', 'Please wait...': 'Tunggu sebentar...', - 'Login using email': 'Masuk menggunakan email' + 'Login using email': 'Masuk menggunakan email', + 'Track removed from offline!': 'Trek dihapus dari offline!', + 'Removed album from offline!': 'Album yang dihapus dari offline!', + 'Playlist removed from offline!': 'Daftar putar dihapus dari offline!', + 'Repeat': 'Ulangi', + 'Repeat one': 'Ulangi sekali', + 'Repeat off': 'Ulangi off', + 'Love': 'Love', + 'Unlove': 'Unlove', + 'Dislike': 'Tidak suka', + 'Close': 'Tutup', + 'Sort playlist': 'Sort playlists', + 'Sort ascending': 'Urutkan naik', + 'Sort descending': 'Urutkan ke bawah', + 'Stop': 'Stop', + 'Start': 'Mulai', + 'Clear all': 'Hapus semua', + 'Play previous': 'Putar sebelumnya' }, - 'it_it': { + 'it-IT': { 'Home': 'Pagina Iniziale', 'Search': 'Cerca', 'Library': 'Libreria', @@ -6128,7 +6211,7 @@ const crowdin = { 'Aiutaci a tradurre questa app su Crowdin!', 'Allow screen to turn off': 'Consenti allo schermo di spegnersi' }, - 'ko_ko': { + 'ko-KR': { 'Home': '홈', 'Search': '검색', 'Library': '라이브러리', @@ -6404,7 +6487,7 @@ const crowdin = { 'Remove offline': '오프라인 트랙 제거', 'Playlist removed from library!': '라이브러리에서 재생목록이 삭제되었습니다!' }, - 'nl_nl': { + 'nl-NL': { 'Home': 'Startpagina', 'Search': 'Zoek', 'Library': 'Bibliotheek', @@ -6769,7 +6852,7 @@ const crowdin = { 'Help deze app te vertalen op Crowdin!', 'Allow screen to turn off': 'Scherm uitschakelen toestaan' }, - 'pl_pl': { + 'pl-PL': { 'Home': 'Strona główna', 'Search': 'Szukaj', 'Library': 'Biblioteka', @@ -6778,6 +6861,7 @@ const crowdin = { 'Added to library': 'Dodane do biblioteki', 'Download': 'Pobierz', 'Disk': 'Dysk', + 'Offline': 'Offline', 'Top Tracks': 'Najlepsze utwory', 'Show more tracks': 'Pokaż więcej utworów', 'Top': 'Najlepsze', @@ -6806,6 +6890,7 @@ const crowdin = { 'Please check your connection and try again later...': 'Proszę sprawdź swoje połączenie internetowe i spróbuj ponownie później...', 'Show more': 'Pokaż więcej', + 'Importer': 'Importer', 'Currently supporting only Spotify, with 100 tracks limit': 'Obecnie obsługuje tylko Spotify, z limitem 100 utworów', 'Due to API limitations': 'Ze względu na ograniczenia API', @@ -6843,6 +6928,7 @@ const crowdin = { 'Login using browser': 'Zaloguj się za pomocą przeglądarki', 'Login using token': 'Logowanie przy użyciu tokenu', 'Enter ARL': 'Wprowadź ARL', + 'Token (ARL)': 'Token (ARL)', 'Save': 'Zapisz', "If you don't have account, you can register on deezer.com for free.": 'Jeśli nie masz konta, możesz zarejestrować się na deezer.com za darmo.', @@ -6890,6 +6976,7 @@ const crowdin = { 'General': 'Ogólne', 'Appearance': 'Wygląd', 'Quality': 'Jakość', + 'Deezer': 'Deezer', 'Theme': 'Motyw', 'Currently': 'Obecnie', 'Select theme': 'Wybierz motyw', @@ -6921,6 +7008,7 @@ const crowdin = { 'Downloads naming': 'Nazewnictwo pobieranych', 'Downloaded tracks filename': 'Nazwa pliku pobranego utworu', 'Valid variables are': 'Prawidłowe zmienne to', + 'Reset': 'Zresetuj', 'Clear': 'Wyczyść', 'Create folders for artist': 'Utwórz foldery dla wykonawcy', 'Create folders for albums': 'Utwórz foldery dla albumów', @@ -6943,6 +7031,8 @@ const crowdin = { 'Language changed, please restart ReFreezer to apply!': 'Zmieniono język, uruchom ponownie ReFreezer aby zastosować!', 'Importing...': 'Importowanie...', + 'Radio': 'Radio', + 'Flow': 'Flow', 'Track is not available on Deezer!': 'Ścieżka nie jest dostępna w Deezer!', 'Failed to download track! Please restart.': 'Nie udało się pobrać utworu! Proszę uruchomić ponownie.', @@ -6955,6 +7045,7 @@ const crowdin = { 'Download Settings': 'Ustawienia pobierania plików', 'Create folder for playlist': 'Utwórz folder dla playlisty', 'Download .LRC lyrics': 'Pobierz tekst .LRC', + 'Proxy': 'Sewer proxy', 'Not set': 'Nie ustawiono', 'Search or paste URL': 'Szukaj lub wklej URL', 'History': 'Historia', @@ -7005,6 +7096,7 @@ const crowdin = { 'Ask before downloading': 'Zapytaj przed pobraniem', 'Search history': 'Historia wyszukiwania', 'Clear search history': 'Wyczyść historię wyszukiwania', + 'LastFM': 'LastFM', 'Login to enable scrobbling.': 'Zaloguj się, aby włączyć scrobbling.', 'Login to LastFM': 'Zaloguj się do LastFM', 'Username': 'Nazwa użytkownika', @@ -7030,6 +7122,7 @@ const crowdin = { 'Play mix': 'Odtwarzaj składankę', 'Share show': 'Udostępnij podcast', 'Date added': 'Data dodania', + 'Discord': 'Discord', 'Official Discord server': 'Oficjalny serwer Discord', 'Restart of app is required to properly log out!': 'Ponowne uruchomienie aplikacji jest wymagane do poprawnego wylogowania!', @@ -7060,12 +7153,16 @@ const crowdin = { 'Show visualizers on lyrics page. WARNING: Requires microphone permission!': 'Pokaż wizualizatorów na stronie tekstowej. UWAGA: Wymaga uprawnienia mikrofonu!', 'Tags': 'Tagi', + 'Album': 'Album', 'Track number': 'Numer utworu', 'Disc number': 'Numer dysku', 'Album artist': 'Wykonawca albumu', 'Date/Year': 'Data/Rok', 'Label': 'Etykieta', + 'ISRC': 'ISRC', + 'UPC': 'UPC', 'Track total': 'Ilość utworów', + 'BPM': 'BPM', 'Unsynchronized lyrics': 'Niezsynchronizowany tekst', 'Genre': 'Gatunek', 'Contributors': 'Współautorzy', @@ -7075,6 +7172,7 @@ const crowdin = { 'Deezer is unavailable': 'Deezer jest niedostępny', 'Continue': 'Kontynuuj', 'Email Login': 'Logowanie przez e-mail', + 'Email': 'Adres e-mail', 'Missing email or password!': 'Brakujący adres email lub hasło!', 'Error logging in using email, please check your credentials.\nError:': 'Błąd podczas logowania przez email, sprawdź dane logowania.\nBłąd:', @@ -7082,10 +7180,12 @@ const crowdin = { 'Change display mode': 'Zmień widok', 'Enable high refresh rates': 'Włącz wysoką częstotliwość odświeżania', 'Display mode': 'Tryb wyświetlania', + 'Spotify v1': 'Spotify v1', 'Import Spotify playlists up to 100 tracks without any login.': 'Importuj playlisty Spotify do 100 utworów bez żadnego logowania.', 'Download imported tracks': 'Pobierz zaimportowane utwory', 'Start import': 'Rozpocznij importowanie', + 'Spotify v2': 'Spotify v2', 'Import any Spotify playlist, import from own Spotify library. Requires free account.': 'Zaimportuj dowolną playlistę Spotify ze swojej biblioteki Spotify. Wymaga darmowego konta.', 'Spotify Importer v2': 'Importer Spotify v2', @@ -7097,9 +7197,12 @@ const crowdin = { '2. In the app you just created go to settings, and set the Redirect URL to: ': '2. Przejdź do ustawień aplikacji, którą właśnie utworzyłeś i ustaw URL przekierowania na: ', 'Copy the Redirect URL': 'Skopiuj URL przekierowania', + 'Client ID': 'Client ID', + 'Client Secret': 'Client Secret', 'Authorize': 'Autoryzuj', 'Logged in as: ': 'Zalogowano jako: ', 'Import playlists by URL': 'Importuj playlisty przez adres URL', + 'URL': 'Adres URL', 'Options': 'Ustawienia', 'Invalid/Unsupported URL': 'Niepoprawny/nieobsługiwany adres URL', 'Please wait...': 'Zaczekaj...', @@ -7132,9 +7235,28 @@ const crowdin = { 'Duration': 'Czas trwania', 'Sort': 'Sortowanie', 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': - 'Twój ARL mógł wygasnąć, spróbuj wylogować się i zalogować jeszcze raz używając nowego tokena ARL lub przeglądarki.' + 'Twój ARL mógł wygasnąć, spróbuj wylogować się i zalogować jeszcze raz używając nowego tokena ARL lub przeglądarki.', + 'The original freezer development team': + 'Oryginalny zespół deweloperów freezer', + 'Donate': 'Dotacja', + 'You should rather support your favorite artists, instead of this app!': + 'Powinieneś raczej wesprzeć swoich ulubionych artystów, zamiast tej aplikacji!', + 'No really, go support your favorite artists instead ;)': + 'Nie, naprawdę proszę o wsparcie dla Twoich ulubionych artystów ;)', + 'Storage permission is required to download content.\nPlease open settings and grant storage permission to ReFreezer.': + 'Do pobrania treści wymagane jest uprawnienie do pamięci.\nProszę otworzyć ustawienia i przyznać ReFreezerowi uprawnienia do pamięci.', + 'Open system settings': 'Otwórz Ustawienia systemu', + 'Application Log': 'Logi aplikacji', + 'Are you sure you want to log out?': 'Czy na pewno chcesz się wylogować?', + 'Download failed!': 'Pobieranie nie powiodło się!', + 'Permission denied, download canceled!': + 'Brak uprawnień, pobieranie anulowane!', + 'Crowdin': 'Crowdin', + 'Help translating this app on Crowdin!': + 'Pomóż w tłumaczeniu tej aplikacji na Crowdin!', + 'Allow screen to turn off': 'Zezwól ekranowi wyłączyć' }, - 'pt_br': { + 'pt-BR': { 'Home': 'Início', 'Search': 'Busca', 'Library': 'Biblioteca', @@ -7538,7 +7660,7 @@ const crowdin = { 'Ajude a traduzir este aplicativo no Crowdin!', 'Allow screen to turn off': 'Permitir que a tela seja desligada' }, - 'ro_ro': { + 'ro-RO': { 'Home': 'Pagina de pornire', 'Search': 'Căutare', 'Library': 'Librărie', @@ -7948,7 +8070,7 @@ const crowdin = { 'Ajută la traducerea acestei aplicații pe Crowdin!', 'Allow screen to turn off': 'Permite ecranului să se închidă' }, - 'ru_ru': { + 'ru-RU': { 'Home': 'Главная', 'Search': 'Поиск', 'Library': 'Библиотека', @@ -8351,7 +8473,7 @@ const crowdin = { 'Помогите перевести это приложение на Crowdin!', 'Allow screen to turn off': 'Разрешить отключение экрана' }, - 'sk_sk': { + 'sk-SK': { 'Home': 'Domov', 'Search': 'Hľadať', 'Library': 'Knižnica', @@ -8717,7 +8839,7 @@ const crowdin = { 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': 'Vaše ARL vypršalo. Skúste sa odhlásiť a znovu prihlásiť s novým ARL alebo cez prehliadač.' }, - 'sl_sl': { + 'sl-SI': { 'Home': 'Domov', 'Search': 'Išči', 'Library': 'Knjižnica', @@ -9096,8 +9218,41 @@ const crowdin = { 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': 'Vaš ARL je mogoče potekel, poskusite se odjaviti in prijaviti nazaj z novim ARL ali brskalnikom.' }, - 'te_in': {'Home': 'హోమ్'}, - 'tr_tr': { + 'te-IN': { + 'Home': 'హోమ్', + 'Search': 'వెతుకు', + 'Library': 'లైబ్రరీ', + "Offline mode, can't play flow or smart track lists.": + 'ఆఫ్ లైన్ మోడ్ లో ఉన్నారు, ప్లే చేయలేరు.', + 'Added to library': 'లైబ్రరీకి కలపబడింది', + 'Download': 'డౌన్లోడ్', + 'Disk': 'డిస్క్', + 'Offline': 'ఆఫ్ లైన్', + 'Top Tracks': 'టాప్ ట్రాక్స్', + 'Show more tracks': 'మరిన్ని ట్రాక్స్ చూపించు', + 'Top': 'టాప్', + 'Top Albums': 'టాప్ ఆల్బమ్స్', + 'Show all albums': 'అన్ని ఆల్బమ్స్ చూపించు', + 'Discography': 'డిస్కోగ్రఫీ', + 'Default': 'డీఫాల్ట్', + 'Reverse': 'రివర్స్', + 'Alphabetic': 'అక్షరక్రమం', + '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": + 'ఇప్పుడు డౌన్లోడ్ అవుతున్న ఐటమ్ ను ఇది తొలగించదు', + 'Are you sure you want to delete all queued downloads?': + 'క్యూ లో ఉన్న అన్ని డౌన్లోడ్స్ ను నిజంగా తొలగించాలా?', + 'Clear downloads history': 'డౌన్లోడ్స్ హిస్టరీని ఖాళీ చేయి' + }, + 'tr-TR': { 'Home': 'Ana Sayfa', 'Search': 'Ara', 'Library': 'Kütüphane', @@ -9105,6 +9260,7 @@ const crowdin = { 'Çevrimdışı modu, flow veya akıllı parça listeleri çalınamaz.', 'Added to library': 'Kütüphaneye eklendi', 'Download': 'İndir', + 'Disk': 'Disk', 'Offline': 'Çevrimdışı', 'Top Tracks': 'Popülar Parçalar', 'Show more tracks': 'Daha fazla parça göster', @@ -9174,6 +9330,7 @@ const crowdin = { 'Login using browser': 'Tarayıcı kullanarak giriş yapın', 'Login using token': 'Token kullanarak giriş yap', 'Enter ARL': 'ARL girin', + 'Token (ARL)': 'Belirteç (ARL)', 'Save': 'Kaydet', "If you don't have account, you can register on deezer.com for free.": "Hesabınız yoksa deezer.com'a ücretsiz kayıt olabilirsiniz.", @@ -9221,11 +9378,13 @@ const crowdin = { 'General': 'Genel', 'Appearance': 'Arayüz', 'Quality': 'Kalite', + 'Deezer': 'Deezer', 'Theme': 'Tema', 'Currently': 'Şu anda', 'Select theme': 'Tema seçin', 'Dark': 'Koyu', 'Black (AMOLED)': 'Siyah (AMOLED)', + 'Deezer (Dark)': 'Deezer (Karanlık)', 'Primary color': 'Ana renk', 'Selected color': 'Seçilen renk', 'Use album art primary color': 'Albüm resmini ana renk olarak kullan', @@ -9288,6 +9447,7 @@ const crowdin = { 'Download Settings': 'İndirme Ayarları', 'Create folder for playlist': 'Çalma listesi için klasör oluştur', 'Download .LRC lyrics': '.LRC şarkı sözlerini indir', + 'Proxy': "Proxy 'Vekil Sunucu'", 'Not set': 'Ayarlanmadı', 'Search or paste URL': 'Arayın veya URL yapıştırın', 'History': 'Geçmiş', @@ -9339,6 +9499,7 @@ const crowdin = { 'Ask before downloading': 'İndirmeden önce sor', 'Search history': 'Arama geçmişi', 'Clear search history': 'Arama geçmişini temizle', + 'LastFM': 'LastFM', 'Login to enable scrobbling.': "Scrobbling'i etkinleştirmek için giriş yap.", 'Login to LastFM': 'LastFM ile giriş yap', @@ -9365,6 +9526,7 @@ const crowdin = { 'Play mix': 'Mix çal', 'Share show': 'Gösteriyi paylaş', 'Date added': 'Eklenme tarihi', + 'Discord': 'Discord', 'Official Discord server': 'Resmi Discord sunucusu', 'Restart of app is required to properly log out!': 'Oturumun düzgün bir şekilde kapatılması için uygulamanın yeniden başlatılması gerekiyor!', @@ -9402,7 +9564,10 @@ const crowdin = { 'Album artist': 'Albüm sanatçısı', 'Date/Year': 'Tarih/Yıl', 'Label': 'Etiket', + 'ISRC': 'ISRC', + 'UPC': 'UPC', 'Track total': 'Parça toplamı', + 'BPM': "BPM 'Şarkı ritmi'", 'Unsynchronized lyrics': 'Senkronize edilmemiş şarkı sözleri', 'Genre': 'Tür', 'Contributors': 'Katkıda bulunanlar', @@ -9420,10 +9585,12 @@ const crowdin = { 'Change display mode': 'Görünüm modunu değiştir', 'Enable high refresh rates': 'Yüksek yenileme oranını etkinleştir', 'Display mode': 'Görünüm modu', + 'Spotify v1': 'Spotify v1', 'Import Spotify playlists up to 100 tracks without any login.': 'Giriş yapmadan Spotify çalma listelerini 100 parçaya kadar içe aktarın.', 'Download imported tracks': 'İçe aktarılan parçaları indir', 'Start import': 'İçe aktarmayı başlat', + 'Spotify v2': 'Spotify v2', 'Import any Spotify playlist, import from own Spotify library. Requires free account.': "Herhangi bir Spotify çalma listesini içe aktarın, Spotify'ın kütüphanesinden içe aktarın. Ücretsiz hesap gerektirir.", 'Spotify Importer v2': 'Spotify İçe Aktarıcı v2', @@ -9436,9 +9603,11 @@ const crowdin = { "2. Yeni oluşturduğunuz uygulamada Ayarlar'a gidin ve Yönlendirme URL'sini şu şekilde ayarlayın: ", 'Copy the Redirect URL': "Yönlendirme URL'sini Kopyala", 'Client ID': 'İstemci ID', + 'Client Secret': 'İstemci belirteci', 'Authorize': 'İzin ver', 'Logged in as: ': 'Giriş yapıldı: ', 'Import playlists by URL': 'Çalma listelerini URL ile içe aktar', + 'URL': 'URL', 'Options': 'Seçenekler', 'Invalid/Unsupported URL': 'Geçersiz/Desteklenmeyen URL', 'Please wait...': 'Lütfen bekleyin...', @@ -9466,12 +9635,36 @@ const crowdin = { 'Play': 'Oynat', 'Pause': 'Duraklat', 'Remove': 'Kaldır', + 'Seekbar': 'Arama Çubuğu', + 'Singles': "Tekliler 'Singles'", 'Featured': 'Öne çıkanlar', 'Fans': 'Hayranlar', 'Duration': 'Süre', - 'Sort': 'Sırala' + 'Sort': 'Sırala', + 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': + "ARL'niz sona ermiş olabilir, çıkış yapıp yeni ARL veya tarayıcı kullanarak tekrar giriş yapmayı deneyin.", + 'The original freezer development team': + 'Orijinal Freezer geliştirici ekibi', + 'Donate': 'Bağış yap', + 'You should rather support your favorite artists, instead of this app!': + 'Bu uygulama yerine sevdiğiniz sanatçıları desteklemelisiniz!', + 'No really, go support your favorite artists instead ;)': + 'Hayır, gerçekten, bunun yerine gidin ve en sevdiğiniz sanatçıları destekleyin ;)', + 'Storage permission is required to download content.\nPlease open settings and grant storage permission to ReFreezer.': + "İçeriği indirmek için depolama izni gereklidir.\nLütfen ayarları açın ve ReFreezer'a depolama izni verin.", + 'Open system settings': 'Sistem ayarlarını açın', + 'Application Log': 'Uygulama Günlüğü', + 'Are you sure you want to log out?': + 'Çıkış yapmak istediğinize emin misiniz?', + 'Download failed!': 'İndirme başarısız!', + 'Permission denied, download canceled!': + 'İzin reddedildi, indirme iptal edildi!', + 'Crowdin': 'Crowdin', + 'Help translating this app on Crowdin!': + "Bu uygulamanın Crowdin'de çevrilmesine yardımcı olun!", + 'Allow screen to turn off': 'Ekranın kapanmasına izin ver' }, - 'uk_ua': { + 'uk-UA': { 'Home': 'Головна', 'Search': 'Пошук', 'Library': 'Бібліотека', @@ -9847,7 +10040,7 @@ const crowdin = { 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': 'Можливо, термін дії ARL минув, спробуйте вийти з обліковки та повернутися в систему за допомогою нового ARL або браузера.' }, - 'ur_pk': { + 'ur-PK': { 'Home': 'ہوم', 'Search': 'تلاش کریں', 'Library': 'لائبریری', @@ -9864,7 +10057,7 @@ const crowdin = { 'Show all albums': 'تمام البمز دکھائیں', 'Singleton naming': 'Singleton naming' }, - 'uwu_uwu': { + 'uwu-UWU': { 'Search': 'Seawch', 'Library': 'Wibwawy', "Offline mode, can't play flow or smart track lists.": @@ -10223,7 +10416,7 @@ const crowdin = { 'I need your help uwu, please translate this app on crowdin! >w<', 'Allow screen to turn off': 'Awwow scween to turn o-off' }, - 'vi_vi': { + 'vi-VN': { 'Home': 'Trang chủ', 'Search': 'Tìm kiếm', 'Library': 'Thư viện', @@ -10593,7 +10786,7 @@ const crowdin = { 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.': 'ARL của bạn có thể đã hết hạn, hãy đăng xuất và đăng nhập lại bằng ARL mới hoặc qua trình duyệt.' }, - 'zh_cn': { + 'zh-CN': { 'Home': '主页', 'Search': '搜索', 'Library': '曲库', diff --git a/lib/languages/en_us.dart b/lib/languages/en_us.dart index 274ac02..e51ebec 100644 --- a/lib/languages/en_us.dart +++ b/lib/languages/en_us.dart @@ -1,9 +1,10 @@ const language_en_us = { - 'en_us': { + 'en-US': { 'Home': 'Home', 'Search': 'Search', 'Library': 'Library', - "Offline mode, can't play flow or smart track lists.": "Offline mode, can't play flow or smart track lists.", + "Offline mode, can't play flow or smart track lists.": + "Offline mode, can't play flow or smart track lists.", 'Added to library': 'Added to library', 'Download': 'Download', 'Disk': 'Disk', @@ -21,16 +22,20 @@ const language_en_us = { 'Post processing...': 'Post processing...', 'Done': 'Done', 'Delete': 'Delete', - 'Are you sure you want to delete this download?': 'Are you sure you want to delete this download?', + 'Are you sure you want to delete this download?': + 'Are you sure you want to delete this download?', 'Cancel': 'Cancel', 'Downloads': 'Downloads', 'Clear queue': '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?': 'Are you sure you want to delete all queued downloads?', + "This won't delete currently downloading item": + "This won't delete currently downloading item", + 'Are you sure you want to delete all queued downloads?': + 'Are you sure you want to delete all queued downloads?', 'Clear downloads history': 'Clear downloads history', 'WARNING: This will only clear non-offline (external downloads)': 'WARNING: This will only clear non-offline (external downloads)', - 'Please check your connection and try again later...': 'Please check your connection and try again later...', + 'Please check your connection and try again later...': + 'Please check your connection and try again later...', 'Show more': 'Show more', 'Importer': 'Importer', 'Currently supporting only Spotify, with 100 tracks limit': @@ -58,13 +63,15 @@ const language_en_us = { 'Favorites': 'Favorites', 'All offline tracks': 'All offline tracks', 'Create new playlist': 'Create new playlist', - 'Cannot create playlists in offline mode': 'Cannot create playlists in offline mode', + 'Cannot create playlists in offline mode': + 'Cannot create playlists in offline mode', 'Error': 'Error', 'Error logging in! Please check your token and internet connection and try again.': 'Error logging in! Please check your token and internet connection and try again.', 'Dismiss': 'Dismiss', 'Welcome to': 'Welcome to', - 'Please login using your Deezer account.': 'Please login using your Deezer account.', + 'Please login using your Deezer account.': + 'Please login using your Deezer account.', 'Login using browser': 'Login using browser', 'Login using token': 'Login using token', 'Enter ARL': 'Enter ARL', @@ -73,7 +80,8 @@ const language_en_us = { "If you don't have account, you can register on deezer.com for free.": "If you don't have account, you can register on deezer.com for free.", 'Open in browser': 'Open in browser', - "By using this app, you don't agree with the Deezer ToS": "By using this app, you don't agree with the Deezer ToS", + "By using this app, you don't agree with the Deezer ToS": + "By using this app, you don't agree with the Deezer ToS", 'Play next': 'Play next', 'Add to queue': 'Add to queue', 'Add track to favorites': 'Add track to favorites', @@ -130,7 +138,8 @@ const language_en_us = { 'Wifi streaming': 'Wifi streaming', 'External downloads': 'External downloads', 'Content language': 'Content language', - 'Not app language, used in headers. Now': 'Not app language, used in headers. Now', + 'Not app language, used in headers. Now': + 'Not app language, used in headers. Now', 'Select language': 'Select language', 'Content country': 'Content country', 'Country used in headers. Now': 'Country used in headers. Now', @@ -139,7 +148,8 @@ const language_en_us = { 'Send track listen logs to Deezer, enable it for features like Flow to work properly', 'Offline mode': 'Offline mode', 'Will be overwritten on start.': 'Will be overwritten on start.', - 'Error logging in, check your internet connections.': 'Error logging in, check your internet connections.', + 'Error logging in, check your internet connections.': + 'Error logging in, check your internet connections.', 'Logging in...': 'Logging in...', 'Download path': 'Download path', 'Downloads naming': 'Downloads naming', @@ -152,7 +162,8 @@ const language_en_us = { 'Separate albums by discs': 'Separate albums by disks', 'Overwrite already downloaded files': 'Overwrite already downloaded files', 'Copy ARL': 'Copy ARL', - 'Copy userToken/ARL Cookie for use in other apps.': 'Copy userToken/ARL Cookie for use in other apps.', + 'Copy userToken/ARL Cookie for use in other apps.': + 'Copy userToken/ARL Cookie for use in other apps.', 'Copied': 'Copied', 'Log out': 'Log out', 'Due to plugin incompatibility, login using browser is unavailable without restart.': @@ -164,12 +175,14 @@ const language_en_us = { 'Go up': 'Go up', 'Permission denied': 'Permission denied', 'Language': 'Language', - 'Language changed, please restart ReFreezer to apply!': 'Language changed, please restart ReFreezer to apply!', + 'Language changed, please restart ReFreezer to apply!': + 'Language changed, please restart ReFreezer 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.', + 'Failed to download track! Please restart.': + 'Failed to download track! Please restart.', //0.5.0 Strings: 'Storage permission denied!': 'Storage permission denied!', @@ -190,13 +203,15 @@ const language_en_us = { //Updated 0.5.1 'Download threads': 'Concurrent downloads', //0.5.0 - 'Lyrics unavailable, empty or failed to load!': 'Lyrics unavailable, empty or failed to load!', + 'Lyrics unavailable, empty or failed to load!': + 'Lyrics unavailable, empty or failed to load!', 'About': 'About', 'Telegram Channel': 'Telegram Channel', 'To get latest releases': 'To get latest releases', 'Official chat': 'Official chat', 'Telegram Group': 'Telegram Group', - 'Huge thanks to all the contributors! <3': 'Huge thanks to all the contributors! <3', + 'Huge thanks to all the contributors! <3': + 'Huge thanks to all the contributors! <3', 'Edit playlist': 'Edit playlist', 'Update': 'Update', 'Playlist updated!': 'Playlist updated!', @@ -228,7 +243,8 @@ const language_en_us = { //0.5.6 Strings: 'Create .nomedia files': 'Create .nomedia files', - 'To prevent gallery being filled with album art': 'To prevent gallery being filled with album art', + 'To prevent gallery being filled with album art': + 'To prevent gallery being filled with album art', //0.5.7 Strings: 'Sleep timer': 'Sleep timer', @@ -270,7 +286,8 @@ const language_en_us = { 'Current version: ': 'Current version: ', 'Unsupported platform!': 'Unsupported platform!', 'ReFreezer Updates': 'ReFreezer Updates', - 'Update to latest version in the settings.': 'Update to latest version in the settings.', + 'Update to latest version in the settings.': + 'Update to latest version in the settings.', 'Release date': 'Release date', //0.6.4 Strings: @@ -285,7 +302,8 @@ const language_en_us = { 'Official Discord server': 'Official Discord server', //0.6.6 - 'Restart of app is required to properly log out!': 'Restart of app is required to properly log out!', + 'Restart of app is required to properly log out!': + 'Restart of app is required to properly log out!', 'Artist separator': 'Artist separator', 'Singleton naming': 'Standalone tracks filename', @@ -411,11 +429,13 @@ const language_en_us = { 'Your ARL might be expired, try logging out and logging back in using new ARL or browser.', //0.7.05 - 'The original freezer development team': 'The original freezer development team', + 'The original freezer development team': + 'The original freezer development team', 'Donate': 'Donate', 'You should rather support your favorite artists, instead of this app!': 'You should rather support your favorite artists, instead of this app!', - 'No really, go support your favorite artists instead ;)': 'No really, go support your favorite artists instead ;)', + 'No really, go support your favorite artists instead ;)': + 'No really, go support your favorite artists instead ;)', 'Storage permission is required to download content.\nPlease open settings and grant storage permission to ReFreezer.': 'Storage permission is required to download content.\nPlease open settings and grant storage permission to ReFreezer.', 'Open system settings': 'Open system settings', @@ -426,9 +446,11 @@ const language_en_us = { 'Download failed!': 'Download failed!', // 0.7.14 - 'Permission denied, download canceled!': 'Permission denied, download canceled!', + 'Permission denied, download canceled!': + 'Permission denied, download canceled!', 'Crowdin': 'Crowdin', - 'Help translating this app on Crowdin!': 'Help translating this app on Crowdin!', + 'Help translating this app on Crowdin!': + 'Help translating this app on Crowdin!', // 0.7.15 'Allow screen to turn off': 'Allow screen to turn off', diff --git a/lib/translations.i18n.dart b/lib/translations.i18n.dart index 51e1612..705e6a1 100644 --- a/lib/translations.i18n.dart +++ b/lib/translations.i18n.dart @@ -7,41 +7,41 @@ import '../languages/en_us.dart'; List languages = [ Language('en', 'US', 'English'), Language('ar', 'AR', 'Arabic'), - Language('pt', 'BR', 'Brazil'), - Language('it', 'IT', 'Italian'), + Language('ast', 'ES', 'Asturian'), + Language('bg', 'BG', 'Bulgarian'), + Language('cs', 'CZ', 'Czech'), Language('de', 'DE', 'German'), - Language('ru', 'RU', 'Russian'), - Language('es', 'ES', 'Spanish'), - Language('hr', 'HR', 'Croatian'), Language('el', 'GR', 'Greek'), - Language('ko', 'KO', 'Korean'), + Language('es', 'ES', 'Spanish'), + Language('fa', 'IR', 'Persian'), + Language('fil', 'PH', 'Filipino'), Language('fr', 'FR', 'Baguette'), Language('he', 'IL', 'Hebrew'), - Language('tr', 'TR', 'Turkish'), - Language('ro', 'RO', 'Romanian'), - Language('id', 'ID', 'Indonesian'), - Language('fa', 'IR', 'Persian'), - Language('pl', 'PL', 'Polish'), - Language('uk', 'UA', 'Ukrainian'), - Language('hu', 'HU', 'Hungarian'), - Language('ur', 'PK', 'Urdu'), Language('hi', 'IN', 'Hindi'), - Language('sk', 'SK', 'Slovak'), - Language('cs', 'CZ', 'Czech'), - Language('vi', 'VI', 'Vietnamese'), + Language('hr', 'HR', 'Croatian'), + Language('hu', 'HU', 'Hungarian'), + Language('id', 'ID', 'Indonesian'), + Language('it', 'IT', 'Italian'), + Language('ko', 'KR', 'Korean'), Language('nl', 'NL', 'Dutch'), - Language('sl', 'SL', 'Slovenian'), - Language('zh', 'CN', 'Chinese'), - Language('fil', 'PH', 'Filipino'), - Language('ast', 'ES', 'Asturian'), - Language('bul', 'BG', 'Bulgarian'), - Language('uwu', 'UWU', 'Furry'), + Language('pl', 'PL', 'Polish'), + Language('pt', 'BR', 'Brazil'), + Language('ro', 'RO', 'Romanian'), + Language('ru', 'RU', 'Russian'), + Language('sk', 'SK', 'Slovak'), + Language('sl', 'SI', 'Slovenian'), Language('te', 'IN', 'Telugu'), + Language('tr', 'TR', 'Turkish'), + Language('uk', 'UA', 'Ukrainian'), + Language('ur', 'PK', 'Urdu'), + Language('uwu', 'UWU', 'Furry'), + Language('vi', 'VN', 'Vietnamese'), + Language('zh', 'CN', 'Chinese'), ]; List get supportedLocales => languages.map((l) => l.getLocale).toList(); extension Localization on String { - static final _t = Translations.byLocale('en_US') + language_en_us + crowdin; + static final _t = Translations.byLocale('en-US') + language_en_us + crowdin; String get i18n => localize(this, _t); } diff --git a/marquee b/marquee deleted file mode 160000 index 4241bdf..0000000 --- a/marquee +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4241bdf46dd1346b939b0f4f02bde26b258f9cea diff --git a/pubspec.yaml b/pubspec.yaml index 3d04148..e8fdbd8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,7 @@ dependencies: animations: ^2.0.10 async: ^2.11.0 audio_service: ^0.18.14 - audio_session: ^0.1.20 + audio_session: ^0.2.2 cached_network_image: ^3.3.0 clipboard: ^0.1.3 collection: ^1.18.0 @@ -64,7 +64,7 @@ dependencies: flutter_displaymode: ^0.6.0 #flutter_file_dialog: ^3.0.1 flutter_inappwebview: ^6.1.0+1 - flutter_local_notifications: ^18.0.1 + flutter_local_notifications: ^19.2.1 flutter_markdown: ^0.7.3 flutter_material_color_picker: ^1.2.0 flutter_screenutil: ^5.9.0 @@ -72,10 +72,10 @@ dependencies: google_fonts: ^6.1.0 html: ^0.15.3 http: ^1.2.1 - i18n_extension: ^13.0.2 - intl: ^0.19.0 + i18n_extension: ^15.0.5 + intl: ^0.20.2 json_annotation: ^4.9.0 - just_audio: ^0.9.39 + just_audio: ^0.10.4 #just_audio: # git: # url: https://github.com/ryanheise/just_audio.git @@ -87,9 +87,10 @@ dependencies: # ref: visualizer # path: just_audio_platform_interface logging: ^1.2.0 - #marquee: ^2.2.3 - marquee: - path: ./marquee + marquee: ^2.3.0 + #marquee: + # git: + # url: https://github.com/DJDoubleD/marquee #move_to_background: ^1.0.1 # Gradle 8 updated version: move_to_background: @@ -97,14 +98,12 @@ dependencies: numberpicker: ^2.1.2 # Awaiting release with fix for flutter 3.29.0: #open_filex: ^4.6.0 - open_filex: - git: - url: https://github.com/mufassalhussain/open_filex + open_filex: ^4.7.0 package_info_plus: ^8.0.0 palette_generator: ^0.3.3+3 path: ^1.8.3 path_provider: ^2.1.1 - permission_handler: ^11.3.1 + permission_handler: ^12.0.0+1 photo_view: ^0.15.0 pointycastle: ^3.7.4 quick_actions: ^1.0.6 @@ -117,7 +116,7 @@ dependencies: rxdart: ^0.28.0 scrobblenaut: path: ./scrobblenaut - share_plus: ^10.0.0 + share_plus: ^11.0.0 spotify: ^0.13.1 sqflite: ^2.3.0 url_launcher: ^6.2.2 @@ -131,7 +130,7 @@ dev_dependencies: json_serializable: ^6.7.1 build_runner: ^2.4.7 - flutter_lints: ^5.0.0 + flutter_lints: ^6.0.0 envied_generator: ^1.0.0 # For information on the generic Dart part of this file, see the diff --git a/run_build_runner.ps1 b/run_build_runner.ps1 index 4939dbf..7c25cb7 100644 --- a/run_build_runner.ps1 +++ b/run_build_runner.ps1 @@ -18,28 +18,29 @@ function Invoke-BuildRunner { Write-Host "Running 'dart run build_runner build --delete-conflicting-outputs' for $name" -ForegroundColor Green dart run build_runner build --delete-conflicting-outputs - - Write-Host "Running 'flutter clean' for $name" -ForegroundColor Green - flutter clean } # Extract submodule paths from .gitmodules -$submodulePaths = git config --file .gitmodules --name-only --get-regexp path | ForEach-Object { +# Use a more specific regex '\.path$' to ensure we only get keys ending in .path +$submodulePaths = git config --file .gitmodules --name-only --get-regexp '\.path$' | ForEach-Object { git config --file .gitmodules --get $_ } | Where-Object { $_ -notmatch "http" } - # Run build_runner for each submodule -foreach ($submodule in $submodulePaths) { - $submodulePath = Join-Path -Path $mainProjectDir -ChildPath $submodule - Invoke-BuildRunner $submodulePath "submodule $submodule" +if ($submodulePaths) { + foreach ($submoduleDirName in $submodulePaths) { + $submodulePath = Join-Path -Path $mainProjectDir -ChildPath $submoduleDirName + if (Test-Path $submodulePath) { + Invoke-BuildRunner $submodulePath "submodule $submoduleDirName" + } + else { + Write-Host "Submodule path $submodulePath not found, skipping." -ForegroundColor Yellow + } + } } +# Clean and then run build_runner for the main project +Set-Location $mainProjectDir +Write-Host "Running 'flutter clean' for the main project before build" -ForegroundColor Yellow +flutter clean # Run build_runner for the main project Invoke-BuildRunner $mainProjectDir "main project" - -# Clean and get dependencies for the main project again -Set-Location $mainProjectDir -Write-Host "Running 'flutter clean' for the main project" -ForegroundColor Yellow -flutter clean -Write-Host "Running 'flutter pub get' for the main project" -ForegroundColor Yellow -flutter pub get diff --git a/translations/crowdin_to_dart.py b/translations/crowdin_to_dart.py index a16ec6d..890b1a6 100644 --- a/translations/crowdin_to_dart.py +++ b/translations/crowdin_to_dart.py @@ -4,37 +4,37 @@ import zipfile import json lang_crowdin = { - "ar": "ar_ar", - "ast": "ast_es", - "bg": "bul_bg", - "cs": "cs_cz", - "de": "de_de", - "el": "el_gr", - "es-ES": "es_es", - "fa": "fa_ir", - "fil": "fil_ph", - "fr": "fr_fr", - "he": "he_il", - "hi": "hi_in", - "hr": "hr_hr", - "hu": "hu_hu", - "id": "id_id", - "it": "it_it", - "ko": "ko_ko", - "nl": "nl_nl", - "pl": "pl_pl", - "pt-BR": "pt_br", - "ro": "ro_ro", - "ru": "ru_ru", - "sk": "sk_sk", - "sl": "sl_sl", - "te": "te_in", - "tr": "tr_tr", - "uk": "uk_ua", - "ur-PK": "ur_pk", - "uwu": "uwu_uwu", - "vi": "vi_vi", - "zh-CN": "zh_cn", + "ar": "ar-AR", + "ast": "ast-ES", + "bg": "bg-BG", + "cs": "cs-CZ", + "de": "de-DE", + "el": "el-GR", + "es-ES": "es-ES", + "fa": "fa-IR", + "fil": "fil-PH", + "fr": "fr-FR", + "he": "he-IL", + "hi": "hi-IN", + "hr": "hr-HR", + "hu": "hu-HU", + "id": "id-ID", + "it": "it-IT", + "ko": "ko-KR", + "nl": "nl-NL", + "pl": "pl-PL", + "pt-BR": "pt-BR", + "ro": "ro-RO", + "ru": "ru-RU", + "sk": "sk-SK", + "sl": "sl-SI", + "te": "te-IN", + "tr": "tr-TR", + "uk": "uk-UA", + "ur-PK": "ur-PK", + "uwu": "uwu-UWU", + "vi": "vi-VN", + "zh-CN": "zh-CN", } @@ -58,7 +58,7 @@ def convert_to_single_quotes(json_str): pattern = r'"((?:[^"\\]|\\.)*)":\s*"((?:[^"\\]|\\.)*)"' single_quote_json = re.sub(pattern, replace_quotes, json_str) - locale_pattern = r'"(\w+_\w+)":\s*{' + locale_pattern = r'"(\w+-\w+)":\s*{' single_quote_json = re.sub(locale_pattern, replace_locale_quotes, single_quote_json) return single_quote_json