diff --git a/.flutter b/.flutter index c23637390..ea121f885 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit c23637390482d4cf9598c3ce3f2be31aa7332daf +Subproject commit ea121f8859e4b13e47a8f845e4586164519588bc diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index 021d53388..b6369aae0 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -59,7 +59,7 @@ jobs: # Building relies on the Android Gradle plugin, # which requires a modern Java version (not the default one). - name: Set up JDK for Android Gradle plugin - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '21' @@ -69,7 +69,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/init@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -83,6 +83,6 @@ jobs: ./flutterw build apk --profile -t lib/main_play.dart --flavor play - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/analyze@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4decbc849..00405f298 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: # Building relies on the Android Gradle plugin, # which requires a modern Java version (not the default one). - name: Set up JDK for Android Gradle plugin - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '21' diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 182caf4c0..c6dc1deba 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -71,6 +71,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/upload-sarif@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 with: sarif_file: results.sarif diff --git a/CHANGELOG.md b/CHANGELOG.md index e7958a5e2..e7a0892d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [v1.12.10] - 2025-04-16 + +### Added + +- Search: format filters +- Albums: sort by path + +### Changed + +- upgraded Flutter to stable v3.29.3 + +### Fixed + +- region decoding failing to access decoder pool + ## [v1.12.9] - 2025-04-06 ### Added diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt index 996c139ea..488474404 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt @@ -14,6 +14,7 @@ import androidx.work.ForegroundInfo import androidx.work.WorkManager import androidx.work.WorkerParameters import app.loup.streams_channel.StreamsChannel +import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend import deckers.thibault.aves.channel.calls.DeviceHandler import deckers.thibault.aves.channel.calls.GeocodingHandler import deckers.thibault.aves.channel.calls.MediaFetchObjectHandler @@ -44,11 +45,12 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine private var backgroundChannel: MethodChannel? = null override suspend fun doWork(): Result { + Log.i(LOG_TAG, "Start analysis worker $id") defaultScope.launch { // prevent ANR triggered by slow operations in main thread createNotificationChannel() setForeground(createForegroundInfo()) - } + }.join() suspendCoroutine { cont -> workCont = cont onStart() @@ -68,7 +70,6 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine } private fun onStart() { - Log.i(LOG_TAG, "Start analysis worker $id") runBlocking { FlutterUtils.initFlutterEngine(applicationContext, SHARED_PREFERENCES_KEY, PREF_CALLBACK_HANDLE_KEY) { flutterEngine = it @@ -132,12 +133,7 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine result.success(null) } - "updateNotification" -> { - val title = call.argument("title") - val message = call.argument("message") - setForegroundAsync(createForegroundInfo(title, message)) - result.success(null) - } + "updateNotification" -> defaultScope.launch { safeSuspend(call, result, ::updateNotification) } "stop" -> { workCont?.resume(null) @@ -180,17 +176,22 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine .setContentIntent(openAppIntent) .addAction(stopAction) .build() - return if (Build.VERSION.SDK_INT == 34) { - // from Android 14 (API 34), foreground service type is mandatory for long-running workers: - // https://developer.android.com/guide/background/persistent/how-to/long-running - ForegroundInfo(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) - } else if (Build.VERSION.SDK_INT >= 35) { - ForegroundInfo(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING) - } else { - ForegroundInfo(NOTIFICATION_ID, notification) + // from Android 14 (API 34), foreground service type is mandatory for long-running workers: + // https://developer.android.com/guide/background/persistent/how-to/long-running + return when { + Build.VERSION.SDK_INT >= 35 -> ForegroundInfo(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING) + Build.VERSION.SDK_INT == 34 -> ForegroundInfo(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + else -> ForegroundInfo(NOTIFICATION_ID, notification) } } + private suspend fun updateNotification(call: MethodCall, result: MethodChannel.Result) { + val title = call.argument("title") + val message = call.argument("message") + setForeground(createForegroundInfo(title, message)) + result.success(null) + } + companion object { private val LOG_TAG = LogUtils.createTag() private const val BACKGROUND_CHANNEL = "deckers.thibault/aves/analysis_service_background" diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/RegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/RegionFetcher.kt index f3d761fbb..0762a4df9 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/RegionFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/RegionFetcher.kt @@ -20,6 +20,8 @@ import deckers.thibault.aves.utils.MemoryUtils import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.StorageUtils import io.flutter.plugin.common.MethodChannel +import java.util.concurrent.locks.ReentrantLock +import kotlin.concurrent.withLock import kotlin.math.max import kotlin.math.roundToInt @@ -60,7 +62,7 @@ class RegionFetcher internal constructor( } try { - val decoder = getOrCreateDecoder(uri, requestKey) + val decoder = getOrCreateDecoder(context, uri, requestKey) if (decoder == null) { result.error("fetch-read-null", "failed to open file for mimeType=$mimeType uri=$uri regionRect=$regionRect", null) return @@ -143,26 +145,6 @@ class RegionFetcher internal constructor( } } - private fun getOrCreateDecoder(uri: Uri, requestKey: Pair): BitmapRegionDecoder? { - var decoderRef = decoderPool.firstOrNull { it.requestKey == requestKey } - if (decoderRef == null) { - val newDecoder = StorageUtils.openInputStream(context, uri)?.use { input -> - BitmapRegionDecoderCompat.newInstance(input) - } - if (newDecoder == null) { - return null - } - decoderRef = DecoderRef(requestKey, newDecoder) - } else { - decoderPool.remove(decoderRef) - } - decoderPool.add(0, decoderRef) - while (decoderPool.size > DECODER_POOL_SIZE) { - decoderPool.removeAt(decoderPool.size - 1) - } - return decoderRef.decoder - } - private fun createTemporaryJpegExport(uri: Uri, mimeType: String, pageId: Int?): Uri { Log.d(LOG_TAG, "create JPEG export for uri=$uri mimeType=$mimeType pageId=$pageId") val target = Glide.with(context) @@ -195,5 +177,29 @@ class RegionFetcher internal constructor( private const val DECODER_POOL_SIZE = 3 private val decoderPool = ArrayList() private val exportUris = HashMap, Uri>() + + private val poolLock = ReentrantLock() + + private fun getOrCreateDecoder(context: Context, uri: Uri, requestKey: Pair): BitmapRegionDecoder? { + poolLock.withLock { + var decoderRef = decoderPool.firstOrNull { it.requestKey == requestKey } + if (decoderRef == null) { + val newDecoder = StorageUtils.openInputStream(context, uri)?.use { input -> + BitmapRegionDecoderCompat.newInstance(input) + } + if (newDecoder == null) { + return null + } + decoderRef = DecoderRef(requestKey, newDecoder) + } else { + decoderPool.remove(decoderRef) + } + decoderPool.add(0, decoderRef) + while (decoderPool.size > DECODER_POOL_SIZE) { + decoderPool.removeAt(decoderPool.size - 1) + } + return decoderRef.decoder + } + } } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt index 7208bc6a3..03b8d4df4 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt @@ -17,6 +17,8 @@ import deckers.thibault.aves.utils.BitmapUtils import deckers.thibault.aves.utils.MemoryUtils import deckers.thibault.aves.utils.StorageUtils import io.flutter.plugin.common.MethodChannel +import java.util.concurrent.locks.ReentrantLock +import kotlin.concurrent.withLock import kotlin.math.ceil class SvgRegionFetcher internal constructor( @@ -38,7 +40,7 @@ class SvgRegionFetcher internal constructor( } try { - val svg = getOrCreateDecoder(uri) + val svg = getOrCreateDecoder(context, uri) if (svg == null) { result.error("fetch-read-null", "failed to open file for uri=$uri regionRect=$regionRect", null) return @@ -95,27 +97,6 @@ class SvgRegionFetcher internal constructor( } } - private fun getOrCreateDecoder(uri: Uri): SVG? { - var decoderRef = decoderPool.firstOrNull { it.uri == uri } - if (decoderRef == null) { - val newDecoder = StorageUtils.openInputStream(context, uri)?.use { input -> - SVG.getFromInputStream(SVGParserBufferedInputStream(input)) - } - if (newDecoder == null) { - return null - } - newDecoder.normalizeSize() - decoderRef = DecoderRef(uri, newDecoder) - } else { - decoderPool.remove(decoderRef) - } - decoderPool.add(0, decoderRef) - while (decoderPool.size > DECODER_POOL_SIZE) { - decoderPool.removeAt(decoderPool.size - 1) - } - return decoderRef.decoder - } - private data class DecoderRef( val uri: Uri, val decoder: SVG, @@ -125,5 +106,30 @@ class SvgRegionFetcher internal constructor( private val PREFERRED_CONFIG = Bitmap.Config.ARGB_8888 private const val DECODER_POOL_SIZE = 3 private val decoderPool = ArrayList() + + private val poolLock = ReentrantLock() + + private fun getOrCreateDecoder(context: Context, uri: Uri): SVG? { + poolLock.withLock { + var decoderRef = decoderPool.firstOrNull { it.uri == uri } + if (decoderRef == null) { + val newDecoder = StorageUtils.openInputStream(context, uri)?.use { input -> + SVG.getFromInputStream(SVGParserBufferedInputStream(input)) + } + if (newDecoder == null) { + return null + } + newDecoder.normalizeSize() + decoderRef = DecoderRef(uri, newDecoder) + } else { + decoderPool.remove(decoderRef) + } + decoderPool.add(0, decoderRef) + while (decoderPool.size > DECODER_POOL_SIZE) { + decoderPool.removeAt(decoderPool.size - 1) + } + return decoderRef.decoder + } + } } } diff --git a/android/app/src/main/res/values-iw/strings.xml b/android/app/src/main/res/values-iw/strings.xml index 842cc5530..fc8b10d5b 100644 --- a/android/app/src/main/res/values-iw/strings.xml +++ b/android/app/src/main/res/values-iw/strings.xml @@ -1,6 +1,6 @@ - אייבז + Aves מסגרת תמונה טפט חיפוש @@ -9,4 +9,4 @@ סורק מדיה הפסק מפה - \ No newline at end of file + diff --git a/android/app/src/main/res/values-ne/strings.xml b/android/app/src/main/res/values-ne/strings.xml new file mode 100644 index 000000000..6dc61acf8 --- /dev/null +++ b/android/app/src/main/res/values-ne/strings.xml @@ -0,0 +1,4 @@ + + + एभस + diff --git a/fastlane/metadata/android/en-US/changelogs/140.txt b/fastlane/metadata/android/en-US/changelogs/140.txt deleted file mode 100644 index b028e1e94..000000000 --- a/fastlane/metadata/android/en-US/changelogs/140.txt +++ /dev/null @@ -1,4 +0,0 @@ -In v1.12.0: -- save your filtered collection as dynamic albums -- enjoy the app in Tamil, Bulgarian and Estonian -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/14001.txt b/fastlane/metadata/android/en-US/changelogs/14001.txt deleted file mode 100644 index b028e1e94..000000000 --- a/fastlane/metadata/android/en-US/changelogs/14001.txt +++ /dev/null @@ -1,4 +0,0 @@ -In v1.12.0: -- save your filtered collection as dynamic albums -- enjoy the app in Tamil, Bulgarian and Estonian -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/141.txt b/fastlane/metadata/android/en-US/changelogs/141.txt deleted file mode 100644 index 3b8617d7c..000000000 --- a/fastlane/metadata/android/en-US/changelogs/141.txt +++ /dev/null @@ -1,3 +0,0 @@ -In v1.12.1: -- enjoy the app in Danish -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/14101.txt b/fastlane/metadata/android/en-US/changelogs/14101.txt deleted file mode 100644 index 3b8617d7c..000000000 --- a/fastlane/metadata/android/en-US/changelogs/14101.txt +++ /dev/null @@ -1,3 +0,0 @@ -In v1.12.1: -- enjoy the app in Danish -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/142.txt b/fastlane/metadata/android/en-US/changelogs/142.txt deleted file mode 100644 index d061c30ac..000000000 --- a/fastlane/metadata/android/en-US/changelogs/142.txt +++ /dev/null @@ -1,3 +0,0 @@ -In v1.12.2: -- enjoy the app in Danish -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/14201.txt b/fastlane/metadata/android/en-US/changelogs/14201.txt deleted file mode 100644 index d061c30ac..000000000 --- a/fastlane/metadata/android/en-US/changelogs/14201.txt +++ /dev/null @@ -1,3 +0,0 @@ -In v1.12.2: -- enjoy the app in Danish -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/143.txt b/fastlane/metadata/android/en-US/changelogs/143.txt deleted file mode 100644 index 73dc0e78b..000000000 --- a/fastlane/metadata/android/en-US/changelogs/143.txt +++ /dev/null @@ -1,3 +0,0 @@ -In v1.12.3: -- edit locations via GPX tracks -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/14301.txt b/fastlane/metadata/android/en-US/changelogs/14301.txt deleted file mode 100644 index 73dc0e78b..000000000 --- a/fastlane/metadata/android/en-US/changelogs/14301.txt +++ /dev/null @@ -1,3 +0,0 @@ -In v1.12.3: -- edit locations via GPX tracks -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/145.txt b/fastlane/metadata/android/en-US/changelogs/145.txt deleted file mode 100644 index 139cfbdfd..000000000 --- a/fastlane/metadata/android/en-US/changelogs/145.txt +++ /dev/null @@ -1,4 +0,0 @@ -In v1.12.5: -- play more kinds of motion photos -- enjoy the app in Galician -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/14501.txt b/fastlane/metadata/android/en-US/changelogs/14501.txt deleted file mode 100644 index 139cfbdfd..000000000 --- a/fastlane/metadata/android/en-US/changelogs/14501.txt +++ /dev/null @@ -1,4 +0,0 @@ -In v1.12.5: -- play more kinds of motion photos -- enjoy the app in Galician -Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/144.txt b/fastlane/metadata/android/en-US/changelogs/150.txt similarity index 56% rename from fastlane/metadata/android/en-US/changelogs/144.txt rename to fastlane/metadata/android/en-US/changelogs/150.txt index cbdd279bc..a65f073d9 100644 --- a/fastlane/metadata/android/en-US/changelogs/144.txt +++ b/fastlane/metadata/android/en-US/changelogs/150.txt @@ -1,4 +1,4 @@ -In v1.12.4: +In v1.12.10: - play more kinds of motion photos -- enjoy the app in Galician +- enjoy the app in Galician and Kannada Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/14401.txt b/fastlane/metadata/android/en-US/changelogs/15001.txt similarity index 56% rename from fastlane/metadata/android/en-US/changelogs/14401.txt rename to fastlane/metadata/android/en-US/changelogs/15001.txt index cbdd279bc..a65f073d9 100644 --- a/fastlane/metadata/android/en-US/changelogs/14401.txt +++ b/fastlane/metadata/android/en-US/changelogs/15001.txt @@ -1,4 +1,4 @@ -In v1.12.4: +In v1.12.10: - play more kinds of motion photos -- enjoy the app in Galician +- enjoy the app in Galician and Kannada Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/he/full_description.txt b/fastlane/metadata/android/he/full_description.txt index 23a3d6235..62bbf0d4a 100644 --- a/fastlane/metadata/android/he/full_description.txt +++ b/fastlane/metadata/android/he/full_description.txt @@ -1,5 +1,5 @@ -Aves can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like multi-page TIFFs, SVGs, old AVIs and more! It scans your media collection to identify motion photos, panoramas (aka photo spheres), 360° videos, as well as GeoTIFF files. +Aves יכול להתמודד עם כל מיני תמונות וסרטונים, כולל קובצי JPEG ו-MP4 הטיפוסיים שלך, אבל גם דברים אקזוטיים יותר כמו TIFF מרובי עמודים, SVGs, AVI ישנים ועוד! הוא סורק את אוסף המדיה שלך כדי לזהות תמונות תנועה, פנורמות (הידוע גם בתמונות פנורמיות), סרטוני 360°, וכן קבצי GeoTIFF. -Navigation and search is an important part of Aves. The goal is for users to easily flow from albums to photos to tags to maps, etc. +ניווט וחיפוש הם חלק חשוב ב-Aves. המטרה היא שהמשתמשים יזרמו בקלות מאלבומים לתמונות לתגים למפות וכו'. -Aves integrates with Android (including Android TV) with features such as widgets, app shortcuts, screen saver and global search handling. It also works as a media viewer and picker. +Aves משתלב עם Android (כולל Android TV) עם תכונות כגון ווידג'טים, קיצורי אפליקציות, שומר מסך וטיפול בחיפוש גלובלי. הוא פועל גם כמציג ובוחר מדיה. diff --git a/fastlane/metadata/android/he/short_description.txt b/fastlane/metadata/android/he/short_description.txt index 8c9445bd5..e4190231d 100644 --- a/fastlane/metadata/android/he/short_description.txt +++ b/fastlane/metadata/android/he/short_description.txt @@ -1 +1 @@ -Gallery and metadata explorer \ No newline at end of file +סייר גלריה ומטא נתונים \ No newline at end of file diff --git a/fastlane/metadata/android/ne/full_description.txt b/fastlane/metadata/android/ne/full_description.txt new file mode 100644 index 000000000..23a3d6235 --- /dev/null +++ b/fastlane/metadata/android/ne/full_description.txt @@ -0,0 +1,5 @@ +Aves can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like multi-page TIFFs, SVGs, old AVIs and more! It scans your media collection to identify motion photos, panoramas (aka photo spheres), 360° videos, as well as GeoTIFF files. + +Navigation and search is an important part of Aves. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +Aves integrates with Android (including Android TV) with features such as widgets, app shortcuts, screen saver and global search handling. It also works as a media viewer and picker. diff --git a/fastlane/metadata/android/ne/short_description.txt b/fastlane/metadata/android/ne/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/ne/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 2c1c05250..251fc10a8 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -1608,5 +1608,9 @@ "editEntryLocationDialogTimeShift": "التحول الزمني", "@editEntryLocationDialogTimeShift": {}, "removeEntryMetadataDialogAll": "الكل", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "حسب المسار", + "@sortByPath": {}, + "searchFormatSectionTitle": "التنسيقات", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index 715917fac..bf27b0f08 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -266,7 +266,7 @@ "@welcomeMessage": {}, "welcomeOptional": "Опционално", "@welcomeOptional": {}, - "itemCount": "{count, plural, =1{{count} обект} few{{count} обекта} other{{count} обекта}}", + "itemCount": "{count, plural, =1{{count} елемент} few{{count} елемента} other{{count} елемента}}", "@itemCount": { "placeholders": { "count": { @@ -663,7 +663,7 @@ "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "ПРОДЪЛЖИ", "@videoResumeButtonLabel": {}, - "setCoverDialogLatest": "Последен обект", + "setCoverDialogLatest": "Последен елемент", "@setCoverDialogLatest": {}, "setCoverDialogCustom": "Персонален", "@setCoverDialogCustom": {}, @@ -725,7 +725,7 @@ "@exportEntryDialogWriteMetadata": {}, "renameEntryDialogLabel": "Ново име", "@renameEntryDialogLabel": {}, - "editEntryDialogCopyFromItem": "Копиране от друг обект", + "editEntryDialogCopyFromItem": "Копиране от друг елемент", "@editEntryDialogCopyFromItem": {}, "editEntryDialogTargetFieldsHeader": "Полета за промяна", "@editEntryDialogTargetFieldsHeader": {}, @@ -1454,7 +1454,7 @@ "@settingsAllowErrorReporting": {}, "settingsEnableBin": "Използвайте кошчето", "@settingsEnableBin": {}, - "settingsEnableBinSubtitle": "Съхранявайте изтритите обекти за 30 дни", + "settingsEnableBinSubtitle": "Съхранявайте изтритите елементи за 30 дни", "@settingsEnableBinSubtitle": {}, "settingsAllowMediaManagement": "Разрешаване на управление на медиите", "@settingsAllowMediaManagement": {}, diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index ac7fe39f4..df3250c3c 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1414,5 +1414,9 @@ "editEntryLocationDialogTimeShift": "Zeitverschiebung", "@editEntryLocationDialogTimeShift": {}, "removeEntryMetadataDialogAll": "Alle", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Formate", + "@searchFormatSectionTitle": {}, + "sortByPath": "Nach Pfad", + "@sortByPath": {} } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 4d53d1071..9a4e43bf9 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -758,6 +758,7 @@ "sortByAlbumFileName": "By album & file name", "sortByRating": "By rating", "sortByDuration": "By duration", + "sortByPath": "By path", "sortOrderNewestFirst": "Newest first", "sortOrderOldestFirst": "Oldest first", @@ -815,6 +816,7 @@ "searchCollectionFieldHint": "Search collection", "searchRecentSectionTitle": "Recent", "searchDateSectionTitle": "Date", + "searchFormatSectionTitle": "Formats", "searchAlbumsSectionTitle": "Albums", "searchCountriesSectionTitle": "Countries", "searchStatesSectionTitle": "States", diff --git a/lib/l10n/app_et.arb b/lib/l10n/app_et.arb index 840129e54..38cb3a67f 100644 --- a/lib/l10n/app_et.arb +++ b/lib/l10n/app_et.arb @@ -1634,5 +1634,9 @@ "editEntryLocationDialogImportGpx": "Impordi GPX-fail", "@editEntryLocationDialogImportGpx": {}, "removeEntryMetadataDialogAll": "Kõik", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "Asukoha alusel", + "@sortByPath": {}, + "searchFormatSectionTitle": "Vormingud", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index e8e56a29b..40cd6bad8 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1416,5 +1416,9 @@ "editEntryLocationDialogImportGpx": "Importer un fichier GPX", "@editEntryLocationDialogImportGpx": {}, "removeEntryMetadataDialogAll": "Tout", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "par chemin", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formats", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_he.arb b/lib/l10n/app_he.arb index d73ba56f5..bf8fa21c6 100644 --- a/lib/l10n/app_he.arb +++ b/lib/l10n/app_he.arb @@ -6,5 +6,143 @@ "welcomeOptional": "אופציונלי", "@welcomeOptional": {}, "welcomeTermsToggle": "אני מסכימ/ה לתנאים", - "@welcomeTermsToggle": {} + "@welcomeTermsToggle": {}, + "chipActionShowCollection": "הצג באוסף", + "@chipActionShowCollection": {}, + "chipActionGoToAlbumPage": "הצג באלבום", + "@chipActionGoToAlbumPage": {}, + "chipActionFilterIn": "סנן לבתוך", + "@chipActionFilterIn": {}, + "chipActionFilterOut": "סנן החוצה", + "@chipActionFilterOut": {}, + "chipActionPin": "הצמד למעלה", + "@chipActionPin": {}, + "chipActionUnpin": "בטל הצמד למעלה", + "@chipActionUnpin": {}, + "chipActionRename": "שנה שם", + "@chipActionRename": {}, + "applyTooltip": "החל", + "@applyTooltip": {}, + "changeTooltip": "שינוי", + "@changeTooltip": {}, + "clearTooltip": "ניקוי", + "@clearTooltip": {}, + "previousTooltip": "הקודם", + "@previousTooltip": {}, + "nextTooltip": "הבא", + "@nextTooltip": {}, + "resetTooltip": "אפס", + "@resetTooltip": {}, + "saveTooltip": "שמור", + "@saveTooltip": {}, + "pickTooltip": "בחר", + "@pickTooltip": {}, + "chipActionGoToPlacePage": "הצג במקומות", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "הצג בתגיות", + "@chipActionGoToTagPage": {}, + "chipActionDecompose": "פיצול", + "@chipActionDecompose": {}, + "chipActionHide": "הסתר", + "@chipActionHide": {}, + "chipActionLock": "נעל", + "@chipActionLock": {}, + "applyButtonLabel": "החל", + "@applyButtonLabel": {}, + "nextButtonLabel": "הבא", + "@nextButtonLabel": {}, + "showButtonLabel": "הצג", + "@showButtonLabel": {}, + "hideButtonLabel": "הסתר", + "@hideButtonLabel": {}, + "continueButtonLabel": "המשך", + "@continueButtonLabel": {}, + "cancelTooltip": "ביטול", + "@cancelTooltip": {}, + "columnCount": "{count, plural, =1{{count} עמודה} other{{count} עמודות}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "itemCount": "{count, plural, =1{{count} פריט} other{{count} פריטים}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "deleteButtonLabel": "מחק", + "@deleteButtonLabel": {}, + "doubleBackExitMessage": "כדי לצאת הקש שוב על \"חזרה\".", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "אל תשאל שוב", + "@doNotAskAgain": {}, + "sourceStateLocatingPlaces": "טוען מקומות", + "@sourceStateLocatingPlaces": {}, + "chipActionRemove": "הסר", + "@chipActionRemove": {}, + "timeSeconds": "{count, plural, =1{{count} שניה} other{{count} שניות}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} דקה} other{{count} דקות}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} יום} other{{count} ימים}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "saveCopyButtonLabel": "שמור עותק", + "@saveCopyButtonLabel": {}, + "chipActionGoToCountryPage": "הצג במדינות", + "@chipActionGoToCountryPage": {}, + "chipActionDelete": "מחק", + "@chipActionDelete": {}, + "hideTooltip": "הסתר", + "@hideTooltip": {}, + "showTooltip": "הצג", + "@showTooltip": {}, + "sourceStateLoading": "טוען", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "מקטלג", + "@sourceStateCataloguing": {}, + "actionRemove": "הסרה", + "@actionRemove": {}, + "sourceStateLocatingCountries": "טוען מדינות", + "@sourceStateLocatingCountries": {}, + "stopTooltip": "עצור", + "@stopTooltip": {}, + "chipActionGoToExplorerPage": "הצג בסייר", + "@chipActionGoToExplorerPage": {} } diff --git a/lib/l10n/app_is.arb b/lib/l10n/app_is.arb index 271d5f9f1..8c4e146dd 100644 --- a/lib/l10n/app_is.arb +++ b/lib/l10n/app_is.arb @@ -1608,5 +1608,9 @@ "editEntryLocationDialogTimeShift": "Tímahliðrun", "@editEntryLocationDialogTimeShift": {}, "removeEntryMetadataDialogAll": "Allt", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Snið", + "@searchFormatSectionTitle": {}, + "sortByPath": "Eftir slóð", + "@sortByPath": {} } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 4a2abaf75..fbca071ea 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -1416,5 +1416,9 @@ "editEntryLocationDialogImportGpx": "GPX 가져오기", "@editEntryLocationDialogImportGpx": {}, "removeEntryMetadataDialogAll": "모두", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "경로", + "@sortByPath": {}, + "searchFormatSectionTitle": "형식", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_ne.arb b/lib/l10n/app_ne.arb new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/lib/l10n/app_ne.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 9668eea77..eff28966f 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -465,7 +465,7 @@ "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Layout", "@viewDialogLayoutSectionTitle": {}, - "viewDialogReverseSortOrder": "Draai sorteerrichting om", + "viewDialogReverseSortOrder": "Sortering omkeren", "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mozaïek", "@tileLayoutMosaic": {}, @@ -637,9 +637,9 @@ "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Oudste eerst", "@sortOrderOldestFirst": {}, - "sortOrderAtoZ": "A tot Z", + "sortOrderAtoZ": "A - Z", "@sortOrderAtoZ": {}, - "sortOrderZtoA": "Z tot A", + "sortOrderZtoA": "Z - A", "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Hoogste eerst", "@sortOrderHighestFirst": {}, @@ -1417,5 +1417,9 @@ "editEntryLocationDialogTimeShift": "Verschuiving van de tijd", "@editEntryLocationDialogTimeShift": {}, "removeEntryMetadataDialogAll": "Alle", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Formaten", + "@searchFormatSectionTitle": {}, + "sortByPath": "Op pad", + "@sortByPath": {} } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 58598a0b3..9b02774d0 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1608,5 +1608,9 @@ "editEntryLocationDialogTimeShift": "Przesunięcie czasowe", "@editEntryLocationDialogTimeShift": {}, "removeEntryMetadataDialogAll": "Wszystko", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Formaty", + "@searchFormatSectionTitle": {}, + "sortByPath": "Według ścieżki", + "@sortByPath": {} } diff --git a/lib/l10n/app_ro.arb b/lib/l10n/app_ro.arb index ddd96552b..bd69ac1a1 100644 --- a/lib/l10n/app_ro.arb +++ b/lib/l10n/app_ro.arb @@ -1608,5 +1608,9 @@ "mapStyleOsmLiberty": "OSM Liberty", "@mapStyleOsmLiberty": {}, "removeEntryMetadataDialogAll": "Toate", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "După cale", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formate", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 7502523e3..6f1349a3a 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1416,5 +1416,7 @@ "coordinateFormatDdm": "DDM", "@coordinateFormatDdm": {}, "removeEntryMetadataDialogAll": "Все", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Форматы", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index a738428a3..349e2277b 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -1617,5 +1617,11 @@ "removeEntryMetadataDialogAll": "Allt", "@removeEntryMetadataDialogAll": {}, "coordinateFormatDdm": "DDM", - "@coordinateFormatDdm": {} + "@coordinateFormatDdm": {}, + "editEntryLocationDialogTimeShift": "Tidsskifte", + "@editEntryLocationDialogTimeShift": {}, + "sortByPath": "Efter sökväg", + "@sortByPath": {}, + "searchFormatSectionTitle": "Format", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index c7f80d8c9..1e878438a 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -1394,5 +1394,25 @@ "newAlbumDialogAlbumAlreadyExistsHelper": "Böyle bir albüm zaten var", "@newAlbumDialogAlbumAlreadyExistsHelper": {}, "videoActionShowPreviousFrame": "Önceki kareyi göster", - "@videoActionShowPreviousFrame": {} + "@videoActionShowPreviousFrame": {}, + "editEntryLocationDialogImportGpx": "GPX'i içe aktar", + "@editEntryLocationDialogImportGpx": {}, + "chipActionDecompose": "Böl", + "@chipActionDecompose": {}, + "albumTierDynamic": "Dinamik", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Yeni dinamik albüm", + "@newDynamicAlbumDialogTitle": {}, + "appExportDynamicAlbums": "Dinamik albümler", + "@appExportDynamicAlbums": {}, + "chipActionRemove": "Kaldır", + "@chipActionRemove": {}, + "dynamicAlbumAlreadyExists": "Dinamik albüm zaten var", + "@dynamicAlbumAlreadyExists": {}, + "removeEntryMetadataDialogAll": "Tümü", + "@removeEntryMetadataDialogAll": {}, + "collectionActionAddDynamicAlbum": "Dinamik albüm ekle", + "@collectionActionAddDynamicAlbum": {}, + "searchFormatSectionTitle": "Biçimler", + "@searchFormatSectionTitle": {} } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 92126f2de..65534409f 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -1608,5 +1608,9 @@ "editEntryLocationDialogTimeShift": "Зсув часу", "@editEntryLocationDialogTimeShift": {}, "removeEntryMetadataDialogAll": "Все", - "@removeEntryMetadataDialogAll": {} + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Формати", + "@searchFormatSectionTitle": {}, + "sortByPath": "Шляхом", + "@sortByPath": {} } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index e979a37f7..2ccf7609d 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1416,5 +1416,9 @@ "removeEntryMetadataDialogAll": "全部", "@removeEntryMetadataDialogAll": {}, "editEntryLocationDialogTimeShift": "时间时移", - "@editEntryLocationDialogTimeShift": {} + "@editEntryLocationDialogTimeShift": {}, + "searchFormatSectionTitle": "格式", + "@searchFormatSectionTitle": {}, + "sortByPath": "按路径", + "@sortByPath": {} } diff --git a/lib/l10ngen/app_localizations.dart b/lib/l10ngen/app_localizations.dart index 9db90f1f2..634117dae 100644 --- a/lib/l10ngen/app_localizations.dart +++ b/lib/l10ngen/app_localizations.dart @@ -37,6 +37,7 @@ import 'app_localizations_lt.dart'; import 'app_localizations_ml.dart'; import 'app_localizations_my.dart'; import 'app_localizations_nb.dart'; +import 'app_localizations_ne.dart'; import 'app_localizations_nl.dart'; import 'app_localizations_nn.dart'; import 'app_localizations_or.dart'; @@ -172,6 +173,7 @@ abstract class AppLocalizations { Locale('ml'), Locale('my'), Locale('nb'), + Locale('ne'), Locale('nl'), Locale('nn'), Locale('or'), @@ -2713,6 +2715,12 @@ abstract class AppLocalizations { /// **'By duration'** String get sortByDuration; + /// No description provided for @sortByPath. + /// + /// In en, this message translates to: + /// **'By path'** + String get sortByPath; + /// No description provided for @sortOrderNewestFirst. /// /// In en, this message translates to: @@ -2971,6 +2979,12 @@ abstract class AppLocalizations { /// **'Date'** String get searchDateSectionTitle; + /// No description provided for @searchFormatSectionTitle. + /// + /// In en, this message translates to: + /// **'Formats'** + String get searchFormatSectionTitle; + /// No description provided for @searchAlbumsSectionTitle. /// /// In en, this message translates to: @@ -4439,7 +4453,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['ar', 'az', 'be', 'bg', 'bn', 'ca', 'ckb', 'cs', 'da', 'de', 'el', 'en', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'he', 'hi', 'hu', 'id', 'is', 'it', 'ja', 'kn', 'ko', 'lt', 'ml', 'my', 'nb', 'nl', 'nn', 'or', 'pl', 'pt', 'ro', 'ru', 'sat', 'sk', 'sl', 'sr', 'sv', 'ta', 'th', 'tr', 'uk', 'vi', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['ar', 'az', 'be', 'bg', 'bn', 'ca', 'ckb', 'cs', 'da', 'de', 'el', 'en', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'he', 'hi', 'hu', 'id', 'is', 'it', 'ja', 'kn', 'ko', 'lt', 'ml', 'my', 'nb', 'ne', 'nl', 'nn', 'or', 'pl', 'pt', 'ro', 'ru', 'sat', 'sk', 'sl', 'sr', 'sv', 'ta', 'th', 'tr', 'uk', 'vi', 'zh'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -4497,6 +4511,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { case 'ml': return AppLocalizationsMl(); case 'my': return AppLocalizationsMy(); case 'nb': return AppLocalizationsNb(); + case 'ne': return AppLocalizationsNe(); case 'nl': return AppLocalizationsNl(); case 'nn': return AppLocalizationsNn(); case 'or': return AppLocalizationsOr(); diff --git a/lib/l10ngen/app_localizations_ar.dart b/lib/l10ngen/app_localizations_ar.dart index 2d7b0351c..bd7345d11 100644 --- a/lib/l10ngen/app_localizations_ar.dart +++ b/lib/l10ngen/app_localizations_ar.dart @@ -1451,6 +1451,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get sortByDuration => 'حسب المدة'; + @override + String get sortByPath => 'حسب المسار'; + @override String get sortOrderNewestFirst => 'الأحدث أولاً'; @@ -1580,6 +1583,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get searchDateSectionTitle => 'تاريخ'; + @override + String get searchFormatSectionTitle => 'التنسيقات'; + @override String get searchAlbumsSectionTitle => 'الألبومات'; diff --git a/lib/l10ngen/app_localizations_az.dart b/lib/l10ngen/app_localizations_az.dart index 3d2f7f9ac..902b1307d 100644 --- a/lib/l10ngen/app_localizations_az.dart +++ b/lib/l10ngen/app_localizations_az.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsAz extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsAz extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_be.dart b/lib/l10ngen/app_localizations_be.dart index c9e13c55d..5474d00b4 100644 --- a/lib/l10ngen/app_localizations_be.dart +++ b/lib/l10ngen/app_localizations_be.dart @@ -1469,6 +1469,9 @@ class AppLocalizationsBe extends AppLocalizations { @override String get sortByDuration => 'Па працягласці'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Спачатку самае новае'; @@ -1598,6 +1601,9 @@ class AppLocalizationsBe extends AppLocalizations { @override String get searchDateSectionTitle => 'Дата'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Альбомы'; diff --git a/lib/l10ngen/app_localizations_bg.dart b/lib/l10ngen/app_localizations_bg.dart index b57feb387..b8a5b4866 100644 --- a/lib/l10ngen/app_localizations_bg.dart +++ b/lib/l10ngen/app_localizations_bg.dart @@ -28,9 +28,9 @@ class AppLocalizationsBg extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$countString обекта', - few: '$countString обекта', - one: '$countString обект', + other: '$countString елемента', + few: '$countString елемента', + one: '$countString елемент', ); return '$_temp0'; } @@ -814,7 +814,7 @@ class AppLocalizationsBg extends AppLocalizations { String get videoResumeButtonLabel => 'ПРОДЪЛЖИ'; @override - String get setCoverDialogLatest => 'Последен обект'; + String get setCoverDialogLatest => 'Последен елемент'; @override String get setCoverDialogAuto => 'Авто'; @@ -962,7 +962,7 @@ class AppLocalizationsBg extends AppLocalizations { String get renameEntryDialogLabel => 'Ново име'; @override - String get editEntryDialogCopyFromItem => 'Копиране от друг обект'; + String get editEntryDialogCopyFromItem => 'Копиране от друг елемент'; @override String get editEntryDialogTargetFieldsHeader => 'Полета за промяна'; @@ -1503,6 +1503,9 @@ class AppLocalizationsBg extends AppLocalizations { @override String get sortByDuration => 'По продължителност'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Първо най-новите'; @@ -1632,6 +1635,9 @@ class AppLocalizationsBg extends AppLocalizations { @override String get searchDateSectionTitle => 'Дата'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Албуми'; @@ -2050,7 +2056,7 @@ class AppLocalizationsBg extends AppLocalizations { String get settingsEnableBin => 'Използвайте кошчето'; @override - String get settingsEnableBinSubtitle => 'Съхранявайте изтритите обекти за 30 дни'; + String get settingsEnableBinSubtitle => 'Съхранявайте изтритите елементи за 30 дни'; @override String get settingsDisablingBinWarningDialogMessage => 'Елементите в кошчето ще бъдат изтрити завинаги.'; diff --git a/lib/l10ngen/app_localizations_bn.dart b/lib/l10ngen/app_localizations_bn.dart index 206db02e6..1714234fb 100644 --- a/lib/l10ngen/app_localizations_bn.dart +++ b/lib/l10ngen/app_localizations_bn.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsBn extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsBn extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_ca.dart b/lib/l10ngen/app_localizations_ca.dart index 504663324..7314cde85 100644 --- a/lib/l10ngen/app_localizations_ca.dart +++ b/lib/l10ngen/app_localizations_ca.dart @@ -1451,6 +1451,9 @@ class AppLocalizationsCa extends AppLocalizations { @override String get sortByDuration => 'Per durada'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Primer el més nou'; @@ -1580,6 +1583,9 @@ class AppLocalizationsCa extends AppLocalizations { @override String get searchDateSectionTitle => 'Data'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Àlbums'; diff --git a/lib/l10ngen/app_localizations_ckb.dart b/lib/l10ngen/app_localizations_ckb.dart index f434ad2c4..4336a9dd5 100644 --- a/lib/l10ngen/app_localizations_ckb.dart +++ b/lib/l10ngen/app_localizations_ckb.dart @@ -1488,6 +1488,9 @@ class AppLocalizationsCkb extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1617,6 +1620,9 @@ class AppLocalizationsCkb extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_cs.dart b/lib/l10ngen/app_localizations_cs.dart index a4735547e..9e1801924 100644 --- a/lib/l10ngen/app_localizations_cs.dart +++ b/lib/l10ngen/app_localizations_cs.dart @@ -1464,6 +1464,9 @@ class AppLocalizationsCs extends AppLocalizations { @override String get sortByDuration => 'Podle trvání'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Od nejnovějšího'; @@ -1593,6 +1596,9 @@ class AppLocalizationsCs extends AppLocalizations { @override String get searchDateSectionTitle => 'Datum'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Alba'; diff --git a/lib/l10ngen/app_localizations_da.dart b/lib/l10ngen/app_localizations_da.dart index 36737cbef..91d0f70b7 100644 --- a/lib/l10ngen/app_localizations_da.dart +++ b/lib/l10ngen/app_localizations_da.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsDa extends AppLocalizations { @override String get sortByDuration => 'Efter varighed'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Nyeste først'; @@ -1628,6 +1631,9 @@ class AppLocalizationsDa extends AppLocalizations { @override String get searchDateSectionTitle => 'Dato'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Album'; diff --git a/lib/l10ngen/app_localizations_de.dart b/lib/l10ngen/app_localizations_de.dart index 406ef5ea3..66e789ab5 100644 --- a/lib/l10ngen/app_localizations_de.dart +++ b/lib/l10ngen/app_localizations_de.dart @@ -1496,6 +1496,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get sortByDuration => 'Nach Dauer'; + @override + String get sortByPath => 'Nach Pfad'; + @override String get sortOrderNewestFirst => 'Neueste zuerst'; @@ -1625,6 +1628,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get searchDateSectionTitle => 'Datum'; + @override + String get searchFormatSectionTitle => 'Formate'; + @override String get searchAlbumsSectionTitle => 'Alben'; diff --git a/lib/l10ngen/app_localizations_el.dart b/lib/l10ngen/app_localizations_el.dart index d5ba6f9aa..96bd7f14c 100644 --- a/lib/l10ngen/app_localizations_el.dart +++ b/lib/l10ngen/app_localizations_el.dart @@ -1496,6 +1496,9 @@ class AppLocalizationsEl extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Τα πιο πρόσφατα πρώτα'; @@ -1625,6 +1628,9 @@ class AppLocalizationsEl extends AppLocalizations { @override String get searchDateSectionTitle => 'Ημερομηνια'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Άλμπουμ'; diff --git a/lib/l10ngen/app_localizations_en.dart b/lib/l10ngen/app_localizations_en.dart index b56ba1634..055e31a71 100644 --- a/lib/l10ngen/app_localizations_en.dart +++ b/lib/l10ngen/app_localizations_en.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_es.dart b/lib/l10ngen/app_localizations_es.dart index edd3524eb..241eb3c3c 100644 --- a/lib/l10ngen/app_localizations_es.dart +++ b/lib/l10ngen/app_localizations_es.dart @@ -1496,6 +1496,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get sortByDuration => 'Por duración'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'El más nuevo primero'; @@ -1625,6 +1628,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get searchDateSectionTitle => 'Fecha'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Álbumes'; diff --git a/lib/l10ngen/app_localizations_et.dart b/lib/l10ngen/app_localizations_et.dart index 22cd00169..38856b654 100644 --- a/lib/l10ngen/app_localizations_et.dart +++ b/lib/l10ngen/app_localizations_et.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsEt extends AppLocalizations { @override String get sortByDuration => 'Kestuse järgi'; + @override + String get sortByPath => 'Asukoha alusel'; + @override String get sortOrderNewestFirst => 'Esmalt uuemad'; @@ -1628,6 +1631,9 @@ class AppLocalizationsEt extends AppLocalizations { @override String get searchDateSectionTitle => 'Kuupäevad'; + @override + String get searchFormatSectionTitle => 'Vormingud'; + @override String get searchAlbumsSectionTitle => 'Albumid'; diff --git a/lib/l10ngen/app_localizations_eu.dart b/lib/l10ngen/app_localizations_eu.dart index 3dc73c323..84f7155e3 100644 --- a/lib/l10ngen/app_localizations_eu.dart +++ b/lib/l10ngen/app_localizations_eu.dart @@ -1451,6 +1451,9 @@ class AppLocalizationsEu extends AppLocalizations { @override String get sortByDuration => 'Iraupenaren arabera'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Berriena lehenengo'; @@ -1580,6 +1583,9 @@ class AppLocalizationsEu extends AppLocalizations { @override String get searchDateSectionTitle => 'Data'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albumak'; diff --git a/lib/l10ngen/app_localizations_fa.dart b/lib/l10ngen/app_localizations_fa.dart index bb73df9ac..ee8ba4540 100644 --- a/lib/l10ngen/app_localizations_fa.dart +++ b/lib/l10ngen/app_localizations_fa.dart @@ -1448,6 +1448,9 @@ class AppLocalizationsFa extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'اول جدیدترین'; @@ -1577,6 +1580,9 @@ class AppLocalizationsFa extends AppLocalizations { @override String get searchDateSectionTitle => 'تاریخ'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'آلبوم ها'; diff --git a/lib/l10ngen/app_localizations_fi.dart b/lib/l10ngen/app_localizations_fi.dart index 63838c367..759701db8 100644 --- a/lib/l10ngen/app_localizations_fi.dart +++ b/lib/l10ngen/app_localizations_fi.dart @@ -1493,6 +1493,9 @@ class AppLocalizationsFi extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1622,6 +1625,9 @@ class AppLocalizationsFi extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_fr.dart b/lib/l10ngen/app_localizations_fr.dart index 1de161181..c1b693df4 100644 --- a/lib/l10ngen/app_localizations_fr.dart +++ b/lib/l10ngen/app_localizations_fr.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get sortByDuration => 'par durée'; + @override + String get sortByPath => 'par chemin'; + @override String get sortOrderNewestFirst => 'Plus récents d’abord'; @@ -1628,6 +1631,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_gl.dart b/lib/l10ngen/app_localizations_gl.dart index eaebd895c..4733d2fb5 100644 --- a/lib/l10ngen/app_localizations_gl.dart +++ b/lib/l10ngen/app_localizations_gl.dart @@ -1496,6 +1496,9 @@ class AppLocalizationsGl extends AppLocalizations { @override String get sortByDuration => 'Por duración'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Novos primeiro'; @@ -1625,6 +1628,9 @@ class AppLocalizationsGl extends AppLocalizations { @override String get searchDateSectionTitle => 'Data'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Álbums'; diff --git a/lib/l10ngen/app_localizations_he.dart b/lib/l10ngen/app_localizations_he.dart index 39e16a014..fc3535e2a 100644 --- a/lib/l10ngen/app_localizations_he.dart +++ b/lib/l10ngen/app_localizations_he.dart @@ -28,8 +28,8 @@ class AppLocalizationsHe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$countString items', - one: '$countString item', + other: '$countString פריטים', + one: '$countString פריט', ); return '$_temp0'; } @@ -42,8 +42,8 @@ class AppLocalizationsHe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$countString columns', - one: '$countString column', + other: '$countString עמודות', + one: '$countString עמודה', ); return '$_temp0'; } @@ -56,8 +56,8 @@ class AppLocalizationsHe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$countString seconds', - one: '$countString second', + other: '$countString שניות', + one: '$countString שניה', ); return '$_temp0'; } @@ -70,8 +70,8 @@ class AppLocalizationsHe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$countString minutes', - one: '$countString minute', + other: '$countString דקות', + one: '$countString דקה', ); return '$_temp0'; } @@ -84,8 +84,8 @@ class AppLocalizationsHe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$countString days', - one: '$countString day', + other: '$countString ימים', + one: '$countString יום', ); return '$_temp0'; } @@ -96,130 +96,130 @@ class AppLocalizationsHe extends AppLocalizations { } @override - String get applyButtonLabel => 'APPLY'; + String get applyButtonLabel => 'החל'; @override - String get deleteButtonLabel => 'DELETE'; + String get deleteButtonLabel => 'מחק'; @override - String get nextButtonLabel => 'NEXT'; + String get nextButtonLabel => 'הבא'; @override - String get showButtonLabel => 'SHOW'; + String get showButtonLabel => 'הצג'; @override - String get hideButtonLabel => 'HIDE'; + String get hideButtonLabel => 'הסתר'; @override - String get continueButtonLabel => 'CONTINUE'; + String get continueButtonLabel => 'המשך'; @override - String get saveCopyButtonLabel => 'SAVE COPY'; + String get saveCopyButtonLabel => 'שמור עותק'; @override - String get applyTooltip => 'Apply'; + String get applyTooltip => 'החל'; @override - String get cancelTooltip => 'Cancel'; + String get cancelTooltip => 'ביטול'; @override - String get changeTooltip => 'Change'; + String get changeTooltip => 'שינוי'; @override - String get clearTooltip => 'Clear'; + String get clearTooltip => 'ניקוי'; @override - String get previousTooltip => 'Previous'; + String get previousTooltip => 'הקודם'; @override - String get nextTooltip => 'Next'; + String get nextTooltip => 'הבא'; @override - String get showTooltip => 'Show'; + String get showTooltip => 'הצג'; @override - String get hideTooltip => 'Hide'; + String get hideTooltip => 'הסתר'; @override - String get actionRemove => 'Remove'; + String get actionRemove => 'הסרה'; @override - String get resetTooltip => 'Reset'; + String get resetTooltip => 'אפס'; @override - String get saveTooltip => 'Save'; + String get saveTooltip => 'שמור'; @override - String get stopTooltip => 'Stop'; + String get stopTooltip => 'עצור'; @override - String get pickTooltip => 'Pick'; + String get pickTooltip => 'בחר'; @override - String get doubleBackExitMessage => 'Tap “back” again to exit.'; + String get doubleBackExitMessage => 'כדי לצאת הקש שוב על \"חזרה\".'; @override - String get doNotAskAgain => 'Do not ask again'; + String get doNotAskAgain => 'אל תשאל שוב'; @override - String get sourceStateLoading => 'Loading'; + String get sourceStateLoading => 'טוען'; @override - String get sourceStateCataloguing => 'Cataloguing'; + String get sourceStateCataloguing => 'מקטלג'; @override - String get sourceStateLocatingCountries => 'Locating countries'; + String get sourceStateLocatingCountries => 'טוען מדינות'; @override - String get sourceStateLocatingPlaces => 'Locating places'; + String get sourceStateLocatingPlaces => 'טוען מקומות'; @override - String get chipActionDelete => 'Delete'; + String get chipActionDelete => 'מחק'; @override - String get chipActionRemove => 'Remove'; + String get chipActionRemove => 'הסר'; @override - String get chipActionShowCollection => 'Show in Collection'; + String get chipActionShowCollection => 'הצג באוסף'; @override - String get chipActionGoToAlbumPage => 'Show in Albums'; + String get chipActionGoToAlbumPage => 'הצג באלבום'; @override - String get chipActionGoToCountryPage => 'Show in Countries'; + String get chipActionGoToCountryPage => 'הצג במדינות'; @override - String get chipActionGoToPlacePage => 'Show in Places'; + String get chipActionGoToPlacePage => 'הצג במקומות'; @override - String get chipActionGoToTagPage => 'Show in Tags'; + String get chipActionGoToTagPage => 'הצג בתגיות'; @override - String get chipActionGoToExplorerPage => 'Show in Explorer'; + String get chipActionGoToExplorerPage => 'הצג בסייר'; @override - String get chipActionDecompose => 'Split'; + String get chipActionDecompose => 'פיצול'; @override - String get chipActionFilterOut => 'Filter out'; + String get chipActionFilterOut => 'סנן החוצה'; @override - String get chipActionFilterIn => 'Filter in'; + String get chipActionFilterIn => 'סנן לבתוך'; @override - String get chipActionHide => 'Hide'; + String get chipActionHide => 'הסתר'; @override - String get chipActionLock => 'Lock'; + String get chipActionLock => 'נעל'; @override - String get chipActionPin => 'Pin to top'; + String get chipActionPin => 'הצמד למעלה'; @override - String get chipActionUnpin => 'Unpin from top'; + String get chipActionUnpin => 'בטל הצמד למעלה'; @override - String get chipActionRename => 'Rename'; + String get chipActionRename => 'שנה שם'; @override String get chipActionSetCover => 'Set cover'; @@ -1499,6 +1499,9 @@ class AppLocalizationsHe extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsHe extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_hi.dart b/lib/l10ngen/app_localizations_hi.dart index cf0f30fae..bfd9aa858 100644 --- a/lib/l10ngen/app_localizations_hi.dart +++ b/lib/l10ngen/app_localizations_hi.dart @@ -1490,6 +1490,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get sortByDuration => 'समय के अनुसार'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'नए पहले'; @@ -1619,6 +1622,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get searchDateSectionTitle => 'दिनांक'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'एल्बम'; diff --git a/lib/l10ngen/app_localizations_hu.dart b/lib/l10ngen/app_localizations_hu.dart index a8c9da4ae..395b40ad8 100644 --- a/lib/l10ngen/app_localizations_hu.dart +++ b/lib/l10ngen/app_localizations_hu.dart @@ -1446,6 +1446,9 @@ class AppLocalizationsHu extends AppLocalizations { @override String get sortByDuration => 'Hossz szerint'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Legújabb legelöl'; @@ -1575,6 +1578,9 @@ class AppLocalizationsHu extends AppLocalizations { @override String get searchDateSectionTitle => 'Dátum'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albumok'; diff --git a/lib/l10ngen/app_localizations_id.dart b/lib/l10ngen/app_localizations_id.dart index 875e83fd1..009a06d09 100644 --- a/lib/l10ngen/app_localizations_id.dart +++ b/lib/l10ngen/app_localizations_id.dart @@ -1480,6 +1480,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get sortByDuration => 'Berdasarkan durasi'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Terbaru pertama'; @@ -1609,6 +1612,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get searchDateSectionTitle => 'Tanggal'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Album'; diff --git a/lib/l10ngen/app_localizations_is.dart b/lib/l10ngen/app_localizations_is.dart index 63d747568..b86b64fbe 100644 --- a/lib/l10ngen/app_localizations_is.dart +++ b/lib/l10ngen/app_localizations_is.dart @@ -1451,6 +1451,9 @@ class AppLocalizationsIs extends AppLocalizations { @override String get sortByDuration => 'Eftir tímalengd'; + @override + String get sortByPath => 'Eftir slóð'; + @override String get sortOrderNewestFirst => 'Nýjast fyrst'; @@ -1580,6 +1583,9 @@ class AppLocalizationsIs extends AppLocalizations { @override String get searchDateSectionTitle => 'Dagsetning'; + @override + String get searchFormatSectionTitle => 'Snið'; + @override String get searchAlbumsSectionTitle => 'Albúm'; diff --git a/lib/l10ngen/app_localizations_it.dart b/lib/l10ngen/app_localizations_it.dart index 52e1a4ee0..4d58a53ab 100644 --- a/lib/l10ngen/app_localizations_it.dart +++ b/lib/l10ngen/app_localizations_it.dart @@ -1496,6 +1496,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get sortByDuration => 'Per durata'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Dal più nuovo'; @@ -1625,6 +1628,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get searchDateSectionTitle => 'Data'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Album'; diff --git a/lib/l10ngen/app_localizations_ja.dart b/lib/l10ngen/app_localizations_ja.dart index 8d3dcb62e..928a6fddd 100644 --- a/lib/l10ngen/app_localizations_ja.dart +++ b/lib/l10ngen/app_localizations_ja.dart @@ -1480,6 +1480,9 @@ class AppLocalizationsJa extends AppLocalizations { @override String get sortByDuration => '期間順'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => '新しいものから表示'; @@ -1609,6 +1612,9 @@ class AppLocalizationsJa extends AppLocalizations { @override String get searchDateSectionTitle => '日付'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'アルバム'; diff --git a/lib/l10ngen/app_localizations_kn.dart b/lib/l10ngen/app_localizations_kn.dart index 3b7c736e8..a515cb37d 100644 --- a/lib/l10ngen/app_localizations_kn.dart +++ b/lib/l10ngen/app_localizations_kn.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsKn extends AppLocalizations { @override String get sortByDuration => 'ಅವಧಿಯಂತೆ'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'ಹೊಸದು ಮೊದಲು'; @@ -1628,6 +1631,9 @@ class AppLocalizationsKn extends AppLocalizations { @override String get searchDateSectionTitle => 'ದಿನಾಂಕ'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'ಆಲ್ಬಮ್ ಗಳು'; diff --git a/lib/l10ngen/app_localizations_ko.dart b/lib/l10ngen/app_localizations_ko.dart index e1ac8d4de..3ffa77937 100644 --- a/lib/l10ngen/app_localizations_ko.dart +++ b/lib/l10ngen/app_localizations_ko.dart @@ -1478,6 +1478,9 @@ class AppLocalizationsKo extends AppLocalizations { @override String get sortByDuration => '길이'; + @override + String get sortByPath => '경로'; + @override String get sortOrderNewestFirst => '최근 날짜순'; @@ -1607,6 +1610,9 @@ class AppLocalizationsKo extends AppLocalizations { @override String get searchDateSectionTitle => '날짜'; + @override + String get searchFormatSectionTitle => '형식'; + @override String get searchAlbumsSectionTitle => '앨범'; diff --git a/lib/l10ngen/app_localizations_lt.dart b/lib/l10ngen/app_localizations_lt.dart index 9797d52a3..ba4ca116f 100644 --- a/lib/l10ngen/app_localizations_lt.dart +++ b/lib/l10ngen/app_localizations_lt.dart @@ -1458,6 +1458,9 @@ class AppLocalizationsLt extends AppLocalizations { @override String get sortByDuration => 'Pagal trukmę'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Naujausi viršuje'; @@ -1587,6 +1590,9 @@ class AppLocalizationsLt extends AppLocalizations { @override String get searchDateSectionTitle => 'Datos'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albumai'; diff --git a/lib/l10ngen/app_localizations_ml.dart b/lib/l10ngen/app_localizations_ml.dart index 1766ef1c5..5a302a86d 100644 --- a/lib/l10ngen/app_localizations_ml.dart +++ b/lib/l10ngen/app_localizations_ml.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsMl extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsMl extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_my.dart b/lib/l10ngen/app_localizations_my.dart index 21d5fb9ba..90fda817f 100644 --- a/lib/l10ngen/app_localizations_my.dart +++ b/lib/l10ngen/app_localizations_my.dart @@ -1460,6 +1460,9 @@ class AppLocalizationsMy extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'အသစ်ဆုံးက ထိပ်ဆုံး'; @@ -1589,6 +1592,9 @@ class AppLocalizationsMy extends AppLocalizations { @override String get searchDateSectionTitle => 'ရက်စွဲ'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'အယ်လ်ဘမ်များ'; diff --git a/lib/l10ngen/app_localizations_nb.dart b/lib/l10ngen/app_localizations_nb.dart index 034ab0616..17dc2750f 100644 --- a/lib/l10ngen/app_localizations_nb.dart +++ b/lib/l10ngen/app_localizations_nb.dart @@ -1451,6 +1451,9 @@ class AppLocalizationsNb extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Nyeste først'; @@ -1580,6 +1583,9 @@ class AppLocalizationsNb extends AppLocalizations { @override String get searchDateSectionTitle => 'Dato'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Album'; diff --git a/lib/l10ngen/app_localizations_ne.dart b/lib/l10ngen/app_localizations_ne.dart new file mode 100644 index 000000000..658caac50 --- /dev/null +++ b/lib/l10ngen/app_localizations_ne.dart @@ -0,0 +1,2376 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Nepali (`ne`). +class AppLocalizationsNe extends AppLocalizations { + AppLocalizationsNe([String locale = 'ne']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welcome to Aves'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Group'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get collectionGroupNone => 'Do not group'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & file name'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumGroupNone => 'Do not group'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsShowBottomNavigationBar => 'Show bottom navigation bar'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; + + @override + String get filePickerShowHiddenFiles => 'Show hidden files'; + + @override + String get filePickerDoNotShowHiddenFiles => 'Don’t show hidden files'; + + @override + String get filePickerOpenFrom => 'Open from'; + + @override + String get filePickerNoItems => 'No items'; + + @override + String get filePickerUseThisFolder => 'Use this folder'; +} diff --git a/lib/l10ngen/app_localizations_nl.dart b/lib/l10ngen/app_localizations_nl.dart index e6574e24b..ac971733c 100644 --- a/lib/l10ngen/app_localizations_nl.dart +++ b/lib/l10ngen/app_localizations_nl.dart @@ -1092,7 +1092,7 @@ class AppLocalizationsNl extends AppLocalizations { String get viewDialogLayoutSectionTitle => 'Layout'; @override - String get viewDialogReverseSortOrder => 'Draai sorteerrichting om'; + String get viewDialogReverseSortOrder => 'Sortering omkeren'; @override String get tileLayoutMosaic => 'Mozaïek'; @@ -1498,6 +1498,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get sortByDuration => 'Op lengte'; + @override + String get sortByPath => 'Op pad'; + @override String get sortOrderNewestFirst => 'Nieuwste eerst'; @@ -1505,10 +1508,10 @@ class AppLocalizationsNl extends AppLocalizations { String get sortOrderOldestFirst => 'Oudste eerst'; @override - String get sortOrderAtoZ => 'A tot Z'; + String get sortOrderAtoZ => 'A - Z'; @override - String get sortOrderZtoA => 'Z tot A'; + String get sortOrderZtoA => 'Z - A'; @override String get sortOrderHighestFirst => 'Hoogste eerst'; @@ -1627,6 +1630,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get searchDateSectionTitle => 'Datum'; + @override + String get searchFormatSectionTitle => 'Formaten'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_nn.dart b/lib/l10ngen/app_localizations_nn.dart index 48903d667..2556e386b 100644 --- a/lib/l10ngen/app_localizations_nn.dart +++ b/lib/l10ngen/app_localizations_nn.dart @@ -1440,6 +1440,9 @@ class AppLocalizationsNn extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Nyaste først'; @@ -1569,6 +1572,9 @@ class AppLocalizationsNn extends AppLocalizations { @override String get searchDateSectionTitle => 'Dato'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Album'; diff --git a/lib/l10ngen/app_localizations_or.dart b/lib/l10ngen/app_localizations_or.dart index 7c1d9d048..4e793a957 100644 --- a/lib/l10ngen/app_localizations_or.dart +++ b/lib/l10ngen/app_localizations_or.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsOr extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsOr extends AppLocalizations { @override String get searchDateSectionTitle => 'ତାରିଖ'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_pl.dart b/lib/l10ngen/app_localizations_pl.dart index 223ec0bea..bb07c74cd 100644 --- a/lib/l10ngen/app_localizations_pl.dart +++ b/lib/l10ngen/app_localizations_pl.dart @@ -1461,6 +1461,9 @@ class AppLocalizationsPl extends AppLocalizations { @override String get sortByDuration => 'Według czasu trwania'; + @override + String get sortByPath => 'Według ścieżki'; + @override String get sortOrderNewestFirst => 'Najpierw najnowsze'; @@ -1590,6 +1593,9 @@ class AppLocalizationsPl extends AppLocalizations { @override String get searchDateSectionTitle => 'Data'; + @override + String get searchFormatSectionTitle => 'Formaty'; + @override String get searchAlbumsSectionTitle => 'Albumy'; diff --git a/lib/l10ngen/app_localizations_pt.dart b/lib/l10ngen/app_localizations_pt.dart index 54d0a26a4..0c03aab1b 100644 --- a/lib/l10ngen/app_localizations_pt.dart +++ b/lib/l10ngen/app_localizations_pt.dart @@ -1496,6 +1496,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get sortByDuration => 'Por duração'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Os mais novos primeiro'; @@ -1625,6 +1628,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get searchDateSectionTitle => 'Data'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Álbuns'; diff --git a/lib/l10ngen/app_localizations_ro.dart b/lib/l10ngen/app_localizations_ro.dart index 4acbf8f15..4f0953f8c 100644 --- a/lib/l10ngen/app_localizations_ro.dart +++ b/lib/l10ngen/app_localizations_ro.dart @@ -1451,6 +1451,9 @@ class AppLocalizationsRo extends AppLocalizations { @override String get sortByDuration => 'După durată'; + @override + String get sortByPath => 'După cale'; + @override String get sortOrderNewestFirst => 'Cele mai noi mai întâi'; @@ -1580,6 +1583,9 @@ class AppLocalizationsRo extends AppLocalizations { @override String get searchDateSectionTitle => 'Dată'; + @override + String get searchFormatSectionTitle => 'Formate'; + @override String get searchAlbumsSectionTitle => 'Albume'; diff --git a/lib/l10ngen/app_localizations_ru.dart b/lib/l10ngen/app_localizations_ru.dart index 052235b44..436f7e1b2 100644 --- a/lib/l10ngen/app_localizations_ru.dart +++ b/lib/l10ngen/app_localizations_ru.dart @@ -1513,6 +1513,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get sortByDuration => 'По продолжительности'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Сначала новые'; @@ -1642,6 +1645,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get searchDateSectionTitle => 'Дата'; + @override + String get searchFormatSectionTitle => 'Форматы'; + @override String get searchAlbumsSectionTitle => 'Альбомы'; diff --git a/lib/l10ngen/app_localizations_sat.dart b/lib/l10ngen/app_localizations_sat.dart index 25bff2da0..f691c216a 100644 --- a/lib/l10ngen/app_localizations_sat.dart +++ b/lib/l10ngen/app_localizations_sat.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsSat extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsSat extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_sk.dart b/lib/l10ngen/app_localizations_sk.dart index 175f3b3b9..2e406f9cd 100644 --- a/lib/l10ngen/app_localizations_sk.dart +++ b/lib/l10ngen/app_localizations_sk.dart @@ -1456,6 +1456,9 @@ class AppLocalizationsSk extends AppLocalizations { @override String get sortByDuration => 'Trvanie'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Najskôr najnovšie'; @@ -1585,6 +1588,9 @@ class AppLocalizationsSk extends AppLocalizations { @override String get searchDateSectionTitle => 'Dátum'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albumy'; diff --git a/lib/l10ngen/app_localizations_sl.dart b/lib/l10ngen/app_localizations_sl.dart index 87b187e56..1085ca0a1 100644 --- a/lib/l10ngen/app_localizations_sl.dart +++ b/lib/l10ngen/app_localizations_sl.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsSl extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsSl extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_sr.dart b/lib/l10ngen/app_localizations_sr.dart index 2f317debf..6bf41fbf9 100644 --- a/lib/l10ngen/app_localizations_sr.dart +++ b/lib/l10ngen/app_localizations_sr.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsSr extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1628,6 +1631,9 @@ class AppLocalizationsSr extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_sv.dart b/lib/l10ngen/app_localizations_sv.dart index 5fdc436c3..6ef787926 100644 --- a/lib/l10ngen/app_localizations_sv.dart +++ b/lib/l10ngen/app_localizations_sv.dart @@ -1002,7 +1002,7 @@ class AppLocalizationsSv extends AppLocalizations { String get editEntryLocationDialogLongitude => 'Longitud'; @override - String get editEntryLocationDialogTimeShift => 'Time shift'; + String get editEntryLocationDialogTimeShift => 'Tidsskifte'; @override String get locationPickerUseThisLocationButton => 'Använd den här platsen'; @@ -1479,6 +1479,9 @@ class AppLocalizationsSv extends AppLocalizations { @override String get sortByDuration => 'Efter spellängd'; + @override + String get sortByPath => 'Efter sökväg'; + @override String get sortOrderNewestFirst => 'Nyast först'; @@ -1608,6 +1611,9 @@ class AppLocalizationsSv extends AppLocalizations { @override String get searchDateSectionTitle => 'Datum'; + @override + String get searchFormatSectionTitle => 'Format'; + @override String get searchAlbumsSectionTitle => 'Album'; diff --git a/lib/l10ngen/app_localizations_ta.dart b/lib/l10ngen/app_localizations_ta.dart index 2597786a1..4855d80f9 100644 --- a/lib/l10ngen/app_localizations_ta.dart +++ b/lib/l10ngen/app_localizations_ta.dart @@ -1499,6 +1499,9 @@ class AppLocalizationsTa extends AppLocalizations { @override String get sortByDuration => 'காலப்படி'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'முதலில் புதியது'; @@ -1628,6 +1631,9 @@ class AppLocalizationsTa extends AppLocalizations { @override String get searchDateSectionTitle => 'திகதி'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'தொகுப்புகள்'; diff --git a/lib/l10ngen/app_localizations_th.dart b/lib/l10ngen/app_localizations_th.dart index 821ef9ab2..8a3eff00c 100644 --- a/lib/l10ngen/app_localizations_th.dart +++ b/lib/l10ngen/app_localizations_th.dart @@ -1487,6 +1487,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get sortByDuration => 'By duration'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Newest first'; @@ -1616,6 +1619,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get searchDateSectionTitle => 'Date'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Albums'; diff --git a/lib/l10ngen/app_localizations_tr.dart b/lib/l10ngen/app_localizations_tr.dart index 10bf1c8e5..5ae5badb5 100644 --- a/lib/l10ngen/app_localizations_tr.dart +++ b/lib/l10ngen/app_localizations_tr.dart @@ -169,7 +169,7 @@ class AppLocalizationsTr extends AppLocalizations { String get chipActionDelete => 'Sil'; @override - String get chipActionRemove => 'Remove'; + String get chipActionRemove => 'Kaldır'; @override String get chipActionShowCollection => 'Koleksiyonda göster'; @@ -190,7 +190,7 @@ class AppLocalizationsTr extends AppLocalizations { String get chipActionGoToExplorerPage => 'Gezginde göster'; @override - String get chipActionDecompose => 'Split'; + String get chipActionDecompose => 'Böl'; @override String get chipActionFilterOut => 'Dışarıda bırak'; @@ -496,7 +496,7 @@ class AppLocalizationsTr extends AppLocalizations { String get albumTierVaults => 'Kilitli albümler'; @override - String get albumTierDynamic => 'Dynamic'; + String get albumTierDynamic => 'Dinamik'; @override String get albumTierRegular => 'Diğer'; @@ -829,10 +829,10 @@ class AppLocalizationsTr extends AppLocalizations { String get newAlbumDialogStorageLabel => 'Depolama:'; @override - String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + String get newDynamicAlbumDialogTitle => 'Yeni dinamik albüm'; @override - String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + String get dynamicAlbumAlreadyExists => 'Dinamik albüm zaten var'; @override String get newVaultWarningDialogMessage => 'Kilitli albümlere yalnızca bu uygulama erişebilir, başka herhangi bir uygulama erişemez.\n\nBu uygulamayı kaldırır veya verilerini silerseniz kilitli albümlerdeki bütün ögeleri kaybedersiniz.'; @@ -992,7 +992,7 @@ class AppLocalizationsTr extends AppLocalizations { String get editEntryLocationDialogChooseOnMap => 'Harita üzerinde seç'; @override - String get editEntryLocationDialogImportGpx => 'Import GPX'; + String get editEntryLocationDialogImportGpx => 'GPX\'i içe aktar'; @override String get editEntryLocationDialogLatitude => 'Enlem'; @@ -1013,7 +1013,7 @@ class AppLocalizationsTr extends AppLocalizations { String get removeEntryMetadataDialogTitle => 'Üst Veri Kaldırma'; @override - String get removeEntryMetadataDialogAll => 'All'; + String get removeEntryMetadataDialogAll => 'Tümü'; @override String get removeEntryMetadataDialogMore => 'Daha fazla'; @@ -1217,7 +1217,7 @@ class AppLocalizationsTr extends AppLocalizations { String get collectionActionHideTitleSearch => 'Başlık filtresini gizle'; @override - String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + String get collectionActionAddDynamicAlbum => 'Dinamik albüm ekle'; @override String get collectionActionAddShortcut => 'Kısayol ekle'; @@ -1491,6 +1491,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get sortByDuration => 'Süreye göre'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Önce en yeni'; @@ -1620,6 +1623,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get searchDateSectionTitle => 'Tarih'; + @override + String get searchFormatSectionTitle => 'Biçimler'; + @override String get searchAlbumsSectionTitle => 'Albümler'; @@ -1681,7 +1687,7 @@ class AppLocalizationsTr extends AppLocalizations { String get appExportCovers => 'Kapaklar'; @override - String get appExportDynamicAlbums => 'Dynamic albums'; + String get appExportDynamicAlbums => 'Dinamik albümler'; @override String get appExportFavourites => 'Favoriler'; diff --git a/lib/l10ngen/app_localizations_uk.dart b/lib/l10ngen/app_localizations_uk.dart index 8a0254501..cd4c10aa9 100644 --- a/lib/l10ngen/app_localizations_uk.dart +++ b/lib/l10ngen/app_localizations_uk.dart @@ -1470,6 +1470,9 @@ class AppLocalizationsUk extends AppLocalizations { @override String get sortByDuration => 'За тривалістю'; + @override + String get sortByPath => 'Шляхом'; + @override String get sortOrderNewestFirst => 'Найновіші перші'; @@ -1599,6 +1602,9 @@ class AppLocalizationsUk extends AppLocalizations { @override String get searchDateSectionTitle => 'Дата'; + @override + String get searchFormatSectionTitle => 'Формати'; + @override String get searchAlbumsSectionTitle => 'Альбоми'; diff --git a/lib/l10ngen/app_localizations_vi.dart b/lib/l10ngen/app_localizations_vi.dart index a9c64c804..c16aa1c65 100644 --- a/lib/l10ngen/app_localizations_vi.dart +++ b/lib/l10ngen/app_localizations_vi.dart @@ -1446,6 +1446,9 @@ class AppLocalizationsVi extends AppLocalizations { @override String get sortByDuration => 'Theo thời lượng'; + @override + String get sortByPath => 'By path'; + @override String get sortOrderNewestFirst => 'Mới nhất trước'; @@ -1575,6 +1578,9 @@ class AppLocalizationsVi extends AppLocalizations { @override String get searchDateSectionTitle => 'Thời gian'; + @override + String get searchFormatSectionTitle => 'Formats'; + @override String get searchAlbumsSectionTitle => 'Bộ sưu tập'; diff --git a/lib/l10ngen/app_localizations_zh.dart b/lib/l10ngen/app_localizations_zh.dart index e7b520b84..ab0191725 100644 --- a/lib/l10ngen/app_localizations_zh.dart +++ b/lib/l10ngen/app_localizations_zh.dart @@ -1480,6 +1480,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get sortByDuration => '按时长'; + @override + String get sortByPath => '按路径'; + @override String get sortOrderNewestFirst => '降序'; @@ -1609,6 +1612,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get searchDateSectionTitle => '日期'; + @override + String get searchFormatSectionTitle => '格式'; + @override String get searchAlbumsSectionTitle => '相册'; diff --git a/lib/model/app/contributors.dart b/lib/model/app/contributors.dart index 57fe3d009..6cca28c6a 100644 --- a/lib/model/app/contributors.dart +++ b/lib/model/app/contributors.dart @@ -132,6 +132,9 @@ class Contributors { Contributor('hanyang cheng', 'cinxiafortis@tutanota.de'), Contributor('Chethan', 'chethan@users.noreply.hosted.weblate.org'), Contributor('Prasannakumar T Bhat', 'pbhat99@gmail.com'), + Contributor('Bora Atıcı', 'boratici.acc@gmail.com'), + Contributor('Ettore Atalan', 'atalanttore@googlemail.com'), + Contributor('VertekPlus', 'vertekplus@users.noreply.hosted.weblate.org'), // Contributor('Femini', 'nizamismidov4@gmail.com'), // Azerbaijani // Contributor('Alvi Khan', 'aveenalvi@gmail.com'), // Bengali // Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese @@ -140,6 +143,7 @@ class Contributors { // Contributor('Olli', 'ollinen@ollit.dev'), // Finnish // Contributor('Ricky Tigg', 'ricky.tigg@gmail.com'), // Finnish // Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew + // Contributor('elid', 'shopisrael12@gmail.com'), // Hebrew // Contributor('Rohit Burman', 'rohitburman31p@rediffmail.com'), // Hindi // Contributor('AJ07', 'ajaykumarmeena676@gmail.com'), // Hindi // Contributor('Sartaj', 'ssaarrttaajj111@gmail.com'), // Hindi @@ -147,6 +151,7 @@ class Contributors { // Contributor('GoRaN', 'gorangharib.909@gmail.com'), // Kurdish (Central) // Contributor('Rasti K5', 'rasti.khdhr@gmail.com'), // Kurdish (Central) // Contributor('Raman', 'xysed@tutanota.com'), // Malayalam + // Contributor('Over Barrow', 'rawixo6748@insfou.com'), // Nepali // Contributor('Subham Jena', 'subhamjena8465@gmail.com'), // Odia // Contributor('Prasanta-Hembram', 'Prasantahembram720@gmail.com'), // Santali // Contributor('Enenra', 'nnra2210@gmail.com'), // Serbian diff --git a/lib/model/app/dependencies.dart b/lib/model/app/dependencies.dart index 04d54bae6..35211c148 100644 --- a/lib/model/app/dependencies.dart +++ b/lib/model/app/dependencies.dart @@ -226,6 +226,11 @@ class Dependencies { license: mit, sourceUrl: 'https://github.com/ziofat/material_design_icons_flutter', ), + Dependency( + name: 'Material Symbols Icons for Flutter', + license: apache2, + sourceUrl: 'https://github.com/timmaffett/material_symbols_icons', + ), Dependency( name: 'Overlay Support', license: apache2, diff --git a/lib/model/filters/path.dart b/lib/model/filters/path.dart index 7515ab635..bb0adea54 100644 --- a/lib/model/filters/path.dart +++ b/lib/model/filters/path.dart @@ -64,7 +64,7 @@ class PathFilter extends CollectionFilter { } @override - Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.explorer, size: size); + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.path, size: size); @override String get category => type; diff --git a/lib/model/filters/query.dart b/lib/model/filters/query.dart index e5c47c42b..11897bc25 100644 --- a/lib/model/filters/query.dart +++ b/lib/model/filters/query.dart @@ -21,6 +21,7 @@ class QueryFilter extends CollectionFilter { static final _fieldPattern = RegExp(r'(.+)([=<>])(.+)'); static final _fileSizePattern = RegExp(r'(\d+)([KMG])?'); + static const keyContentExtension = 'EXT'; static const keyContentId = 'ID'; static const keyContentYear = 'YEAR'; static const keyContentMonth = 'MONTH'; @@ -82,7 +83,7 @@ class QueryFilter extends CollectionFilter { String get universalLabel => query; @override - Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.text, size: size); + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.text, fill: 1, size: size); @override Future color(BuildContext context) { @@ -112,6 +113,11 @@ class QueryFilter extends CollectionFilter { final valueInt = int.tryParse(valueString); switch (key) { + case keyContentExtension: + if (op == opEqual) { + final extension = '.$valueString'; + return (entry) => entry.extension?.toUpperCase() == extension; + } case keyContentId: if (valueInt == null) return null; if (op == opEqual) { diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart index 25aa0b918..c63e5cb0a 100644 --- a/lib/theme/icons.dart +++ b/lib/theme/icons.dart @@ -1,213 +1,212 @@ import 'package:flutter/material.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; +import 'package:material_symbols_icons/symbols.dart'; class AIcons { - static const allCollection = Icons.collections_outlined; - static const image = Icons.photo_outlined; - static const video = Icons.movie_outlined; - static const vector = Icons.code_outlined; + static const allCollection = Symbols.collections; + static const image = Symbols.photo; + static const video = Symbols.movie; + static const vector = Symbols.code; - static const accessibility = Icons.accessibility_new_outlined; - static const android = Icons.android; - static const app = Icons.apps_outlined; - static const apply = Icons.done_outlined; - static const aspectRatio = Icons.aspect_ratio_outlined; - static const bin = Icons.delete_outlined; - static const broken = Icons.broken_image_outlined; - static const brightnessMin = Icons.brightness_low_outlined; - static const brightnessMax = Icons.brightness_high_outlined; - static const checked = Icons.done_outlined; + static const accessibility = Symbols.accessibility_new; + static const android = Symbols.android; + static const app = Symbols.apps; + static const apply = Symbols.done; + static const aspectRatio = Symbols.aspect_ratio; + static const bin = Symbols.delete; + static const broken = Symbols.broken_image; + static const brightnessMin = Symbols.brightness_low; + static const brightnessMax = Symbols.brightness_high; + static const checked = Symbols.done; + static const circle = Symbols.fiber_manual_record; static final count = MdiIcons.counter; - static const counter = Icons.plus_one_outlined; - static const description = Icons.description_outlined; - static const descriptionUntitled = Icons.comments_disabled_outlined; - static const disc = Icons.fiber_manual_record; - static const display = Icons.light_mode_outlined; - static const duration = Icons.timelapse_outlined; - static const error = Icons.error_outline; - static const explorer = Icons.account_tree_outlined; - static const folder = Icons.folder_outlined; + static const counter = Symbols.plus_one; + static const description = Symbols.description; + static const descriptionUntitled = Symbols.comments_disabled; + static const display = Symbols.light_mode; + static const duration = Symbols.timelapse; + static const error = Symbols.error; + static const explorer = Symbols.account_tree; + static const folder = Symbols.folder; static final github = MdiIcons.github; - static const home = Icons.home_outlined; + static const home = Symbols.home; // as of Flutter v3.16.3, // `label_important_outlined` matches text direction but is filled // `label_important_outline` is outlined but does not match text direction static const important = IconData(labelImportantOutlineCodePoint, fontFamily: materialIconsFontFamily, matchTextDirection: true); - static const language = Icons.translate_outlined; + static const language = Symbols.translate; static final legal = MdiIcons.scaleBalance; - static const mimeType = Icons.code_outlined; - static const name = Icons.abc_outlined; - static const newTier = Icons.fiber_new_outlined; - static const opacity = Icons.opacity; - static const palette = Icons.palette_outlined; - static final privacy = MdiIcons.shieldAccountOutline; - static const rating = Icons.star_border_outlined; - static const ratingFull = Icons.star; + static const mimeType = Symbols.code; + static const name = Symbols.abc; + static const newTier = Symbols.fiber_new; + static const opacity = Symbols.opacity; + static const palette = Symbols.palette; + static const path = Symbols.account_tree; + static const privacy = Symbols.shield_person; + static const rating = Symbols.star; static final ratingRejected = MdiIcons.starMinusOutline; static final ratingUnrated = MdiIcons.starOffOutline; - static const raw = Icons.raw_on_outlined; - static const sensorControlEnabled = Icons.explore_outlined; - static const sensorControlDisabled = Icons.explore_off_outlined; - static const settings = Icons.settings_outlined; - static const shooting = Icons.camera_outlined; - static const size = Icons.data_usage_outlined; - static const storageCard = Icons.sd_storage_outlined; - static const storageMain = Icons.smartphone_outlined; - static const streamVideo = Icons.movie_outlined; - static const streamAudio = Icons.audiotrack_outlined; - static const streamText = Icons.closed_caption_outlined; - static const tag = Icons.local_offer_outlined; + static const raw = Symbols.raw_on; + static const sensorControlEnabled = Symbols.explore; + static const sensorControlDisabled = Symbols.explore_off; + static const settings = Symbols.settings; + static const shooting = Symbols.camera; + static const size = Symbols.data_usage; + static const storageCard = Symbols.sd_storage; + static const storageMain = Symbols.smartphone; + static const streamVideo = Symbols.movie; + static const streamAudio = Symbols.audiotrack; + static const streamText = Symbols.closed_caption; + static const tag = Symbols.sell; static final tagUntagged = MdiIcons.tagOffOutline; - static const text = Icons.format_quote_outlined; - static const thumbnails = Icons.grid_on_outlined; - static const volumeMin = Icons.volume_mute_outlined; - static const volumeMax = Icons.volume_up_outlined; + static const text = Symbols.format_quote; + static const thumbnails = Symbols.grid_on; + static const volumeMin = Symbols.volume_mute; + static const volumeMax = Symbols.volume_up; // time/space - static const date = Icons.calendar_today_outlined; - static const dateByDay = Icons.today_outlined; - static const dateByMonth = Icons.calendar_month_outlined; - static const dateRecent = Icons.today_outlined; - static const dateUndated = Icons.event_busy_outlined; - static const geoBounds = Icons.public_outlined; - static const location = Icons.place_outlined; - static const locationUnlocated = Icons.location_off_outlined; - static const country = Icons.flag_outlined; - static const state = Icons.flag_outlined; - static const place = Icons.place_outlined; + static const date = Symbols.calendar_today; + static const dateByDay = Symbols.today; + static const dateByMonth = Symbols.calendar_month; + static const dateRecent = Symbols.today; + static const dateUndated = Symbols.event_busy; + static const geoBounds = Symbols.public; + static const location = Symbols.place; + static const locationUnlocated = Symbols.location_off; + static const country = Symbols.flag; + static const state = Symbols.flag; + static const place = Symbols.place; // view - static const group = Icons.group_work_outlined; - static const layout = Icons.grid_view_outlined; - static const layoutMosaic = Icons.view_comfy_outlined; - static const layoutGrid = Icons.view_compact_outlined; - static const layoutList = Icons.list_outlined; - static const sort = Icons.sort_outlined; - static const sortOrder = Icons.swap_vert_outlined; - static const thumbnailLarge = Icons.photo_size_select_large_outlined; - static const thumbnailSmall = Icons.photo_size_select_small_outlined; + static const group = Symbols.group_work; + static const layout = Symbols.grid_view; + static const layoutMosaic = Symbols.view_comfy; + static const layoutGrid = Symbols.view_compact; + static const layoutList = Symbols.list; + static const sort = Symbols.sort; + static const sortOrder = Symbols.swap_vert; + static const thumbnailLarge = Symbols.photo_size_select_large; + static const thumbnailSmall = Symbols.photo_size_select_small; // actions - static const add = Icons.add_circle_outline; - static const addShortcut = Icons.add_to_home_screen_outlined; - static const cancel = Icons.cancel_outlined; - static const cast = Icons.cast_outlined; - static const clear = Icons.clear_outlined; - static const clipboard = Icons.content_copy_outlined; - static const convert = Icons.transform_outlined; + static const add = Symbols.add_circle; + static const addShortcut = Symbols.add_to_home_screen; + static const cancel = Symbols.cancel; + static const cast = Symbols.cast; + static const clear = Symbols.clear; + static const clipboard = Symbols.content_copy; + static const convert = Symbols.transform; static final convertToStillImage = MdiIcons.movieRemoveOutline; - static const copy = Icons.file_copy_outlined; - static const debug = Icons.whatshot_outlined; - static const delete = Icons.delete_outlined; - static const edit = Icons.edit_outlined; - static const emptyBin = Icons.delete_sweep_outlined; - static const export = Icons.open_with_outlined; + static const copy = Symbols.file_copy; + static const debug = Symbols.mode_heat; + static const delete = Symbols.delete; + static const edit = Symbols.edit; + static const emptyBin = Symbols.delete_sweep; + static const export = Symbols.open_with; static final fileExport = MdiIcons.fileExportOutline; static final fileImport = MdiIcons.fileImportOutline; - static const flip = Icons.flip_outlined; - static const favourite = Icons.favorite_border; - static const favouriteActive = Icons.favorite; - static final filter = MdiIcons.filterOutline; - static final filterOff = MdiIcons.filterOffOutline; - static const goUp = Icons.arrow_upward_outlined; - static const hide = Icons.visibility_off_outlined; - static const info = Icons.info_outlined; - static const layers = Icons.layers_outlined; - static const map = Icons.map_outlined; - static const more = Icons.more_horiz_outlined; + static const flip = Symbols.flip; + static const favourite = Symbols.favorite; + static const filter = Symbols.filter_alt; + static const filterOff = Symbols.filter_alt_off; + static const goUp = Symbols.arrow_upward; + static const hide = Symbols.visibility_off; + static const info = Symbols.info; + static const layers = Symbols.layers; + static const map = Symbols.map; + static const more = Symbols.more_horiz; static final move = MdiIcons.fileMoveOutline; - static const rename = Icons.abc_outlined; - static const openOutside = Icons.open_in_new_outlined; - static final openVideoPlayer = MdiIcons.openInApp; + static const rename = Symbols.abc; + static const openOutside = Symbols.open_in_new; static final openVideoPart = MdiIcons.moviePlayOutline; - static const pin = Icons.push_pin_outlined; - static final unpin = MdiIcons.pinOffOutline; - static const print = Icons.print_outlined; - static const refresh = Icons.refresh_outlined; - static const remove = Icons.remove_outlined; + static const pin = Symbols.keep; + static const unpin = Symbols.keep_off; + static const print = Symbols.print; + static const refresh = Symbols.refresh; + static const remove = Symbols.remove; static final resetBounds = MdiIcons.rayStartEnd; - static const reverse = Icons.invert_colors_outlined; - static const reset = Icons.restart_alt_outlined; - static const restore = Icons.restore_outlined; - static const rotateLeft = Icons.rotate_left_outlined; - static const rotateRight = Icons.rotate_right_outlined; - static const rotateScreen = Icons.screen_rotation_outlined; - static const search = Icons.search_outlined; - static const select = Icons.select_all_outlined; - static const setAs = Icons.wallpaper_outlined; + static const reverse = Symbols.invert_colors; + static const reset = Symbols.restart_alt; + static const restore = Symbols.restore; + static const rotateLeft = Symbols.rotate_left; + static const rotateRight = Symbols.rotate_right; + static const rotateScreen = Symbols.screen_rotation; + static const search = Symbols.search; + static const select = Symbols.select_all; + static const setAs = Symbols.wallpaper; static final setBoundEnd = MdiIcons.rayEnd; static final setBoundStart = MdiIcons.rayStart; static final setCover = MdiIcons.imageEditOutline; - static const share = Icons.share_outlined; - static const show = Icons.visibility_outlined; - static final showFullscreenArrows = MdiIcons.arrowExpand; - static const showFullscreenCorners = Icons.fullscreen_outlined; - static const slideshow = Icons.slideshow_outlined; - static const split = Icons.call_split_outlined; - static const stats = Icons.donut_small_outlined; - static const vaultLock = Icons.lock_outlined; - static const vaultAdd = Icons.enhanced_encryption_outlined; + static const share = Symbols.share; + static const show = Symbols.visibility; + static const showFullscreenArrows = Symbols.open_in_full; + static const showFullscreenCorners = Symbols.fullscreen; + static const slideshow = Symbols.slideshow; + static const split = Symbols.call_split; + static const stats = Symbols.donut_small; + static const vaultLock = Symbols.lock; + static const vaultAdd = Symbols.enhanced_encryption; static final vaultConfigure = MdiIcons.shieldLockOutline; - static const view = Icons.grid_view_outlined; - static const viewerLock = Icons.lock_outlined; - static const viewerUnlock = Icons.lock_open_outlined; - static const zoomIn = Icons.add_outlined; - static const zoomOut = Icons.remove_outlined; - static const collapse = Icons.expand_less_outlined; - static const expand = Icons.expand_more_outlined; - static const up = Icons.keyboard_arrow_up_outlined; - static const down = Icons.keyboard_arrow_down_outlined; - static const previous = Icons.chevron_left_outlined; - static const next = Icons.chevron_right_outlined; + static const view = Symbols.grid_view; + static const viewerLock = Symbols.lock; + static const viewerUnlock = Symbols.lock_open; + static const zoomIn = Symbols.add; + static const zoomOut = Symbols.remove; + static const collapse = Symbols.expand_less; + static const expand = Symbols.expand_more; + static const up = Symbols.keyboard_arrow_up; + static const down = Symbols.keyboard_arrow_down; + static const previous = Symbols.chevron_left; + static const next = Symbols.chevron_right; // video actions // `play` and `pause` icon should be consistent with `AnimatedIcons.play_pause` - static const play = Icons.play_arrow; - static const pause = Icons.pause; - static const previousFrame = Icons.skip_previous_outlined; - static const nextFrame = Icons.skip_next_outlined; - static const replay10 = Icons.replay_10_outlined; - static const skip10 = Icons.forward_10_outlined; - static const mute = Icons.volume_off_outlined; - static const unmute = Icons.volume_up_outlined; - static const captureFrame = Icons.screenshot_outlined; - static const repeat = Icons.repeat_outlined; + static const play = Symbols.play_arrow; + static const pause = Symbols.pause; + static const previousFrame = Symbols.skip_previous; + static const nextFrame = Symbols.skip_next; + static const replay10 = Symbols.replay_10; + static const skip10 = Symbols.forward_10; + static const mute = Symbols.volume_off; + static const unmute = Symbols.volume_up; + static const captureFrame = Symbols.screenshot; + static const repeat = Symbols.repeat; static final repeatOff = MdiIcons.repeatOff; - static const selectStreams = Icons.translate_outlined; - static const setSpeed = Icons.speed_outlined; - static const videoSettings = Icons.video_settings_outlined; + static const selectStreams = Symbols.translate; + static const setSpeed = Symbols.speed; + static const videoSettings = Symbols.video_settings; // editor - static const transform = Icons.crop_rotate_outlined; - static const aspectRatioFree = Icons.crop_free_outlined; - static const aspectRatioOriginal = Icons.crop_original_outlined; - static const aspectRatioSquare = Icons.crop_square_outlined; - static const aspectRatio_16_9 = Icons.crop_16_9_outlined; - static const aspectRatio_4_3 = Icons.crop_landscape_outlined; + static const transform = Symbols.crop_rotate; + static const aspectRatioFree = Symbols.crop_free; + static const aspectRatioOriginal = Symbols.crop_original; + static const aspectRatioSquare = Symbols.crop_square; + static const aspectRatio_16_9 = Symbols.crop_16_9; + static const aspectRatio_4_3 = Symbols.crop_landscape; // albums - static const album = Icons.photo_album_outlined; - static const dynamicAlbum = Icons.image_search_outlined; - static const cameraAlbum = Icons.photo_camera_outlined; - static const downloadAlbum = Icons.file_download; - static const screenshotAlbum = Icons.screenshot_outlined; - static const recordingAlbum = Icons.smartphone_outlined; - static const locked = Icons.lock_outlined; - static const unlocked = Icons.lock_open_outlined; + static const album = Symbols.photo_album; + static const dynamicAlbum = Symbols.image_search; + static const cameraAlbum = Symbols.photo_camera; + static const downloadAlbum = Symbols.file_download; + static const screenshotAlbum = Symbols.screenshot; + static const recordingAlbum = Symbols.smartphone; + static const locked = Symbols.lock; + static const unlocked = Symbols.lock_open; // thumbnail overlay - static const animated = Icons.slideshow; - static const geo = Icons.language_outlined; - static const hdr = Icons.hdr_on_outlined; - static const motionPhoto = Icons.motion_photos_on_outlined; - static const multiPage = Icons.burst_mode_outlined; - static const panorama = Icons.vrpano_outlined; - static const sphericalVideo = Icons.threesixty_outlined; - static const videoThumb = Icons.play_circle_outlined; - static const selected = Icons.check_circle_outlined; - static const unselected = Icons.radio_button_unchecked; + static const animated = Symbols.animated_images; + static const geo = Symbols.language; + static const hdr = Symbols.hdr_on; + static const motionPhoto = Symbols.motion_photos_on; + static const multiPage = Symbols.burst_mode; + static const panorama = Symbols.vrpano; + static const sphericalVideo = Symbols.threesixty; + static const videoThumb = Symbols.play_circle; + static const selected = Symbols.check_circle; + static const unselected = Symbols.radio_button_unchecked; // Material Icons references to make constant instances of `IconData` // as non-constant instances of `IconData` prevent icon font tree shaking diff --git a/lib/theme/themes.dart b/lib/theme/themes.dart index 252017dc2..700b96a77 100644 --- a/lib/theme/themes.dart +++ b/lib/theme/themes.dart @@ -60,8 +60,10 @@ class Themes { dividerColor: colors.outlineVariant, scaffoldBackgroundColor: _schemeFirstLayer(colors), // TYPOGRAPHY & ICONOGRAPHY + iconTheme: _iconTheme(colors), typography: _typography, // COMPONENT THEMES + bottomNavigationBarTheme: _bottomNavigationBarTheme(colors), checkboxTheme: _checkboxTheme(colors), drawerTheme: _drawerTheme(colors), floatingActionButtonTheme: _floatingActionButtonTheme(colors), @@ -79,6 +81,15 @@ class Themes { ); } + static BottomNavigationBarThemeData _bottomNavigationBarTheme(ColorScheme colors) { + final iconTheme = _iconTheme(colors); + return BottomNavigationBarThemeData( + elevation: 0, + selectedIconTheme: iconTheme.copyWith(color: colors.primary), + unselectedIconTheme: iconTheme.copyWith(color: _unselectedWidgetColor(colors)), + ); + } + static CheckboxThemeData _checkboxTheme(ColorScheme colors) => CheckboxThemeData( side: BorderSide(width: 2.0, color: _unselectedWidgetColor(colors)), ); @@ -87,6 +98,16 @@ class Themes { backgroundColor: _schemeSecondLayer(colors), ); + static IconThemeData _iconTheme(ColorScheme colors) => IconThemeData( + // increased weight (from default 400 to 600) + // applied to variable fonts from `material_symbols_icons`, + // to match the fixed-weight icons from `material_design_icons_flutter` + weight: 600, + grade: 0, + opticalSize: 48, + color: colors.onSurface, + ); + static const _listTileTheme = ListTileThemeData( contentPadding: EdgeInsets.symmetric(horizontal: 16), ); diff --git a/lib/view/src/actions/entry.dart b/lib/view/src/actions/entry.dart index edf094590..aa50b98e1 100644 --- a/lib/view/src/actions/entry.dart +++ b/lib/view/src/actions/entry.dart @@ -126,7 +126,7 @@ extension ExtraEntryActionView on EntryAction { // external EntryAction.edit => AIcons.edit, EntryAction.open => AIcons.openOutside, - EntryAction.openVideoPlayer => AIcons.openVideoPlayer, + EntryAction.openVideoPlayer => AIcons.openOutside, EntryAction.openMap => AIcons.map, EntryAction.setAs => AIcons.setAs, EntryAction.cast => AIcons.cast, diff --git a/lib/view/src/source/sort.dart b/lib/view/src/source/sort.dart index 800cde2a3..cd621455e 100644 --- a/lib/view/src/source/sort.dart +++ b/lib/view/src/source/sort.dart @@ -45,6 +45,7 @@ extension ExtraChipSortFactorView on ChipSortFactor { ChipSortFactor.name => l10n.sortByName, ChipSortFactor.count => l10n.sortByItemCount, ChipSortFactor.size => l10n.sortBySize, + ChipSortFactor.path => l10n.sortByPath, }; } @@ -54,6 +55,7 @@ extension ExtraChipSortFactorView on ChipSortFactor { ChipSortFactor.name => AIcons.name, ChipSortFactor.count => AIcons.count, ChipSortFactor.size => AIcons.size, + ChipSortFactor.path => AIcons.path, }; } @@ -61,7 +63,7 @@ extension ExtraChipSortFactorView on ChipSortFactor { final l10n = context.l10n; return switch (this) { ChipSortFactor.date => reverse ? l10n.sortOrderOldestFirst : l10n.sortOrderNewestFirst, - ChipSortFactor.name => reverse ? l10n.sortOrderZtoA : l10n.sortOrderAtoZ, + ChipSortFactor.name || ChipSortFactor.path => reverse ? l10n.sortOrderZtoA : l10n.sortOrderAtoZ, ChipSortFactor.count || ChipSortFactor.size => reverse ? l10n.sortOrderSmallestFirst : l10n.sortOrderLargestFirst, }; } diff --git a/lib/widgets/about/app_ref.dart b/lib/widgets/about/app_ref.dart index 8443d1597..d45aa94df 100644 --- a/lib/widgets/about/app_ref.dart +++ b/lib/widgets/about/app_ref.dart @@ -80,7 +80,7 @@ class AppReference extends StatelessWidget { urlString: '${AppReference.avesGithub}/blob/main/LICENSE', ), LinkChip( - leading: Icon( + leading: const Icon( AIcons.privacy, size: 22, ), diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index f9e2e0a8e..c1281cb1d 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -72,6 +72,7 @@ class AvesApp extends StatefulWidget { 'hi', // Hindi 'ml', // Malayalam 'my', // Burmese + 'ne', // Nepali 'or', // Odia 'sat', // Santali 'sl', // Slovenian diff --git a/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart index f1f10ac74..cdb857522 100644 --- a/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart +++ b/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart @@ -69,12 +69,13 @@ class _RateQuickChooserState extends State { return Row( mainAxisSize: MainAxisSize.min, children: List.generate(5, (i) { - final thisRating = i + 1; + final disabled = _rating < i + 1; return Padding( padding: const EdgeInsets.all(4), child: Icon( - _rating < thisRating ? AIcons.rating : AIcons.ratingFull, - color: _rating < thisRating ? AColors.starDisabled : AColors.starEnabled, + AIcons.rating, + fill: disabled ? 0 : 1, + color: disabled ? AColors.starDisabled : AColors.starEnabled, ), ); }).toList(), diff --git a/lib/widgets/common/action_controls/togglers/favourite.dart b/lib/widgets/common/action_controls/togglers/favourite.dart index ea683b0a6..cfc28d729 100644 --- a/lib/widgets/common/action_controls/togglers/favourite.dart +++ b/lib/widgets/common/action_controls/togglers/favourite.dart @@ -34,9 +34,8 @@ class _FavouriteTogglerState extends State { Set get entries => widget.entries; - static const isFavouriteIcon = AIcons.favouriteActive; - static const isNotFavouriteIcon = AIcons.favourite; - static const favouriteSweeperIcon = AIcons.favourite; + static const isFavouriteIcon = Icon(AIcons.favourite, fill: 1); + static const isNotFavouriteIcon = Icon(AIcons.favourite, fill: 0); @override void initState() { @@ -67,11 +66,11 @@ class _FavouriteTogglerState extends State { return isFavourite ? MenuRow( text: context.l10n.entryActionRemoveFavourite, - icon: const Icon(isFavouriteIcon), + icon: isFavouriteIcon, ) : MenuRow( text: context.l10n.entryActionAddFavourite, - icon: const Icon(isNotFavouriteIcon), + icon: isNotFavouriteIcon, ); } final animate = context.select((v) => v.animate); @@ -79,7 +78,7 @@ class _FavouriteTogglerState extends State { alignment: Alignment.center, children: [ IconButton( - icon: Icon(isFavourite ? isFavouriteIcon : isNotFavouriteIcon), + icon: isFavourite ? isFavouriteIcon : isNotFavouriteIcon, onPressed: widget.onPressed, focusNode: widget.focusNode, tooltip: isFavourite ? context.l10n.entryActionRemoveFavourite : context.l10n.entryActionAddFavourite, @@ -88,7 +87,8 @@ class _FavouriteTogglerState extends State { Sweeper( key: ValueKey(entries.length == 1 ? entries.first : entries.length), builder: (context) => Icon( - favouriteSweeperIcon, + AIcons.favourite, + fill: 0, color: context.select((v) => v.favourite), ), toggledNotifier: _isFavouriteNotifier, diff --git a/lib/widgets/common/identity/aves_donut.dart b/lib/widgets/common/identity/aves_donut.dart index 8fc3e82ed..3ad6bc70e 100644 --- a/lib/widgets/common/identity/aves_donut.dart +++ b/lib/widgets/common/identity/aves_donut.dart @@ -140,7 +140,7 @@ class _AvesDonutState extends State with AutomaticKeepAliveClientMixi child: Row( mainAxisSize: MainAxisSize.min, children: [ - Icon(AIcons.disc, color: colorize(context, d)), + Icon(AIcons.circle, fill: 1, color: colorize(context, d)), const SizedBox(width: 8), Flexible( child: Text( diff --git a/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart index 4c79a3fb9..771ab6fe1 100644 --- a/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart @@ -62,6 +62,7 @@ class _EditEntryRatingDialogState extends State { children: [ ...List.generate(5, (i) { final thisRating = i + 1; + final disabled = _rating < thisRating; return GestureDetector( onTap: () => setState(() { _action = _RatingAction.set; @@ -71,8 +72,9 @@ class _EditEntryRatingDialogState extends State { child: Padding( padding: const EdgeInsets.all(4), child: Icon( - _rating < thisRating ? AIcons.rating : AIcons.ratingFull, - color: _rating < thisRating ? AColors.starDisabled : AColors.starEnabled, + AIcons.rating, + fill: disabled ? 0 : 1, + color: disabled ? AColors.starDisabled : AColors.starEnabled, ), ), ); diff --git a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart index 0d5eb89ca..11ffb0097 100644 --- a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart @@ -104,7 +104,7 @@ class _CoverSelectionDialogState extends State { _buildTab( context, const Key('tab-color'), - AIcons.opacity, + AIcons.palette, l10n.coverDialogTabColor, ), Column(children: _buildColorOptions()), diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart index 7c8736e5e..557978bee 100644 --- a/lib/widgets/filter_grids/common/action_delegates/album_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -190,7 +190,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate builder: (context) { return TileViewDialog( initialValue: initialValue, - sortOptions: ChipSetActionDelegate.sortOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), + sortOptions: ChipSetActionDelegate.albumSortOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), groupOptions: _groupOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), layoutOptions: ChipSetActionDelegate.layoutOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), sortOrder: (factor, reverse) => factor.getOrderName(context, reverse), diff --git a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart index ec4b49597..b114d3b5b 100644 --- a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart @@ -57,6 +57,11 @@ abstract class ChipSetActionDelegate with FeedbackMi ChipSortFactor.size, ]; + static const albumSortOptions = [ + ...sortOptions, + ChipSortFactor.path, + ]; + static const layoutOptions = [ TileLayout.mosaic, TileLayout.grid, diff --git a/lib/widgets/filter_grids/common/draggable_thumb_label.dart b/lib/widgets/filter_grids/common/draggable_thumb_label.dart index fa06daddc..bff34883a 100644 --- a/lib/widgets/filter_grids/common/draggable_thumb_label.dart +++ b/lib/widgets/filter_grids/common/draggable_thumb_label.dart @@ -28,6 +28,7 @@ class FilterDraggableThumbLabel extends StatelessWid DraggableThumbLabel.formatMonthThumbLabel(context, filterGridItem.entry?.bestDate), ]; case ChipSortFactor.name: + case ChipSortFactor.path: return [ filterGridItem.filter.getLabel(context), ]; diff --git a/lib/widgets/filter_grids/common/filter_nav_page.dart b/lib/widgets/filter_grids/common/filter_nav_page.dart index 4b4f95a09..a45608079 100644 --- a/lib/widgets/filter_grids/common/filter_nav_page.dart +++ b/lib/widgets/filter_grids/common/filter_nav_page.dart @@ -1,3 +1,4 @@ +import 'package:aves/model/filters/covered/stored_album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -59,6 +60,18 @@ class FilterNavigationPage(FilterGridItem a, FilterGridItem b) { + if (T == AlbumBaseFilter) { + final filterA = a.filter; + final filterB = b.filter; + final pathA = filterA is StoredAlbumFilter ? filterA.album : ''; + final pathB = filterB is StoredAlbumFilter ? filterB.album : ''; + final c = pathA.compareTo(pathB); + return c != 0 ? c : a.filter.compareTo(b.filter); + } + return 0; + } + static List> sort>( ChipSortFactor sortFactor, bool reverse, @@ -90,6 +103,8 @@ class FilterNavigationPage kv.key).toSet(); allMapEntries = toGridItem(source, filters); + case ChipSortFactor.path: + allMapEntries = toGridItem(source, filters)..sort(compareFiltersByPath); } if (reverse) { allMapEntries = allMapEntries.reversed.toList(); diff --git a/lib/widgets/navigation/nav_bar/nav_bar.dart b/lib/widgets/navigation/nav_bar/nav_bar.dart index 636a40036..87e9ea683 100644 --- a/lib/widgets/navigation/nav_bar/nav_bar.dart +++ b/lib/widgets/navigation/nav_bar/nav_bar.dart @@ -91,7 +91,6 @@ class _AppBottomNavBarState extends State { .toList(), onTap: (index) => _goTo(context, items, index), currentIndex: _getCurrentIndex(context, items), - elevation: 0, type: BottomNavigationBarType.fixed, backgroundColor: backgroundColor, showSelectedLabels: false, diff --git a/lib/widgets/search/search_delegate.dart b/lib/widgets/search/search_delegate.dart index 17038b351..61a06b941 100644 --- a/lib/widgets/search/search_delegate.dart +++ b/lib/widgets/search/search_delegate.dart @@ -21,7 +21,6 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/location/country.dart'; import 'package:aves/model/source/location/place.dart'; import 'package:aves/model/source/tag.dart'; -import 'package:aves/ref/mime_types.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; @@ -41,6 +40,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va final ValueNotifier _expandedSectionNotifier = ValueNotifier(null); final FocusNode _suggestionsTopFocusNode = FocusNode(); final ScrollController _suggestionsScrollController = ScrollController(); + late final List _mimeTypeFilters; @override FocusNode? get suggestionsFocusNode => _suggestionsTopFocusNode; @@ -62,7 +62,6 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va TypeFilter.geotiff, TypeFilter.hdr, TypeFilter.raw, - MimeFilter(MimeTypes.svg), ]; static final _monthFilters = List.generate(12, (i) => DateFilter(DateLevel.m, DateTime(1, i + 1))); @@ -78,6 +77,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va routeName: SearchPage.routeName, ) { query = initialQuery ?? ''; + _mimeTypeFilters = source.allEntries.map((entry) => entry.mimeType).toSet().map(MimeFilter.new).toList()..sort(); } @override @@ -149,6 +149,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va filters: history, ), _buildDateFilters(context, containQuery), + _buildMimeTypeFilters(context, containQuery), _buildAlbumFilters(containQuery), _buildCountryFilters(containQuery), _buildStateFilters(containQuery), @@ -205,6 +206,15 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va ); } + Widget _buildMimeTypeFilters(BuildContext context, _ContainQuery containQuery) { + final filters = _mimeTypeFilters.where((f) => containQuery(f.universalLabel)).toList(); + return _buildFilterRow( + context: context, + title: context.l10n.searchFormatSectionTitle, + filters: filters, + ); + } + Widget _buildAlbumFilters(_ContainQuery containQuery) { return AnimatedBuilder( animation: dynamicAlbums, diff --git a/lib/widgets/viewer/action/entry_info_action_delegate.dart b/lib/widgets/viewer/action/entry_info_action_delegate.dart index 037921af3..416a25d30 100644 --- a/lib/widgets/viewer/action/entry_info_action_delegate.dart +++ b/lib/widgets/viewer/action/entry_info_action_delegate.dart @@ -56,6 +56,9 @@ class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEdi return canWrite && targetEntry.isMotionPhoto; case EntryAction.viewMotionPhotoVideo: return appMode.canNavigate && targetEntry.isMotionPhoto; + // debug + case EntryAction.debug: + return !kReleaseMode; default: return false; } diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart index 24f111962..f7af0dba1 100644 --- a/lib/widgets/viewer/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -18,7 +18,6 @@ import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; import 'package:aves/widgets/viewer/info/info_search.dart'; import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; import 'package:aves_model/aves_model.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; @@ -86,7 +85,7 @@ class InfoAppBar extends StatelessWidget { const PopupMenuDivider(), ...formatSpecificActions.map((action) => _toMenuItem(context, action, enabled: actionDelegate.canApply(entry, action))), ], - if (!kReleaseMode) ...[ + if (isVisible(EntryAction.debug)) ...[ const PopupMenuDivider(), _toMenuItem(context, EntryAction.debug, enabled: true), ] diff --git a/lib/widgets/viewer/info/metadata/tv_page.dart b/lib/widgets/viewer/info/metadata/tv_page.dart index f35786505..0cfbae5d3 100644 --- a/lib/widgets/viewer/info/metadata/tv_page.dart +++ b/lib/widgets/viewer/info/metadata/tv_page.dart @@ -69,7 +69,7 @@ class _TvMetadataPageState extends State { final dir = metadata[titles[i]]!; final color = MetadataDirTile.getTitleColor(context, dir); return NavigationRailDestination( - icon: Icon(AIcons.disc, color: color), + icon: Icon(AIcons.circle, fill: 1, color: color), label: Text(title), ); }).toList(), diff --git a/lib/widgets/viewer/overlay/viewer_buttons.dart b/lib/widgets/viewer/overlay/viewer_buttons.dart index 20e6548a5..3ebcfd903 100644 --- a/lib/widgets/viewer/overlay/viewer_buttons.dart +++ b/lib/widgets/viewer/overlay/viewer_buttons.dart @@ -250,7 +250,11 @@ class _ViewerButtonRowContentState extends State { @override Widget build(BuildContext context) { final appMode = context.watch>().value; - final showOrientationActions = EntryActions.orientationActions.any((v) => actionDelegate.isVisible(appMode: appMode, action: v)); + bool isVisible(EntryAction action) => actionDelegate.isVisible( + appMode: appMode, + action: action, + ); + final showOrientationActions = EntryActions.orientationActions.any(isVisible); final topLevelActions = widget.topLevelActions; final exportActions = widget.exportActions; final videoActions = widget.videoActions; @@ -304,7 +308,7 @@ class _ViewerButtonRowContentState extends State { ...videoActions.map((action) => _buildPopupMenuItem(context, action, videoController)), ], ), - if (!kReleaseMode) ...[ + if (isVisible(EntryAction.debug)) ...[ const PopupMenuDivider(), _buildPopupMenuItem(context, EntryAction.debug, videoController), ] diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index 2ac1e211a..2f78dcfb9 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -77,7 +77,7 @@ class _WelcomePageState extends State { Padding( padding: const EdgeInsets.all(16), child: LinkChip( - leading: Icon( + leading: const Icon( AIcons.privacy, size: 22, ), diff --git a/plugins/aves_model/lib/src/source/enums.dart b/plugins/aves_model/lib/src/source/enums.dart index 9f9d65e4d..cad1c1a2b 100644 --- a/plugins/aves_model/lib/src/source/enums.dart +++ b/plugins/aves_model/lib/src/source/enums.dart @@ -1,6 +1,6 @@ enum SourceState { loading, cataloguing, locatingCountries, locatingPlaces, ready } -enum ChipSortFactor { date, name, count, size } +enum ChipSortFactor { date, name, count, size, path } enum AlbumChipGroupFactor { none, importance, mimeType, volume } diff --git a/pubspec.lock b/pubspec.lock index 01faf1d84..a48701e9b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: bidi - sha256: "9a712c7ddf708f7c41b1923aa83648a3ed44cfd75b04f72d598c45e5be287f9d" + sha256: "77f475165e94b261745cf1032c751e2032b8ed92ccb2bf5716036db79320637d" url: "https://pub.dev" source: hosted - version: "2.0.12" + version: "2.0.13" boolean_selector: dependency: transitive description: @@ -73,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + chalkdart: + dependency: transitive + description: + name: chalkdart + sha256: "937c94f1866b51155548e6237e1374a26134d39c1bf11b443db466dc9c8e62da" + url: "https://pub.dev" + source: hosted + version: "3.0.4" characters: dependency: transitive description: @@ -99,6 +107,14 @@ packages: url: "https://github.com/deckerst/flutter_google_charts.git" source: git version: "0.12.0" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" clock: dependency: transitive description: @@ -151,10 +167,10 @@ packages: dependency: transitive description: name: coverage - sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + sha256: "9086475ef2da7102a0c0a4e37e1e30707e7fb7b6d28c209f559a9c5f8ce42016" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" crypto: dependency: transitive description: @@ -551,10 +567,10 @@ packages: dependency: transitive description: name: google_maps_flutter_ios - sha256: ef72c822930ce69515cb91c10cd88cfb8b26296f765808a43cbc9a10eaffacfe + sha256: "2911e0c5654c2cc0d664324e0f49f055bb748740162821bdc0285045150b0439" url: "https://pub.dev" source: hosted - version: "2.15.0" + version: "2.15.1" google_maps_flutter_platform_interface: dependency: transitive description: @@ -591,10 +607,10 @@ packages: dependency: transitive description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "9475be233c437f0e3637af55e7702cbbe5c23a68bd56e8a5fa2d426297b7c6c8" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.5+1" http: dependency: "direct main" description: @@ -787,6 +803,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.7296" + material_symbols_icons: + dependency: "direct main" + description: + name: material_symbols_icons + sha256: d45b6c36c3effa8cb51b1afb8698107d5ff1f88fa4631428f34a8a01abc295d7 + url: "https://pub.dev" + source: hosted + version: "4.2815.0" media_kit: dependency: transitive description: @@ -1025,34 +1049,34 @@ packages: dependency: "direct main" description: name: percent_indicator - sha256: "0d77d5c6fa9b7f60202cedf748b568ba9ba38d3f30405d6ceae4da76f5185462" + sha256: "157d29133bbc6ecb11f923d36e7960a96a3f28837549a20b65e5135729f0f9fd" url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "4.2.5" permission_handler: dependency: "direct main" description: name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "12.0.0+1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" url: "https://pub.dev" source: hosted - version: "12.1.0" + version: "13.0.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 url: "https://pub.dev" source: hosted - version: "9.4.6" + version: "9.4.7" permission_handler_html: dependency: transitive description: @@ -1273,10 +1297,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "3ec7210872c4ba945e3244982918e502fa2bfb5230dff6832459ca0e1879b7ad" + sha256: c2c8c46297b5d6a80bed7741ec1f2759742c77d272f1a1698176ae828f8e1a18 url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.9" shared_preferences_foundation: dependency: transitive description: @@ -1789,4 +1813,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.7.0 <4.0.0" - flutter: ">=3.29.2" + flutter: ">=3.29.3" diff --git a/pubspec.yaml b/pubspec.yaml index a5f870332..fc0b551fa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,13 +7,13 @@ repository: https://github.com/deckerst/aves # - play changelog: /whatsnew/whatsnew-en-US # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt # - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt -version: 1.12.9+149 +version: 1.12.10+150 publish_to: none environment: # this project bundles Flutter SDK via `flutter_wrapper` # cf https://github.com/passsy/flutter_wrapper - flutter: 3.29.2 + flutter: 3.29.3 sdk: ">=3.6.0 <4.0.0" # incoherent dartfmt from 3.7.0 workspace: - plugins/aves_magnifier @@ -97,6 +97,7 @@ dependencies: leak_tracker: local_auth: material_design_icons_flutter: + material_symbols_icons: network_info_plus: overlay_support: package_info_plus: diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index 53217c088..a65f073d9 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,4 +1,4 @@ -In v1.12.9: +In v1.12.10: - play more kinds of motion photos - enjoy the app in Galician and Kannada Full changelog available on GitHub \ No newline at end of file