diff --git a/.flutter b/.flutter
index 78666c8dc..41456452f 160000
--- a/.flutter
+++ b/.flutter
@@ -1 +1 @@
-Subproject commit 78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9
+Subproject commit 41456452f29d64e8deb623a3c927524bcf9f111b
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7bb0e41f5..216ce3367 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+## [v1.10.3] - 2024-01-29
+
+### Added
+
+- Viewer: optional histogram (for real this time)
+- Collection: allow hiding thumbnail overlay HDR icon
+- Collection: allow setting any filtered collection as home page
+
+### Changed
+
+- Viewer: lift format control for tiling, allowing large DNG tiling if supported
+- Info: strip `unlocated` filter from context collection when editing location via map
+- Slideshow: keep playing when losing focus but app is still visible (e.g. split screen)
+- upgraded Flutter to stable v3.16.9
+
+### Fixed
+
+- crash when loading some large DNG in viewer
+- searching from drawer on mobile
+- resizing TIFF during conversion
+
## [v1.10.2] - 2023-12-24
### Changed
@@ -16,6 +37,8 @@ All notable changes to this project will be documented in this file.
## [v1.10.1] - 2023-12-21
+### Added
+
- Cataloguing: detect/filter `Ultra HDR`
- Viewer: show JPEG MPF dependent images (except thumbnails and HDR gain maps)
- Info: show metadata from JPEG MPF
diff --git a/README.md b/README.md
index e8df83514..ff6fa5a0d 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ It scans your media collection to identify **motion photos**, **panoramas** (aka
**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 (from KitKat to Android 13, 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 integrates with Android (from KitKat to Android 14, 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**.
## Screenshots
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 1ff9698d7..ad88be50b 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -50,24 +50,27 @@ if (keystorePropertiesFile.exists()) {
android {
namespace 'deckers.thibault.aves'
compileSdk 34
- ndkVersion flutter.ndkVersion
+ // cf https://developer.android.com/studio/projects/install-ndk#default-ndk-per-agp
+ ndkVersion '25.1.8937393'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
- lintOptions {
+ lint {
checkAllWarnings true
warningsAsErrors true
disable 'InvalidPackage'
}
packagingOptions {
- // The Amazon Developer console mistakenly considers the app to not be 64-bit compatible
- // if there are some libs in `lib/armeabi-v7a` unmatched by libs in `lib/arm64-v8a`,
- // so we exclude the extra `neon` libs bundled by `FFmpegKit`.
- exclude 'lib/armeabi-v7a/*_neon.so'
+ jniLibs {
+ // The Amazon Developer console mistakenly considers the app to not be 64-bit compatible
+ // if there are some libs in `lib/armeabi-v7a` unmatched by libs in `lib/arm64-v8a`,
+ // so we exclude the extra `neon` libs bundled by `FFmpegKit`.
+ excludes += ['lib/armeabi-v7a/*_neon.so']
+ }
}
sourceSets {
@@ -77,12 +80,9 @@ android {
defaultConfig {
applicationId packageName
// minSdk constraints:
- // - Flutter & other plugins: 16
+ // - Flutter & other plugins: 19 (cf `flutter.minSdkVersion`)
// - google_maps_flutter v2.1.1: 20
- // - to build XML documents from XMP data, `metadata-extractor` and `PixyMeta` rely on `DocumentBuilder`,
- // which implementation `DocumentBuilderImpl` is provided by the OS and is not customizable on Android,
- // but the implementation on API <19 is not robust enough and fails to build XMP documents
- minSdk 19
+ minSdk flutter.minSdkVersion
targetSdk 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
@@ -215,7 +215,7 @@ dependencies {
implementation "androidx.appcompat:appcompat:1.6.1"
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.exifinterface:exifinterface:1.3.7'
- implementation 'androidx.lifecycle:lifecycle-process:2.6.2'
+ implementation 'androidx.lifecycle:lifecycle-process:2.7.0'
implementation 'androidx.media:media:1.7.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.security:security-crypto:1.1.0-alpha06'
@@ -227,7 +227,7 @@ dependencies {
implementation "com.github.bumptech.glide:glide:$glide_version"
implementation 'com.google.android.material:material:1.11.0'
// SLF4J implementation for `mp4parser`
- implementation 'org.slf4j:slf4j-simple:2.0.9'
+ implementation 'org.slf4j:slf4j-simple:2.0.11'
// forked, built by JitPack:
// - https://jitpack.io/p/deckerst/Android-TiffBitmapFactory
@@ -236,7 +236,7 @@ dependencies {
implementation 'com.github.deckerst:Android-TiffBitmapFactory:90c06eebf4'
implementation 'com.github.deckerst.mp4parser:isoparser:4cc0c5d06c'
implementation 'com.github.deckerst.mp4parser:muxer:4cc0c5d06c'
- implementation 'com.github.deckerst:pixymeta-android:706bd73d6e'
+ implementation 'com.github.deckerst:pixymeta-android:9ec7097f17'
// huawei flavor only
huaweiImplementation "com.huawei.agconnect:agconnect-core:$huawei_agconnect_version"
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt
index ccc38f8b1..6693112dd 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt
@@ -12,6 +12,7 @@ import androidx.core.content.pm.ShortcutManagerCompat
import com.google.android.material.color.DynamicColors
import deckers.thibault.aves.channel.calls.Coresult.Companion.safe
import deckers.thibault.aves.model.FieldMap
+import deckers.thibault.aves.utils.MimeTypes
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt
index b86b2d636..3cf9babea 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt
@@ -109,7 +109,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
when (call.method) {
"getAllMetadata" -> ioScope.launch { safe(call, result, ::getAllMetadata) }
"getCatalogMetadata" -> ioScope.launch { safe(call, result, ::getCatalogMetadata) }
- "getOverlayMetadata" -> ioScope.launch { safe(call, result, ::getOverlayMetadata) }
+ "getFields" -> ioScope.launch { safe(call, result, ::getFields) }
"getGeoTiffInfo" -> ioScope.launch { safe(call, result, ::getGeoTiffInfo) }
"getMultiPageInfo" -> ioScope.launch { safe(call, result, ::getMultiPageInfo) }
"getPanoramaInfo" -> ioScope.launch { safe(call, result, ::getPanoramaInfo) }
@@ -118,7 +118,6 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
"hasContentResolverProp" -> ioScope.launch { safe(call, result, ::hasContentProp) }
"getContentResolverProp" -> ioScope.launch { safe(call, result, ::getContentPropValue) }
"getDate" -> ioScope.launch { safe(call, result, ::getDate) }
- "getDescription" -> ioScope.launch { safe(call, result, ::getDescription) }
else -> result.notImplemented()
}
}
@@ -807,17 +806,18 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
}
}
- private fun getOverlayMetadata(call: MethodCall, result: MethodChannel.Result) {
+ private fun getFields(call: MethodCall, result: MethodChannel.Result) {
val mimeType = call.argument("mimeType")
val uri = call.argument("uri")?.let { Uri.parse(it) }
val sizeBytes = call.argument("sizeBytes")?.toLong()
- if (mimeType == null || uri == null) {
+ val fields = call.argument>("fields")
+ if (mimeType == null || uri == null || fields == null) {
result.error("getOverlayMetadata-args", "missing arguments", null)
return
}
val metadataMap = HashMap()
- if (isVideo(mimeType)) {
+ if (fields.isEmpty() || isVideo(mimeType)) {
result.success(metadataMap)
return
}
@@ -842,10 +842,21 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
val metadata = Helper.safeRead(input)
for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) {
foundExif = true
- dir.getSafeRational(ExifDirectoryBase.TAG_FNUMBER) { metadataMap[KEY_APERTURE] = it.numerator.toDouble() / it.denominator }
- dir.getSafeRational(ExifDirectoryBase.TAG_EXPOSURE_TIME, saveExposureTime)
- dir.getSafeRational(ExifDirectoryBase.TAG_FOCAL_LENGTH) { metadataMap[KEY_FOCAL_LENGTH] = it.numerator.toDouble() / it.denominator }
- dir.getSafeInt(ExifDirectoryBase.TAG_ISO_EQUIVALENT) { metadataMap[KEY_ISO] = it }
+ if (fields.contains(KEY_APERTURE)) {
+ dir.getSafeRational(ExifDirectoryBase.TAG_FNUMBER) { metadataMap[KEY_APERTURE] = it.numerator.toDouble() / it.denominator }
+ }
+ if (fields.contains(KEY_DESCRIPTION)) {
+ getDescriptionByMetadataExtractor(metadata)?.let { metadataMap[KEY_DESCRIPTION] = it }
+ }
+ if (fields.contains(KEY_EXPOSURE_TIME)) {
+ dir.getSafeRational(ExifDirectoryBase.TAG_EXPOSURE_TIME, saveExposureTime)
+ }
+ if (fields.contains(KEY_FOCAL_LENGTH)) {
+ dir.getSafeRational(ExifDirectoryBase.TAG_FOCAL_LENGTH) { metadataMap[KEY_FOCAL_LENGTH] = it.numerator.toDouble() / it.denominator }
+ }
+ if (fields.contains(KEY_ISO)) {
+ dir.getSafeInt(ExifDirectoryBase.TAG_ISO_EQUIVALENT) { metadataMap[KEY_ISO] = it }
+ }
}
}
} catch (e: Exception) {
@@ -862,10 +873,18 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
try {
Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input ->
val exif = ExifInterface(input)
- exif.getSafeDouble(ExifInterface.TAG_F_NUMBER) { metadataMap[KEY_APERTURE] = it }
- exif.getSafeRational(ExifInterface.TAG_EXPOSURE_TIME, saveExposureTime)
- exif.getSafeDouble(ExifInterface.TAG_FOCAL_LENGTH) { metadataMap[KEY_FOCAL_LENGTH] = it }
- exif.getSafeInt(ExifInterface.TAG_PHOTOGRAPHIC_SENSITIVITY) { metadataMap[KEY_ISO] = it }
+ if (fields.contains(KEY_APERTURE)) {
+ exif.getSafeDouble(ExifInterface.TAG_F_NUMBER) { metadataMap[KEY_APERTURE] = it }
+ }
+ if (fields.contains(KEY_EXPOSURE_TIME)) {
+ exif.getSafeRational(ExifInterface.TAG_EXPOSURE_TIME, saveExposureTime)
+ }
+ if (fields.contains(KEY_FOCAL_LENGTH)) {
+ exif.getSafeDouble(ExifInterface.TAG_FOCAL_LENGTH) { metadataMap[KEY_FOCAL_LENGTH] = it }
+ }
+ if (fields.contains(KEY_ISO)) {
+ exif.getSafeInt(ExifInterface.TAG_PHOTOGRAPHIC_SENSITIVITY) { metadataMap[KEY_ISO] = it }
+ }
}
} catch (e: Exception) {
// ExifInterface initialization can fail with a RuntimeException
@@ -877,6 +896,47 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
result.success(metadataMap)
}
+ // return description from these fields (by precedence):
+ // - XMP / dc:description
+ // - IPTC / caption-abstract
+ // - Exif / UserComment
+ // - Exif / ImageDescription
+ private fun getDescriptionByMetadataExtractor(metadata: com.drew.metadata.Metadata): String? {
+ var description: String? = null
+ for (dir in metadata.getDirectoriesOfType(XmpDirectory::class.java)) {
+ val xmpMeta = dir.xmpMeta
+ try {
+ if (xmpMeta.doesPropExist(XMP.DC_DESCRIPTION_PROP_NAME)) {
+ xmpMeta.getSafeLocalizedText(XMP.DC_DESCRIPTION_PROP_NAME, acceptBlank = false) { description = it }
+ }
+ } catch (e: XMPException) {
+ Log.w(LOG_TAG, "failed to read XMP directory", e)
+ }
+ }
+ if (description == null) {
+ for (dir in metadata.getDirectoriesOfType(IptcDirectory::class.java)) {
+ dir.getSafeString(IptcDirectory.TAG_CAPTION, acceptBlank = false) { description = it }
+ }
+ }
+ if (description == null) {
+ for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) {
+ // user comment field specifies encoding, unlike other string fields
+ if (dir.containsTag(ExifSubIFDDirectory.TAG_USER_COMMENT)) {
+ val string = dir.getDescription(ExifSubIFDDirectory.TAG_USER_COMMENT)
+ if (string.isNotBlank()) {
+ description = string
+ }
+ }
+ }
+ }
+ if (description == null) {
+ for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) {
+ dir.getSafeString(ExifIFD0Directory.TAG_IMAGE_DESCRIPTION, acceptBlank = false) { description = it }
+ }
+ }
+ return description
+ }
+
private fun getGeoTiffInfo(call: MethodCall, result: MethodChannel.Result) {
val mimeType = call.argument("mimeType")
val uri = call.argument("uri")?.let { Uri.parse(it) }
@@ -1191,70 +1251,6 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
result.success(dateMillis)
}
- // return description from these fields (by precedence):
- // - XMP / dc:description
- // - IPTC / caption-abstract
- // - Exif / UserComment
- // - Exif / ImageDescription
- private fun getDescription(call: MethodCall, result: MethodChannel.Result) {
- val mimeType = call.argument("mimeType")
- val uri = call.argument("uri")?.let { Uri.parse(it) }
- val sizeBytes = call.argument("sizeBytes")?.toLong()
- if (mimeType == null || uri == null) {
- result.error("getDescription-args", "missing arguments", null)
- return
- }
-
- var description: String? = null
- if (canReadWithMetadataExtractor(mimeType)) {
- try {
- Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input ->
- val metadata = Helper.safeRead(input)
-
- for (dir in metadata.getDirectoriesOfType(XmpDirectory::class.java)) {
- val xmpMeta = dir.xmpMeta
- try {
- if (xmpMeta.doesPropExist(XMP.DC_DESCRIPTION_PROP_NAME)) {
- xmpMeta.getSafeLocalizedText(XMP.DC_DESCRIPTION_PROP_NAME, acceptBlank = false) { description = it }
- }
- } catch (e: XMPException) {
- Log.w(LOG_TAG, "failed to read XMP directory for uri=$uri", e)
- }
- }
- if (description == null) {
- for (dir in metadata.getDirectoriesOfType(IptcDirectory::class.java)) {
- dir.getSafeString(IptcDirectory.TAG_CAPTION, acceptBlank = false) { description = it }
- }
- }
- if (description == null) {
- for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) {
- // user comment field specifies encoding, unlike other string fields
- if (dir.containsTag(ExifSubIFDDirectory.TAG_USER_COMMENT)) {
- val string = dir.getDescription(ExifSubIFDDirectory.TAG_USER_COMMENT)
- if (string.isNotBlank()) {
- description = string
- }
- }
- }
- }
- if (description == null) {
- for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) {
- dir.getSafeString(ExifIFD0Directory.TAG_IMAGE_DESCRIPTION, acceptBlank = false) { description = it }
- }
- }
- }
- } catch (e: Exception) {
- Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e)
- } catch (e: NoClassDefFoundError) {
- Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e)
- } catch (e: AssertionError) {
- Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e)
- }
- }
-
- result.success(description)
- }
-
companion object {
private val LOG_TAG = LogUtils.createTag()
const val CHANNEL = "deckers.thibault/aves/metadata_fetch"
@@ -1319,6 +1315,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
// overlay metadata
private const val KEY_APERTURE = "aperture"
+ private const val KEY_DESCRIPTION = "description"
private const val KEY_EXPOSURE_TIME = "exposureTime"
private const val KEY_FOCAL_LENGTH = "focalLength"
private const val KEY_ISO = "iso"
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 b3efb8a3c..2cf30d200 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
@@ -18,6 +18,9 @@ import deckers.thibault.aves.utils.StorageUtils
import io.flutter.plugin.common.MethodChannel
import kotlin.math.roundToInt
+// As of Android 14 (API 34), `BitmapRegionDecoder` documentation states
+// that "only the JPEG, PNG, WebP and HEIF formats are supported"
+// but in practice it successfully decodes some others.
class RegionFetcher internal constructor(
private val context: Context,
) {
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt
index bf4c37bcd..065d5ba30 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt
@@ -1,6 +1,7 @@
package deckers.thibault.aves.channel.calls.window
import android.app.Activity
+import android.content.pm.ActivityInfo
import android.os.Build
import android.view.WindowManager
import deckers.thibault.aves.utils.getDisplayCompat
@@ -75,4 +76,21 @@ class ActivityWindowHandler(private val activity: Activity) : WindowHandler(acti
)
)
}
+
+ override fun supportsHdr(call: MethodCall, result: MethodChannel.Result) {
+ result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && activity.getDisplayCompat()?.isHdr ?: false)
+ }
+
+ override fun setHdrColorMode(call: MethodCall, result: MethodChannel.Result) {
+ val on = call.argument("on")
+ if (on == null) {
+ result.error("setHdrColorMode-args", "missing arguments", null)
+ return
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ activity.window.colorMode = if (on) ActivityInfo.COLOR_MODE_HDR else ActivityInfo.COLOR_MODE_DEFAULT
+ }
+ result.success(null)
+ }
}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt
index 1332bbb9a..347669239 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt
@@ -28,4 +28,12 @@ class ServiceWindowHandler(service: Service) : WindowHandler(service) {
override fun getCutoutInsets(call: MethodCall, result: MethodChannel.Result) {
result.success(HashMap())
}
+
+ override fun supportsHdr(call: MethodCall, result: MethodChannel.Result) {
+ result.success(false)
+ }
+
+ override fun setHdrColorMode(call: MethodCall, result: MethodChannel.Result) {
+ result.success(null)
+ }
}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt
index 11472d6a5..051451024 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt
@@ -18,6 +18,8 @@ abstract class WindowHandler(private val contextWrapper: ContextWrapper) : Metho
"requestOrientation" -> Coresult.safe(call, result, ::requestOrientation)
"isCutoutAware" -> Coresult.safe(call, result, ::isCutoutAware)
"getCutoutInsets" -> Coresult.safe(call, result, ::getCutoutInsets)
+ "supportsHdr" -> Coresult.safe(call, result, ::supportsHdr)
+ "setHdrColorMode" -> Coresult.safe(call, result, ::setHdrColorMode)
else -> result.notImplemented()
}
}
@@ -44,6 +46,10 @@ abstract class WindowHandler(private val contextWrapper: ContextWrapper) : Metho
abstract fun getCutoutInsets(call: MethodCall, result: MethodChannel.Result)
+ abstract fun supportsHdr(call: MethodCall, result: MethodChannel.Result)
+
+ abstract fun setHdrColorMode(call: MethodCall, result: MethodChannel.Result)
+
companion object {
private val LOG_TAG = LogUtils.createTag()
const val CHANNEL = "deckers.thibault/aves/window"
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/TiffGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/TiffGlideModule.kt
index 20ad40cb5..c96631bf9 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/TiffGlideModule.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/TiffGlideModule.kt
@@ -48,7 +48,8 @@ internal class TiffFetcher(val model: TiffImage, val width: Int, val height: Int
val page = model.page ?: 0
var sampleSize = 1
- if (width > 0 && height > 0) {
+ val customSize = width > 0 && height > 0
+ if (customSize) {
// determine sample size
val fd = context.contentResolver.openFileDescriptor(uri, "r")?.detachFd()
if (fd == null) {
@@ -63,7 +64,7 @@ internal class TiffFetcher(val model: TiffImage, val width: Int, val height: Int
val imageWidth = options.outWidth
val imageHeight = options.outHeight
if (imageHeight > height || imageWidth > width) {
- while (imageHeight / (sampleSize * 2) > height && imageWidth / (sampleSize * 2) > width) {
+ while (imageHeight / (sampleSize * 2) >= height && imageWidth / (sampleSize * 2) >= width) {
sampleSize *= 2
}
}
@@ -84,6 +85,18 @@ internal class TiffFetcher(val model: TiffImage, val width: Int, val height: Int
val bitmap = TiffBitmapFactory.decodeFileDescriptor(fd, options)
if (bitmap == null) {
callback.onLoadFailed(Exception("Decoding full TIFF yielded null bitmap"))
+ } else if (customSize) {
+ val dstWidth: Int
+ val dstHeight: Int
+ val aspectRatio = bitmap.width.toFloat() / bitmap.height
+ if (aspectRatio > 1) {
+ dstWidth = (height * aspectRatio).toInt()
+ dstHeight = height
+ } else {
+ dstWidth = width
+ dstHeight = (width / aspectRatio).toInt()
+ }
+ callback.onDataReady(Bitmap.createScaledBitmap(bitmap, dstWidth, dstHeight, true))
} else {
callback.onDataReady(bitmap)
}
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/PixyMetaHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/PixyMetaHelper.kt
index eee140f28..200379383 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/PixyMetaHelper.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/PixyMetaHelper.kt
@@ -1,5 +1,7 @@
package deckers.thibault.aves.metadata
+import android.content.Context
+import android.net.Uri
import deckers.thibault.aves.metadata.Metadata.TYPE_COMMENT
import deckers.thibault.aves.metadata.Metadata.TYPE_EXIF
import deckers.thibault.aves.metadata.Metadata.TYPE_ICC_PROFILE
@@ -10,6 +12,8 @@ import deckers.thibault.aves.metadata.Metadata.TYPE_JPEG_DUCKY
import deckers.thibault.aves.metadata.Metadata.TYPE_PHOTOSHOP_IRB
import deckers.thibault.aves.metadata.Metadata.TYPE_XMP
import deckers.thibault.aves.model.FieldMap
+import deckers.thibault.aves.utils.MimeTypes
+import deckers.thibault.aves.utils.StorageUtils
import pixy.meta.meta.Metadata
import pixy.meta.meta.MetadataEntry
import pixy.meta.meta.MetadataType
@@ -19,6 +23,7 @@ import pixy.meta.meta.iptc.IPTCRecord
import pixy.meta.meta.jpeg.JPGMeta
import pixy.meta.meta.xmp.XMP
import pixy.meta.string.XMLUtils
+import java.io.File
import java.io.InputStream
import java.io.OutputStream
import java.util.*
@@ -105,6 +110,48 @@ object PixyMetaHelper {
fun XMP.extendedXmpDocString(): String = XMLUtils.serializeToString(extendedXmpDocument)
+ fun copyIptcXmp(
+ context: Context,
+ sourceMimeType: String,
+ sourceUri: Uri,
+ targetMimeType: String,
+ targetUri: Uri,
+ editableFile: File,
+ ) {
+ var pixyIptc: IPTC? = null
+ var pixyXmp: XMP? = null
+ if (MimeTypes.canReadWithPixyMeta(sourceMimeType)) {
+ StorageUtils.openInputStream(context, sourceUri)?.use { input ->
+ val metadata = Metadata.readMetadata(input)
+ if (MimeTypes.canEditIptc(targetMimeType)) {
+ pixyIptc = metadata[MetadataType.IPTC] as IPTC?
+ }
+ if (MimeTypes.canEditXmp(targetMimeType)) {
+ pixyXmp = metadata[MetadataType.XMP] as XMP?
+ }
+ }
+ }
+ if (pixyIptc != null || pixyXmp != null) {
+ editableFile.outputStream().use { output ->
+ if (pixyIptc != null) {
+ // reopen input to read from start
+ StorageUtils.openInputStream(context, targetUri)?.use { input ->
+ val iptcs = pixyIptc!!.dataSets.flatMap { it.value }
+ Metadata.insertIPTC(input, output, iptcs)
+ }
+ }
+ if (pixyXmp != null) {
+ // reopen input to read from start
+ StorageUtils.openInputStream(context, targetUri)?.use { input ->
+ val xmpString = pixyXmp!!.xmpDocString()
+ val extendedXmp = if (pixyXmp!!.hasExtendedXmp()) pixyXmp!!.extendedXmpDocString() else null
+ setXmp(input, output, xmpString, if (targetMimeType == MimeTypes.JPEG) extendedXmp else null)
+ }
+ }
+ }
+ }
+ }
+
fun removeMetadata(input: InputStream, output: OutputStream, metadataTypes: Set) {
val types = metadataTypes.map(::toMetadataType).toTypedArray()
Metadata.removeMetadata(input, output, *types)
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt
index 71f126f0d..424fdb08a 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt
@@ -18,6 +18,12 @@ class AvesEntry(map: FieldMap) {
val isRotated: Boolean
get() = rotationDegrees % 180 == 90
+ val displayWidth: Int
+ get() = if (isRotated) height else width
+
+ val displayHeight: Int
+ get() = if (isRotated) width else height
+
companion object {
// convenience method
private fun toLong(o: Any?): Long? = when (o) {
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt
index 766c3b936..093f2c997 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt
@@ -53,15 +53,12 @@ import deckers.thibault.aves.utils.MimeTypes.canEditExif
import deckers.thibault.aves.utils.MimeTypes.canEditIptc
import deckers.thibault.aves.utils.MimeTypes.canEditXmp
import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface
-import deckers.thibault.aves.utils.MimeTypes.canReadWithPixyMeta
import deckers.thibault.aves.utils.MimeTypes.canRemoveMetadata
import deckers.thibault.aves.utils.MimeTypes.extensionFor
import deckers.thibault.aves.utils.MimeTypes.isVideo
import deckers.thibault.aves.utils.StorageUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
-import pixy.meta.meta.Metadata
-import pixy.meta.meta.MetadataType
import java.io.ByteArrayInputStream
import java.io.File
import java.io.FileOutputStream
@@ -301,11 +298,18 @@ abstract class ImageProvider {
sourceDocFile.copyTo(output)
}
} else {
- var targetWidthPx: Int = if (sourceEntry.isRotated) height else width
- var targetHeightPx: Int = if (sourceEntry.isRotated) width else height
- if (lengthUnit == LENGTH_UNIT_PERCENT) {
- targetWidthPx = sourceEntry.width * targetWidthPx / 100
- targetHeightPx = sourceEntry.height * targetHeightPx / 100
+ val targetWidthPx: Int
+ val targetHeightPx: Int
+ when (lengthUnit) {
+ LENGTH_UNIT_PERCENT -> {
+ targetWidthPx = sourceEntry.displayWidth * width / 100
+ targetHeightPx = sourceEntry.displayHeight * height / 100
+ }
+
+ else -> {
+ targetWidthPx = width
+ targetHeightPx = height
+ }
}
val model: Any = if (pageId != null && MultiPageImage.isSupported(sourceMimeType)) {
@@ -405,39 +409,7 @@ abstract class ImageProvider {
}
// copy IPTC / XMP via PixyMeta
-
- var pixyIptc: pixy.meta.meta.iptc.IPTC? = null
- var pixyXmp: pixy.meta.meta.xmp.XMP? = null
- if (canReadWithPixyMeta(sourceMimeType)) {
- StorageUtils.openInputStream(context, sourceUri)?.use { input ->
- val metadata = Metadata.readMetadata(input)
- if (canEditIptc(targetMimeType)) {
- pixyIptc = metadata[MetadataType.IPTC] as pixy.meta.meta.iptc.IPTC?
- }
- if (canEditXmp(targetMimeType)) {
- pixyXmp = metadata[MetadataType.XMP] as pixy.meta.meta.xmp.XMP?
- }
- }
- }
- if (pixyIptc != null || pixyXmp != null) {
- editableFile.outputStream().use { output ->
- if (pixyIptc != null) {
- // reopen input to read from start
- StorageUtils.openInputStream(context, targetUri)?.use { input ->
- val iptcs = pixyIptc!!.dataSets.flatMap { it.value }
- Metadata.insertIPTC(input, output, iptcs)
- }
- }
- if (pixyXmp != null) {
- // reopen input to read from start
- StorageUtils.openInputStream(context, targetUri)?.use { input ->
- val xmpString = pixyXmp!!.xmpDocString()
- val extendedXmp = if (pixyXmp!!.hasExtendedXmp()) pixyXmp!!.extendedXmpDocString() else null
- PixyMetaHelper.setXmp(input, output, xmpString, if (targetMimeType == MimeTypes.JPEG) extendedXmp else null)
- }
- }
- }
- }
+ PixyMetaHelper.copyIptcXmp(context, sourceMimeType, sourceUri, targetMimeType, targetUri, editableFile)
// copy Exif via ExifInterface
diff --git a/android/app/src/main/res/values-sat/strings.xml b/android/app/src/main/res/values-sat/strings.xml
new file mode 100644
index 000000000..5383771d2
--- /dev/null
+++ b/android/app/src/main/res/values-sat/strings.xml
@@ -0,0 +1,5 @@
+
+
+ ᱮᱣᱥ
+ ᱪᱤᱛᱟᱹᱨ ᱯᱷᱨᱮᱢ
+
\ No newline at end of file
diff --git a/android/app/src/main/res/values-sv/strings.xml b/android/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 000000000..786d17c9a
--- /dev/null
+++ b/android/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,12 @@
+
+
+ Aves
+ Foto Ram
+ Bakgrund
+ Felsäkert läge
+ Videor
+ Media scanning
+ Scannar media
+ Stop
+ Sök
+
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 14ae3f66e..3d2b26752 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -2,7 +2,7 @@ buildscript {
ext {
kotlin_version = '1.9.21'
ksp_version = "$kotlin_version-1.0.15"
- agp_version = '8.1.4'
+ agp_version = '8.2.2'
glide_version = '4.16.0'
// AppGallery Connect plugin versions: https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-sdk-changenotes-0000001058732550
huawei_agconnect_version = '1.9.1.300'
diff --git a/fastlane/metadata/android/en-US/changelogs/112.txt b/fastlane/metadata/android/en-US/changelogs/112.txt
new file mode 100644
index 000000000..2060b1138
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/112.txt
@@ -0,0 +1,4 @@
+In v1.10.3:
+- customize your home page
+- analyze your images with the histogram (for real this time)
+Full changelog available on GitHub
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/11201.txt b/fastlane/metadata/android/en-US/changelogs/11201.txt
new file mode 100644
index 000000000..2060b1138
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/11201.txt
@@ -0,0 +1,4 @@
+In v1.10.3:
+- customize your home page
+- analyze your images with the histogram (for real this time)
+Full changelog available on GitHub
\ No newline at end of file
diff --git a/fastlane/metadata/android/is/full_description.txt b/fastlane/metadata/android/is/full_description.txt
index 6b96ec3ea..acf30d43d 100644
--- a/fastlane/metadata/android/is/full_description.txt
+++ b/fastlane/metadata/android/is/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 getur meðhöndlað allar algengar gerðir mynda og myndskeiða, þar með talið JPEG og MP4, en einnig sjaldgæfari skrár á borð við marg-síðna TIFF-myndir, SVG-línuteikningar, eldri gerðir AVI-skráa og margt fleira! Forritið skannar safnið þitt til að greina hreyfiljósmyndir, víðmyndir (t.d. myndahnetti), 360° myndskeið, auk GeoTIFF-skráa.
-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.
+Flakk og leit eru mikilvægir hlutar Aves. Markmiðið er að notendur eigi auðvelt með að flæða úr albúmum yfir í ljósmyndir yfir í merki eða landakort, o.s.frv.
-Aves integrates with Android (from KitKat to Android 14, 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 samtvinnast við Android (frá KitKat til Android 14, að meðtöldu Android TV) með eiginleikum á borð við viðmótshluta, flýtileiðir í forrit, skjáhvílu og víðværa leit. Það virkar einnig sem margmiðlunarskoðari og veljari.
diff --git a/fastlane/metadata/android/is/images/featureGraphic.png b/fastlane/metadata/android/is/images/featureGraphic.png
index b15f02fb5..d86ecedbc 100644
Binary files a/fastlane/metadata/android/is/images/featureGraphic.png and b/fastlane/metadata/android/is/images/featureGraphic.png differ
diff --git a/fastlane/metadata/android/is/short_description.txt b/fastlane/metadata/android/is/short_description.txt
index 8c9445bd5..c47534b66 100644
--- a/fastlane/metadata/android/is/short_description.txt
+++ b/fastlane/metadata/android/is/short_description.txt
@@ -1 +1 @@
-Gallery and metadata explorer
\ No newline at end of file
+Myndasafn og skoðun lýsigagna
\ No newline at end of file
diff --git a/fastlane/metadata/android/sat/full_description.txt b/fastlane/metadata/android/sat/full_description.txt
new file mode 100644
index 000000000..6b96ec3ea
--- /dev/null
+++ b/fastlane/metadata/android/sat/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 (from KitKat to Android 14, 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/sat/short_description.txt b/fastlane/metadata/android/sat/short_description.txt
new file mode 100644
index 000000000..8c9445bd5
--- /dev/null
+++ b/fastlane/metadata/android/sat/short_description.txt
@@ -0,0 +1 @@
+Gallery and metadata explorer
\ No newline at end of file
diff --git a/fastlane/metadata/android/sv/full_description.txt b/fastlane/metadata/android/sv/full_description.txt
new file mode 100644
index 000000000..0aa28a364
--- /dev/null
+++ b/fastlane/metadata/android/sv/full_description.txt
@@ -0,0 +1,5 @@
+Aves kan hantera alla typer av bilder och videor, inklusive vanliga JPEG- och MP4-filer, men även mer exotiska filer som flersidiga TIFF-filer, SVG-filer, gamla AVI-filer och mycket mer! Den skannar din mediasamling för att identifiera rörelsefoton, panoramor (även kallade fotosfärer), 360° videor, samnt GeoTIFF filer.
+
+Navigering och sökhantering är än viktigt del av Aves. Målet är att användarna på ett smidigt sätt ska kunna gå från album till foton till taggar till kartor, osv.
+
+Aves integrerar med Android (från KitKat till Android 14, inklusive Android TV) med funktioner som widgetar, appgenvägar, skärmsläckare och global sökhantering. Den fungerar också som en mediavisare och mediaväljare.
diff --git a/fastlane/metadata/android/sv/short_description.txt b/fastlane/metadata/android/sv/short_description.txt
new file mode 100644
index 000000000..9a702b948
--- /dev/null
+++ b/fastlane/metadata/android/sv/short_description.txt
@@ -0,0 +1 @@
+Galleri och metadatautforskare
\ No newline at end of file
diff --git a/lib/convert/metadata/fields.dart b/lib/convert/metadata/fields.dart
index fd677c105..c19f0f91b 100644
--- a/lib/convert/metadata/fields.dart
+++ b/lib/convert/metadata/fields.dart
@@ -1,5 +1,9 @@
import 'package:aves_model/aves_model.dart';
+extension ExtraMetadataSyntheticFieldConvert on MetadataSyntheticField {
+ String? get toPlatform => name;
+}
+
extension ExtraMetadataFieldConvert on MetadataField {
MetadataType get type {
switch (this) {
diff --git a/lib/image_providers/thumbnail_provider.dart b/lib/image_providers/thumbnail_provider.dart
index 33f05fec4..c9f868296 100644
--- a/lib/image_providers/thumbnail_provider.dart
+++ b/lib/image_providers/thumbnail_provider.dart
@@ -1,6 +1,7 @@
import 'dart:ui' as ui;
import 'package:aves/services/common/services.dart';
+import 'package:aves_report/aves_report.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
@@ -46,14 +47,14 @@ class ThumbnailProvider extends ImageProvider {
taskKey: key,
);
if (bytes.isEmpty) {
- throw StateError('$uri ($mimeType) loading failed');
+ throw UnreportedStateError('$uri ($mimeType) loading failed');
}
final buffer = await ui.ImmutableBuffer.fromUint8List(bytes);
return await decode(buffer);
} catch (error) {
// loading may fail if the provided MIME type is incorrect (e.g. the Media Store may report a JPEG as a TIFF)
debugPrint('$runtimeType _loadAsync failed with mimeType=$mimeType, uri=$uri, error=$error');
- throw StateError('$mimeType decoding failed (page $pageId)');
+ throw UnreportedStateError('$mimeType decoding failed (page $pageId)');
}
}
diff --git a/lib/image_providers/uri_image_provider.dart b/lib/image_providers/uri_image_provider.dart
index 38842e742..4d3b46713 100644
--- a/lib/image_providers/uri_image_provider.dart
+++ b/lib/image_providers/uri_image_provider.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:ui' as ui;
import 'package:aves/services/common/services.dart';
+import 'package:aves_report/aves_report.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
@@ -64,14 +65,14 @@ class UriImage extends ImageProvider with EquatableMixin {
},
);
if (bytes.isEmpty) {
- throw StateError('$uri ($mimeType) loading failed');
+ throw UnreportedStateError('$uri ($mimeType) loading failed');
}
final buffer = await ui.ImmutableBuffer.fromUint8List(bytes);
return await decode(buffer);
} catch (error) {
// loading may fail if the provided MIME type is incorrect (e.g. the Media Store may report a JPEG as a TIFF)
debugPrint('$runtimeType _loadAsync failed with mimeType=$mimeType, uri=$uri, error=$error');
- throw StateError('$mimeType decoding failed (page $pageId)');
+ throw UnreportedStateError('$mimeType decoding failed (page $pageId)');
} finally {
unawaited(chunkEvents.close());
}
diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb
index d0392a93d..8a2b2a011 100644
--- a/lib/l10n/app_ar.arb
+++ b/lib/l10n/app_ar.arb
@@ -479,7 +479,7 @@
"@statsTopCountriesSectionTitle": {},
"settingsActionImport": "إستيراد",
"@settingsActionImport": {},
- "viewerInfoLabelSize": "المقاس",
+ "viewerInfoLabelSize": "الحجم",
"@viewerInfoLabelSize": {},
"locationPickerUseThisLocationButton": "استخدم هذا الموقع",
"@locationPickerUseThisLocationButton": {},
@@ -1518,5 +1518,11 @@
"filterNoDateLabel": "غير مؤرخ",
"@filterNoDateLabel": {},
"exportEntryDialogWriteMetadata": "كتابة البيانات الوصفية",
- "@exportEntryDialogWriteMetadata": {}
+ "@exportEntryDialogWriteMetadata": {},
+ "settingsThumbnailShowHdrIcon": "إظهار أيقونة HDR",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "تعيين كخلفية",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "مجموعة مخصصة",
+ "@setHomeCustomCollection": {}
}
diff --git a/lib/l10n/app_be.arb b/lib/l10n/app_be.arb
index 122e32173..322e9e141 100644
--- a/lib/l10n/app_be.arb
+++ b/lib/l10n/app_be.arb
@@ -649,7 +649,7 @@
"@viewerTransitionSlide": {},
"overlayHistogramRGB": "RGB",
"@overlayHistogramRGB": {},
- "overlayHistogramNone": "Няма",
+ "overlayHistogramNone": "Не",
"@overlayHistogramNone": {},
"overlayHistogramLuminance": "Яркасць",
"@overlayHistogramLuminance": {},
@@ -931,7 +931,7 @@
"@collectionGroupNone": {},
"searchRatingSectionTitle": "Рэйтынгі",
"@searchRatingSectionTitle": {},
- "settingsDisabled": "Адключана",
+ "settingsDisabled": "Адкл.",
"@settingsDisabled": {},
"settingsActionImportDialogTitle": "Імпарт",
"@settingsActionImportDialogTitle": {},
@@ -1518,5 +1518,11 @@
"placeholders": {
"minutes": {}
}
- }
+ },
+ "collectionActionSetHome": "Усталяваць як галоўную",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Уласная калекцыя",
+ "@setHomeCustomCollection": {},
+ "settingsThumbnailShowHdrIcon": "Паказаць значок HDR",
+ "@settingsThumbnailShowHdrIcon": {}
}
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index 2b32b01fb..620c607b2 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -570,6 +570,7 @@
"collectionActionShowTitleSearch": "Show title filter",
"collectionActionHideTitleSearch": "Hide title filter",
"collectionActionAddShortcut": "Add shortcut",
+ "collectionActionSetHome": "Set as home",
"collectionActionEmptyBin": "Empty bin",
"collectionActionCopy": "Copy to album",
"collectionActionMove": "Move to album",
@@ -757,6 +758,7 @@
"settingsNavigationSectionTitle": "Navigation",
"settingsHomeTile": "Home",
"settingsHomeDialogTitle": "Home",
+ "setHomeCustomCollection": "Custom collection",
"settingsShowBottomNavigationBar": "Show bottom navigation bar",
"settingsKeepScreenOnTile": "Keep screen on",
"settingsKeepScreenOnDialogTitle": "Keep Screen On",
@@ -781,6 +783,7 @@
"settingsThumbnailSectionTitle": "Thumbnails",
"settingsThumbnailOverlayTile": "Overlay",
"settingsThumbnailOverlayPageTitle": "Overlay",
+ "settingsThumbnailShowHdrIcon": "Show HDR icon",
"settingsThumbnailShowFavouriteIcon": "Show favorite icon",
"settingsThumbnailShowTagIcon": "Show tag icon",
"settingsThumbnailShowLocationIcon": "Show location icon",
diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb
index c90567521..16f12483d 100644
--- a/lib/l10n/app_es.arb
+++ b/lib/l10n/app_es.arb
@@ -1360,5 +1360,11 @@
"entryActionCast": "Echar",
"@entryActionCast": {},
"castDialogTitle": "Dispositivos Cast",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "Mostrar el icono del HDR",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "Fijar como inicio",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Colección personalizada",
+ "@setHomeCustomCollection": {}
}
diff --git a/lib/l10n/app_eu.arb b/lib/l10n/app_eu.arb
index 2f13c23b4..856613cd6 100644
--- a/lib/l10n/app_eu.arb
+++ b/lib/l10n/app_eu.arb
@@ -959,15 +959,15 @@
"@settingsNavigationDrawerAddAlbum": {},
"settingsThumbnailSectionTitle": "Miniaturak",
"@settingsThumbnailSectionTitle": {},
- "settingsThumbnailShowFavouriteIcon": "Gogokoen ikonoa erakutsi",
+ "settingsThumbnailShowFavouriteIcon": "Erakutsi gogokoen ikonoa",
"@settingsThumbnailShowFavouriteIcon": {},
- "settingsThumbnailShowTagIcon": "Etiketaren ikonoa erakutsi",
+ "settingsThumbnailShowTagIcon": "Erakutsi etiketaren ikonoa",
"@settingsThumbnailShowTagIcon": {},
- "settingsThumbnailShowMotionPhotoIcon": "Mugimendu-argazkiaren ikonoa erakutsi",
+ "settingsThumbnailShowMotionPhotoIcon": "Erakutsi mugimendu-argazkiaren ikonoa",
"@settingsThumbnailShowMotionPhotoIcon": {},
- "settingsThumbnailShowRawIcon": "Raw ikonoa erakutsi",
+ "settingsThumbnailShowRawIcon": "Erakutsi raw ikonoa",
"@settingsThumbnailShowRawIcon": {},
- "settingsThumbnailShowVideoDuration": "Bideoaren iraupena erakutsi",
+ "settingsThumbnailShowVideoDuration": "Erakutsi bideoaren iraupena",
"@settingsThumbnailShowVideoDuration": {},
"settingsCollectionQuickActionEditorPageTitle": "Ekintza azkarrak",
"@settingsCollectionQuickActionEditorPageTitle": {},
@@ -975,13 +975,13 @@
"@settingsCollectionQuickActionTabBrowsing": {},
"settingsThumbnailOverlayPageTitle": "Inkrustazioak",
"@settingsThumbnailOverlayPageTitle": {},
- "settingsThumbnailShowLocationIcon": "Kokapenaren ikonoa erakutsi",
+ "settingsThumbnailShowLocationIcon": "Erakutsi kokalekuaren ikonoa",
"@settingsThumbnailShowLocationIcon": {},
- "settingsThumbnailShowRating": "Balorazioa erakutsi",
+ "settingsThumbnailShowRating": "Erakutsi balorazioa",
"@settingsThumbnailShowRating": {},
"settingsCollectionQuickActionsTile": "Ekintza azkarrak",
"@settingsCollectionQuickActionsTile": {},
- "settingsCollectionQuickActionTabSelecting": "Aukeraketa",
+ "settingsCollectionQuickActionTabSelecting": "Hautapena",
"@settingsCollectionQuickActionTabSelecting": {},
"searchMetadataSectionTitle": "Metadatuak",
"@searchMetadataSectionTitle": {},
@@ -1025,7 +1025,7 @@
"@settingsViewerSectionTitle": {},
"settingsViewerGestureSideTapNext": "Pantailaren ertzetan sakatu aurreko/hurrengo elementua bistaratzeko",
"@settingsViewerGestureSideTapNext": {},
- "settingsViewerUseCutout": "Moztutako eremua erabili",
+ "settingsViewerUseCutout": "Erabili moztutako eremua",
"@settingsViewerUseCutout": {},
"settingsImageBackground": "Atzeko irudia",
"@settingsImageBackground": {},
@@ -1043,15 +1043,15 @@
"@settingsViewerQuickActionEmpty": {},
"settingsViewerOverlayPageTitle": "Inkrustazioak",
"@settingsViewerOverlayPageTitle": {},
- "settingsViewerShowMinimap": "Bistaratu minimapa",
+ "settingsViewerShowMinimap": "Erakutsi minimapa",
"@settingsViewerShowMinimap": {},
- "settingsViewerShowInformation": "Bistaratu informazioa",
+ "settingsViewerShowInformation": "Erakutsi informazioa",
"@settingsViewerShowInformation": {},
- "settingsViewerShowInformationSubtitle": "Bistaratu izenburua, data, kokapena, etab.",
+ "settingsViewerShowInformationSubtitle": "Erakutsi izenburua, data, kokalekua, etab.",
"@settingsViewerShowInformationSubtitle": {},
- "settingsViewerShowDescription": "Bistaratu deskribapena",
+ "settingsViewerShowDescription": "Erakutsi azalpena",
"@settingsViewerShowDescription": {},
- "settingsViewerShowOverlayThumbnails": "Bistaratu miniaturak",
+ "settingsViewerShowOverlayThumbnails": "Erakutsi miniaturak",
"@settingsViewerShowOverlayThumbnails": {},
"settingsSlideshowTransitionTile": "Trantsizioa",
"@settingsSlideshowTransitionTile": {},
@@ -1141,13 +1141,13 @@
"@settingsMotionPhotoAutoPlay": {},
"settingsViewerOverlayTile": "Inkrustazioak",
"@settingsViewerOverlayTile": {},
- "settingsViewerShowOverlayOnOpening": "Bistaratu hasieran",
+ "settingsViewerShowOverlayOnOpening": "Erakutsi irekitzean",
"@settingsViewerShowOverlayOnOpening": {},
- "settingsViewerShowRatingTags": "Bistaratu balorazioa eta etiketak",
+ "settingsViewerShowRatingTags": "Erakutsi balorazioa eta etiketak",
"@settingsViewerShowRatingTags": {},
"settingsViewerEnableOverlayBlurEffect": "Lausotze efektua",
"@settingsViewerEnableOverlayBlurEffect": {},
- "settingsViewerShowShootingDetails": "Bistaratu hartualdiaren xehetasunak",
+ "settingsViewerShowShootingDetails": "Erakutsi hartualdiaren xehetasunak",
"@settingsViewerShowShootingDetails": {},
"settingsViewerSlideshowPageTitle": "Aurkezpena",
"@settingsViewerSlideshowPageTitle": {},
@@ -1155,7 +1155,7 @@
"@settingsViewerSlideshowTile": {},
"settingsSlideshowShuffle": "Nahastu",
"@settingsSlideshowShuffle": {},
- "settingsSlideshowFillScreen": "Pantaila bete",
+ "settingsSlideshowFillScreen": "Bete pantaila",
"@settingsSlideshowFillScreen": {},
"settingsSlideshowRepeat": "Errepikatu",
"@settingsSlideshowRepeat": {},
@@ -1165,11 +1165,11 @@
"@settingsSlideshowVideoPlaybackTile": {},
"settingsSubtitleThemeTextPositionTile": "Testuaren posizioa",
"@settingsSubtitleThemeTextPositionTile": {},
- "settingsVideoShowVideos": "Bideoak erakutsi",
+ "settingsVideoShowVideos": "Erakutsi bideoak",
"@settingsVideoShowVideos": {},
- "settingsVideoPageTitle": "Bideoen ezarpenak",
+ "settingsVideoPageTitle": "Bideoaren ezarpenak",
"@settingsVideoPageTitle": {},
- "settingsVideoSectionTitle": "Bideo",
+ "settingsVideoSectionTitle": "Bideoa",
"@settingsVideoSectionTitle": {},
"settingsVideoEnableHardwareAcceleration": "Hardwarearen azelerazioa",
"@settingsVideoEnableHardwareAcceleration": {},
@@ -1427,13 +1427,13 @@
"@patternDialogConfirm": {},
"settingsVideoEnablePip": "Bideoa leihotxoan",
"@settingsVideoEnablePip": {},
- "settingsVideoBackgroundMode": "Erreprodukzioa atzeko planoan",
+ "settingsVideoBackgroundMode": "Atzeko planoko modua",
"@settingsVideoBackgroundMode": {},
"settingsVideoBackgroundModeDialogTitle": "Atzeko planoko modua",
"@settingsVideoBackgroundModeDialogTitle": {},
"settingsCollectionBurstPatternsNone": "Bat ere ez",
"@settingsCollectionBurstPatternsNone": {},
- "settingsCollectionBurstPatternsTile": "Segida moduak",
+ "settingsCollectionBurstPatternsTile": "Segida ereduak",
"@settingsCollectionBurstPatternsTile": {},
"tagPlaceholderState": "Egoera",
"@tagPlaceholderState": {},
@@ -1518,5 +1518,11 @@
"entryActionCast": "Igorri",
"@entryActionCast": {},
"castDialogTitle": "Igortzeko gailuak",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "Erakutsi HDR ikonoa",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "Ezarri hasiera gisa",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Bilduma pertsonalizatua",
+ "@setHomeCustomCollection": {}
}
diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb
index 5136e5c9d..7011c61e7 100644
--- a/lib/l10n/app_fr.arb
+++ b/lib/l10n/app_fr.arb
@@ -1360,5 +1360,11 @@
"entryActionCast": "Caster",
"@entryActionCast": {},
"castDialogTitle": "Appareils",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "collectionActionSetHome": "Définir comme page d’accueil",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Collection personnalisée",
+ "@setHomeCustomCollection": {},
+ "settingsThumbnailShowHdrIcon": "Afficher l’icône HDR",
+ "@settingsThumbnailShowHdrIcon": {}
}
diff --git a/lib/l10n/app_hu.arb b/lib/l10n/app_hu.arb
index ff32de97a..2cc375d95 100644
--- a/lib/l10n/app_hu.arb
+++ b/lib/l10n/app_hu.arb
@@ -1518,5 +1518,11 @@
"entryActionCast": "Kivetítés",
"@entryActionCast": {},
"castDialogTitle": "Kivetítő eszközök",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "HDR ikon megjelenítése",
+ "@settingsThumbnailShowHdrIcon": {},
+ "setHomeCustomCollection": "Egyéni gyűjtemény",
+ "@setHomeCustomCollection": {},
+ "collectionActionSetHome": "Kezdőlapnak beállít",
+ "@collectionActionSetHome": {}
}
diff --git a/lib/l10n/app_is.arb b/lib/l10n/app_is.arb
index ef10be1b8..bbd9d5e08 100644
--- a/lib/l10n/app_is.arb
+++ b/lib/l10n/app_is.arb
@@ -1518,5 +1518,11 @@
"settingsStorageAccessBanner": "Sumar möppur krefjast þess að gefin sé sérstök heimild til að breyta skrám í þeim. Þú getur yfirfarið hér þær möppur sem þú hefur gefið aðgangaheimildir fyrir.",
"@settingsStorageAccessBanner": {},
"settingsCollectionBurstPatternsTile": "Mynstur runu",
- "@settingsCollectionBurstPatternsTile": {}
+ "@settingsCollectionBurstPatternsTile": {},
+ "settingsThumbnailShowHdrIcon": "Birta HDR-táknmynd",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "Setja sem upphafsskjá",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Sérsniðið safn",
+ "@setHomeCustomCollection": {}
}
diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb
index b2a80a83a..b706cdbec 100644
--- a/lib/l10n/app_ko.arb
+++ b/lib/l10n/app_ko.arb
@@ -1360,5 +1360,11 @@
"entryActionCast": "전송",
"@entryActionCast": {},
"castDialogTitle": "전송 대상",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "HDR 아이콘 표시",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "홈으로 설정",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "지정 미디어",
+ "@setHomeCustomCollection": {}
}
diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb
index f8ff7e9e8..f5d2c1b3d 100644
--- a/lib/l10n/app_pl.arb
+++ b/lib/l10n/app_pl.arb
@@ -1518,5 +1518,11 @@
"entryActionCast": "Cast",
"@entryActionCast": {},
"castDialogTitle": "Urządzenia Cast",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "Pokaż ikonę HDR",
+ "@settingsThumbnailShowHdrIcon": {},
+ "setHomeCustomCollection": "Własna kolekcja",
+ "@setHomeCustomCollection": {},
+ "collectionActionSetHome": "Ustaw jako stronę główną",
+ "@collectionActionSetHome": {}
}
diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb
index 0bc76c5b8..5483b73d7 100644
--- a/lib/l10n/app_ru.arb
+++ b/lib/l10n/app_ru.arb
@@ -1360,5 +1360,11 @@
"entryActionCast": "Трансляция",
"@entryActionCast": {},
"castDialogTitle": "Устройства трансляции",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "Показать значок HDR",
+ "@settingsThumbnailShowHdrIcon": {},
+ "setHomeCustomCollection": "Собственная коллекция",
+ "@setHomeCustomCollection": {},
+ "collectionActionSetHome": "Установить как главную",
+ "@collectionActionSetHome": {}
}
diff --git a/lib/l10n/app_sat.arb b/lib/l10n/app_sat.arb
new file mode 100644
index 000000000..d344237d0
--- /dev/null
+++ b/lib/l10n/app_sat.arb
@@ -0,0 +1,7 @@
+{
+ "@@locale": "sat",
+ "welcomeMessage": "ᱮᱣᱥ ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ",
+ "@welcomeMessage": {},
+ "appName": "ᱮᱣᱥ",
+ "@appName": {}
+}
diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb
index a6491c7f3..eda652986 100644
--- a/lib/l10n/app_sk.arb
+++ b/lib/l10n/app_sk.arb
@@ -1518,5 +1518,11 @@
"aboutDataUsageClearCache": "Vymazať cache",
"@aboutDataUsageClearCache": {},
"castDialogTitle": "Cast zariadenia",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "collectionActionSetHome": "Nastaviť ako doma",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Kolekcia na mieru",
+ "@setHomeCustomCollection": {},
+ "settingsThumbnailShowHdrIcon": "Zobraziť ikonu HDR",
+ "@settingsThumbnailShowHdrIcon": {}
}
diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb
new file mode 100644
index 000000000..5f3f40eb4
--- /dev/null
+++ b/lib/l10n/app_sv.arb
@@ -0,0 +1,839 @@
+{
+ "viewerActionLock": "Lås",
+ "@viewerActionLock": {},
+ "entryInfoActionEditTags": "Redigera taggar",
+ "@entryInfoActionEditTags": {},
+ "videoActionPlay": "Spela",
+ "@videoActionPlay": {},
+ "viewerActionSettings": "Inställningar",
+ "@viewerActionSettings": {},
+ "albumTierSpecial": "Vanlig",
+ "@albumTierSpecial": {},
+ "displayRefreshRatePreferLowest": "Lägsta intervall",
+ "@displayRefreshRatePreferLowest": {},
+ "keepScreenOnViewerOnly": "Visningssidan bara",
+ "@keepScreenOnViewerOnly": {},
+ "mapStyleHuaweiTerrain": "Petal Maps (Terrain)",
+ "@mapStyleHuaweiTerrain": {},
+ "mapStyleHuaweiNormal": "Petal Maps",
+ "@mapStyleHuaweiNormal": {},
+ "mapStyleOsmHot": "Humanitarian OSM",
+ "@mapStyleOsmHot": {},
+ "videoResumptionModeAlways": "Alltid",
+ "@videoResumptionModeAlways": {},
+ "storageVolumeDescriptionFallbackPrimary": "Intern lagring",
+ "@storageVolumeDescriptionFallbackPrimary": {},
+ "widgetOpenPageCollection": "Öppen insamling",
+ "@widgetOpenPageCollection": {},
+ "widgetTapUpdateWidget": "Uppdatera widgeten",
+ "@widgetTapUpdateWidget": {},
+ "storageVolumeDescriptionFallbackNonPrimary": "SD kort",
+ "@storageVolumeDescriptionFallbackNonPrimary": {},
+ "welcomeTermsToggle": "Jag godkäner användar villkoren",
+ "@welcomeTermsToggle": {},
+ "focalLength": "{length} mm",
+ "@focalLength": {
+ "placeholders": {
+ "length": {
+ "type": "String",
+ "example": "5.4"
+ }
+ }
+ },
+ "deleteButtonLabel": "Ta bort",
+ "@deleteButtonLabel": {},
+ "showButtonLabel": "Visa",
+ "@showButtonLabel": {},
+ "hideButtonLabel": "Göm",
+ "@hideButtonLabel": {},
+ "continueButtonLabel": "Fortsätt",
+ "@continueButtonLabel": {},
+ "saveCopyButtonLabel": "Spara kopia",
+ "@saveCopyButtonLabel": {},
+ "changeTooltip": "Ändra",
+ "@changeTooltip": {},
+ "clearTooltip": "Rensa",
+ "@clearTooltip": {},
+ "previousTooltip": "Föregående",
+ "@previousTooltip": {},
+ "showTooltip": "Visa",
+ "@showTooltip": {},
+ "hideTooltip": "Göm",
+ "@hideTooltip": {},
+ "actionRemove": "Ta bort",
+ "@actionRemove": {},
+ "resetTooltip": "Återställ",
+ "@resetTooltip": {},
+ "saveTooltip": "Spara",
+ "@saveTooltip": {},
+ "pickTooltip": "Välj",
+ "@pickTooltip": {},
+ "sourceStateLocatingCountries": "Lokaliserar länder",
+ "@sourceStateLocatingCountries": {},
+ "sourceStateLocatingPlaces": "Lokaliserar platser",
+ "@sourceStateLocatingPlaces": {},
+ "chipActionDelete": "Ta bort",
+ "@chipActionDelete": {},
+ "chipActionGoToAlbumPage": "Visa i album",
+ "@chipActionGoToAlbumPage": {},
+ "welcomeOptional": "Valfritt",
+ "@welcomeOptional": {},
+ "applyButtonLabel": "TILLÄMPA",
+ "@applyButtonLabel": {},
+ "applyTooltip": "Tillämpa",
+ "@applyTooltip": {},
+ "cancelTooltip": "Avbryt",
+ "@cancelTooltip": {},
+ "doubleBackExitMessage": "Tryck \"bakåt\" igen för att stänga.",
+ "@doubleBackExitMessage": {},
+ "chipActionGoToCountryPage": "Visa i länder",
+ "@chipActionGoToCountryPage": {},
+ "chipActionGoToPlacePage": "Visa på Platser",
+ "@chipActionGoToPlacePage": {},
+ "chipActionGoToTagPage": "Visa i Taggar",
+ "@chipActionGoToTagPage": {},
+ "chipActionFilterOut": "Filtrera ut",
+ "@chipActionFilterOut": {},
+ "chipActionFilterIn": "Filtrera fram",
+ "@chipActionFilterIn": {},
+ "chipActionHide": "Göm",
+ "@chipActionHide": {},
+ "chipActionLock": "Lås",
+ "@chipActionLock": {},
+ "itemCount": "{count, plural, other{{count} objekt}}",
+ "@itemCount": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "columnCount": "{count, plural, =1{1 kolumn} other{{count} kolumner}}",
+ "@columnCount": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "timeSeconds": "{seconds, plural, =1{1 sekund} other{{seconds} sekunder}}",
+ "@timeSeconds": {
+ "placeholders": {
+ "seconds": {}
+ }
+ },
+ "timeMinutes": "{minutes, plural, =1{1 minut} other{{minutes} minuter}}",
+ "@timeMinutes": {
+ "placeholders": {
+ "minutes": {}
+ }
+ },
+ "timeDays": "{days, plural, =1{1 dag} other{{days} dagar}}",
+ "@timeDays": {
+ "placeholders": {
+ "days": {}
+ }
+ },
+ "chipActionPin": "Fäst överst",
+ "@chipActionPin": {},
+ "chipActionRename": "Byt namn",
+ "@chipActionRename": {},
+ "chipActionSetCover": "Välj som omslag",
+ "@chipActionSetCover": {},
+ "chipActionShowCountryStates": "Visa delstater",
+ "@chipActionShowCountryStates": {},
+ "chipActionCreateAlbum": "Skapa album",
+ "@chipActionCreateAlbum": {},
+ "chipActionCreateVault": "Skapa valv",
+ "@chipActionCreateVault": {},
+ "chipActionConfigureVault": "Konfigurera valv",
+ "@chipActionConfigureVault": {},
+ "entryActionConvert": "Konvertera",
+ "@entryActionConvert": {},
+ "entryActionExport": "Exportera",
+ "@entryActionExport": {},
+ "entryActionInfo": "Info",
+ "@entryActionInfo": {},
+ "entryActionRename": "Byt namn",
+ "@entryActionRename": {},
+ "entryActionRestore": "Återställ",
+ "@entryActionRestore": {},
+ "entryActionRotateCCW": "Rotera moturs",
+ "@entryActionRotateCCW": {},
+ "entryActionRotateCW": "Rotera medurs",
+ "@entryActionRotateCW": {},
+ "entryActionFlip": "Vrid horisontellt",
+ "@entryActionFlip": {},
+ "entryActionPrint": "Skriv ut",
+ "@entryActionPrint": {},
+ "entryActionShare": "Dela",
+ "@entryActionShare": {},
+ "entryActionShareImageOnly": "Dela endast bild",
+ "@entryActionShareImageOnly": {},
+ "entryActionShareVideoOnly": "Dela endast video",
+ "@entryActionShareVideoOnly": {},
+ "entryActionViewSource": "Visa källa",
+ "@entryActionViewSource": {},
+ "entryActionShowGeoTiffOnMap": "Visa som kartöverlägg",
+ "@entryActionShowGeoTiffOnMap": {},
+ "entryActionConvertMotionPhotoToStillImage": "Konvertera till stillbild",
+ "@entryActionConvertMotionPhotoToStillImage": {},
+ "entryActionViewMotionPhotoVideo": "Öppna video",
+ "@entryActionViewMotionPhotoVideo": {},
+ "entryActionEdit": "Redigera",
+ "@entryActionEdit": {},
+ "entryActionOpen": "Öppna med",
+ "@entryActionOpen": {},
+ "entryActionSetAs": "Välj som",
+ "@entryActionSetAs": {},
+ "entryActionOpenMap": "Visa i kartappen",
+ "@entryActionOpenMap": {},
+ "entryActionRotateScreen": "Rotera skärmen",
+ "@entryActionRotateScreen": {},
+ "entryActionAddFavourite": "Lägg till i favoritlistan",
+ "@entryActionAddFavourite": {},
+ "entryActionRemoveFavourite": "Lägg från favoritlistan",
+ "@entryActionRemoveFavourite": {},
+ "videoActionCaptureFrame": "Fånga stillbild",
+ "@videoActionCaptureFrame": {},
+ "videoActionMute": "Ljudlös",
+ "@videoActionMute": {},
+ "videoActionUnmute": "Ljud",
+ "@videoActionUnmute": {},
+ "videoActionPause": "Pausa",
+ "@videoActionPause": {},
+ "videoActionReplay10": "Spola tillbaks 10 sekunder",
+ "@videoActionReplay10": {},
+ "videoActionSkip10": "Spola framåt 10 sekunder",
+ "@videoActionSkip10": {},
+ "videoActionSelectStreams": "Välj spår",
+ "@videoActionSelectStreams": {},
+ "videoActionSetSpeed": "Uppspelningshastighet",
+ "@videoActionSetSpeed": {},
+ "entryActionDelete": "Radera",
+ "@entryActionDelete": {},
+ "entryActionCopyToClipboard": "Spara till urklipp",
+ "@entryActionCopyToClipboard": {},
+ "viewerActionUnlock": "Öppna",
+ "@viewerActionUnlock": {},
+ "slideshowActionResume": "Återuppta",
+ "@slideshowActionResume": {},
+ "slideshowActionShowInCollection": "Visa i samling",
+ "@slideshowActionShowInCollection": {},
+ "entryInfoActionEditDate": "Redigera datum & tid",
+ "@entryInfoActionEditDate": {},
+ "entryInfoActionEditLocation": "Redigera plats",
+ "@entryInfoActionEditLocation": {},
+ "entryInfoActionEditTitleDescription": "Redigera titel och beskrivning",
+ "@entryInfoActionEditTitleDescription": {},
+ "entryInfoActionEditRating": "Redigera betyg",
+ "@entryInfoActionEditRating": {},
+ "entryInfoActionRemoveMetadata": "Ta bort metadata",
+ "@entryInfoActionRemoveMetadata": {},
+ "entryInfoActionExportMetadata": "Exportera metadata",
+ "@entryInfoActionExportMetadata": {},
+ "entryInfoActionRemoveLocation": "Ta bort plats",
+ "@entryInfoActionRemoveLocation": {},
+ "editorActionTransform": "Transformera",
+ "@editorActionTransform": {},
+ "editorTransformCrop": "Beskär",
+ "@editorTransformCrop": {},
+ "editorTransformRotate": "Rotera",
+ "@editorTransformRotate": {},
+ "cropAspectRatioFree": "Fri",
+ "@cropAspectRatioFree": {},
+ "cropAspectRatioOriginal": "Original",
+ "@cropAspectRatioOriginal": {},
+ "cropAspectRatioSquare": "Fyrkant",
+ "@cropAspectRatioSquare": {},
+ "filterAspectRatioLandscapeLabel": "Liggande",
+ "@filterAspectRatioLandscapeLabel": {},
+ "filterAspectRatioPortraitLabel": "Porträtt",
+ "@filterAspectRatioPortraitLabel": {},
+ "filterBinLabel": "Papperskorg",
+ "@filterBinLabel": {},
+ "filterFavouriteLabel": "Favorit",
+ "@filterFavouriteLabel": {},
+ "filterNoDateLabel": "Odaterat",
+ "@filterNoDateLabel": {},
+ "filterNoAddressLabel": "Ingen adress",
+ "@filterNoAddressLabel": {},
+ "filterLocatedLabel": "Belägen",
+ "@filterLocatedLabel": {},
+ "filterNoLocationLabel": "Ej belägen",
+ "@filterNoLocationLabel": {},
+ "filterNoTagLabel": "otaggad",
+ "@filterNoTagLabel": {},
+ "filterNoTitleLabel": "Obetitlad",
+ "@filterNoTitleLabel": {},
+ "filterOnThisDayLabel": "På den här dagen",
+ "@filterOnThisDayLabel": {},
+ "filterRecentlyAddedLabel": "Nyligen tillagd",
+ "@filterRecentlyAddedLabel": {},
+ "filterRatingRejectedLabel": "Avisad",
+ "@filterRatingRejectedLabel": {},
+ "filterTypeAnimatedLabel": "Animerad",
+ "@filterTypeAnimatedLabel": {},
+ "filterTypeMotionPhotoLabel": "Rörelsefoto",
+ "@filterTypeMotionPhotoLabel": {},
+ "filterTypePanoramaLabel": "Panorama",
+ "@filterTypePanoramaLabel": {},
+ "filterTypeRawLabel": "Raw",
+ "@filterTypeRawLabel": {},
+ "filterTypeSphericalVideoLabel": "360° Video",
+ "@filterTypeSphericalVideoLabel": {},
+ "filterTypeGeotiffLabel": "GeoTIFF",
+ "@filterTypeGeotiffLabel": {},
+ "filterMimeImageLabel": "Bild",
+ "@filterMimeImageLabel": {},
+ "filterMimeVideoLabel": "Video",
+ "@filterMimeVideoLabel": {},
+ "accessibilityAnimationsRemove": "Förhindra skärmeffekter",
+ "@accessibilityAnimationsRemove": {},
+ "accessibilityAnimationsKeep": "Behåll skärmeffekter",
+ "@accessibilityAnimationsKeep": {},
+ "albumTierNew": "Ny",
+ "@albumTierNew": {},
+ "albumTierPinned": "Fastnålad",
+ "@albumTierPinned": {},
+ "albumTierApps": "Appar",
+ "@albumTierApps": {},
+ "albumTierVaults": "Valv",
+ "@albumTierVaults": {},
+ "albumTierRegular": "Andra",
+ "@albumTierRegular": {},
+ "coordinateFormatDms": "DMS",
+ "@coordinateFormatDms": {},
+ "coordinateFormatDecimal": "Decimal degrees",
+ "@coordinateFormatDecimal": {},
+ "coordinateDms": "{coordinate} {direction}",
+ "@coordinateDms": {
+ "placeholders": {
+ "coordinate": {
+ "type": "String",
+ "example": "38° 41′ 47.72″"
+ },
+ "direction": {
+ "type": "String",
+ "example": "S"
+ }
+ }
+ },
+ "coordinateDmsNorth": "N",
+ "@coordinateDmsNorth": {},
+ "coordinateDmsSouth": "S",
+ "@coordinateDmsSouth": {},
+ "coordinateDmsEast": "Ö",
+ "@coordinateDmsEast": {},
+ "coordinateDmsWest": "V",
+ "@coordinateDmsWest": {},
+ "displayRefreshRatePreferHighest": "Högsta intervall",
+ "@displayRefreshRatePreferHighest": {},
+ "keepScreenOnVideoPlayback": "Under videouppspelning",
+ "@keepScreenOnVideoPlayback": {},
+ "keepScreenOnAlways": "Alltid",
+ "@keepScreenOnAlways": {},
+ "lengthUnitPixel": "px",
+ "@lengthUnitPixel": {},
+ "lengthUnitPercent": "%",
+ "@lengthUnitPercent": {},
+ "mapStyleGoogleNormal": "Google Maps",
+ "@mapStyleGoogleNormal": {},
+ "mapStyleGoogleHybrid": "Google Maps (Hybrid)",
+ "@mapStyleGoogleHybrid": {},
+ "mapStyleGoogleTerrain": "Google Maps (Terrain)",
+ "@mapStyleGoogleTerrain": {},
+ "mapStyleStamenWatercolor": "Stamen Watercolor",
+ "@mapStyleStamenWatercolor": {},
+ "maxBrightnessNever": "Alldrig",
+ "@maxBrightnessNever": {},
+ "maxBrightnessAlways": "Alltid",
+ "@maxBrightnessAlways": {},
+ "nameConflictStrategyRename": "Byt namn",
+ "@nameConflictStrategyRename": {},
+ "nameConflictStrategyReplace": "Ersätt",
+ "@nameConflictStrategyReplace": {},
+ "nameConflictStrategySkip": "Skippa",
+ "@nameConflictStrategySkip": {},
+ "overlayHistogramNone": "Igen",
+ "@overlayHistogramNone": {},
+ "overlayHistogramRGB": "RGB",
+ "@overlayHistogramRGB": {},
+ "overlayHistogramLuminance": "Luminans",
+ "@overlayHistogramLuminance": {},
+ "subtitlePositionBottom": "Nederkant",
+ "@subtitlePositionBottom": {},
+ "subtitlePositionTop": "Överkant",
+ "@subtitlePositionTop": {},
+ "themeBrightnessLight": "Ljus",
+ "@themeBrightnessLight": {},
+ "themeBrightnessDark": "Mörk",
+ "@themeBrightnessDark": {},
+ "themeBrightnessBlack": "Svart",
+ "@themeBrightnessBlack": {},
+ "unitSystemMetric": "Metrisk",
+ "@unitSystemMetric": {},
+ "unitSystemImperial": "Brittiskt",
+ "@unitSystemImperial": {},
+ "vaultLockTypePattern": "Mönster",
+ "@vaultLockTypePattern": {},
+ "vaultLockTypePin": "PIN",
+ "@vaultLockTypePin": {},
+ "vaultLockTypePassword": "Lösenord",
+ "@vaultLockTypePassword": {},
+ "settingsVideoEnablePip": "Bild-i-bild",
+ "@settingsVideoEnablePip": {},
+ "videoControlsPlay": "Spela",
+ "@videoControlsPlay": {},
+ "videoControlsPlaySeek": "Spela & sök bakåt/framåt",
+ "@videoControlsPlaySeek": {},
+ "videoControlsPlayOutside": "Öppna med annan spelare",
+ "@videoControlsPlayOutside": {},
+ "videoControlsNone": "Ingen",
+ "@videoControlsNone": {},
+ "videoLoopModeNever": "Aldrig",
+ "@videoLoopModeNever": {},
+ "videoLoopModeShortOnly": "Bara korta videor",
+ "@videoLoopModeShortOnly": {},
+ "videoLoopModeAlways": "Alltid",
+ "@videoLoopModeAlways": {},
+ "videoPlaybackSkip": "Skippa",
+ "@videoPlaybackSkip": {},
+ "videoPlaybackMuted": "Spela ljudlös",
+ "@videoPlaybackMuted": {},
+ "videoPlaybackWithSound": "Spela med ljud",
+ "@videoPlaybackWithSound": {},
+ "videoResumptionModeNever": "Alldrig",
+ "@videoResumptionModeNever": {},
+ "viewerTransitionSlide": "Glid",
+ "@viewerTransitionSlide": {},
+ "viewerTransitionParallax": "Parallax",
+ "@viewerTransitionParallax": {},
+ "viewerTransitionNone": "Igen",
+ "@viewerTransitionNone": {},
+ "wallpaperTargetHome": "Hemskärm",
+ "@wallpaperTargetHome": {},
+ "widgetDisplayedItemRandom": "Slumpvis",
+ "@widgetDisplayedItemRandom": {},
+ "widgetDisplayedItemMostRecent": "Alldra senast",
+ "@widgetDisplayedItemMostRecent": {},
+ "widgetOpenPageHome": "Öppna hem",
+ "@widgetOpenPageHome": {},
+ "otherDirectoryDescription": "“{name}” map",
+ "@otherDirectoryDescription": {
+ "placeholders": {
+ "name": {
+ "type": "String",
+ "example": "Pictures",
+ "description": "the name of a specific directory"
+ }
+ }
+ },
+ "storageAccessDialogMessage": "Var snäll och välj {directory} av“{volume}” på nästa skärm för att ge appen åtkomst till den.",
+ "@storageAccessDialogMessage": {
+ "placeholders": {
+ "directory": {
+ "type": "String",
+ "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`"
+ },
+ "volume": {
+ "type": "String",
+ "example": "SD card",
+ "description": "the name of a storage volume"
+ }
+ }
+ },
+ "videoStartOverButtonLabel": "BÖRJA OM",
+ "@videoStartOverButtonLabel": {},
+ "videoResumeButtonLabel": "Återuppta",
+ "@videoResumeButtonLabel": {},
+ "setCoverDialogLatest": "Senaste objektet",
+ "@setCoverDialogLatest": {},
+ "setCoverDialogAuto": "Auto",
+ "@setCoverDialogAuto": {},
+ "setCoverDialogCustom": "Anpassad",
+ "@setCoverDialogCustom": {},
+ "hideFilterConfirmationDialogMessage": "Matchande foton och videor kommer att döljas från din samling. Du kan välja att visa dem igen från \"sekretessinställningarna\".\n\nÄr du säker på att du vill dölja dem?",
+ "@hideFilterConfirmationDialogMessage": {},
+ "newAlbumDialogTitle": "Nytt Album",
+ "@newAlbumDialogTitle": {},
+ "newAlbumDialogNameLabelAlreadyExistsHelper": "Mappen existerar redan",
+ "@newAlbumDialogNameLabelAlreadyExistsHelper": {},
+ "newAlbumDialogStorageLabel": "Lagring:",
+ "@newAlbumDialogStorageLabel": {},
+ "newVaultDialogTitle": "Nytt Valv",
+ "@newVaultDialogTitle": {},
+ "configureVaultDialogTitle": "Konfigurera Valv",
+ "@configureVaultDialogTitle": {},
+ "vaultDialogLockTypeLabel": "Lås typ",
+ "@vaultDialogLockTypeLabel": {},
+ "pinDialogConfirm": "Bekräfta pinkod",
+ "@pinDialogConfirm": {},
+ "pinDialogEnter": "Ange Pinkod",
+ "@pinDialogEnter": {},
+ "passwordDialogEnter": "Ange lösenord",
+ "@passwordDialogEnter": {},
+ "passwordDialogConfirm": "Bekräfta lösenord",
+ "@passwordDialogConfirm": {},
+ "authenticateToConfigureVault": "Autentisera för att konfigurera valvet",
+ "@authenticateToConfigureVault": {},
+ "appName": "Aves",
+ "@appName": {},
+ "welcomeMessage": "Välkommen till Aves",
+ "@welcomeMessage": {},
+ "nextButtonLabel": "Nästa",
+ "@nextButtonLabel": {},
+ "nextTooltip": "Nästs",
+ "@nextTooltip": {},
+ "doNotAskAgain": "Fråga inte igen",
+ "@doNotAskAgain": {},
+ "sourceStateLoading": "Laddar",
+ "@sourceStateLoading": {},
+ "sourceStateCataloguing": "Katalogiserar",
+ "@sourceStateCataloguing": {},
+ "editEntryLocationDialogLongitude": "Longitud",
+ "@editEntryLocationDialogLongitude": {},
+ "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP behövs för att spela upp videon i ett Rörelsefoto.\n\nÄr du säker att du vill ta bort det?",
+ "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {},
+ "videoStreamSelectionDialogOff": "Av",
+ "@videoStreamSelectionDialogOff": {},
+ "videoStreamSelectionDialogTrack": "Spår",
+ "@videoStreamSelectionDialogTrack": {},
+ "videoStreamSelectionDialogNoSelection": "Det finns inga andra spår.",
+ "@videoStreamSelectionDialogNoSelection": {},
+ "genericSuccessFeedback": "Klar!",
+ "@genericSuccessFeedback": {},
+ "genericFailureFeedback": "Misslyckad",
+ "@genericFailureFeedback": {},
+ "genericDangerWarningDialogMessage": "Är du säker?",
+ "@genericDangerWarningDialogMessage": {},
+ "tooManyItemsErrorDialogMessage": "Försök ingen med färre objekt.",
+ "@tooManyItemsErrorDialogMessage": {},
+ "menuActionConfigureView": "Visa",
+ "@menuActionConfigureView": {},
+ "menuActionSelectAll": "Välj alla",
+ "@menuActionSelectAll": {},
+ "menuActionSelect": "Välj",
+ "@menuActionSelect": {},
+ "menuActionSelectNone": "Välj ingen",
+ "@menuActionSelectNone": {},
+ "menuActionMap": "Karta",
+ "@menuActionMap": {},
+ "menuActionSlideshow": "Bildspel",
+ "@menuActionSlideshow": {},
+ "menuActionStats": "Statistik",
+ "@menuActionStats": {},
+ "filterNoRatingLabel": "Ej betygsatt",
+ "@filterNoRatingLabel": {},
+ "viewerTransitionZoomIn": "Zooma in",
+ "@viewerTransitionZoomIn": {},
+ "nameConflictDialogSingleSourceMessage": "Vissa filer i destinationsmappen har samma namn.",
+ "@nameConflictDialogSingleSourceMessage": {},
+ "nameConflictDialogMultipleSourceMessage": "Vissa filer har samma namn.",
+ "@nameConflictDialogMultipleSourceMessage": {},
+ "noMatchingAppDialogMessage": "Det finns inga appar som kan hantera detta.",
+ "@noMatchingAppDialogMessage": {},
+ "moveUndatedConfirmationDialogSetDate": "Spara datum",
+ "@moveUndatedConfirmationDialogSetDate": {},
+ "videoResumeDialogMessage": "Vill du återuppta uppspelningen vid",
+ "@videoResumeDialogMessage": {
+ "placeholders": {
+ "time": {
+ "type": "String",
+ "example": "13:37"
+ }
+ }
+ },
+ "newAlbumDialogNameLabel": "Album namn",
+ "@newAlbumDialogNameLabel": {},
+ "newVaultWarningDialogMessage": "Objekt i valv är endast tillgängliga i denna app och inga andra.\n\nOm du avinstallerar den här appen eller rensar appens data kommer du att förlora alla dessa objekt.",
+ "@newVaultWarningDialogMessage": {},
+ "vaultDialogLockModeWhenScreenOff": "Lås när skärmen stängs av",
+ "@vaultDialogLockModeWhenScreenOff": {},
+ "patternDialogEnter": "Ange mönster",
+ "@patternDialogEnter": {},
+ "patternDialogConfirm": "Bekräfta mönster",
+ "@patternDialogConfirm": {},
+ "renameEntrySetPagePatternFieldLabel": "Namnge mönster",
+ "@renameEntrySetPagePatternFieldLabel": {},
+ "renameEntrySetPageInsertTooltip": "Infoga ---",
+ "@renameEntrySetPageInsertTooltip": {},
+ "renameEntrySetPagePreviewSectionTitle": "Förhandsgranska",
+ "@renameEntrySetPagePreviewSectionTitle": {},
+ "renameProcessorName": "Namn",
+ "@renameProcessorName": {},
+ "exportEntryDialogFormat": "Format:",
+ "@exportEntryDialogFormat": {},
+ "exportEntryDialogWidth": "Bredd",
+ "@exportEntryDialogWidth": {},
+ "exportEntryDialogHeight": "Höjd",
+ "@exportEntryDialogHeight": {},
+ "exportEntryDialogQuality": "Kvalitet",
+ "@exportEntryDialogQuality": {},
+ "exportEntryDialogWriteMetadata": "Skriv metadata",
+ "@exportEntryDialogWriteMetadata": {},
+ "renameEntryDialogLabel": "Nytt namn",
+ "@renameEntryDialogLabel": {},
+ "editEntryDialogCopyFromItem": "Kopiera från annat objekt",
+ "@editEntryDialogCopyFromItem": {},
+ "editEntryDateDialogTitle": "Datum & Tid",
+ "@editEntryDateDialogTitle": {},
+ "editEntryDateDialogExtractFromTitle": "Kopiera från titel",
+ "@editEntryDateDialogExtractFromTitle": {},
+ "editEntryDateDialogShift": "Skift",
+ "@editEntryDateDialogShift": {},
+ "editEntryDateDialogSourceFileModifiedDate": "Filens modifieringsdatum",
+ "@editEntryDateDialogSourceFileModifiedDate": {},
+ "durationDialogHours": "Timmar",
+ "@durationDialogHours": {},
+ "durationDialogMinutes": "Minuter",
+ "@durationDialogMinutes": {},
+ "durationDialogSeconds": "Sekunder",
+ "@durationDialogSeconds": {},
+ "editEntryLocationDialogTitle": "Plats",
+ "@editEntryLocationDialogTitle": {},
+ "editEntryLocationDialogChooseOnMap": "Välj på karta",
+ "@editEntryLocationDialogChooseOnMap": {},
+ "editEntryLocationDialogLatitude": "Latitud",
+ "@editEntryLocationDialogLatitude": {},
+ "locationPickerUseThisLocationButton": "Använd den här platsen",
+ "@locationPickerUseThisLocationButton": {},
+ "editEntryRatingDialogTitle": "Betyg",
+ "@editEntryRatingDialogTitle": {},
+ "removeEntryMetadataDialogTitle": "Borttagning av metadata",
+ "@removeEntryMetadataDialogTitle": {},
+ "removeEntryMetadataDialogMore": "Mer",
+ "@removeEntryMetadataDialogMore": {},
+ "videoSpeedDialogLabel": "Uppspelningshastighet",
+ "@videoSpeedDialogLabel": {},
+ "videoStreamSelectionDialogVideo": "Video",
+ "@videoStreamSelectionDialogVideo": {},
+ "videoStreamSelectionDialogAudio": "Ljud",
+ "@videoStreamSelectionDialogAudio": {},
+ "videoStreamSelectionDialogText": "Undertexter",
+ "@videoStreamSelectionDialogText": {},
+ "aboutBugReportInstruction": "Rapportera på GitHub med loggarna och systeminformation.",
+ "@aboutBugReportInstruction": {},
+ "aboutDataUsageInternal": "Internt",
+ "@aboutDataUsageInternal": {},
+ "aboutLicensesBanner": "Den här appen använder följande paket och bibliotek under öppen källkod-licens",
+ "@aboutLicensesBanner": {},
+ "collectionPickPageTitle": "Välj",
+ "@collectionPickPageTitle": {},
+ "aboutBugCopyInfoButton": "Kopiera",
+ "@aboutBugCopyInfoButton": {},
+ "aboutBugReportButton": "Rapportera",
+ "@aboutBugReportButton": {},
+ "aboutDataUsageData": "Data",
+ "@aboutDataUsageData": {},
+ "aboutDataUsageSectionTitle": "DataAnvänding",
+ "@aboutDataUsageSectionTitle": {},
+ "aboutDataUsageCache": "Cache",
+ "@aboutDataUsageCache": {},
+ "aboutDataUsageDatabase": "Databas",
+ "@aboutDataUsageDatabase": {},
+ "aboutDataUsageMisc": "Annat",
+ "@aboutDataUsageMisc": {},
+ "aboutDataUsageExternal": "Externt",
+ "@aboutDataUsageExternal": {},
+ "aboutDataUsageClearCache": "Rensa Cacheminnet",
+ "@aboutDataUsageClearCache": {},
+ "aboutCreditsWorldAtlas1": "Den här appen använder en TopoJSON fil från",
+ "@aboutCreditsWorldAtlas1": {},
+ "aboutCreditsWorldAtlas2": "under ISC Licens.",
+ "@aboutCreditsWorldAtlas2": {},
+ "aboutTranslatorsSectionTitle": "Översättare",
+ "@aboutTranslatorsSectionTitle": {},
+ "aboutLicensesSectionTitle": "Öppen-Källkod Licenser",
+ "@aboutLicensesSectionTitle": {},
+ "aboutLicensesAndroidLibrariesSectionTitle": "Android Biblotek",
+ "@aboutLicensesAndroidLibrariesSectionTitle": {},
+ "aboutLicensesFlutterPluginsSectionTitle": "Flutter Tillägg",
+ "@aboutLicensesFlutterPluginsSectionTitle": {},
+ "collectionPageTitle": "Samling",
+ "@collectionPageTitle": {},
+ "collectionSelectPageTitle": "Välj objekt",
+ "@collectionSelectPageTitle": {},
+ "collectionActionEmptyBin": "Töm papperskorgen",
+ "@collectionActionEmptyBin": {},
+ "collectionActionCopy": "kopiera till album",
+ "@collectionActionCopy": {},
+ "collectionActionMove": "Flytta till album",
+ "@collectionActionMove": {},
+ "viewDialogSortSectionTitle": "Sortera",
+ "@viewDialogSortSectionTitle": {},
+ "viewDialogGroupSectionTitle": "Grupp",
+ "@viewDialogGroupSectionTitle": {},
+ "viewDialogLayoutSectionTitle": "Layout",
+ "@viewDialogLayoutSectionTitle": {},
+ "viewDialogReverseSortOrder": "Omvänd sorteringsordning",
+ "@viewDialogReverseSortOrder": {},
+ "tileLayoutMosaic": "Mosaik",
+ "@tileLayoutMosaic": {},
+ "tileLayoutGrid": "Nät",
+ "@tileLayoutGrid": {},
+ "tileLayoutList": "Lista",
+ "@tileLayoutList": {},
+ "coverDialogTabCover": "Omslag",
+ "@coverDialogTabCover": {},
+ "coverDialogTabApp": "App",
+ "@coverDialogTabApp": {},
+ "coverDialogTabColor": "Färg",
+ "@coverDialogTabColor": {},
+ "appPickDialogTitle": "Välj App",
+ "@appPickDialogTitle": {},
+ "appPickDialogNone": "Igen",
+ "@appPickDialogNone": {},
+ "aboutPageTitle": "Om",
+ "@aboutPageTitle": {},
+ "aboutLinkLicense": "Licens",
+ "@aboutLinkLicense": {},
+ "aboutLinkPolicy": "IntegritetsPolicy",
+ "@aboutLinkPolicy": {},
+ "aboutBugSectionTitle": "FelRapport",
+ "@aboutBugSectionTitle": {},
+ "aboutBugSaveLogInstruction": "Spara appens log till en fil",
+ "@aboutBugSaveLogInstruction": {},
+ "aboutBugCopyInfoInstruction": "Kopiera systemInformation",
+ "@aboutBugCopyInfoInstruction": {},
+ "aboutLicensesShowAllButtonLabel": "Visa alla licenser",
+ "@aboutLicensesShowAllButtonLabel": {},
+ "policyPageTitle": "IntegritetsPolicy",
+ "@policyPageTitle": {},
+ "collectionActionHideTitleSearch": "Göm titelfilter",
+ "@collectionActionHideTitleSearch": {},
+ "collectionActionAddShortcut": "Lägg till genväg",
+ "@collectionActionAddShortcut": {},
+ "collectionActionRescan": "Scanna om",
+ "@collectionActionRescan": {},
+ "collectionActionEdit": "Redigera",
+ "@collectionActionEdit": {},
+ "collectionSearchTitlesHintText": "Sög titlar",
+ "@collectionSearchTitlesHintText": {},
+ "dateYesterday": "Igår",
+ "@dateYesterday": {},
+ "dateThisMonth": "Den här månaden",
+ "@dateThisMonth": {},
+ "collectionDeleteFailureFeedback": "{count, plural, other{Misslyckades med att ta bort {count} objekt}}",
+ "@collectionDeleteFailureFeedback": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "collectionCopyFailureFeedback": "{count, plural, =1{Lyckades inte kopiera 1 objekt} other{Lyckades inte kopiera {count} objekt}}",
+ "@collectionCopyFailureFeedback": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "collectionMoveFailureFeedback": "{count, plural, =1{Lyckades inte flytta 1 objekt} other{Lyckades inte flytta {count} objekt}}",
+ "@collectionMoveFailureFeedback": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "collectionRenameFailureFeedback": "{count, plural, =1{Lyckades inte byta namn på 1 objekt} other{Lyckades inte byta namn på {count} objekt}}",
+ "@collectionRenameFailureFeedback": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "collectionEmptyFavourites": "Inga favoriter",
+ "@collectionEmptyFavourites": {},
+ "collectionEmptyGrantAccessButtonLabel": "Ge åtkomst",
+ "@collectionEmptyGrantAccessButtonLabel": {},
+ "sortOrderLargestFirst": "Störst först",
+ "@sortOrderLargestFirst": {},
+ "sortByDate": "På datum",
+ "@sortByDate": {},
+ "sortOrderSmallestFirst": "Minst först",
+ "@sortOrderSmallestFirst": {},
+ "wallpaperTargetLock": "Låsskärm",
+ "@wallpaperTargetLock": {},
+ "entryActionCast": "Casta",
+ "@entryActionCast": {},
+ "filterTaggedLabel": "Taggad",
+ "@filterTaggedLabel": {},
+ "keepScreenOnNever": "Alldrig",
+ "@keepScreenOnNever": {},
+ "viewerTransitionFade": "Tona ut",
+ "@viewerTransitionFade": {},
+ "wallpaperTargetHomeLock": "Hem och låsskärmar",
+ "@wallpaperTargetHomeLock": {},
+ "missingSystemFilePickerDialogMessage": "systemets filväljare är borta eller avstängd. Var snäll och sätt på den och försök igen.",
+ "@missingSystemFilePickerDialogMessage": {},
+ "renameProcessorCounter": "Räknare",
+ "@renameProcessorCounter": {},
+ "editEntryLocationDialogSetCustom": "Ange anpassad plats",
+ "@editEntryLocationDialogSetCustom": {},
+ "collectionGroupAlbum": "Om album",
+ "@collectionGroupAlbum": {},
+ "collectionGroupMonth": "Om månad",
+ "@collectionGroupMonth": {},
+ "collectionGroupDay": "Om dag",
+ "@collectionGroupDay": {},
+ "collectionGroupNone": "Gruppera inte",
+ "@collectionGroupNone": {},
+ "sectionUnknown": "Okänd",
+ "@sectionUnknown": {},
+ "dateToday": "Idag",
+ "@dateToday": {},
+ "collectionActionSetHome": "Välj som hem",
+ "@collectionActionSetHome": {},
+ "collectionEmptyVideos": "Inga Videor",
+ "@collectionEmptyVideos": {},
+ "collectionEmptyImages": "Inga bilder",
+ "@collectionEmptyImages": {},
+ "drawerCollectionMotionPhotos": "Rörelsefoton",
+ "@drawerCollectionMotionPhotos": {},
+ "drawerAboutButton": "Om",
+ "@drawerAboutButton": {},
+ "drawerSettingsButton": "Inställningar",
+ "@drawerSettingsButton": {},
+ "drawerCollectionAll": "Hela samlingen",
+ "@drawerCollectionAll": {},
+ "drawerCollectionFavourites": "Favoriter",
+ "@drawerCollectionFavourites": {},
+ "drawerCollectionImages": "Bilder",
+ "@drawerCollectionImages": {},
+ "drawerCollectionVideos": "Videor",
+ "@drawerCollectionVideos": {},
+ "drawerCollectionAnimated": "Animerad",
+ "@drawerCollectionAnimated": {},
+ "collectionDeselectSectionTooltip": "Avmarkera sektion",
+ "@collectionDeselectSectionTooltip": {},
+ "drawerCollectionPanoramas": "Panoraman",
+ "@drawerCollectionPanoramas": {},
+ "collectionSelectSectionTooltip": "Markera sektion",
+ "@collectionSelectSectionTooltip": {},
+ "drawerCollectionRaws": "Bilder - råformat",
+ "@drawerCollectionRaws": {},
+ "drawerCollectionSphericalVideos": "360° Videor",
+ "@drawerCollectionSphericalVideos": {},
+ "drawerAlbumPage": "Album",
+ "@drawerAlbumPage": {},
+ "drawerCountryPage": "Länder",
+ "@drawerCountryPage": {},
+ "drawerPlacePage": "Platser",
+ "@drawerPlacePage": {},
+ "drawerTagPage": "Taggar",
+ "@drawerTagPage": {},
+ "sortOrderNewestFirst": "Nyast först",
+ "@sortOrderNewestFirst": {},
+ "sortByName": "På namn",
+ "@sortByName": {},
+ "sortByItemCount": "På antal objekt",
+ "@sortByItemCount": {},
+ "sortBySize": "På storlek",
+ "@sortBySize": {},
+ "sortByAlbumFileName": "På album & filnamn",
+ "@sortByAlbumFileName": {},
+ "sortByRating": "På omdöme",
+ "@sortByRating": {},
+ "sortOrderOldestFirst": "Äldst först",
+ "@sortOrderOldestFirst": {},
+ "sortOrderAtoZ": "A till Ö",
+ "@sortOrderAtoZ": {},
+ "sortOrderZtoA": "Ö till A",
+ "@sortOrderZtoA": {},
+ "filePickerUseThisFolder": "Använd den har mappen",
+ "@filePickerUseThisFolder": {},
+ "chipActionUnpin": "Släpp från fästet",
+ "@chipActionUnpin": {}
+}
diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb
index ce5f1f103..445635590 100644
--- a/lib/l10n/app_tr.arb
+++ b/lib/l10n/app_tr.arb
@@ -29,7 +29,7 @@
"@hideButtonLabel": {},
"continueButtonLabel": "DEVAM ET",
"@continueButtonLabel": {},
- "cancelTooltip": "İptal et",
+ "cancelTooltip": "İptal",
"@cancelTooltip": {},
"changeTooltip": "Değiştir",
"@changeTooltip": {},
@@ -75,7 +75,7 @@
"@chipActionHide": {},
"chipActionPin": "Başa sabitle",
"@chipActionPin": {},
- "chipActionUnpin": "Baştan çıkar",
+ "chipActionUnpin": "Sabitlemeyi kaldır",
"@chipActionUnpin": {},
"chipActionRename": "Yeniden adlandır",
"@chipActionRename": {},
@@ -95,7 +95,7 @@
"@entryActionInfo": {},
"entryActionRename": "Yeniden adlandır",
"@entryActionRename": {},
- "entryActionRestore": "Dışa aktar",
+ "entryActionRestore": "Geri getir",
"@entryActionRestore": {},
"entryActionRotateCCW": "Saat yönünün tersine döndür",
"@entryActionRotateCCW": {},
@@ -129,11 +129,11 @@
"@entryActionAddFavourite": {},
"entryActionRemoveFavourite": "Favorilerden kaldır",
"@entryActionRemoveFavourite": {},
- "videoActionCaptureFrame": "Çerçeve yakala",
+ "videoActionCaptureFrame": "Kareyi yakala",
"@videoActionCaptureFrame": {},
- "videoActionMute": "Sustur",
+ "videoActionMute": "Sessize al",
"@videoActionMute": {},
- "videoActionUnmute": "Susturmayı kaldır",
+ "videoActionUnmute": "Sesi aç",
"@videoActionUnmute": {},
"videoActionPause": "Duraklat",
"@videoActionPause": {},
@@ -143,7 +143,7 @@
"@videoActionReplay10": {},
"videoActionSkip10": "10 saniye ileri git",
"@videoActionSkip10": {},
- "videoActionSelectStreams": "Parça seç",
+ "videoActionSelectStreams": "Ses parçası seç",
"@videoActionSelectStreams": {},
"videoActionSetSpeed": "Oynatma hızı",
"@videoActionSetSpeed": {},
@@ -241,7 +241,7 @@
"@nameConflictStrategySkip": {},
"keepScreenOnNever": "Asla",
"@keepScreenOnNever": {},
- "keepScreenOnViewerOnly": "Yalnızca görüntüleyici sayfası",
+ "keepScreenOnViewerOnly": "Yalnızca görüntüleyici sayfasında",
"@keepScreenOnViewerOnly": {},
"keepScreenOnAlways": "Her zaman",
"@keepScreenOnAlways": {},
@@ -367,7 +367,7 @@
"@editEntryDialogCopyFromItem": {},
"editEntryDateDialogExtractFromTitle": "Başlıktan ayıkla",
"@editEntryDateDialogExtractFromTitle": {},
- "editEntryDateDialogShift": "Değişim",
+ "editEntryDateDialogShift": "Değiştir",
"@editEntryDateDialogShift": {},
"editEntryDateDialogSourceFileModifiedDate": "Dosya değiştirilme tarihi",
"@editEntryDateDialogSourceFileModifiedDate": {},
@@ -641,7 +641,7 @@
"@tagEmpty": {},
"binPageTitle": "Geri Dönüşüm Kutusu",
"@binPageTitle": {},
- "searchCollectionFieldHint": "Koleksiyonu ara",
+ "searchCollectionFieldHint": "Koleksiyonda ara",
"@searchCollectionFieldHint": {},
"searchRecentSectionTitle": "Yakın zamanda",
"@searchRecentSectionTitle": {},
@@ -1169,7 +1169,7 @@
"@settingsWidgetDisplayedItem": {},
"settingsSubtitleThemeTextPositionDialogTitle": "Metin Konumu",
"@settingsSubtitleThemeTextPositionDialogTitle": {},
- "filterNoAddressLabel": "Adres yok",
+ "filterNoAddressLabel": "Adressiz",
"@filterNoAddressLabel": {},
"filterAspectRatioLandscapeLabel": "Yatay",
"@filterAspectRatioLandscapeLabel": {},
@@ -1206,5 +1206,165 @@
"tooManyItemsErrorDialogMessage": "Daha az ögeyle tekrar deneyin.",
"@tooManyItemsErrorDialogMessage": {},
"settingsVideoGestureVerticalDragBrightnessVolume": "Parlaklığı/ses seviyesini ayarlamak için yukarı veya aşağı kaydırın",
- "@settingsVideoGestureVerticalDragBrightnessVolume": {}
+ "@settingsVideoGestureVerticalDragBrightnessVolume": {},
+ "patternDialogEnter": "Deseninizi çizin",
+ "@patternDialogEnter": {},
+ "saveCopyButtonLabel": "KOPYAYI KAYDET",
+ "@saveCopyButtonLabel": {},
+ "applyTooltip": "Uygula",
+ "@applyTooltip": {},
+ "chipActionConfigureVault": "Kilitli albüm ayarları",
+ "@chipActionConfigureVault": {},
+ "viewerActionLock": "Kontrolleri kilitle",
+ "@viewerActionLock": {},
+ "viewerActionUnlock": "Kontrollerin kilidini aç",
+ "@viewerActionUnlock": {},
+ "editorTransformRotate": "Döndür",
+ "@editorTransformRotate": {},
+ "editorTransformCrop": "Kırp",
+ "@editorTransformCrop": {},
+ "editorActionTransform": "Dönüştür",
+ "@editorActionTransform": {},
+ "cropAspectRatioFree": "Özgür",
+ "@cropAspectRatioFree": {},
+ "cropAspectRatioOriginal": "Orijinal",
+ "@cropAspectRatioOriginal": {},
+ "cropAspectRatioSquare": "Kare",
+ "@cropAspectRatioSquare": {},
+ "settingsCollectionBurstPatternsTile": "Seri fotoğraf çekme biçimleri",
+ "@settingsCollectionBurstPatternsTile": {},
+ "vaultDialogLockTypeLabel": "Kilit türü",
+ "@vaultDialogLockTypeLabel": {},
+ "chipActionShowCountryStates": "Eyaletleri göster",
+ "@chipActionShowCountryStates": {},
+ "aboutDataUsageSectionTitle": "Kullanılan Alan",
+ "@aboutDataUsageSectionTitle": {},
+ "aboutDataUsageData": "Veriler",
+ "@aboutDataUsageData": {},
+ "aboutDataUsageInternal": "Dahili",
+ "@aboutDataUsageInternal": {},
+ "aboutDataUsageExternal": "Harici",
+ "@aboutDataUsageExternal": {},
+ "drawerPlacePage": "Yerler",
+ "@drawerPlacePage": {},
+ "settingsAskEverytime": "Her seferinde sor",
+ "@settingsAskEverytime": {},
+ "settingsVideoBackgroundModeDialogTitle": "Arkaplan Modu",
+ "@settingsVideoBackgroundModeDialogTitle": {},
+ "maxBrightnessNever": "Asla",
+ "@maxBrightnessNever": {},
+ "maxBrightnessAlways": "Her zaman",
+ "@maxBrightnessAlways": {},
+ "videoResumptionModeNever": "Asla",
+ "@videoResumptionModeNever": {},
+ "videoResumptionModeAlways": "Her zaman",
+ "@videoResumptionModeAlways": {},
+ "exportEntryDialogQuality": "Kalite",
+ "@exportEntryDialogQuality": {},
+ "settingsVideoPlaybackTile": "Oynatma",
+ "@settingsVideoPlaybackTile": {},
+ "settingsVideoPlaybackPageTitle": "Oynatma",
+ "@settingsVideoPlaybackPageTitle": {},
+ "settingsVideoResumptionModeTile": "Oynatmaya devam et",
+ "@settingsVideoResumptionModeTile": {},
+ "settingsVideoResumptionModeDialogTitle": "Oynatmaya Devam Et",
+ "@settingsVideoResumptionModeDialogTitle": {},
+ "tagEditorDiscardDialogMessage": "Değişikliklerden vazgeçmek istiyor musunuz?",
+ "@tagEditorDiscardDialogMessage": {},
+ "chipActionGoToPlacePage": "Yerler'de Göster",
+ "@chipActionGoToPlacePage": {},
+ "chipActionLock": "Kilitle",
+ "@chipActionLock": {},
+ "chipActionCreateVault": "Kilitli albüm oluştur",
+ "@chipActionCreateVault": {},
+ "albumTierVaults": "Kilitli albümler",
+ "@albumTierVaults": {},
+ "vaultLockTypePassword": "Şifre",
+ "@vaultLockTypePassword": {},
+ "overlayHistogramNone": "Hiçbiri",
+ "@overlayHistogramNone": {},
+ "overlayHistogramRGB": "RGB",
+ "@overlayHistogramRGB": {},
+ "widgetTapUpdateWidget": "Widget'i güncelle",
+ "@widgetTapUpdateWidget": {},
+ "configureVaultDialogTitle": "Kilitli Albüm Ayarları",
+ "@configureVaultDialogTitle": {},
+ "aboutDataUsageCache": "Önbellek",
+ "@aboutDataUsageCache": {},
+ "aboutDataUsageDatabase": "Veritabanı",
+ "@aboutDataUsageDatabase": {},
+ "aboutDataUsageMisc": "Diğer",
+ "@aboutDataUsageMisc": {},
+ "settingsViewerShowHistogram": "Çubuk grafiğini göster",
+ "@settingsViewerShowHistogram": {},
+ "authenticateToUnlockVault": "Albümün kilidini açmak için kimliğinizi doğrulayın",
+ "@authenticateToUnlockVault": {},
+ "vaultBinUsageDialogMessage": "Bazı kilitli albümler çöp kutusunu kullanıyor.",
+ "@vaultBinUsageDialogMessage": {},
+ "patternDialogConfirm": "Deseninizi tekrar çizin",
+ "@patternDialogConfirm": {},
+ "authenticateToConfigureVault": "Kilitli albümü ayarlamak için kimliğinizi doğrulayın",
+ "@authenticateToConfigureVault": {},
+ "statePageTitle": "Eyaletler",
+ "@statePageTitle": {},
+ "stateEmpty": "Hiç eyalet bulunamadı",
+ "@stateEmpty": {},
+ "searchStatesSectionTitle": "Eyaletler",
+ "@searchStatesSectionTitle": {},
+ "settingsConfirmationVaultDataLoss": "Kilitli albüm veri kaybı uyarısını göster",
+ "@settingsConfirmationVaultDataLoss": {},
+ "settingsCollectionBurstPatternsNone": "Hiçbiri",
+ "@settingsCollectionBurstPatternsNone": {},
+ "settingsDisablingBinWarningDialogMessage": "Çöp kutusundaki ögeler sonsuza dek silinecektir.",
+ "@settingsDisablingBinWarningDialogMessage": {},
+ "lengthUnitPercent": "%",
+ "@lengthUnitPercent": {},
+ "newVaultDialogTitle": "Kilitli Albüm Oluştur",
+ "@newVaultDialogTitle": {},
+ "passwordDialogConfirm": "Şifrenizi tekrar girin",
+ "@passwordDialogConfirm": {},
+ "collectionActionSetHome": "Ana ekran olarak ayarla",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "Kişisel koleksiyon",
+ "@setHomeCustomCollection": {},
+ "statsTopStatesSectionTitle": "Baş Eyaletler",
+ "@statsTopStatesSectionTitle": {},
+ "pinDialogEnter": "PIN girin",
+ "@pinDialogEnter": {},
+ "vaultDialogLockModeWhenScreenOff": "Ekran kapatıldığında kilitle",
+ "@vaultDialogLockModeWhenScreenOff": {},
+ "pinDialogConfirm": "PIN'inizi tekrar girin",
+ "@pinDialogConfirm": {},
+ "exportEntryDialogWriteMetadata": "Metaverileri ekle",
+ "@exportEntryDialogWriteMetadata": {},
+ "settingsVideoEnablePip": "Resim içinde resim",
+ "@settingsVideoEnablePip": {},
+ "vaultLockTypePattern": "Desen",
+ "@vaultLockTypePattern": {},
+ "aboutDataUsageClearCache": "Önbelleği Temizle",
+ "@aboutDataUsageClearCache": {},
+ "placeEmpty": "Hiç yer bulunamadı",
+ "@placeEmpty": {},
+ "overlayHistogramLuminance": "Parlaklık",
+ "@overlayHistogramLuminance": {},
+ "lengthUnitPixel": "px",
+ "@lengthUnitPixel": {},
+ "passwordDialogEnter": "Şifre girin",
+ "@passwordDialogEnter": {},
+ "placePageTitle": "Yerler",
+ "@placePageTitle": {},
+ "settingsThumbnailShowHdrIcon": "HDR simgesini göster",
+ "@settingsThumbnailShowHdrIcon": {},
+ "settingsVideoBackgroundMode": "Arkaplan modu",
+ "@settingsVideoBackgroundMode": {},
+ "tagPlaceholderState": "Eyalet",
+ "@tagPlaceholderState": {},
+ "vaultLockTypePin": "PIN",
+ "@vaultLockTypePin": {},
+ "entryActionCast": "Yansıt",
+ "@entryActionCast": {},
+ "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.",
+ "@newVaultWarningDialogMessage": {},
+ "castDialogTitle": "Yakındaki Cihazlar",
+ "@castDialogTitle": {}
}
diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb
index ded1cbf7a..ff6915f18 100644
--- a/lib/l10n/app_uk.arb
+++ b/lib/l10n/app_uk.arb
@@ -1518,5 +1518,11 @@
"entryActionCast": "Трансляція",
"@entryActionCast": {},
"castDialogTitle": "Пристрої трансляції",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "settingsThumbnailShowHdrIcon": "Показати іконку HDR",
+ "@settingsThumbnailShowHdrIcon": {},
+ "setHomeCustomCollection": "Власна колекція",
+ "@setHomeCustomCollection": {},
+ "collectionActionSetHome": "Встановити як головну",
+ "@collectionActionSetHome": {}
}
diff --git a/lib/l10n/app_vi.arb b/lib/l10n/app_vi.arb
index 7d628e698..f897239c5 100644
--- a/lib/l10n/app_vi.arb
+++ b/lib/l10n/app_vi.arb
@@ -145,7 +145,7 @@
"@filterNoLocationLabel": {},
"videoActionPlay": "Phát",
"@videoActionPlay": {},
- "entryActionSetAs": "Thiết lập như",
+ "entryActionSetAs": "Đặt làm",
"@entryActionSetAs": {},
"filterLocatedLabel": "Đã định vị",
"@filterLocatedLabel": {},
@@ -1518,5 +1518,11 @@
"entryActionCast": "Truyền",
"@entryActionCast": {},
"castDialogTitle": "Thiết bị truyền",
- "@castDialogTitle": {}
+ "@castDialogTitle": {},
+ "setHomeCustomCollection": "Bộ sưu tập tùy chỉnh",
+ "@setHomeCustomCollection": {},
+ "settingsThumbnailShowHdrIcon": "Hiển thị biểu tượng HDR",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "Đặt làm nhà",
+ "@collectionActionSetHome": {}
}
diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb
index 36ba2b40a..54ce1fec0 100644
--- a/lib/l10n/app_zh.arb
+++ b/lib/l10n/app_zh.arb
@@ -59,7 +59,7 @@
"@sourceStateLoading": {},
"sourceStateCataloguing": "正在进行编目",
"@sourceStateCataloguing": {},
- "sourceStateLocatingCountries": "正在定位国家",
+ "sourceStateLocatingCountries": "正在定位地区",
"@sourceStateLocatingCountries": {},
"sourceStateLocatingPlaces": "正在定位地点",
"@sourceStateLocatingPlaces": {},
@@ -67,7 +67,7 @@
"@chipActionDelete": {},
"chipActionGoToAlbumPage": "在相册中显示",
"@chipActionGoToAlbumPage": {},
- "chipActionGoToCountryPage": "在国家中显示",
+ "chipActionGoToCountryPage": "在地区中显示",
"@chipActionGoToCountryPage": {},
"chipActionGoToTagPage": "在标签中显示",
"@chipActionGoToTagPage": {},
@@ -625,7 +625,7 @@
"@drawerCollectionSphericalVideos": {},
"drawerAlbumPage": "相册",
"@drawerAlbumPage": {},
- "drawerCountryPage": "国家",
+ "drawerCountryPage": "地区",
"@drawerCountryPage": {},
"drawerTagPage": "标签",
"@drawerTagPage": {},
@@ -693,9 +693,9 @@
"@createAlbumButtonLabel": {},
"newFilterBanner": "新的",
"@newFilterBanner": {},
- "countryPageTitle": "国家",
+ "countryPageTitle": "地区",
"@countryPageTitle": {},
- "countryEmpty": "无国家",
+ "countryEmpty": "无地区",
"@countryEmpty": {},
"tagPageTitle": "标签",
"@tagPageTitle": {},
@@ -711,7 +711,7 @@
"@searchDateSectionTitle": {},
"searchAlbumsSectionTitle": "相册",
"@searchAlbumsSectionTitle": {},
- "searchCountriesSectionTitle": "国家",
+ "searchCountriesSectionTitle": "地区",
"@searchCountriesSectionTitle": {},
"searchPlacesSectionTitle": "地点",
"@searchPlacesSectionTitle": {},
@@ -1023,7 +1023,7 @@
"@statsPageTitle": {},
"statsWithGps": "{count, plural, other{{count} 项带位置信息}}",
"@statsWithGps": {},
- "statsTopCountriesSectionTitle": "热门国家",
+ "statsTopCountriesSectionTitle": "热门地区",
"@statsTopCountriesSectionTitle": {},
"statsTopPlacesSectionTitle": "热门地点",
"@statsTopPlacesSectionTitle": {},
@@ -1197,7 +1197,7 @@
"@chipActionConfigureVault": {},
"chipActionCreateVault": "创建保险库",
"@chipActionCreateVault": {},
- "chipActionShowCountryStates": "显示状态",
+ "chipActionShowCountryStates": "显示区域",
"@chipActionShowCountryStates": {},
"viewerActionLock": "锁定查看器",
"@viewerActionLock": {},
@@ -1255,7 +1255,7 @@
"@vaultLockTypePattern": {},
"albumTierVaults": "保险库",
"@albumTierVaults": {},
- "settingsVideoResumptionModeTile": "恢复回放",
+ "settingsVideoResumptionModeTile": "恢复播放",
"@settingsVideoResumptionModeTile": {},
"vaultBinUsageDialogMessage": "有些保险库正在使用资源回收站。",
"@vaultBinUsageDialogMessage": {},
@@ -1275,9 +1275,9 @@
"@editorTransformCrop": {},
"filterTaggedLabel": "已标记",
"@filterTaggedLabel": {},
- "statePageTitle": "地区",
+ "statePageTitle": "区域",
"@statePageTitle": {},
- "settingsVideoResumptionModeDialogTitle": "恢复回放",
+ "settingsVideoResumptionModeDialogTitle": "恢复播放",
"@settingsVideoResumptionModeDialogTitle": {},
"settingsVideoBackgroundMode": "后台模式",
"@settingsVideoBackgroundMode": {},
@@ -1305,9 +1305,9 @@
"@newVaultWarningDialogMessage": {},
"settingsDisablingBinWarningDialogMessage": "回收站中的项目将被永久删除。",
"@settingsDisablingBinWarningDialogMessage": {},
- "statsTopStatesSectionTitle": "最多项的地区",
+ "statsTopStatesSectionTitle": "最多项的区域",
"@statsTopStatesSectionTitle": {},
- "settingsVideoPlaybackPageTitle": "回放",
+ "settingsVideoPlaybackPageTitle": "播放",
"@settingsVideoPlaybackPageTitle": {},
"filterLocatedLabel": "位于",
"@filterLocatedLabel": {},
@@ -1337,9 +1337,9 @@
"@cropAspectRatioOriginal": {},
"configureVaultDialogTitle": "设置保险库",
"@configureVaultDialogTitle": {},
- "searchStatesSectionTitle": "地区",
+ "searchStatesSectionTitle": "区域",
"@searchStatesSectionTitle": {},
- "stateEmpty": "没有地区",
+ "stateEmpty": "没有区域",
"@stateEmpty": {},
"aboutDataUsageData": "数据",
"@aboutDataUsageData": {},
@@ -1353,12 +1353,18 @@
"@newVaultDialogTitle": {},
"settingsVideoBackgroundModeDialogTitle": "后台模式",
"@settingsVideoBackgroundModeDialogTitle": {},
- "tagPlaceholderState": "地区",
+ "tagPlaceholderState": "区域",
"@tagPlaceholderState": {},
"settingsViewerShowHistogram": "显示直方图",
"@settingsViewerShowHistogram": {},
- "settingsVideoPlaybackTile": "回放",
+ "settingsVideoPlaybackTile": "播放",
"@settingsVideoPlaybackTile": {},
"exportEntryDialogWriteMetadata": "写入元数据",
- "@exportEntryDialogWriteMetadata": {}
+ "@exportEntryDialogWriteMetadata": {},
+ "settingsThumbnailShowHdrIcon": "显示 HDR 图标",
+ "@settingsThumbnailShowHdrIcon": {},
+ "collectionActionSetHome": "设置为首页",
+ "@collectionActionSetHome": {},
+ "setHomeCustomCollection": "自定义媒体集",
+ "@setHomeCustomCollection": {}
}
diff --git a/lib/model/app/contributors.dart b/lib/model/app/contributors.dart
index 9e3c7b812..b4ac9ddab 100644
--- a/lib/model/app/contributors.dart
+++ b/lib/model/app/contributors.dart
@@ -34,7 +34,7 @@ class Contributors {
Contributor('Tijolinho', 'pedrohenrique29.alfenas@gmail.com'),
Contributor('Piotr K', '1337.kelt@gmail.com'),
Contributor('rehork', 'cooky@e.email'),
- Contributor('Eric', 'hamburger2048@users.noreply.hosted.weblate.org'),
+ Contributor('Eric', 'zxmegaxqug@hldrive.com'), // @hamburger2048 / 大王叫我来巡山
Contributor('Aitor Salaberria', 'trslbrr@gmail.com'),
Contributor('Felipe Nogueira', 'contato.fnog@gmail.com'),
Contributor('kaajjo', 'claymanoff@gmail.com'),
@@ -67,11 +67,15 @@ class Contributors {
Contributor('Reza Almanda', 'rezaalmanda27@gmail.com'),
Contributor('Sveinn í Felli', 'sv1@fellsnet.is'),
Contributor('Henning Bunk', 'henningtbunk@gmail.com'),
- Contributor('SAMIRAH AIL', 'samiratalzahrani@gmail.com'),
+ Contributor('Samirah Ail', 'samiratalzahrani@gmail.com'),
Contributor('Salih Ail', 'rrrfff444@gmail.com'),
Contributor('nasreddineloukriz', 'nasreddineloukriz@gmail.com'),
Contributor('Mohamed Zeroug', 'mzeroug19@gmail.com'),
Contributor('ssantos', 'ssantos@web.de'),
+ Contributor('Сергій', 'sergiy.goncharuk.1@gmail.com'),
+ Contributor('v1s7', 'v1s7@users.noreply.hosted.weblate.org'),
+ Contributor('fuzfyy', 'egeozce35@gmail.com'),
+ Contributor('minh', 'teaminh@skiff.com'),
// Contributor('Alvi Khan', 'aveenalvi@gmail.com'), // Bengali
// Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese
// Contributor('Khant', 'khant@users.noreply.hosted.weblate.org'), // Burmese
@@ -86,7 +90,9 @@ class Contributors {
// Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), // Persian
// Contributor('slasb37', 'p84haghi@gmail.com'), // Persian
// Contributor('mimvahedi', 'vahedi0vahedi@gmail.com'), // Persian
+ // Contributor('Prasanta-Hembram', 'Prasantahembram720@gmail.com'), // Santali
// Contributor('mytja', 'mamnju21@gmail.com'), // Slovenian
+ // Contributor('Shift18', 'bribable.lawyer@posteo.net'), // Swedish
// Contributor('Nattapong K', 'mixer5056@gmail.com'), // Thai
};
}
diff --git a/lib/model/app/dependencies.dart b/lib/model/app/dependencies.dart
index 62836c974..ca745410f 100644
--- a/lib/model/app/dependencies.dart
+++ b/lib/model/app/dependencies.dart
@@ -74,9 +74,9 @@ class Dependencies {
sourceUrl: 'https://github.com/material-foundation/flutter-packages/tree/main/packages/dynamic_color',
),
Dependency(
- name: 'FFmpegKit',
+ name: 'FFmpegKit (Aves fork)',
license: lgpl3,
- sourceUrl: 'https://github.com/arthenica/ffmpeg-kit',
+ sourceUrl: 'https://github.com/deckerst/ffmpeg-kit',
),
Dependency(
name: 'Floating',
@@ -207,9 +207,9 @@ class Dependencies {
static const List flutterPackages = [
Dependency(
- name: 'Charts (fzyzcjy fork)',
+ name: 'Charts (Aves fork)',
license: apache2,
- sourceUrl: 'https://github.com/fzyzcjy/charts',
+ sourceUrl: 'https://github.com/deckerst/flutter_google_charts',
),
Dependency(
name: 'Custom rounded rectangle border',
@@ -271,7 +271,7 @@ class Dependencies {
Dependency(
name: 'Panorama (Aves fork)',
license: apache2,
- sourceUrl: 'https://github.com/zesage/panorama',
+ sourceUrl: 'https://github.com/deckerst/aves_panorama',
),
Dependency(
name: 'Pattern Lock',
diff --git a/lib/model/app/support.dart b/lib/model/app/support.dart
index fbf2a29b4..170e82b85 100644
--- a/lib/model/app/support.dart
+++ b/lib/model/app/support.dart
@@ -20,28 +20,6 @@ class AppSupport {
static bool canDecode(String mimeType) => !undecodableImages.contains(mimeType);
- // Android's `BitmapRegionDecoder` documentation states that "only the JPEG and PNG formats are supported"
- // but in practice (tested on API 25, 27, 29), it successfully decodes the formats listed below,
- // and it actually fails to decode GIF, DNG and animated WEBP. Other formats were not tested.
- static bool _supportedByBitmapRegionDecoder(String mimeType) => [
- MimeTypes.heic,
- MimeTypes.heif,
- MimeTypes.jpeg,
- MimeTypes.png,
- MimeTypes.webp,
- MimeTypes.arw,
- MimeTypes.cr2,
- MimeTypes.nef,
- MimeTypes.nrw,
- MimeTypes.orf,
- MimeTypes.pef,
- MimeTypes.raf,
- MimeTypes.rw2,
- MimeTypes.srw,
- ].contains(mimeType);
-
- static bool canDecodeRegion(String mimeType) => _supportedByBitmapRegionDecoder(mimeType) || mimeType == MimeTypes.tiff;
-
// `exifinterface` v1.3.3 declared support for DNG, but it strips non-standard Exif tags when saving attributes,
// and DNG requires DNG-specific tags saved along standard Exif. So it was actually breaking DNG files.
static bool canEditExif(String mimeType) {
diff --git a/lib/model/entry/extensions/props.dart b/lib/model/entry/extensions/props.dart
index 16e71676a..8953e04c7 100644
--- a/lib/model/entry/extensions/props.dart
+++ b/lib/model/entry/extensions/props.dart
@@ -32,7 +32,7 @@ extension ExtraAvesEntryProps on AvesEntry {
// size
- bool get useTiles => canDecodeRegion && (width > 4096 || height > 4096);
+ bool get useTiles => (width > 4096 || height > 4096) && !isAnimated;
bool get isSized => width > 0 && height > 0;
@@ -127,8 +127,6 @@ extension ExtraAvesEntryProps on AvesEntry {
bool get canDecode => AppSupport.canDecode(mimeType);
- bool get canDecodeRegion => AppSupport.canDecodeRegion(mimeType) && !isAnimated;
-
bool get canEditExif => AppSupport.canEditExif(mimeType);
bool get canEditIptc => AppSupport.canEditIptc(mimeType);
diff --git a/lib/model/filters/location.dart b/lib/model/filters/location.dart
index f66bf26ea..cad7074e7 100644
--- a/lib/model/filters/location.dart
+++ b/lib/model/filters/location.dart
@@ -15,6 +15,11 @@ class LocationFilter extends CoveredCollectionFilter {
late final String? _code;
late final EntryFilter _test;
+ static final unlocated = LocationFilter(LocationLevel.place, '');
+ static final located = unlocated.reverse();
+
+ bool get _isUnlocated => _location.isEmpty;
+
@override
List