diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index feee323cd..bb6136f7e 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -15,7 +15,7 @@ jobs:
- uses: subosito/flutter-action@v1
with:
channel: stable
- flutter-version: '2.10.2'
+ flutter-version: '2.10.3'
- name: Clone the repository.
uses: actions/checkout@v2
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 813ec0b82..8172cb051 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -17,7 +17,7 @@ jobs:
- uses: subosito/flutter-action@v1
with:
channel: stable
- flutter-version: '2.10.2'
+ flutter-version: '2.10.3'
# Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1):
# https://issuetracker.google.com/issues/144111441
@@ -52,12 +52,12 @@ jobs:
rm release.keystore.asc
mkdir outputs
(cd scripts/; ./apply_flavor_play.sh)
- flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.2.sksl.json
+ flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.3.sksl.json
cp build/app/outputs/bundle/playRelease/*.aab outputs
- flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.2.sksl.json
+ flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.3.sksl.json
cp build/app/outputs/apk/play/release/*.apk outputs
(cd scripts/; ./apply_flavor_izzy.sh)
- flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_2.10.2.sksl.json
+ flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_2.10.3.sksl.json
cp build/app/outputs/apk/izzy/release/*.apk outputs
rm $AVES_STORE_FILE
env:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d17e6f445..3c51c196f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,26 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+## [v1.6.2] - 2022-03-07
+
+### Added
+
+- Viewer: optional thumbnail preview
+- Video: optional gestures to play/seek
+- Video: mute action
+- Japanese translation (thanks Maki)
+
+### Changed
+
+- Viewer: overlay reorganization
+- upgraded Flutter to stable v2.10.3
+
+### Fixed
+
+- storage write access for Android <11
+- various bin related fixes
+- Viewer: apply video settings change without leaving the viewer
+
## [v1.6.1] - 2022-02-23
### Added
diff --git a/README.md b/README.md
index 4f17a28bb..3c6d54aa9 100644
--- a/README.md
+++ b/README.md
@@ -85,7 +85,7 @@ At this stage this project does *not* accept PRs, except for translations.
### Translations
-If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). English, Korean and French are already handled by me. Russian, German, Spanish, Portuguese & Indonesian are handled by generous volunteers.
+If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). English, Korean and French are already handled by me. Russian, German, Spanish, Portuguese, Indonesian & Japanese are handled by generous volunteers.
### Donations
diff --git a/android/app/build.gradle b/android/app/build.gradle
index fed4ca45f..ccdb492b5 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -152,7 +152,7 @@ dependencies {
implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a'
// forked, built by JitPack, cf https://jitpack.io/p/deckerst/pixymeta-android
implementation 'com.github.deckerst:pixymeta-android:706bd73d6e'
- implementation 'com.github.bumptech.glide:glide:4.13.0'
+ implementation 'com.github.bumptech.glide:glide:4.13.1'
kapt 'androidx.annotation:annotation:1.3.0'
kapt 'com.github.bumptech.glide:compiler:4.13.0'
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt
index 5e99cee7e..a6b54573d 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt
@@ -59,7 +59,11 @@ class ThumbnailFetcher internal constructor(
// As of Android R, the Media Store content resolver may return a thumbnail
// that is automatically rotated according to EXIF orientation, but not flipped,
// so we skip this step for flipped entries.
- bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) getByResolver() else getByMediaStore()
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ bitmap = getByResolver()
+ } else if (StorageUtils.isMediaStoreContentUri(uri)) {
+ bitmap = getByMediaStore()
+ }
}
} catch (e: Exception) {
exception = e
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 43e648b34..82bbdcf2e 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
@@ -74,10 +74,6 @@ abstract class ImageProvider {
throw UnsupportedOperationException("`scanPostMetadataEdit` is not supported by this image provider")
}
- open fun scanObsoletePath(context: Context, path: String, mimeType: String) {
- throw UnsupportedOperationException("`scanObsoletePath` is not supported by this image provider")
- }
-
suspend fun exportMultiple(
activity: Activity,
imageExportMimeType: String,
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt
index 79f3f4a21..4708e909d 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt
@@ -30,6 +30,8 @@ import deckers.thibault.aves.utils.StorageUtils.PathSegments
import deckers.thibault.aves.utils.StorageUtils.ensureTrailingSeparator
import deckers.thibault.aves.utils.StorageUtils.removeTrailingSeparator
import deckers.thibault.aves.utils.UriUtils.tryParseId
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
import java.io.File
import java.io.OutputStream
import java.util.*
@@ -293,17 +295,17 @@ class MediaStoreImageProvider : ImageProvider() {
if (fileExists) {
if (StorageUtils.canEditByFile(activity, path)) {
if (hasEntry(activity, uri)) {
- Log.d(LOG_TAG, "delete content at uri=$uri path=$path")
+ Log.d(LOG_TAG, "delete [permission:file, file exists, content exists] content at uri=$uri path=$path")
activity.contentResolver.delete(uri, null, null)
}
// in theory, deleting via content resolver should remove the file on storage
// in practice, the file may still be there afterwards
if (file.exists()) {
- Log.d(LOG_TAG, "delete file at uri=$uri path=$path")
+ Log.d(LOG_TAG, "delete [permission:file, file exists after content delete] file at uri=$uri path=$path")
if (file.delete()) {
// in theory, scanning an obsolete path should remove the entry from the Media Store
// in practice, the entry may still be there afterwards
- scanObsoletePath(activity, path, mimeType)
+ scanObsoletePath(activity, uri, path, mimeType)
return
}
} else {
@@ -312,18 +314,28 @@ class MediaStoreImageProvider : ImageProvider() {
} else if (!isMediaUriPermissionGranted(activity, uri, mimeType)
&& StorageUtils.requireAccessPermission(activity, path)
) {
- // if the file is on SD card, calling the content resolver `delete()`
- // removes the entry from the Media Store but it doesn't delete the file,
- // even when the app has the permission, so we manually delete the document file
- Log.d(LOG_TAG, "delete document (fileExists=$fileExists) at uri=$uri path=$path")
- val df = StorageUtils.getDocumentFile(activity, path, uri)
+ // the delete request may yield a `RecoverableSecurityException` when using scoped storage,
+ // even if we have permissions on the tree document via SAF
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q && hasEntry(activity, uri)) {
+ Log.d(LOG_TAG, "delete [permission:doc, file exists, content exists] content at uri=$uri path=$path")
+ activity.contentResolver.delete(uri, null, null)
+ }
- @Suppress("BlockingMethodInNonBlockingContext")
- if (df != null && df.delete()) {
- scanObsoletePath(activity, path, mimeType)
+ // in theory, deleting via content resolver should remove the file on storage
+ // in practice, the file may still be there afterwards
+ if (file.exists()) {
+ Log.d(LOG_TAG, "delete [permission:doc, file exists after content delete] document at uri=$uri path=$path")
+ val df = StorageUtils.getDocumentFile(activity, path, uri)
+
+ @Suppress("BlockingMethodInNonBlockingContext")
+ if (df != null && df.delete()) {
+ scanObsoletePath(activity, uri, path, mimeType)
+ return
+ }
+ throw Exception("failed to delete document with df=$df")
+ } else {
return
}
- throw Exception("failed to delete document with df=$df")
}
} else if (uri.scheme?.lowercase(Locale.ROOT) == ContentResolver.SCHEME_FILE) {
val uriFilePath = File(uri.path!!).path
@@ -332,7 +344,7 @@ class MediaStoreImageProvider : ImageProvider() {
}
try {
- Log.d(LOG_TAG, "delete content (fileExists=$fileExists) at uri=$uri path=$path")
+ Log.d(LOG_TAG, "delete [file exists=$fileExists] content at uri=$uri path=$path")
if (activity.contentResolver.delete(uri, null, null) > 0) return
if (hasEntry(activity, uri) || file.exists()) {
@@ -620,7 +632,7 @@ class MediaStoreImageProvider : ImageProvider() {
val newFile = File(oldFile.parent, newFileName)
return when {
oldFile == newFile -> skippedFieldMap
- StorageUtils.canEditByFile(activity, oldPath) -> renameSingleByFile(activity, mimeType, oldPath, newFile)
+ StorageUtils.canEditByFile(activity, oldPath) -> renameSingleByFile(activity, mimeType, oldMediaUri, oldPath, newFile)
isMediaUriPermissionGranted(activity, oldMediaUri, mimeType) -> renameSingleByMediaStore(activity, mimeType, oldMediaUri, newFile)
else -> renameSingleByTreeDoc(activity, mimeType, oldMediaUri, oldPath, newFile)
}
@@ -674,13 +686,14 @@ class MediaStoreImageProvider : ImageProvider() {
if (!renamed) {
throw Exception("failed to rename document at path=$oldPath")
}
- scanObsoletePath(activity, oldPath, mimeType)
+ scanObsoletePath(activity, oldMediaUri, oldPath, mimeType)
return scanNewPath(activity, newFile.path, mimeType)
}
private suspend fun renameSingleByFile(
activity: Activity,
mimeType: String,
+ oldMediaUri: Uri,
oldPath: String,
newFile: File
): FieldMap {
@@ -689,7 +702,7 @@ class MediaStoreImageProvider : ImageProvider() {
if (!renamed) {
throw Exception("failed to rename file at path=$oldPath")
}
- scanObsoletePath(activity, oldPath, mimeType)
+ scanObsoletePath(activity, oldMediaUri, oldPath, mimeType)
return scanNewPath(activity, newFile.path, mimeType)
}
@@ -714,8 +727,31 @@ class MediaStoreImageProvider : ImageProvider() {
}
}
- override fun scanObsoletePath(context: Context, path: String, mimeType: String) {
- MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType), null)
+ private fun scanObsoletePath(context: Context, uri: Uri, path: String, mimeType: String) {
+ val file = File(path)
+ val delayMillis = 500L
+ val maxDelayMillis = 10000L
+ var totalDelayMillis = 0L
+ while (file.exists()) {
+ if (!hasEntry(context, uri)) return
+ if (totalDelayMillis < maxDelayMillis) {
+ Log.d(LOG_TAG, "Trying to scan obsolete path but file exists at path=$path. Will retry in $delayMillis ms (total: $totalDelayMillis ms)")
+ runBlocking { delay(delayMillis) }
+ totalDelayMillis += delayMillis
+ } else {
+ throw Exception("Timeout ($maxDelayMillis ms) to clear MediaStore entry for file at path=$path")
+ }
+ }
+
+ if (hasEntry(context, uri)) {
+ MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, newUri: Uri? ->
+ if (newUri != null && hasEntry(context, newUri)) {
+ Log.w(LOG_TAG, "Failed to clear Media Store entry at uri=$newUri path=$path")
+ } else {
+ Log.w(LOG_TAG, "Cleared Media Store entry at uri=$newUri path=$path")
+ }
+ }
+ }
}
suspend fun scanNewPath(context: Context, path: String, mimeType: String): FieldMap =
diff --git a/android/app/src/main/res/values-ja/strings.xml b/android/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 000000000..3c2f5d93e
--- /dev/null
+++ b/android/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,10 @@
+
+
+アヴェス
+検索
+動画
+メディアスキャン
+画像と動画をスキャン
+メディアをスキャン中
+停止
+
\ No newline at end of file
diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/1.png b/fastlane/metadata/android/de/images/phoneScreenshots/1.png
index 7bb979df1..0ef48db3d 100644
Binary files a/fastlane/metadata/android/de/images/phoneScreenshots/1.png and b/fastlane/metadata/android/de/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/2.png b/fastlane/metadata/android/de/images/phoneScreenshots/2.png
index b770a7c9e..fb5080556 100644
Binary files a/fastlane/metadata/android/de/images/phoneScreenshots/2.png and b/fastlane/metadata/android/de/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/3.png b/fastlane/metadata/android/de/images/phoneScreenshots/3.png
index 56ef9ded6..540e6c430 100644
Binary files a/fastlane/metadata/android/de/images/phoneScreenshots/3.png and b/fastlane/metadata/android/de/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/4.png b/fastlane/metadata/android/de/images/phoneScreenshots/4.png
index 0a8c2deb7..674ee85e7 100644
Binary files a/fastlane/metadata/android/de/images/phoneScreenshots/4.png and b/fastlane/metadata/android/de/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/5.png b/fastlane/metadata/android/de/images/phoneScreenshots/5.png
index a048d09d4..19bfe9bcd 100644
Binary files a/fastlane/metadata/android/de/images/phoneScreenshots/5.png and b/fastlane/metadata/android/de/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/6.png b/fastlane/metadata/android/de/images/phoneScreenshots/6.png
index e42e4d034..2e8d3034d 100644
Binary files a/fastlane/metadata/android/de/images/phoneScreenshots/6.png and b/fastlane/metadata/android/de/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/en-US/changelogs/1068.txt b/fastlane/metadata/android/en-US/changelogs/1068.txt
new file mode 100644
index 000000000..decd4dce4
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/1068.txt
@@ -0,0 +1,5 @@
+In v1.6.2:
+- revisited viewer: new layout, thumbnail previews, video gestures
+- storage related fixes for Android 10 and older
+- enjoy the app in Japanese
+Full changelog available on GitHub
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
index 4674df71c..aef538c60 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
index d699af62a..a6d84ce73 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
index 20457a45f..039a7a267 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
index 92fec2632..42a897ce9 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
index 95ef69497..7fc82a805 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
index c2383bd70..e93411a46 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png
index a4ca6bdf7..aedd59b04 100644
Binary files a/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png
index bc1654404..907ea242f 100644
Binary files a/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png
index f86f0c4a2..fff50ac57 100644
Binary files a/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png
index b5eb49bcc..69a09e0b3 100644
Binary files a/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png
index 7021c0374..77cbdf3b5 100644
Binary files a/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png
index 7735c2cb3..1cb5582b6 100644
Binary files a/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/1.png b/fastlane/metadata/android/fr/images/phoneScreenshots/1.png
index eb62e1b14..4e9d3a559 100644
Binary files a/fastlane/metadata/android/fr/images/phoneScreenshots/1.png and b/fastlane/metadata/android/fr/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/2.png b/fastlane/metadata/android/fr/images/phoneScreenshots/2.png
index 6aa5def2a..d6d30754d 100644
Binary files a/fastlane/metadata/android/fr/images/phoneScreenshots/2.png and b/fastlane/metadata/android/fr/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/3.png b/fastlane/metadata/android/fr/images/phoneScreenshots/3.png
index ad50c09d1..d6d1136a2 100644
Binary files a/fastlane/metadata/android/fr/images/phoneScreenshots/3.png and b/fastlane/metadata/android/fr/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/4.png b/fastlane/metadata/android/fr/images/phoneScreenshots/4.png
index 070238313..1e1b71624 100644
Binary files a/fastlane/metadata/android/fr/images/phoneScreenshots/4.png and b/fastlane/metadata/android/fr/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/5.png b/fastlane/metadata/android/fr/images/phoneScreenshots/5.png
index cc70a692c..82e97daf0 100644
Binary files a/fastlane/metadata/android/fr/images/phoneScreenshots/5.png and b/fastlane/metadata/android/fr/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/6.png b/fastlane/metadata/android/fr/images/phoneScreenshots/6.png
index 7961778de..dcc9e4eff 100644
Binary files a/fastlane/metadata/android/fr/images/phoneScreenshots/6.png and b/fastlane/metadata/android/fr/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/1.png b/fastlane/metadata/android/id/images/phoneScreenshots/1.png
index 9bca9f58b..1148786fd 100644
Binary files a/fastlane/metadata/android/id/images/phoneScreenshots/1.png and b/fastlane/metadata/android/id/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/2.png b/fastlane/metadata/android/id/images/phoneScreenshots/2.png
index 85100c774..f1a6c95bb 100644
Binary files a/fastlane/metadata/android/id/images/phoneScreenshots/2.png and b/fastlane/metadata/android/id/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/3.png b/fastlane/metadata/android/id/images/phoneScreenshots/3.png
index cfdeeec8f..646a107e9 100644
Binary files a/fastlane/metadata/android/id/images/phoneScreenshots/3.png and b/fastlane/metadata/android/id/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/4.png b/fastlane/metadata/android/id/images/phoneScreenshots/4.png
index d5240f2b0..887f67554 100644
Binary files a/fastlane/metadata/android/id/images/phoneScreenshots/4.png and b/fastlane/metadata/android/id/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/5.png b/fastlane/metadata/android/id/images/phoneScreenshots/5.png
index 00baaa099..5684e687b 100644
Binary files a/fastlane/metadata/android/id/images/phoneScreenshots/5.png and b/fastlane/metadata/android/id/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/6.png b/fastlane/metadata/android/id/images/phoneScreenshots/6.png
index be711d86a..43ed58d3e 100644
Binary files a/fastlane/metadata/android/id/images/phoneScreenshots/6.png and b/fastlane/metadata/android/id/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/ja/images/featureGraphics.png b/fastlane/metadata/android/ja/images/featureGraphics.png
new file mode 100644
index 000000000..db3be126f
Binary files /dev/null and b/fastlane/metadata/android/ja/images/featureGraphics.png differ
diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/1.png b/fastlane/metadata/android/ja/images/phoneScreenshots/1.png
new file mode 100644
index 000000000..8a2eb8f99
Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/2.png b/fastlane/metadata/android/ja/images/phoneScreenshots/2.png
new file mode 100644
index 000000000..e840f74b2
Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/3.png b/fastlane/metadata/android/ja/images/phoneScreenshots/3.png
new file mode 100644
index 000000000..a72c431f3
Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/4.png b/fastlane/metadata/android/ja/images/phoneScreenshots/4.png
new file mode 100644
index 000000000..e47324358
Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/5.png b/fastlane/metadata/android/ja/images/phoneScreenshots/5.png
new file mode 100644
index 000000000..2c0a91d4f
Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/6.png b/fastlane/metadata/android/ja/images/phoneScreenshots/6.png
new file mode 100644
index 000000000..392691f0e
Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/1.png b/fastlane/metadata/android/ko/images/phoneScreenshots/1.png
index d4fcc34c3..d8e080ffc 100644
Binary files a/fastlane/metadata/android/ko/images/phoneScreenshots/1.png and b/fastlane/metadata/android/ko/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/2.png b/fastlane/metadata/android/ko/images/phoneScreenshots/2.png
index 13a2135ee..d6928ee42 100644
Binary files a/fastlane/metadata/android/ko/images/phoneScreenshots/2.png and b/fastlane/metadata/android/ko/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/3.png b/fastlane/metadata/android/ko/images/phoneScreenshots/3.png
index b9593c029..7906b78cf 100644
Binary files a/fastlane/metadata/android/ko/images/phoneScreenshots/3.png and b/fastlane/metadata/android/ko/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/4.png b/fastlane/metadata/android/ko/images/phoneScreenshots/4.png
index 3bfa8781a..5ef843272 100644
Binary files a/fastlane/metadata/android/ko/images/phoneScreenshots/4.png and b/fastlane/metadata/android/ko/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/5.png b/fastlane/metadata/android/ko/images/phoneScreenshots/5.png
index ad6518250..b1c3362c9 100644
Binary files a/fastlane/metadata/android/ko/images/phoneScreenshots/5.png and b/fastlane/metadata/android/ko/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/6.png b/fastlane/metadata/android/ko/images/phoneScreenshots/6.png
index 6aaa08e7e..a733c7331 100644
Binary files a/fastlane/metadata/android/ko/images/phoneScreenshots/6.png and b/fastlane/metadata/android/ko/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png
index 8763df15d..5721e71de 100644
Binary files a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png
index 8c6c9597f..41555870c 100644
Binary files a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png
index 200da6361..b8bd3594f 100644
Binary files a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png
index d72ae6282..364cc6fbc 100644
Binary files a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png
index 30a9ebd14..c75e08755 100644
Binary files a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png
index 02b87189c..5244a840b 100644
Binary files a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/1.png b/fastlane/metadata/android/ru/images/phoneScreenshots/1.png
index 80af968b3..f1315be49 100644
Binary files a/fastlane/metadata/android/ru/images/phoneScreenshots/1.png and b/fastlane/metadata/android/ru/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/2.png b/fastlane/metadata/android/ru/images/phoneScreenshots/2.png
index 1d42a1cb0..7a310ca4f 100644
Binary files a/fastlane/metadata/android/ru/images/phoneScreenshots/2.png and b/fastlane/metadata/android/ru/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/3.png b/fastlane/metadata/android/ru/images/phoneScreenshots/3.png
index 811a42242..30ad8972d 100644
Binary files a/fastlane/metadata/android/ru/images/phoneScreenshots/3.png and b/fastlane/metadata/android/ru/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/4.png b/fastlane/metadata/android/ru/images/phoneScreenshots/4.png
index daa6be34e..e91ec53c5 100644
Binary files a/fastlane/metadata/android/ru/images/phoneScreenshots/4.png and b/fastlane/metadata/android/ru/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/5.png b/fastlane/metadata/android/ru/images/phoneScreenshots/5.png
index b22e9d202..e7b6dc26b 100644
Binary files a/fastlane/metadata/android/ru/images/phoneScreenshots/5.png and b/fastlane/metadata/android/ru/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/6.png b/fastlane/metadata/android/ru/images/phoneScreenshots/6.png
index 0a4a2630a..b69e24c5c 100644
Binary files a/fastlane/metadata/android/ru/images/phoneScreenshots/6.png and b/fastlane/metadata/android/ru/images/phoneScreenshots/6.png differ
diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb
index a74c025cd..633b13c3b 100644
--- a/lib/l10n/app_de.arb
+++ b/lib/l10n/app_de.arb
@@ -48,6 +48,7 @@
"entryActionCopyToClipboard": "In die Zwischenablage kopieren",
"entryActionDelete": "Löschen",
+ "entryActionConvert": "Konvertieren",
"entryActionExport": "Exportieren",
"entryActionRename": "Umbenennen",
"entryActionRestore": "Wiederherstellen",
@@ -67,6 +68,8 @@
"entryActionRemoveFavourite": "Aus Favoriten entfernen",
"videoActionCaptureFrame": "Frame aufnehmen",
+ "videoActionMute": "Audio deaktivieren",
+ "videoActionUnmute": "Audio aktiveren",
"videoActionPause": "Pause",
"videoActionPlay": "Spielen",
"videoActionReplay10": "10 Sekunden rückwärts springen",
@@ -111,6 +114,11 @@
"videoLoopModeShortOnly": "Nur kurze Videos",
"videoLoopModeAlways": "Immer",
+ "videoControlsPlay": "Abspielen/Pausieren",
+ "videoControlsPlaySeek": "Abspielen/Pausieren & Sprung-Schaltflächen",
+ "videoControlsPlayOutside": "Mit anderem Video-Player öffnen",
+ "videoControlsNone": "Keine Schaltflächen",
+
"mapStyleGoogleNormal": "Google Maps",
"mapStyleGoogleHybrid": "Google Maps (Hybrid)",
"mapStyleGoogleTerrain": "Google Maps (Gelände)",
@@ -256,8 +264,7 @@
"aboutCredits": "Credits",
"aboutCreditsWorldAtlas1": "Diese Anwendung verwendet eine TopoJSON-Datei von",
"aboutCreditsWorldAtlas2": "unter ISC-Lizenz.",
- "aboutCreditsTranslators": "Übersetzer:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
+ "aboutCreditsTranslators": "Übersetzer",
"aboutLicenses": "Open-Source-Lizenzen",
"aboutLicensesBanner": "Diese Anwendung verwendet die folgenden Open-Source-Pakete und -Bibliotheken.",
@@ -430,6 +437,7 @@
"settingsViewerShowInformation": "Informationen anzeigen",
"settingsViewerShowInformationSubtitle": "Titel, Datum, Ort, etc. anzeigen.",
"settingsViewerShowShootingDetails": "Aufnahmedetails anzeigen",
+ "settingsViewerShowOverlayThumbnails": "Vorschaubilder anzeigen",
"settingsViewerEnableOverlayBlurEffect": "Unschärfe-Effekt",
"settingsVideoPageTitle": "Video-Einstellungen",
@@ -439,8 +447,6 @@
"settingsVideoEnableAutoPlay": "Automatische Wiedergabe",
"settingsVideoLoopModeTile": "Schleifen-Modus",
"settingsVideoLoopModeTitle": "Schleifen-Modus",
- "settingsVideoQuickActionsTile": "Schnelle Aktionen für Videos",
- "settingsVideoQuickActionEditorTitle": "Schnelle Aktionen",
"settingsSubtitleThemeTile": "Untertitel",
"settingsSubtitleThemeTitle": "Untertitel",
@@ -457,6 +463,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "Zentrum",
"settingsSubtitleThemeTextAlignmentRight": "Rechts",
+ "settingsVideoControlsTile": "Steuerung",
+ "settingsVideoControlsTitle": "Steuerung",
+ "settingsVideoButtonsTile": "Schaltflächen",
+ "settingsVideoButtonsTitle": "Schaltflächen",
+ "settingsVideoGestureDoubleTapTogglePlay": "Doppeltippen zum Abspielen/Pausieren",
+ "settingsVideoGestureSideDoubleTapSeek": "Doppeltippen auf die Bildschirmränder zum Rückwärts-/Vorwärtsspringen",
+
"settingsSectionPrivacy": "Datenschutz",
"settingsAllowInstalledAppAccess": "Zugriff auf die Liste der installierten Apps",
"settingsAllowInstalledAppAccessSubtitle": "zur Gruppierung von Bildern nach Apps",
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index 37598546e..bfcd0e5f5 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -92,10 +92,12 @@
"entryActionSetAs": "Set as",
"entryActionOpenMap": "Show in map app",
"entryActionRotateScreen": "Rotate screen",
- "entryActionAddFavourite": "Add to favourites",
- "entryActionRemoveFavourite": "Remove from favourites",
+ "entryActionAddFavourite": "Add to favorites",
+ "entryActionRemoveFavourite": "Remove from favorites",
"videoActionCaptureFrame": "Capture frame",
+ "videoActionMute": "Mute",
+ "videoActionUnmute": "Unmute",
"videoActionPause": "Pause",
"videoActionPlay": "Play",
"videoActionReplay10": "Seek backward 10 seconds",
@@ -111,7 +113,7 @@
"entryInfoActionRemoveMetadata": "Remove metadata",
"filterBinLabel": "Recycle bin",
- "filterFavouriteLabel": "Favourite",
+ "filterFavouriteLabel": "Favorite",
"filterLocationEmptyLabel": "Unlocated",
"filterTagEmptyLabel": "Untagged",
"filterRatingUnratedLabel": "Unrated",
@@ -152,6 +154,11 @@
"videoLoopModeShortOnly": "Short videos only",
"videoLoopModeAlways": "Always",
+ "videoControlsPlay": "Play",
+ "videoControlsPlaySeek": "Play & seek backward/forward",
+ "videoControlsPlayOutside": "Open with other player",
+ "videoControlsNone": "None",
+
"mapStyleGoogleNormal": "Google Maps",
"mapStyleGoogleHybrid": "Google Maps (Hybrid)",
"mapStyleGoogleTerrain": "Google Maps (Terrain)",
@@ -387,20 +394,7 @@
"aboutCredits": "Credits",
"aboutCreditsWorldAtlas1": "This app uses a TopoJSON file from",
"aboutCreditsWorldAtlas2": "under ISC License.",
- "aboutCreditsTranslators": "Translators:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
- "@aboutCreditsTranslatorLine": {
- "placeholders": {
- "language": {
- "type": "String",
- "example": "Sumerian"
- },
- "names": {
- "type": "String",
- "example": "Reggie Lampert"
- }
- }
- },
+ "aboutCreditsTranslators": "Translators",
"aboutLicenses": "Open-Source Licenses",
"aboutLicensesBanner": "This app uses the following open-source packages and libraries.",
@@ -490,7 +484,7 @@
}
},
- "collectionEmptyFavourites": "No favourites",
+ "collectionEmptyFavourites": "No favorites",
"collectionEmptyVideos": "No videos",
"collectionEmptyImages": "No images",
@@ -498,7 +492,7 @@
"collectionDeselectSectionTooltip": "Deselect section",
"drawerCollectionAll": "All collection",
- "drawerCollectionFavourites": "Favourites",
+ "drawerCollectionFavourites": "Favorites",
"drawerCollectionImages": "Images",
"drawerCollectionVideos": "Videos",
"drawerCollectionAnimated": "Animated",
@@ -556,7 +550,7 @@
"settingsActionImport": "Import",
"appExportCovers": "Covers",
- "appExportFavourites": "Favourites",
+ "appExportFavourites": "Favorites",
"appExportSettings": "Settings",
"settingsSectionNavigation": "Navigation",
@@ -579,7 +573,7 @@
"settingsNavigationDrawerAddAlbum": "Add album",
"settingsSectionThumbnails": "Thumbnails",
- "settingsThumbnailShowFavouriteIcon": "Show favourite icon",
+ "settingsThumbnailShowFavouriteIcon": "Show favorite icon",
"settingsThumbnailShowLocationIcon": "Show location icon",
"settingsThumbnailShowMotionPhotoIcon": "Show motion photo icon",
"settingsThumbnailShowRating": "Show rating",
@@ -613,6 +607,7 @@
"settingsViewerShowInformation": "Show information",
"settingsViewerShowInformationSubtitle": "Show title, date, location, etc.",
"settingsViewerShowShootingDetails": "Show shooting details",
+ "settingsViewerShowOverlayThumbnails": "Show thumbnails",
"settingsViewerEnableOverlayBlurEffect": "Blur effect",
"settingsVideoPageTitle": "Video Settings",
@@ -622,8 +617,6 @@
"settingsVideoEnableAutoPlay": "Auto play",
"settingsVideoLoopModeTile": "Loop mode",
"settingsVideoLoopModeTitle": "Loop Mode",
- "settingsVideoQuickActionsTile": "Quick actions for videos",
- "settingsVideoQuickActionEditorTitle": "Quick Actions",
"settingsSubtitleThemeTile": "Subtitles",
"settingsSubtitleThemeTitle": "Subtitles",
@@ -640,6 +633,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "Center",
"settingsSubtitleThemeTextAlignmentRight": "Right",
+ "settingsVideoControlsTile": "Controls",
+ "settingsVideoControlsTitle": "Controls",
+ "settingsVideoButtonsTile": "Buttons",
+ "settingsVideoButtonsTitle": "Buttons",
+ "settingsVideoGestureDoubleTapTogglePlay": "Double tap to play/pause",
+ "settingsVideoGestureSideDoubleTapSeek": "Double tap on screen edges to seek backward/forward",
+
"settingsSectionPrivacy": "Privacy",
"settingsAllowInstalledAppAccess": "Allow access to app inventory",
"settingsAllowInstalledAppAccessSubtitle": "Used to improve album display",
diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb
index 39ac08f98..99e1ce283 100644
--- a/lib/l10n/app_es.arb
+++ b/lib/l10n/app_es.arb
@@ -112,6 +112,11 @@
"videoLoopModeShortOnly": "Sólo videos cortos",
"videoLoopModeAlways": "Siempre",
+ "videoControlsPlay": "Reproducir",
+ "videoControlsPlaySeek": "Reproducir y buscar",
+ "videoControlsPlayOutside": "Reproducir externamente",
+ "videoControlsNone": "Ninguno",
+
"mapStyleGoogleNormal": "Mapas de Google",
"mapStyleGoogleHybrid": "Mapas de Google (Híbrido)",
"mapStyleGoogleTerrain": "Mapas de Google (Superficie)",
@@ -259,8 +264,7 @@
"aboutCredits": "Créditos",
"aboutCreditsWorldAtlas1": "Esta aplicación usa un archivo TopoJSON de",
"aboutCreditsWorldAtlas2": "bajo licencia ISC.",
- "aboutCreditsTranslators": "Traductores:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
+ "aboutCreditsTranslators": "Traductores",
"aboutLicenses": "Licencias de código abierto",
"aboutLicensesBanner": "Esta aplicación usa los siguientes paquetes y librerías de código abierto.",
@@ -433,6 +437,7 @@
"settingsViewerShowInformation": "Mostrar información",
"settingsViewerShowInformationSubtitle": "Mostrar título, fecha, ubicación, etc.",
"settingsViewerShowShootingDetails": "Mostrar detalles de toma",
+ "settingsViewerShowOverlayThumbnails": "Mostrar miniaturas",
"settingsViewerEnableOverlayBlurEffect": "Efecto de difuminado",
"settingsVideoPageTitle": "Ajustes de video",
@@ -442,8 +447,6 @@
"settingsVideoEnableAutoPlay": "Reproducción automática",
"settingsVideoLoopModeTile": "Modo bucle",
"settingsVideoLoopModeTitle": "Modo bucle",
- "settingsVideoQuickActionsTile": "Acciones rápidas para videos",
- "settingsVideoQuickActionEditorTitle": "Acciones rápidas",
"settingsSubtitleThemeTile": "Subtítulos",
"settingsSubtitleThemeTitle": "Subtítulos",
@@ -460,6 +463,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "Centro",
"settingsSubtitleThemeTextAlignmentRight": "Derecha",
+ "settingsVideoControlsTile": "Controles",
+ "settingsVideoControlsTitle": "Controles",
+ "settingsVideoButtonsTile": "Botones",
+ "settingsVideoButtonsTitle": "Botones",
+ "settingsVideoGestureDoubleTapTogglePlay": "Doble toque para reproducir/pausar",
+ "settingsVideoGestureSideDoubleTapSeek": "Doble toque en los bordes de la pantalla para buscar atrás/adelante",
+
"settingsSectionPrivacy": "Privacidad",
"settingsAllowInstalledAppAccess": "Permita el acceso a lista de aplicaciones",
"settingsAllowInstalledAppAccessSubtitle": "Usado para mejorar los álbumes mostrados",
diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb
index 65759fb4e..1c9be0f58 100644
--- a/lib/l10n/app_fr.arb
+++ b/lib/l10n/app_fr.arb
@@ -68,6 +68,8 @@
"entryActionRemoveFavourite": "Retirer des favoris",
"videoActionCaptureFrame": "Capturer l’image",
+ "videoActionMute": "Couper le son",
+ "videoActionUnmute": "Rétablir le son",
"videoActionPause": "Pause",
"videoActionPlay": "Lire",
"videoActionReplay10": "Reculer de 10 secondes",
@@ -112,6 +114,11 @@
"videoLoopModeShortOnly": "Courtes vidéos seulement",
"videoLoopModeAlways": "Toujours",
+ "videoControlsPlay": "Lecture",
+ "videoControlsPlaySeek": "Lecture & déplacement",
+ "videoControlsPlayOutside": "Ouvrir avec un autre lecteur",
+ "videoControlsNone": "Aucun",
+
"mapStyleGoogleNormal": "Google Maps",
"mapStyleGoogleHybrid": "Google Maps (Satellite)",
"mapStyleGoogleTerrain": "Google Maps (Relief)",
@@ -213,7 +220,7 @@
"removeEntryMetadataDialogTitle": "Retrait de métadonnées",
"removeEntryMetadataDialogMore": "Voir plus",
- "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Les métadonnées XMP sont nécessaires pour jouer la vidéo d’une photo animée.\n\nVoulez-vous vraiment les supprimer ?",
+ "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Les métadonnées XMP sont nécessaires pour lire la vidéo d’une photo animée.\n\nVoulez-vous vraiment les supprimer ?",
"videoSpeedDialogLabel": "Vitesse de lecture",
@@ -257,8 +264,7 @@
"aboutCredits": "Remerciements",
"aboutCreditsWorldAtlas1": "Cette app utilise un fichier TopoJSON de ",
"aboutCreditsWorldAtlas2": "sous licence ISC.",
- "aboutCreditsTranslators": "Traducteurs :",
- "aboutCreditsTranslatorLine": "{language} : {names}",
+ "aboutCreditsTranslators": "Traducteurs",
"aboutLicenses": "Licences open-source",
"aboutLicensesBanner": "Cette app utilise ces librairies et packages open-source.",
@@ -431,6 +437,7 @@
"settingsViewerShowInformation": "Afficher les détails",
"settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.",
"settingsViewerShowShootingDetails": "Afficher les détails de prise de vue",
+ "settingsViewerShowOverlayThumbnails": "Afficher les vignettes",
"settingsViewerEnableOverlayBlurEffect": "Effets de flou",
"settingsVideoPageTitle": "Réglages vidéo",
@@ -440,8 +447,6 @@
"settingsVideoEnableAutoPlay": "Lecture automatique",
"settingsVideoLoopModeTile": "Lecture répétée",
"settingsVideoLoopModeTitle": "Lecture répétée",
- "settingsVideoQuickActionsTile": "Actions rapides pour les vidéos",
- "settingsVideoQuickActionEditorTitle": "Actions rapides",
"settingsSubtitleThemeTile": "Sous-titres",
"settingsSubtitleThemeTitle": "Sous-titres",
@@ -458,6 +463,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "centré",
"settingsSubtitleThemeTextAlignmentRight": "droite",
+ "settingsVideoControlsTile": "Contrôles",
+ "settingsVideoControlsTitle": "Contrôles",
+ "settingsVideoButtonsTile": "Boutons",
+ "settingsVideoButtonsTitle": "Boutons",
+ "settingsVideoGestureDoubleTapTogglePlay": "Appuyer deux fois pour lire ou mettre en pause",
+ "settingsVideoGestureSideDoubleTapSeek": "Appuyer deux fois sur les bords de l’écran pour reculer ou avancer",
+
"settingsSectionPrivacy": "Confidentialité",
"settingsAllowInstalledAppAccess": "Autoriser l’accès à l’inventaire des apps",
"settingsAllowInstalledAppAccessSubtitle": "Pour un affichage amélioré des albums",
diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb
index 468e6b2ba..93a384738 100644
--- a/lib/l10n/app_id.arb
+++ b/lib/l10n/app_id.arb
@@ -44,9 +44,9 @@
"chipActionUnpin": "Lepas sematan dari atas",
"chipActionRename": "Ganti nama",
"chipActionSetCover": "Setel sampul",
- "chipActionCreateAlbum": "Membuat album",
+ "chipActionCreateAlbum": "Buat album",
- "entryActionCopyToClipboard": "Salinan ke papan",
+ "entryActionCopyToClipboard": "Salin ke papan klip",
"entryActionDelete": "Hapus",
"entryActionConvert": "Ubah",
"entryActionExport": "Ekspor",
@@ -70,7 +70,7 @@
"videoActionCaptureFrame": "Tangkap bingkai",
"videoActionPause": "Henti",
"videoActionPlay": "Mainkan",
- "videoActionReplay10": "Mundur 10 detik",
+ "videoActionReplay10": "Mundurkan 10 detik",
"videoActionSkip10": "Majukan 10 detik",
"videoActionSelectStreams": "Pilih trek",
"videoActionSetSpeed": "Kecepatan pemutaran",
@@ -84,7 +84,7 @@
"filterBinLabel": "Tong sampah",
"filterFavouriteLabel": "Favorit",
- "filterLocationEmptyLabel": "Lokasi Tidak ditemukan",
+ "filterLocationEmptyLabel": "Lokasi yang tidak ditemukan",
"filterTagEmptyLabel": "Tidak ditag",
"filterRatingUnratedLabel": "Belum diberi peringkat",
"filterRatingRejectedLabel": "Ditolak",
@@ -161,7 +161,7 @@
"noMatchingAppDialogTitle": "Tidak Ada Aplikasi Yang Cocok",
"noMatchingAppDialogMessage": "Tidak ada aplikasi yang cocok untuk menangani ini.",
- "binEntriesConfirmationDialogMessage": "{count, plural, =1{Pindah benda ini ke tong sampah?} other{Pindah {count} benda ke tempat sampah?}}",
+ "binEntriesConfirmationDialogMessage": "{count, plural, =1{Pindahkan benda ini ke tong sampah?} other{Pindahkan {count} benda ke tempat sampah?}}",
"deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Anda yakin ingin menghapus benda ini?} other{Apakah Anda yakin ingin menghapus {count} benda?}}",
"videoResumeDialogMessage": "Apakah Anda ingin melanjutkan di {time}?",
@@ -224,10 +224,10 @@
"videoStreamSelectionDialogTrack": "Trek",
"videoStreamSelectionDialogNoSelection": "Tidak ada Trek yang lain.",
- "genericSuccessFeedback": "Sukses!",
+ "genericSuccessFeedback": "Selesai!",
"genericFailureFeedback": "Gagal",
- "menuActionConfigureView": "Lihat",
+ "menuActionConfigureView": "Tata letak",
"menuActionSelect": "Pilih",
"menuActionSelectAll": "Pilih semua",
"menuActionSelectNone": "Pilih tidak ada",
@@ -257,11 +257,10 @@
"aboutCredits": "Kredit",
"aboutCreditsWorldAtlas1": "Aplikasi ini menggunakan file TopoJSON dari",
"aboutCreditsWorldAtlas2": "dibawah Lisensi ISC.",
- "aboutCreditsTranslators": "Penerjemah:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
+ "aboutCreditsTranslators": "Penerjemah",
"aboutLicenses": "Lisensi Sumber Terbuka",
- "aboutLicensesBanner": "Aplikasi ini menggunakan paket dan pustaka sumber terbuka berikut.",
+ "aboutLicensesBanner": "Aplikasi ini menggunakan paket dan perpustakaan sumber terbuka berikut.",
"aboutLicensesAndroidLibraries": "Perpustakaan Android",
"aboutLicensesFlutterPlugins": "Plugin Flutter",
"aboutLicensesFlutterPackages": "Paket Flutter",
@@ -305,7 +304,7 @@
"collectionEditFailureFeedback": "{count, plural, other{Gagal untuk mengubah {count} benda}}",
"collectionExportFailureFeedback": "{count, plural, other{Gagal untuk mengekspor {count} halaman}}",
"collectionCopySuccessFeedback": "{count, plural, other{Menyalin {count} benda}}",
- "collectionMoveSuccessFeedback": "{count, plural, other{Menggerakkan {count} benda}}",
+ "collectionMoveSuccessFeedback": "{count, plural, other{{count} benda terpindah}}",
"collectionEditSuccessFeedback": "{count, plural, other{Mengubah {count} benda}}",
"collectionEmptyFavourites": "Tidak ada favorit",
@@ -386,7 +385,7 @@
"settingsConfirmationDialogTile": "Dialog konfirmasi",
"settingsConfirmationDialogTitle": "Dialog Konfirmasi",
"settingsConfirmationDialogDeleteItems": "Tanya sebelum menghapus benda selamanya",
- "settingsConfirmationDialogMoveToBinItems": "Tanya sebelum memindahkan benda ke tempat sampah",
+ "settingsConfirmationDialogMoveToBinItems": "Tanya sebelum memindahkan benda ke tong sampah",
"settingsNavigationDrawerTile": "Menu navigasi",
"settingsNavigationDrawerEditorTitle": "Menu Navigasi",
"settingsNavigationDrawerBanner": "Sentuh dan tahan untuk memindahkan dan menyusun ulang benda menu.",
@@ -439,8 +438,6 @@
"settingsVideoEnableAutoPlay": "Putar otomatis",
"settingsVideoLoopModeTile": "Putar ulang",
"settingsVideoLoopModeTitle": "Putar Ulang",
- "settingsVideoQuickActionsTile": "Aksi cepat untuk video",
- "settingsVideoQuickActionEditorTitle": "Aksi Cepat",
"settingsSubtitleThemeTile": "Subtitle",
"settingsSubtitleThemeTitle": "Subtitle",
@@ -460,7 +457,7 @@
"settingsSectionPrivacy": "Privasi",
"settingsAllowInstalledAppAccess": "Izinkan akses ke inventori aplikasi",
"settingsAllowInstalledAppAccessSubtitle": "Digunakan untuk meningkatkan tampilan album",
- "settingsAllowErrorReporting": "Izinkan pelaporan kesalahan anonim",
+ "settingsAllowErrorReporting": "Izinkan pelaporan kesalahan secara anonim",
"settingsSaveSearchHistory": "Simpan riwayat pencarian",
"settingsEnableBin": "Gunakan tong sampah",
"settingsEnableBinSubtitle": "Simpan benda yang dihapus selama 30 hari",
@@ -478,14 +475,14 @@
"settingsStorageAccessTile": "Akses penyimpanan",
"settingsStorageAccessTitle": "Akses Penyimpanan",
- "settingsStorageAccessBanner": "Beberapa direktori memerlukan pemberian akses eksplisit untuk memodifikasi file di dalamnya. Anda dapat meninjau di sini direktori yang sebelumnya Anda beri akses.",
+ "settingsStorageAccessBanner": "Beberapa direktori memerlukan pemberian akses eksplisit untuk memodifikasi file di dalamnya. Anda dapat meninjau direktori yang anda beri akses sebelumnya di sini.",
"settingsStorageAccessEmpty": "Tidak ada akses",
"settingsStorageAccessRevokeTooltip": "Tarik kembali",
"settingsSectionAccessibility": "Aksesibilitas",
"settingsRemoveAnimationsTile": "Hapus animasi",
"settingsRemoveAnimationsTitle": "Hapus Animasi",
- "settingsTimeToTakeActionTile": "Saatnya untuk mengambil tindakan",
+ "settingsTimeToTakeActionTile": "Waktu untuk mengambil tindakan",
"settingsTimeToTakeActionTitle": "Saatnya Bertindak",
"settingsSectionLanguage": "Bahasa & Format",
diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb
new file mode 100644
index 000000000..acc36340d
--- /dev/null
+++ b/lib/l10n/app_ja.arb
@@ -0,0 +1,575 @@
+{
+ "appName": "アヴェス",
+ "welcomeMessage": "アヴェスへようこそ",
+ "welcomeOptional": "オプション",
+ "welcomeTermsToggle": "利用規約に同意する",
+ "itemCount": "{count, plural, other{{count} 件のアイテム}}",
+
+ "timeSeconds": "{seconds, plural, other{{seconds} 秒}}",
+ "timeMinutes": "{minutes, plural, other{{minutes} 分}}",
+ "timeDays": "{days, plural, other{{days} 日}}",
+ "focalLength": "{length} mm",
+
+ "applyButtonLabel": "適用",
+ "deleteButtonLabel": "削除",
+ "nextButtonLabel": "次へ",
+ "showButtonLabel": "表示",
+ "hideButtonLabel": "非表示",
+ "continueButtonLabel": "続ける",
+
+ "cancelTooltip": "キャンセル",
+ "changeTooltip": "変更",
+ "clearTooltip": "クリア",
+ "previousTooltip": "前へ",
+ "nextTooltip": "次へ",
+ "showTooltip": "表示する",
+ "hideTooltip": "非表示にする",
+ "actionRemove": "削除",
+ "resetButtonTooltip": "リセット",
+
+ "doubleBackExitMessage": "終了するには「戻る」をもう一度タップしてください。",
+ "doNotAskAgain": "今後このメッセージを表示しない",
+
+ "sourceStateLoading": "読み込み中",
+ "sourceStateCataloguing": "分類中",
+ "sourceStateLocatingCountries": "国、地域を確認中",
+ "sourceStateLocatingPlaces": "場所を確認中",
+
+ "chipActionDelete": "削除",
+ "chipActionGoToAlbumPage": "アルバム別に表示",
+ "chipActionGoToCountryPage": "国地域別に表示",
+ "chipActionGoToTagPage": "タグ別に表示",
+ "chipActionHide": "非表示",
+ "chipActionPin": "一番上に固定",
+ "chipActionUnpin": "一番上への固定を解除",
+ "chipActionRename": "名前を変更",
+ "chipActionSetCover": "カバーを設定",
+ "chipActionCreateAlbum": "アルバムを作成",
+
+ "entryActionCopyToClipboard": "クリップボードにコピー",
+ "entryActionDelete": "削除",
+ "entryActionConvert": "変換",
+ "entryActionExport": "エクスポート",
+ "entryActionRename": "名前を変更",
+ "entryActionRestore": "元に戻す",
+ "entryActionRotateCCW": "反時計回りに回転",
+ "entryActionRotateCW": "時計回りに回転",
+ "entryActionFlip": "水平方向に反転",
+ "entryActionPrint": "印刷",
+ "entryActionShare": "共有",
+ "entryActionViewSource": "ソースを表示",
+ "entryActionViewMotionPhotoVideo": "モーションフォトを開く",
+ "entryActionEdit": "編集",
+ "entryActionOpen": "アプリで開く",
+ "entryActionSetAs": "登録",
+ "entryActionOpenMap": "地図アプリで表示",
+ "entryActionRotateScreen": "画面を回転",
+ "entryActionAddFavourite": "お気に入りに追加",
+ "entryActionRemoveFavourite": "お気に入りから削除",
+
+ "videoActionCaptureFrame": "フレームをキャプチャ",
+ "videoActionMute": "ミュート",
+ "videoActionUnmute": "ミュート解除",
+ "videoActionPause": "一時停止",
+ "videoActionPlay": "再生",
+ "videoActionReplay10": "10 秒前に戻る",
+ "videoActionSkip10": "10 秒前に進む",
+ "videoActionSelectStreams": "トラックを選択",
+ "videoActionSetSpeed": "再生速度",
+ "videoActionSettings": "設定",
+
+ "entryInfoActionEditDate": "日時を編集",
+ "entryInfoActionEditLocation": "位置情報を編集",
+ "entryInfoActionEditRating": "評価を編集",
+ "entryInfoActionEditTags": "タグを編集",
+ "entryInfoActionRemoveMetadata": "メタデータを削除",
+
+ "filterBinLabel": "ごみ箱",
+ "filterFavouriteLabel": "お気に入り",
+ "filterLocationEmptyLabel": "位置情報なし",
+ "filterTagEmptyLabel": "タグ情報なし",
+ "filterRatingUnratedLabel": "評価情報なし",
+ "filterRatingRejectedLabel": "拒否されました",
+ "filterTypeAnimatedLabel": "アニメーション",
+ "filterTypeMotionPhotoLabel": "モーションフォト",
+ "filterTypePanoramaLabel": "パノラマ",
+ "filterTypeRawLabel": "Raw",
+ "filterTypeSphericalVideoLabel": "360° 動画",
+ "filterTypeGeotiffLabel": "GeoTIFF",
+ "filterMimeImageLabel": "画像",
+ "filterMimeVideoLabel": "動画",
+
+ "coordinateFormatDms": "度分秒",
+ "coordinateFormatDecimal": "十進角",
+ "coordinateDms": "{direction}{coordinate}",
+ "coordinateDmsNorth": "北緯",
+ "coordinateDmsSouth": "南緯",
+ "coordinateDmsEast": "東経",
+ "coordinateDmsWest": "西経",
+
+ "unitSystemMetric": "メートル法",
+ "unitSystemImperial": "ヤード・ポンド法",
+
+ "videoLoopModeNever": "ループ再生しない",
+ "videoLoopModeShortOnly": "短い動画のみループ再生",
+ "videoLoopModeAlways": "常にループ再生",
+
+ "videoControlsPlay": "再生",
+ "videoControlsPlaySeek": "再生&早送り/早戻し",
+ "videoControlsPlayOutside": "他のプレイヤーで開く",
+ "videoControlsNone": "なし",
+
+ "mapStyleGoogleNormal": "Google マップ",
+ "mapStyleGoogleHybrid": "Google マップ(ハイブリッド)",
+ "mapStyleGoogleTerrain": "Google マップ(地形)",
+ "mapStyleOsmHot": "人道支援 OSM",
+ "mapStyleStamenToner": "Stamen Toner",
+ "mapStyleStamenWatercolor": "Stamen Watercolor",
+
+ "nameConflictStrategyRename": "名前を変更",
+ "nameConflictStrategyReplace": "置換",
+ "nameConflictStrategySkip": "スキップ",
+
+ "keepScreenOnNever": "自動オフ",
+ "keepScreenOnViewerOnly": "ビューアー使用時のみオン",
+ "keepScreenOnAlways": "常にオン",
+
+ "accessibilityAnimationsRemove": "画面エフェクトを利用しない",
+ "accessibilityAnimationsKeep": "画面エフェクトを利用",
+
+ "albumTierNew": "新規",
+ "albumTierPinned": "固定",
+ "albumTierSpecial": "全体",
+ "albumTierApps": "アプリ",
+ "albumTierRegular": "その他",
+
+ "storageVolumeDescriptionFallbackPrimary": "内蔵ストレージ",
+ "storageVolumeDescriptionFallbackNonPrimary": "SD カード",
+ "rootDirectoryDescription": "ルート ディレクトリ",
+ "otherDirectoryDescription": "“{name}” ディレクトリ",
+ "storageAccessDialogTitle": "ストレージ アクセス",
+ "storageAccessDialogMessage": "このアプリにアクセスを許可するために次の画面で {directory} の “{volume}” を選択してください。",
+ "restrictedAccessDialogTitle": "アクセス制限",
+ "restrictedAccessDialogMessage": "このアプリは {directory} の “{volume}” にあるファイルを変更できません。\n\nプリインストールされているファイル マネージャまたはギャラリー アプリを使用して他のディレクトリに移動してください。",
+ "notEnoughSpaceDialogTitle": "容量不足",
+ "notEnoughSpaceDialogMessage": "この操作には “{volume}” に {neededSize} の容量が必要ですが、 残り {freeSize} のみ利用可能です。",
+ "missingSystemFilePickerDialogTitle": "システム ファイル ピッカーが見つかりません",
+ "missingSystemFilePickerDialogMessage": "システム ファイル ピッカーが見つからないか、利用できません。利用可能にしてから再度お試しください。",
+
+ "unsupportedTypeDialogTitle": "対応していないタイプ",
+ "unsupportedTypeDialogMessage": "{count, plural, other{この操作は次のタイプのアイテムには対応していません: {types}.}}",
+
+ "nameConflictDialogSingleSourceMessage": "目的フォルダに同じ名前のファイルが存在しています。",
+ "nameConflictDialogMultipleSourceMessage": "同じ名前のファイルが存在しています。",
+
+ "addShortcutDialogLabel": "ショートカット ラベル",
+ "addShortcutButtonLabel": "追加",
+
+ "noMatchingAppDialogTitle": "一致するアプリなし",
+ "noMatchingAppDialogMessage": "処理できるアプリが見つかりません。",
+
+ "binEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムをごみ箱に移動しますか?} other{{count} 件のアイテムをごみ箱に移動しますか?}}",
+ "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムを削除しますか?} other{{count} 件のアイテムを削除しますか?}}",
+
+ "videoResumeDialogMessage": " {time} の時点から再生を再開しますか?",
+ "videoStartOverButtonLabel": "最初から再生",
+ "videoResumeButtonLabel": "再開",
+
+ "setCoverDialogTitle": "カバーを設定",
+ "setCoverDialogLatest": "最新のアイテム",
+ "setCoverDialogCustom": "カスタム",
+
+ "hideFilterConfirmationDialogMessage": "一致する写真と動画はコレクションに表示されなくなります。「プライバシー」設定からいつでもアイテムを表示できます。\n\nこれらのアイテムを非表示にしますか?",
+
+ "newAlbumDialogTitle": "新規アルバム",
+ "newAlbumDialogNameLabel": "アルバム名",
+ "newAlbumDialogNameLabelAlreadyExistsHelper": "ディレクトリが既に存在します",
+ "newAlbumDialogStorageLabel": "ストレージ:",
+
+ "renameAlbumDialogLabel": "新しい名前",
+ "renameAlbumDialogLabelAlreadyExistsHelper": "ディレクトリが既に存在します",
+
+ "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{このアルバムとアルバム内のアイテムを削除しますか?} other{このアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}",
+ "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{これらのアルバムとアルバム内のアイテムを削除しますか?} other{これらのアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}",
+
+ "exportEntryDialogFormat": "形式:",
+ "exportEntryDialogWidth": "幅",
+ "exportEntryDialogHeight": "高さ",
+
+ "renameEntryDialogLabel": "新しい名前",
+
+ "editEntryDateDialogTitle": "日時",
+ "editEntryDateDialogSetCustom": "日を設定する",
+ "editEntryDateDialogCopyField": "他の日からコピーする",
+ "editEntryDateDialogExtractFromTitle": "タイトルから抽出する",
+ "editEntryDateDialogShift": "シフト",
+ "editEntryDateDialogSourceFileModifiedDate": "ファイル更新日",
+ "editEntryDateDialogTargetFieldsHeader": "更新するフィールド",
+ "editEntryDateDialogHours": "時",
+ "editEntryDateDialogMinutes": "分",
+
+ "editEntryLocationDialogTitle": "位置情報",
+ "editEntryLocationDialogChooseOnMapTooltip": "地図上で選択",
+ "editEntryLocationDialogLatitude": "緯度",
+ "editEntryLocationDialogLongitude": "経度",
+
+ "locationPickerUseThisLocationButton": "この位置情報を使用",
+
+ "editEntryRatingDialogTitle": "評価",
+
+ "removeEntryMetadataDialogTitle": "メタデータの削除",
+ "removeEntryMetadataDialogMore": "もっと見る",
+
+ "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "モーションフォト内の動画を再生するには XMP が必要です。\n\n削除しますか?",
+
+ "videoSpeedDialogLabel": "再生速度",
+
+ "videoStreamSelectionDialogVideo": "動画",
+ "videoStreamSelectionDialogAudio": "音声",
+ "videoStreamSelectionDialogText": "字幕",
+ "videoStreamSelectionDialogOff": "オフ",
+ "videoStreamSelectionDialogTrack": "トラック",
+ "videoStreamSelectionDialogNoSelection": "他にトラックはありません。",
+
+ "genericSuccessFeedback": "完了しました!",
+ "genericFailureFeedback": "エラー",
+
+ "menuActionConfigureView": "表示",
+ "menuActionSelect": "選択",
+ "menuActionSelectAll": "すべて選択",
+ "menuActionSelectNone": "選択を解除",
+ "menuActionMap": "地図",
+ "menuActionStats": "統計",
+
+ "viewDialogTabSort": "並べ替え",
+ "viewDialogTabGroup": "グループ",
+ "viewDialogTabLayout": "レイアウト",
+
+ "tileLayoutGrid": "グリッド表示",
+ "tileLayoutList": "リスト表示",
+
+ "aboutPageTitle": "アプリについて",
+ "aboutLinkSources": "ソース",
+ "aboutLinkLicense": "ライセンス",
+ "aboutLinkPolicy": "プライバシー ポリシー",
+
+ "aboutBug": "バグの報告",
+ "aboutBugSaveLogInstruction": "アプリのログをファイルに保存",
+ "aboutBugSaveLogButton": "保存",
+ "aboutBugCopyInfoInstruction": "システム情報をコピー",
+ "aboutBugCopyInfoButton": "コピー",
+ "aboutBugReportInstruction": "ログとシステム情報とともに GitHub で報告",
+ "aboutBugReportButton": "報告",
+
+ "aboutCredits": "クレジット",
+ "aboutCreditsWorldAtlas1": "このアプリは TopoJSON ファイルを",
+ "aboutCreditsWorldAtlas2": "ISC License の下使用しています。",
+ "aboutCreditsTranslators": "翻訳",
+
+ "aboutLicenses": "オープンソース ライセンス",
+ "aboutLicensesBanner": "このアプリは下記のオープンソース パッケージおよびライブラリを使用しています。",
+ "aboutLicensesAndroidLibraries": "Android ライブラリ",
+ "aboutLicensesFlutterPlugins": "Flutter プラグイン",
+ "aboutLicensesFlutterPackages": "Flutter パッケージ",
+ "aboutLicensesDartPackages": "Dart パッケージ",
+ "aboutLicensesShowAllButtonLabel": "すべてのライセンスを表示",
+
+ "policyPageTitle": "プライバシー ポリシー",
+
+ "collectionPageTitle": "コレクション",
+ "collectionPickPageTitle": "ピック",
+ "collectionSelectPageTitle": "アイテムを選択",
+
+ "collectionActionShowTitleSearch": "タイトル名フィルターを表示",
+ "collectionActionHideTitleSearch": "タイトル名フィルターを非表示",
+ "collectionActionAddShortcut": "ショートカットを追加",
+ "collectionActionEmptyBin": "ごみ箱を空にする",
+ "collectionActionCopy": "アルバムにコピー",
+ "collectionActionMove": "アルバムに移動",
+ "collectionActionRescan": "再スキャン",
+ "collectionActionEdit": "編集",
+
+ "collectionSearchTitlesHintText": "タイトルを検索",
+
+ "collectionSortDate": "日付",
+ "collectionSortSize": "サイズ",
+ "collectionSortName": "アルバムとファイル名",
+ "collectionSortRating": "評価",
+
+ "collectionGroupAlbum": "アルバム別",
+ "collectionGroupMonth": "月別",
+ "collectionGroupDay": "日別",
+ "collectionGroupNone": "グループ化しない",
+
+ "sectionUnknown": "不明",
+ "dateToday": "今日",
+ "dateYesterday": "昨日",
+ "dateThisMonth": "今月",
+ "collectionDeleteFailureFeedback": "{count, plural, other{{count} 件のアイテムを削除できませんでした}}",
+ "collectionCopyFailureFeedback": "{count, plural, other{{count} 件のアイテムをコピーできませんでした}}",
+ "collectionMoveFailureFeedback": "{count, plural, other{{count} 件のアイテムを移動できませんでした}}",
+ "collectionEditFailureFeedback": "{count, plural, other{{count} 件のアイテムを編集できませんでした}}",
+ "collectionExportFailureFeedback": "{count, plural, other{{count} ページをエクスポートできませんでした}}",
+ "collectionCopySuccessFeedback": "{count, plural, other{{count} 件のアイテムをコピーしました}}",
+ "collectionMoveSuccessFeedback": "{count, plural, other{{count} 件のアイテムを移動しました}}",
+ "collectionEditSuccessFeedback": "{count, plural, other{{count} 件のアイテムを編集しました}}",
+
+ "collectionEmptyFavourites": "お気に入りはありません",
+ "collectionEmptyVideos": "動画はありません",
+ "collectionEmptyImages": "画像はありません",
+
+ "collectionSelectSectionTooltip": "セクションを選択",
+ "collectionDeselectSectionTooltip": "セクションの選択を解除",
+
+ "drawerCollectionAll": "すべてのコレクション",
+ "drawerCollectionFavourites": "お気に入り",
+ "drawerCollectionImages": "画像",
+ "drawerCollectionVideos": "動画",
+ "drawerCollectionAnimated": "アニメーション",
+ "drawerCollectionMotionPhotos": "モーションフォト",
+ "drawerCollectionPanoramas": "パノラマ",
+ "drawerCollectionRaws": "Raw 写真",
+ "drawerCollectionSphericalVideos": "360° 動画",
+
+ "chipSortDate": "日付",
+ "chipSortName": "名前",
+ "chipSortCount": "アイテム件数",
+
+ "albumGroupTier": "階層別",
+ "albumGroupVolume": "ストレージ ボリューム別",
+ "albumGroupNone": "グループ化しない",
+
+ "albumPickPageTitleCopy": "アルバムにコピー",
+ "albumPickPageTitleExport": "アルバムにエクスポート",
+ "albumPickPageTitleMove": "アルバムに移動",
+ "albumPickPageTitlePick": "アルバムを選択",
+
+ "albumCamera": "カメラ",
+ "albumDownload": "ダウンロード",
+ "albumScreenshots": "スクリーンショット",
+ "albumScreenRecordings": "画面録画",
+ "albumVideoCaptures": "動画キャプチャ",
+
+ "albumPageTitle": "アルバム",
+ "albumEmpty": "アルバムはありません",
+ "createAlbumTooltip": "アルバムを作成",
+ "createAlbumButtonLabel": "作成",
+ "newFilterBanner": "新規",
+
+ "countryPageTitle": "国",
+ "countryEmpty": "国はありません",
+
+ "tagPageTitle": "タグ",
+ "tagEmpty": "タグはありません",
+
+ "binPageTitle": "ごみ箱",
+
+ "searchCollectionFieldHint": "コレクションを検索",
+ "searchSectionRecent": "最近",
+ "searchSectionAlbums": "アルバム",
+ "searchSectionCountries": "国",
+ "searchSectionPlaces": "場所",
+ "searchSectionTags": "タグ",
+ "searchSectionRating": "評価",
+
+ "settingsPageTitle": "設定",
+ "settingsSystemDefault": "システム",
+ "settingsDefault": "デフォルト",
+
+ "settingsActionExport": "エクスポート",
+ "settingsActionImport": "インポート",
+
+ "appExportCovers": "カバー",
+ "appExportFavourites": "お気に入り",
+ "appExportSettings": "設定",
+
+ "settingsSectionNavigation": "ナビゲーション",
+ "settingsHome": "ホーム",
+ "settingsKeepScreenOnTile": "画面表示をオンのままにする",
+ "settingsKeepScreenOnTitle": "画面表示をオンのままにする",
+ "settingsDoubleBackExit": "「戻る」を2回タップして終了",
+
+ "settingsConfirmationDialogTile": "確認メッセージ",
+ "settingsConfirmationDialogTitle": "確認メッセージ",
+ "settingsConfirmationDialogDeleteItems": "アイテムを完全に削除する前に確認",
+ "settingsConfirmationDialogMoveToBinItems": "アイテムをごみ箱に移動する前に確認",
+
+ "settingsNavigationDrawerTile": "ナビゲーション メニュー",
+ "settingsNavigationDrawerEditorTitle": "ナビゲーション メニュー",
+ "settingsNavigationDrawerBanner": "メニュー項目を長押しして、移動および並べ替え",
+ "settingsNavigationDrawerTabTypes": "タイプ",
+ "settingsNavigationDrawerTabAlbums": "アルバム",
+ "settingsNavigationDrawerTabPages": "ページ",
+ "settingsNavigationDrawerAddAlbum": "アルバムを追加",
+
+ "settingsSectionThumbnails": "サムネイル",
+ "settingsThumbnailShowFavouriteIcon": "お気に入りアイコンを表示",
+ "settingsThumbnailShowLocationIcon": "位置情報アイコンを表示",
+ "settingsThumbnailShowMotionPhotoIcon": "モーションフォトアイコンを表示",
+ "settingsThumbnailShowRating": "評価情報を表示",
+ "settingsThumbnailShowRawIcon": "Raw アイコンを表示",
+ "settingsThumbnailShowVideoDuration": "動画の再生時間を表示",
+
+ "settingsCollectionQuickActionsTile": "クイック アクション",
+ "settingsCollectionQuickActionEditorTitle": "クイック アクション",
+ "settingsCollectionQuickActionTabBrowsing": "ブラウズ中",
+ "settingsCollectionQuickActionTabSelecting": "選択中",
+ "settingsCollectionBrowsingQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを閲覧中に表示されるアクションを選択します。",
+ "settingsCollectionSelectionQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを選択中に表示されるアクションを選択します。",
+
+ "settingsSectionViewer": "ビューアー",
+ "settingsViewerUseCutout": "切り取り領域を使用",
+ "settingsViewerMaximumBrightness": "明るさ最大",
+ "settingsMotionPhotoAutoPlay": "モーションフォト自動再生",
+ "settingsImageBackground": "画像背景",
+
+ "settingsViewerQuickActionsTile": "クイックアクション",
+ "settingsViewerQuickActionEditorTitle": "クイックアクション",
+ "settingsViewerQuickActionEditorBanner": "長押ししてボタンを移動しビューアーで表示されるアクションを選択します。",
+ "settingsViewerQuickActionEditorDisplayedButtons": "表示ボタン",
+ "settingsViewerQuickActionEditorAvailableButtons": "利用可能なボタン",
+ "settingsViewerQuickActionEmpty": "ボタンなし",
+
+ "settingsViewerOverlayTile": "オーバーレイ",
+ "settingsViewerOverlayTitle": "オーバーレイ",
+ "settingsViewerShowOverlayOnOpening": "最初に表示",
+ "settingsViewerShowMinimap": "小さな地図を表示",
+ "settingsViewerShowInformation": "情報を表示",
+ "settingsViewerShowInformationSubtitle": "タイトル、日付、位置情報、その他を表示",
+ "settingsViewerShowShootingDetails": "撮影詳細を表示",
+ "settingsViewerShowOverlayThumbnails": "サムネイルを表示",
+ "settingsViewerEnableOverlayBlurEffect": "ぼかし効果",
+
+ "settingsVideoPageTitle": "動画設定",
+ "settingsSectionVideo": "動画",
+ "settingsVideoShowVideos": "動画を表示",
+ "settingsVideoEnableHardwareAcceleration": "ハードウェア アクセラレーション",
+ "settingsVideoEnableAutoPlay": "自動再生",
+ "settingsVideoLoopModeTile": "ループ モード",
+ "settingsVideoLoopModeTitle": "ループ モード",
+
+ "settingsVideoQuickActionsTile": "動画のクイック アクション",
+ "settingsVideoQuickActionEditorTitle": "クイック アクション",
+ "settingsSubtitleThemeTile": "字幕",
+ "settingsSubtitleThemeTitle": "字幕",
+ "settingsSubtitleThemeSample": "これはサンプルです。",
+ "settingsSubtitleThemeTextAlignmentTile": "テキストの配置",
+ "settingsSubtitleThemeTextAlignmentTitle": "テキストの配置",
+ "settingsSubtitleThemeTextSize": "テキストのサイズ",
+ "settingsSubtitleThemeShowOutline": "アウトラインと影を表示",
+ "settingsSubtitleThemeTextColor": "テキストの色",
+ "settingsSubtitleThemeTextOpacity": "テキストの不透明度",
+ "settingsSubtitleThemeBackgroundColor": "背景色",
+ "settingsSubtitleThemeBackgroundOpacity": "背景の不透明度",
+ "settingsSubtitleThemeTextAlignmentLeft": "左揃え",
+ "settingsSubtitleThemeTextAlignmentCenter": "中央揃え",
+ "settingsSubtitleThemeTextAlignmentRight": "右揃え",
+
+ "settingsVideoControlsTile": "操作",
+ "settingsVideoControlsTitle": "操作",
+ "settingsVideoButtonsTile": "ボタン",
+ "settingsVideoButtonsTitle": "ボタン",
+ "settingsVideoGestureDoubleTapTogglePlay": "2回タップして再生/一時停止",
+ "settingsVideoGestureSideDoubleTapSeek": "画面の角を2回タップして早送り/早戻し",
+
+ "settingsSectionPrivacy": "プライバシー",
+ "settingsAllowInstalledAppAccess": "アプリのインベントリへのアクセスを許可する",
+ "settingsAllowInstalledAppAccessSubtitle": "アルバム表示の改善に使用されます",
+ "settingsAllowErrorReporting": "匿名でのエラー報告を許可する",
+ "settingsSaveSearchHistory": "検索履歴を保存",
+ "settingsEnableBin": "ごみ箱を使用",
+ "settingsEnableBinSubtitle": "削除したアイテムを30日間保持します",
+
+ "settingsHiddenItemsTile": "非表示アイテム",
+ "settingsHiddenItemsTitle": "非表示アイテム",
+
+ "settingsHiddenFiltersTitle": "非表示フィルター",
+ "settingsHiddenFiltersBanner": "非表示のフィルターに一致する写真と動画は、コレクションに表示されません。",
+ "settingsHiddenFiltersEmpty": "非表示フィルターがありません",
+
+ "settingsHiddenPathsTitle": "非表示パス",
+ "settingsHiddenPathsBanner": "これらのフォルダまたはそのサブフォルダにある写真と動画は、コレクションに表示されません。",
+ "addPathTooltip": "パスを追加",
+
+ "settingsStorageAccessTile": "ストレージへのアクセス",
+ "settingsStorageAccessTitle": "ストレージへのアクセス",
+ "settingsStorageAccessBanner": "ディレクトリによっては保存されているファイルの編集のためにアクセスを許可する必要があります。これまでにアクセスを許可したディレクトりはこちらで確認できます。",
+ "settingsStorageAccessEmpty": "許可したアクセスはありません",
+ "settingsStorageAccessRevokeTooltip": "許可を取り消し",
+
+ "settingsSectionAccessibility": "アクセシビリティ",
+ "settingsRemoveAnimationsTile": "アニメーションの削除",
+ "settingsRemoveAnimationsTitle": "アニメーションの削除",
+ "settingsTimeToTakeActionTile": "操作までの時間",
+ "settingsTimeToTakeActionTitle": "操作までの時間",
+
+ "settingsSectionLanguage": "言語と形式",
+ "settingsLanguage": "言語",
+ "settingsCoordinateFormatTile": "座標形式",
+ "settingsCoordinateFormatTitle": "座標形式",
+ "settingsUnitSystemTile": "単位",
+ "settingsUnitSystemTitle": "単位",
+
+ "statsPageTitle": "統計",
+ "statsWithGps": "{count, plural, other{位置情報のあるアイテム {count} 件}}",
+ "statsTopCountries": "上位の国",
+ "statsTopPlaces": "上位の場所",
+ "statsTopTags": "上位のタグ",
+
+ "viewerOpenPanoramaButtonLabel": "パノラマを開く",
+ "viewerErrorUnknown": "エラー",
+ "viewerErrorDoesNotExist": "ファイルが存在しません。",
+
+ "viewerInfoPageTitle": "情報",
+ "viewerInfoBackToViewerTooltip": "ビューアーに戻る",
+
+ "viewerInfoUnknown": "不明",
+ "viewerInfoLabelTitle": "タイトル",
+ "viewerInfoLabelDate": "日付",
+ "viewerInfoLabelResolution": "解像度",
+ "viewerInfoLabelSize": "サイズ",
+ "viewerInfoLabelUri": "URI",
+ "viewerInfoLabelPath": "パス",
+ "viewerInfoLabelDuration": "再生時間",
+ "viewerInfoLabelOwner": "所有者",
+ "viewerInfoLabelCoordinates": "座標",
+ "viewerInfoLabelAddress": "アドレス",
+
+ "mapStyleTitle": "地図のスタイル",
+ "mapStyleTooltip": "地図のスタイルを選択",
+ "mapZoomInTooltip": "ズームイン",
+ "mapZoomOutTooltip": "ズームアウト",
+ "mapPointNorthUpTooltip": "北が上になるように表示",
+ "mapAttributionOsmHot": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)",
+ "mapAttributionStamen": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)",
+ "openMapPageTooltip": "地図ページで表示",
+ "mapEmptyRegion": "この地域の画像はありません",
+
+ "viewerInfoOpenEmbeddedFailureFeedback": "埋め込みデータを抽出できませんでした",
+ "viewerInfoOpenLinkText": "開く",
+ "viewerInfoViewXmlLinkText": "XML を表示",
+
+ "viewerInfoSearchFieldLabel": "メタデータを検索",
+ "viewerInfoSearchEmpty": "一致するキーはありません",
+ "viewerInfoSearchSuggestionDate": "日時",
+ "viewerInfoSearchSuggestionDescription": "説明",
+ "viewerInfoSearchSuggestionDimensions": "寸法",
+ "viewerInfoSearchSuggestionResolution": "解像度",
+ "viewerInfoSearchSuggestionRights": "権限",
+
+ "tagEditorPageTitle": "タグの編集",
+ "tagEditorPageNewTagFieldLabel": "新しいタグ",
+ "tagEditorPageAddTagTooltip": "タグを追加",
+ "tagEditorSectionRecent": "最近",
+
+ "panoramaEnableSensorControl": "センサー制御を有効にする",
+ "panoramaDisableSensorControl": "センサー制御を無効にする",
+
+ "sourceViewerPageTitle": "ソース",
+
+ "filePickerShowHiddenFiles": "非表示のファイルを表示する",
+ "filePickerDoNotShowHiddenFiles": "非表示のファイルを表示しない",
+ "filePickerOpenFrom": "次から開く",
+ "filePickerNoItems": "アイテムはありません",
+ "filePickerUseThisFolder": "このフォルダを使用"
+}
diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb
index abe37bbcc..b5a4fd993 100644
--- a/lib/l10n/app_ko.arb
+++ b/lib/l10n/app_ko.arb
@@ -68,6 +68,8 @@
"entryActionRemoveFavourite": "즐겨찾기에서 삭제",
"videoActionCaptureFrame": "프레임 캡처",
+ "videoActionMute": "음소거",
+ "videoActionUnmute": "음소거 해제",
"videoActionPause": "일시정지",
"videoActionPlay": "재생",
"videoActionReplay10": "10초 뒤로 탐색",
@@ -112,6 +114,11 @@
"videoLoopModeShortOnly": "짧은 동영상만 반복",
"videoLoopModeAlways": "항상 반복",
+ "videoControlsPlay": "재생",
+ "videoControlsPlaySeek": "재생 및 앞뒤로 가기",
+ "videoControlsPlayOutside": "다른 앱에서 열기",
+ "videoControlsNone": "없음",
+
"mapStyleGoogleNormal": "구글 지도",
"mapStyleGoogleHybrid": "구글 지도 (위성)",
"mapStyleGoogleTerrain": "구글 지도 (지형)",
@@ -257,8 +264,7 @@
"aboutCredits": "크레딧",
"aboutCreditsWorldAtlas1": "이 앱은",
"aboutCreditsWorldAtlas2": "의 TopoJSON 파일(ISC 라이선스)을 이용합니다.",
- "aboutCreditsTranslators": "번역가:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
+ "aboutCreditsTranslators": "번역가",
"aboutLicenses": "오픈 소스 라이선스",
"aboutLicensesBanner": "이 앱은 다음의 오픈 소스 패키지와 라이브러리를 이용합니다.",
@@ -431,6 +437,7 @@
"settingsViewerShowInformation": "상세 정보 표시",
"settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시",
"settingsViewerShowShootingDetails": "촬영 정보 표시",
+ "settingsViewerShowOverlayThumbnails": "섬네일 표시",
"settingsViewerEnableOverlayBlurEffect": "흐림 효과",
"settingsVideoPageTitle": "동영상 설정",
@@ -440,8 +447,6 @@
"settingsVideoEnableAutoPlay": "자동 재생",
"settingsVideoLoopModeTile": "반복 모드",
"settingsVideoLoopModeTitle": "반복 모드",
- "settingsVideoQuickActionsTile": "동영상의 빠른 작업",
- "settingsVideoQuickActionEditorTitle": "빠른 작업",
"settingsSubtitleThemeTile": "자막",
"settingsSubtitleThemeTitle": "자막",
@@ -458,6 +463,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "가운데",
"settingsSubtitleThemeTextAlignmentRight": "오른쪽",
+ "settingsVideoControlsTile": "제어",
+ "settingsVideoControlsTitle": "제어",
+ "settingsVideoButtonsTile": "버튼",
+ "settingsVideoButtonsTitle": "버튼",
+ "settingsVideoGestureDoubleTapTogglePlay": "두 번 탭해서 재생이나 일시정지하기",
+ "settingsVideoGestureSideDoubleTapSeek": "화면 측면에서 두 번 탭해서 앞뒤로 가기",
+
"settingsSectionPrivacy": "개인정보 보호",
"settingsAllowInstalledAppAccess": "설치된 앱의 목록 접근 허용",
"settingsAllowInstalledAppAccessSubtitle": "앨범 표시 개선을 위해",
diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb
index 948e20c12..55b03d590 100644
--- a/lib/l10n/app_pt.arb
+++ b/lib/l10n/app_pt.arb
@@ -68,6 +68,8 @@
"entryActionRemoveFavourite": "Remova dos favoritos",
"videoActionCaptureFrame": "Capturar quadro",
+ "videoActionMute": "Mudo",
+ "videoActionUnmute": "Ativar mudo",
"videoActionPause": "Pausa",
"videoActionPlay": "Toque",
"videoActionReplay10": "Retroceda 10 segundos",
@@ -112,6 +114,11 @@
"videoLoopModeShortOnly": "Apenas vídeos curtos",
"videoLoopModeAlways": "Sempre",
+ "videoControlsPlay": "Começar",
+ "videoControlsPlaySeek": "Começar e procurar",
+ "videoControlsPlayOutside": "Abrir com outro player",
+ "videoControlsNone": "Nenhum",
+
"mapStyleGoogleNormal": "Google Maps",
"mapStyleGoogleHybrid": "Google Maps (Híbrido)",
"mapStyleGoogleTerrain": "Google Maps (Terreno)",
@@ -257,8 +264,7 @@
"aboutCredits": "Créditos",
"aboutCreditsWorldAtlas1": "Este aplicativo usa um arquivo de TopoJSON",
"aboutCreditsWorldAtlas2": "sob licença ISC.",
- "aboutCreditsTranslators": "Tradutores:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
+ "aboutCreditsTranslators": "Tradutores",
"aboutLicenses": "Licenças de código aberto",
"aboutLicensesBanner": "Este aplicativo usa os seguintes pacotes e bibliotecas de código aberto.",
@@ -431,6 +437,7 @@
"settingsViewerShowInformation": "Mostrar informações",
"settingsViewerShowInformationSubtitle": "Mostrar título, data, local, etc.",
"settingsViewerShowShootingDetails": "Mostrar detalhes de disparo",
+ "settingsViewerShowOverlayThumbnails": "Mostrar miniaturas",
"settingsViewerEnableOverlayBlurEffect": "Efeito de desfoque",
"settingsVideoPageTitle": "Configurações de vídeo",
@@ -440,8 +447,6 @@
"settingsVideoEnableAutoPlay": "Reprodução automática",
"settingsVideoLoopModeTile": "Modo de loop",
"settingsVideoLoopModeTitle": "Modo de loop",
- "settingsVideoQuickActionsTile": "Ações rápidas para vídeos",
- "settingsVideoQuickActionEditorTitle": "Ações rápidas",
"settingsSubtitleThemeTile": "Legendas",
"settingsSubtitleThemeTitle": "Legendas",
@@ -458,6 +463,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "Centro",
"settingsSubtitleThemeTextAlignmentRight": "Direita",
+ "settingsVideoControlsTile": "Controles",
+ "settingsVideoControlsTitle": "Controles",
+ "settingsVideoButtonsTile": "Botões",
+ "settingsVideoButtonsTitle": "Botões",
+ "settingsVideoGestureDoubleTapTogglePlay": "Toque duas vezes para reproduzir/pausar",
+ "settingsVideoGestureSideDoubleTapSeek": "Toque duas vezes nas bordas da tela buscar para trás/para frente",
+
"settingsSectionPrivacy": "Privacidade",
"settingsAllowInstalledAppAccess": "Permitir acesso ao inventário de aplicativos",
"settingsAllowInstalledAppAccessSubtitle": "Usado para melhorar a exibição do álbum",
diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb
index 86b70ebe5..633ca3a4e 100644
--- a/lib/l10n/app_ru.arb
+++ b/lib/l10n/app_ru.arb
@@ -48,6 +48,7 @@
"entryActionCopyToClipboard": "Скопировать в буфер обмена",
"entryActionDelete": "Удалить",
+ "entryActionConvert": "Конвертировать",
"entryActionExport": "Экспорт",
"entryActionRename": "Переименовать",
"entryActionRestore": "Восстановить",
@@ -67,6 +68,8 @@
"entryActionRemoveFavourite": "Удалить из избранного",
"videoActionCaptureFrame": "Сохранить кадр",
+ "videoActionMute": "Выключить звук",
+ "videoActionUnmute": "Включить звук",
"videoActionPause": "Стоп",
"videoActionPlay": "Играть",
"videoActionReplay10": "Перемотка на 10 секунд назад",
@@ -111,6 +114,11 @@
"videoLoopModeShortOnly": "Только для коротких видео",
"videoLoopModeAlways": "Всегда",
+ "videoControlsPlay": "Воспроизведение",
+ "videoControlsPlaySeek": "Воспроизведение и переход на позицию",
+ "videoControlsPlayOutside": "Открыть в другом видеоплеере",
+ "videoControlsNone": "Ничего",
+
"mapStyleGoogleNormal": "Google Карты",
"mapStyleGoogleHybrid": "Google Карты (Гибридный)",
"mapStyleGoogleTerrain": "Google Карты (Местность)",
@@ -256,8 +264,7 @@
"aboutCredits": "Благодарности",
"aboutCreditsWorldAtlas1": "Это приложение использует файл TopoJSON из",
"aboutCreditsWorldAtlas2": "под лицензией ISC.",
- "aboutCreditsTranslators": "Переводчики:",
- "aboutCreditsTranslatorLine": "{language}: {names}",
+ "aboutCreditsTranslators": "Переводчики",
"aboutLicenses": "Лицензии с открытым исходным кодом",
"aboutLicensesBanner": "Это приложение использует следующие пакеты и библиотеки с открытым исходным кодом.",
@@ -430,6 +437,7 @@
"settingsViewerShowInformation": "Показать информацию",
"settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.",
"settingsViewerShowShootingDetails": "Показать детали съёмки",
+ "settingsViewerShowOverlayThumbnails": "Показать эскизы",
"settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия",
"settingsVideoPageTitle": "Настройки видео",
@@ -439,8 +447,6 @@
"settingsVideoEnableAutoPlay": "Автозапуск воспроизведения",
"settingsVideoLoopModeTile": "Циклический режим",
"settingsVideoLoopModeTitle": "Цикличный режим",
- "settingsVideoQuickActionsTile": "Быстрые действия для видео",
- "settingsVideoQuickActionEditorTitle": "Быстрые действия",
"settingsSubtitleThemeTile": "Субтитры",
"settingsSubtitleThemeTitle": "Субтитры",
@@ -457,6 +463,13 @@
"settingsSubtitleThemeTextAlignmentCenter": "По центру",
"settingsSubtitleThemeTextAlignmentRight": "По правой стороне",
+ "settingsVideoControlsTile": "Элементы управления",
+ "settingsVideoControlsTitle": "Элементы управления",
+ "settingsVideoButtonsTile": "Кнопки",
+ "settingsVideoButtonsTitle": "Кнопки",
+ "settingsVideoGestureDoubleTapTogglePlay": "Двойное нажатие для воспроизведения/паузы",
+ "settingsVideoGestureSideDoubleTapSeek": "Двойное нажатие на края экрана для перехода назад/вперёд",
+
"settingsSectionPrivacy": "Конфиденциальность",
"settingsAllowInstalledAppAccess": "Разрешить доступ к библиотеке приложения",
"settingsAllowInstalledAppAccessSubtitle": "Используется для улучшения отображения альбомов",
diff --git a/lib/model/actions/chip_actions.dart b/lib/model/actions/chip_actions.dart
index 046850c81..efae273d7 100644
--- a/lib/model/actions/chip_actions.dart
+++ b/lib/model/actions/chip_actions.dart
@@ -23,9 +23,7 @@ extension ExtraChipAction on ChipAction {
}
}
- Widget getIcon() {
- return Icon(_getIconData());
- }
+ Widget getIcon() => Icon(_getIconData());
IconData _getIconData() {
switch (this) {
diff --git a/lib/model/actions/chip_set_actions.dart b/lib/model/actions/chip_set_actions.dart
index 7a73a8186..65ce55e5a 100644
--- a/lib/model/actions/chip_set_actions.dart
+++ b/lib/model/actions/chip_set_actions.dart
@@ -90,9 +90,7 @@ extension ExtraChipSetAction on ChipSetAction {
}
}
- Widget getIcon() {
- return Icon(_getIconData());
- }
+ Widget getIcon() => Icon(_getIconData());
IconData _getIconData() {
switch (this) {
diff --git a/lib/model/actions/entry_actions.dart b/lib/model/actions/entry_actions.dart
index 2528b62d7..b9282b429 100644
--- a/lib/model/actions/entry_actions.dart
+++ b/lib/model/actions/entry_actions.dart
@@ -21,6 +21,15 @@ enum EntryAction {
flip,
// vector
viewSource,
+ // video
+ videoCaptureFrame,
+ videoSelectStreams,
+ videoSetSpeed,
+ videoToggleMute,
+ videoSettings,
+ videoTogglePlay,
+ videoReplay10,
+ videoSkip10,
// external
edit,
open,
@@ -41,8 +50,8 @@ class EntryActions {
EntryAction.copy,
EntryAction.move,
EntryAction.toggleFavourite,
- EntryAction.viewSource,
EntryAction.rotateScreen,
+ EntryAction.viewSource,
];
static const export = [
@@ -62,6 +71,14 @@ class EntryActions {
];
static const pageActions = [
+ EntryAction.videoCaptureFrame,
+ EntryAction.videoSelectStreams,
+ EntryAction.videoSetSpeed,
+ EntryAction.videoToggleMute,
+ EntryAction.videoSettings,
+ EntryAction.videoTogglePlay,
+ EntryAction.videoReplay10,
+ EntryAction.videoSkip10,
EntryAction.rotateCCW,
EntryAction.rotateCW,
EntryAction.flip,
@@ -72,6 +89,14 @@ class EntryActions {
EntryAction.restore,
EntryAction.debug,
];
+
+ static const video = [
+ EntryAction.videoCaptureFrame,
+ EntryAction.videoToggleMute,
+ EntryAction.videoSetSpeed,
+ EntryAction.videoSelectStreams,
+ EntryAction.videoSettings,
+ ];
}
extension ExtraEntryAction on EntryAction {
@@ -110,6 +135,25 @@ extension ExtraEntryAction on EntryAction {
// vector
case EntryAction.viewSource:
return context.l10n.entryActionViewSource;
+ // video
+ case EntryAction.videoCaptureFrame:
+ return context.l10n.videoActionCaptureFrame;
+ case EntryAction.videoToggleMute:
+ // different data depending on toggle state
+ return context.l10n.videoActionMute;
+ case EntryAction.videoSelectStreams:
+ return context.l10n.videoActionSelectStreams;
+ case EntryAction.videoSetSpeed:
+ return context.l10n.videoActionSetSpeed;
+ case EntryAction.videoSettings:
+ return context.l10n.videoActionSettings;
+ case EntryAction.videoTogglePlay:
+ // different data depending on toggle state
+ return context.l10n.videoActionPlay;
+ case EntryAction.videoReplay10:
+ return context.l10n.videoActionReplay10;
+ case EntryAction.videoSkip10:
+ return context.l10n.videoActionSkip10;
// external
case EntryAction.edit:
return context.l10n.entryActionEdit;
@@ -176,6 +220,25 @@ extension ExtraEntryAction on EntryAction {
// vector
case EntryAction.viewSource:
return AIcons.vector;
+ // video
+ case EntryAction.videoCaptureFrame:
+ return AIcons.captureFrame;
+ case EntryAction.videoToggleMute:
+ // different data depending on toggle state
+ return AIcons.mute;
+ case EntryAction.videoSelectStreams:
+ return AIcons.streams;
+ case EntryAction.videoSetSpeed:
+ return AIcons.speed;
+ case EntryAction.videoSettings:
+ return AIcons.videoSettings;
+ case EntryAction.videoTogglePlay:
+ // different data depending on toggle state
+ return AIcons.play;
+ case EntryAction.videoReplay10:
+ return AIcons.replay10;
+ case EntryAction.videoSkip10:
+ return AIcons.skip10;
// external
case EntryAction.edit:
return AIcons.edit;
diff --git a/lib/model/actions/entry_set_actions.dart b/lib/model/actions/entry_set_actions.dart
index 8df63b991..7446ff8e4 100644
--- a/lib/model/actions/entry_set_actions.dart
+++ b/lib/model/actions/entry_set_actions.dart
@@ -159,9 +159,7 @@ extension ExtraEntrySetAction on EntrySetAction {
}
}
- Widget getIcon() {
- return Icon(_getIconData());
- }
+ Widget getIcon() => Icon(_getIconData());
IconData _getIconData() {
switch (this) {
diff --git a/lib/model/actions/video_actions.dart b/lib/model/actions/video_actions.dart
deleted file mode 100644
index 627640bb5..000000000
--- a/lib/model/actions/video_actions.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-import 'package:aves/theme/icons.dart';
-import 'package:aves/widgets/common/extensions/build_context.dart';
-import 'package:flutter/widgets.dart';
-
-enum VideoAction {
- captureFrame,
- playOutside,
- replay10,
- skip10,
- selectStreams,
- setSpeed,
- settings,
- togglePlay,
- // TODO TLAD [video] toggle mute
-}
-
-class VideoActions {
- static const all = [
- VideoAction.togglePlay,
- VideoAction.captureFrame,
- VideoAction.setSpeed,
- VideoAction.selectStreams,
- VideoAction.replay10,
- VideoAction.skip10,
- VideoAction.playOutside,
- VideoAction.settings,
- ];
-}
-
-extension ExtraVideoAction on VideoAction {
- String getText(BuildContext context) {
- switch (this) {
- case VideoAction.captureFrame:
- return context.l10n.videoActionCaptureFrame;
- case VideoAction.playOutside:
- return context.l10n.entryActionOpen;
- case VideoAction.replay10:
- return context.l10n.videoActionReplay10;
- case VideoAction.skip10:
- return context.l10n.videoActionSkip10;
- case VideoAction.selectStreams:
- return context.l10n.videoActionSelectStreams;
- case VideoAction.setSpeed:
- return context.l10n.videoActionSetSpeed;
- case VideoAction.settings:
- return context.l10n.videoActionSettings;
- case VideoAction.togglePlay:
- // different data depending on toggle state
- return context.l10n.videoActionPlay;
- }
- }
-
- Widget getIcon() {
- return Icon(_getIconData());
- }
-
- IconData _getIconData() {
- switch (this) {
- case VideoAction.captureFrame:
- return AIcons.captureFrame;
- case VideoAction.playOutside:
- return AIcons.openOutside;
- case VideoAction.replay10:
- return AIcons.replay10;
- case VideoAction.skip10:
- return AIcons.skip10;
- case VideoAction.selectStreams:
- return AIcons.streams;
- case VideoAction.setSpeed:
- return AIcons.speed;
- case VideoAction.settings:
- return AIcons.videoSettings;
- case VideoAction.togglePlay:
- // different data depending on toggle state
- return AIcons.play;
- }
- }
-}
diff --git a/lib/model/db/db_metadata.dart b/lib/model/db/db_metadata.dart
index df051677a..cc23707bf 100644
--- a/lib/model/db/db_metadata.dart
+++ b/lib/model/db/db_metadata.dart
@@ -30,7 +30,7 @@ abstract class MetadataDb {
Future updateEntry(int id, AvesEntry entry);
- Future> searchEntries(String query, {int? limit});
+ Future> searchLiveEntries(String query, {int? limit});
// date taken
diff --git a/lib/model/db/db_metadata_sqflite.dart b/lib/model/db/db_metadata_sqflite.dart
index e5133647c..994a7d643 100644
--- a/lib/model/db/db_metadata_sqflite.dart
+++ b/lib/model/db/db_metadata_sqflite.dart
@@ -215,11 +215,11 @@ class SqfliteMetadataDb implements MetadataDb {
}
@override
- Future> searchEntries(String query, {int? limit}) async {
+ Future> searchLiveEntries(String query, {int? limit}) async {
final rows = await _db.query(
entryTable,
- where: 'title LIKE ?',
- whereArgs: ['%$query%'],
+ where: 'title LIKE ? AND trashed = ?',
+ whereArgs: ['%$query%', 0],
orderBy: 'sourceDateTakenMillis DESC',
limit: limit,
);
diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart
index e3c2de204..afa1f219f 100644
--- a/lib/model/settings/defaults.dart
+++ b/lib/model/settings/defaults.dart
@@ -1,6 +1,5 @@
import 'package:aves/model/actions/entry_actions.dart';
import 'package:aves/model/actions/entry_set_actions.dart';
-import 'package:aves/model/actions/video_actions.dart';
import 'package:aves/model/filters/favourite.dart';
import 'package:aves/model/filters/mime.dart';
import 'package:aves/model/settings/enums/enums.dart';
@@ -67,20 +66,20 @@ class SettingsDefaults {
static const showOverlayMinimap = false;
static const showOverlayInfo = true;
static const showOverlayShootingDetails = false;
+ static const showOverlayThumbnailPreview = false;
static const enableOverlayBlurEffect = true; // `enableOverlayBlurEffect` has a contextual default value
static const viewerUseCutout = true;
static const viewerMaxBrightness = false;
static const enableMotionPhotoAutoPlay = false;
// video
- static const videoQuickActions = [
- VideoAction.replay10,
- VideoAction.togglePlay,
- ];
static const enableVideoHardwareAcceleration = true;
static const enableVideoAutoPlay = false;
static const videoLoopMode = VideoLoopMode.shortOnly;
static const videoShowRawTimedText = false;
+ static const videoControls = VideoControls.play;
+ static const videoGestureDoubleTapTogglePlay = false;
+ static const videoGestureSideDoubleTapSeek = true;
// subtitles
static const subtitleFontSize = 20.0;
diff --git a/lib/model/settings/enums/enums.dart b/lib/model/settings/enums/enums.dart
index 8957d0141..f5100f413 100644
--- a/lib/model/settings/enums/enums.dart
+++ b/lib/model/settings/enums/enums.dart
@@ -18,3 +18,5 @@ enum KeepScreenOn { never, viewerOnly, always }
enum UnitSystem { metric, imperial }
enum VideoLoopMode { never, shortOnly, always }
+
+enum VideoControls { play, playSeek, playOutside, none }
diff --git a/lib/model/settings/enums/video_controls.dart b/lib/model/settings/enums/video_controls.dart
new file mode 100644
index 000000000..6f9979f71
--- /dev/null
+++ b/lib/model/settings/enums/video_controls.dart
@@ -0,0 +1,19 @@
+import 'package:aves/widgets/common/extensions/build_context.dart';
+import 'package:flutter/widgets.dart';
+
+import 'enums.dart';
+
+extension ExtraVideoControls on VideoControls {
+ String getName(BuildContext context) {
+ switch (this) {
+ case VideoControls.play:
+ return context.l10n.videoControlsPlay;
+ case VideoControls.playSeek:
+ return context.l10n.videoControlsPlaySeek;
+ case VideoControls.playOutside:
+ return context.l10n.videoControlsPlayOutside;
+ case VideoControls.none:
+ return context.l10n.videoControlsNone;
+ }
+ }
+}
diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart
index 4d32bff5a..67b8f7e0f 100644
--- a/lib/model/settings/settings.dart
+++ b/lib/model/settings/settings.dart
@@ -4,7 +4,6 @@ import 'dart:math';
import 'package:aves/l10n/l10n.dart';
import 'package:aves/model/actions/entry_actions.dart';
import 'package:aves/model/actions/entry_set_actions.dart';
-import 'package:aves/model/actions/video_actions.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/settings/defaults.dart';
import 'package:aves/model/settings/enums/enums.dart';
@@ -82,6 +81,7 @@ class Settings extends ChangeNotifier {
static const showOverlayMinimapKey = 'show_overlay_minimap';
static const showOverlayInfoKey = 'show_overlay_info';
static const showOverlayShootingDetailsKey = 'show_overlay_shooting_details';
+ static const showOverlayThumbnailPreviewKey = 'show_overlay_thumbnail_preview';
static const enableOverlayBlurEffectKey = 'enable_overlay_blur_effect';
static const viewerUseCutoutKey = 'viewer_use_cutout';
static const viewerMaxBrightnessKey = 'viewer_max_brightness';
@@ -89,11 +89,13 @@ class Settings extends ChangeNotifier {
static const imageBackgroundKey = 'image_background';
// video
- static const videoQuickActionsKey = 'video_quick_actions';
static const enableVideoHardwareAccelerationKey = 'video_hwaccel_mediacodec';
static const enableVideoAutoPlayKey = 'video_auto_play';
static const videoLoopModeKey = 'video_loop';
static const videoShowRawTimedTextKey = 'video_show_raw_timed_text';
+ static const videoControlsKey = 'video_controls';
+ static const videoGestureDoubleTapTogglePlayKey = 'video_gesture_double_tap_toggle_play';
+ static const videoGestureSideDoubleTapSeekKey = 'video_gesture_side_double_tap_skip';
// subtitles
static const subtitleFontSizeKey = 'subtitle_font_size';
@@ -389,6 +391,10 @@ class Settings extends ChangeNotifier {
set showOverlayShootingDetails(bool newValue) => setAndNotify(showOverlayShootingDetailsKey, newValue);
+ bool get showOverlayThumbnailPreview => getBoolOrDefault(showOverlayThumbnailPreviewKey, SettingsDefaults.showOverlayThumbnailPreview);
+
+ set showOverlayThumbnailPreview(bool newValue) => setAndNotify(showOverlayThumbnailPreviewKey, newValue);
+
bool get enableOverlayBlurEffect => getBoolOrDefault(enableOverlayBlurEffectKey, SettingsDefaults.enableOverlayBlurEffect);
set enableOverlayBlurEffect(bool newValue) => setAndNotify(enableOverlayBlurEffectKey, newValue);
@@ -411,10 +417,6 @@ class Settings extends ChangeNotifier {
// video
- List get videoQuickActions => getEnumListOrDefault(videoQuickActionsKey, SettingsDefaults.videoQuickActions, VideoAction.values);
-
- set videoQuickActions(List newValue) => setAndNotify(videoQuickActionsKey, newValue.map((v) => v.toString()).toList());
-
bool get enableVideoHardwareAcceleration => getBoolOrDefault(enableVideoHardwareAccelerationKey, SettingsDefaults.enableVideoHardwareAcceleration);
set enableVideoHardwareAcceleration(bool newValue) => setAndNotify(enableVideoHardwareAccelerationKey, newValue);
@@ -431,6 +433,18 @@ class Settings extends ChangeNotifier {
set videoShowRawTimedText(bool newValue) => setAndNotify(videoShowRawTimedTextKey, newValue);
+ VideoControls get videoControls => getEnumOrDefault(videoControlsKey, SettingsDefaults.videoControls, VideoControls.values);
+
+ set videoControls(VideoControls newValue) => setAndNotify(videoControlsKey, newValue.toString());
+
+ bool get videoGestureDoubleTapTogglePlay => getBoolOrDefault(videoGestureDoubleTapTogglePlayKey, SettingsDefaults.videoGestureDoubleTapTogglePlay);
+
+ set videoGestureDoubleTapTogglePlay(bool newValue) => setAndNotify(videoGestureDoubleTapTogglePlayKey, newValue);
+
+ bool get videoGestureSideDoubleTapSeek => getBoolOrDefault(videoGestureSideDoubleTapSeekKey, SettingsDefaults.videoGestureSideDoubleTapSeek);
+
+ set videoGestureSideDoubleTapSeek(bool newValue) => setAndNotify(videoGestureSideDoubleTapSeekKey, newValue);
+
// subtitles
double get subtitleFontSize => getDouble(subtitleFontSizeKey) ?? SettingsDefaults.subtitleFontSize;
@@ -642,12 +656,15 @@ class Settings extends ChangeNotifier {
case showOverlayMinimapKey:
case showOverlayInfoKey:
case showOverlayShootingDetailsKey:
+ case showOverlayThumbnailPreviewKey:
case enableOverlayBlurEffectKey:
case viewerUseCutoutKey:
case viewerMaxBrightnessKey:
case enableMotionPhotoAutoPlayKey:
case enableVideoHardwareAccelerationKey:
case enableVideoAutoPlayKey:
+ case videoGestureDoubleTapTogglePlayKey:
+ case videoGestureSideDoubleTapSeekKey:
case subtitleShowOutlineKey:
case saveSearchHistoryKey:
case filePickerShowHiddenFilesKey:
@@ -668,6 +685,7 @@ class Settings extends ChangeNotifier {
case tagSortFactorKey:
case imageBackgroundKey:
case videoLoopModeKey:
+ case videoControlsKey:
case subtitleTextAlignmentKey:
case infoMapStyleKey:
case coordinateFormatKey:
@@ -689,7 +707,6 @@ class Settings extends ChangeNotifier {
case collectionBrowsingQuickActionsKey:
case collectionSelectionQuickActionsKey:
case viewerQuickActionsKey:
- case videoQuickActionsKey:
if (newValue is List) {
settingsStore.setStringList(key, newValue.cast());
} else {
diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart
index eade5b709..cec81045a 100644
--- a/lib/model/source/collection_source.dart
+++ b/lib/model/source/collection_source.dart
@@ -338,13 +338,19 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
});
}
- if (copy) {
- addEntries(movedEntries);
- } else {
- cleanEmptyAlbums(fromAlbums);
- if (moveType != MoveType.toBin) {
+ switch(moveType) {
+ case MoveType.copy:
+ addEntries(movedEntries);
+ break;
+ case MoveType.move:
+ case MoveType.export:
+ cleanEmptyAlbums(fromAlbums);
addDirectories(destinationAlbums);
- }
+ break;
+ case MoveType.toBin:
+ case MoveType.fromBin:
+ updateDerivedFilters(movedEntries);
+ break;
}
invalidateAlbumFilterSummary(directories: fromAlbums);
_invalidate(movedEntries);
diff --git a/lib/services/android_app_service.dart b/lib/services/android_app_service.dart
index ee0366e31..425d13483 100644
--- a/lib/services/android_app_service.dart
+++ b/lib/services/android_app_service.dart
@@ -34,20 +34,24 @@ abstract class AndroidAppService {
class PlatformAndroidAppService implements AndroidAppService {
static const platform = MethodChannel('deckers.thibault/aves/app');
+ static final knownAppDirs = {
+ 'com.kakao.talk': {'KakaoTalkDownload'},
+ 'com.sony.playmemories.mobile': {'Imaging Edge Mobile'},
+ 'nekox.messenger': {'NekoX'},
+ };
+
@override
Future> getPackages() async {
try {
final result = await platform.invokeMethod('getPackages');
final packages = (result as List).cast