Merge branch 'develop'

This commit is contained in:
Thibault Deckers 2022-03-07 12:05:40 +09:00
commit 2189c4fa6a
240 changed files with 3482 additions and 1815 deletions

View file

@ -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

View file

@ -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:

View file

@ -4,6 +4,26 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased]
## <a id="v1.6.2"></a>[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
## <a id="v1.6.1"></a>[v1.6.1] - 2022-02-23
### Added

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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,

View file

@ -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 =

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">アヴェス</string>
<string name="search_shortcut_short_label">検索</string>
<string name="videos_shortcut_short_label">動画</string>
<string name="analysis_channel_name">メディアスキャン</string>
<string name="analysis_service_description">画像と動画をスキャン</string>
<string name="analysis_notification_default_title">メディアをスキャン中</string>
<string name="analysis_notification_action_stop">停止</string>
</resources>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 366 KiB

View file

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 KiB

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 501 KiB

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 365 KiB

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 366 KiB

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -68,6 +68,8 @@
"entryActionRemoveFavourite": "Retirer des favoris",
"videoActionCaptureFrame": "Capturer limage",
"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 dune photo animée.\n\nVoulez-vous vraiment les supprimer ?",
"removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Les métadonnées XMP sont nécessaires pour lire la vidéo dune 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 laccès à linventaire des apps",
"settingsAllowInstalledAppAccessSubtitle": "Pour un affichage amélioré des albums",

View file

@ -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",

575
lib/l10n/app_ja.arb Normal file
View file

@ -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": "このフォルダを使用"
}

View file

@ -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": "앨범 표시 개선을 위해",

View file

@ -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",

View file

@ -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": "Используется для улучшения отображения альбомов",

View file

@ -23,9 +23,7 @@ extension ExtraChipAction on ChipAction {
}
}
Widget getIcon() {
return Icon(_getIconData());
}
Widget getIcon() => Icon(_getIconData());
IconData _getIconData() {
switch (this) {

View file

@ -90,9 +90,7 @@ extension ExtraChipSetAction on ChipSetAction {
}
}
Widget getIcon() {
return Icon(_getIconData());
}
Widget getIcon() => Icon(_getIconData());
IconData _getIconData() {
switch (this) {

View file

@ -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;

View file

@ -159,9 +159,7 @@ extension ExtraEntrySetAction on EntrySetAction {
}
}
Widget getIcon() {
return Icon(_getIconData());
}
Widget getIcon() => Icon(_getIconData());
IconData _getIconData() {
switch (this) {

View file

@ -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;
}
}
}

View file

@ -30,7 +30,7 @@ abstract class MetadataDb {
Future<void> updateEntry(int id, AvesEntry entry);
Future<Set<AvesEntry>> searchEntries(String query, {int? limit});
Future<Set<AvesEntry>> searchLiveEntries(String query, {int? limit});
// date taken

View file

@ -215,11 +215,11 @@ class SqfliteMetadataDb implements MetadataDb {
}
@override
Future<Set<AvesEntry>> searchEntries(String query, {int? limit}) async {
Future<Set<AvesEntry>> 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,
);

View file

@ -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;

View file

@ -18,3 +18,5 @@ enum KeepScreenOn { never, viewerOnly, always }
enum UnitSystem { metric, imperial }
enum VideoLoopMode { never, shortOnly, always }
enum VideoControls { play, playSeek, playOutside, none }

View file

@ -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;
}
}
}

View file

@ -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<VideoAction> get videoQuickActions => getEnumListOrDefault(videoQuickActionsKey, SettingsDefaults.videoQuickActions, VideoAction.values);
set videoQuickActions(List<VideoAction> 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<String>());
} else {

View file

@ -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);

View file

@ -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<Set<Package>> getPackages() async {
try {
final result = await platform.invokeMethod('getPackages');
final packages = (result as List).cast<Map>().map(Package.fromMap).toSet();
// additional info for known directories
final kakaoTalk = packages.firstWhereOrNull((package) => package.packageName == 'com.kakao.talk');
if (kakaoTalk != null) {
kakaoTalk.ownedDirs.add('KakaoTalkDownload');
}
final imagingEdge = packages.firstWhereOrNull((package) => package.packageName == 'com.sony.playmemories.mobile');
if (imagingEdge != null) {
imagingEdge.ownedDirs.add('Imaging Edge Mobile');
}
knownAppDirs.forEach((packageName, dirs) {
final package = packages.firstWhereOrNull((package) => package.packageName == packageName);
if (package != null) {
package.ownedDirs.addAll(dirs);
}
});
return packages;
} on PlatformException catch (e, stack) {
await reportService.recordError(e, stack);

View file

@ -51,7 +51,7 @@ Future<List<Map<String, String?>>> _getSuggestions(dynamic args) async {
debugPrint('getSuggestions query=$query, locale=$locale use24hour=$use24hour');
if (query is String && locale is String) {
final entries = await metadataDb.searchEntries(query, limit: 9);
final entries = await metadataDb.searchLiveEntries(query, limit: 9);
suggestions.addAll(entries.map((entry) {
final date = entry.bestDate;
return {

View file

@ -39,6 +39,7 @@ class Durations {
static const thumbnailScrollerScrollAnimation = Duration(milliseconds: 200);
static const thumbnailScrollerShadeAnimation = Duration(milliseconds: 150);
static const viewerVideoPlayerTransition = Duration(milliseconds: 500);
static const viewerActionFeedbackAnimation = Duration(milliseconds: 600);
// info animations
static const mapStyleSwitchAnimation = Duration(milliseconds: 300);
@ -62,7 +63,8 @@ class Durations {
static const doubleBackTimerDelay = Duration(milliseconds: 1000);
static const softKeyboardDisplayDelay = Duration(milliseconds: 300);
static const searchDebounceDelay = Duration(milliseconds: 250);
static const contentChangeDebounceDelay = Duration(milliseconds: 1000);
static const mediaContentChangeDebounceDelay = Duration(milliseconds: 1000);
static const viewerThumbnailScrollDebounceDelay = Duration(milliseconds: 1000);
static const mapInfoDebounceDelay = Duration(milliseconds: 150);
static const mapIdleDebounceDelay = Duration(milliseconds: 100);
}

View file

@ -72,6 +72,8 @@ class AIcons {
static const IconData layers = Icons.layers_outlined;
static const IconData map = Icons.map_outlined;
static const IconData move = MdiIcons.fileMoveOutline;
static const IconData mute = Icons.volume_off_outlined;
static const IconData unmute = Icons.volume_up_outlined;
static const IconData newTier = Icons.fiber_new_outlined;
static const IconData openOutside = Icons.open_in_new_outlined;
static const IconData pin = Icons.push_pin_outlined;

View file

@ -13,7 +13,7 @@ class AppReference extends StatefulWidget {
const AppReference({Key? key}) : super(key: key);
@override
_AppReferenceState createState() => _AppReferenceState();
State<AppReference> createState() => _AppReferenceState();
}
class _AppReferenceState extends State<AppReference> {

View file

@ -25,7 +25,7 @@ class BugReport extends StatefulWidget {
const BugReport({Key? key}) : super(key: key);
@override
_BugReportState createState() => _BugReportState();
State<BugReport> createState() => _BugReportState();
}
class _BugReportState extends State<BugReport> with FeedbackMixin {

View file

@ -1,6 +1,7 @@
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/basic/link_chip.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/viewer/info/common.dart';
import 'package:flutter/material.dart';
class AboutCredits extends StatelessWidget {
@ -12,6 +13,7 @@ class AboutCredits extends StatelessWidget {
'Español (México)': 'n-berenice',
'Português (Brasil)': 'Jonatas De Almeida Barros',
'Русский': 'D3ZOXY',
'日本語': 'Maki',
};
@override
@ -45,16 +47,14 @@ class AboutCredits extends StatelessWidget {
],
),
),
const SizedBox(height: 16),
Text(l10n.aboutCreditsTranslators),
...translators.entries.map(
(kv) {
return Padding(
padding: const EdgeInsetsDirectional.only(start: 8, top: 8),
child: Text(l10n.aboutCreditsTranslatorLine(kv.key, kv.value)),
);
},
ConstrainedBox(
constraints: const BoxConstraints(minHeight: 48),
child: Align(
alignment: AlignmentDirectional.centerStart,
child: Text(l10n.aboutCreditsTranslators, style: Constants.titleTextStyle),
),
),
const InfoRowGroup(info: translators),
const SizedBox(height: 16),
],
),

View file

@ -13,7 +13,7 @@ class Licenses extends StatefulWidget {
const Licenses({Key? key}) : super(key: key);
@override
_LicensesState createState() => _LicensesState();
State<Licenses> createState() => _LicensesState();
}
class _LicensesState extends State<Licenses> {

View file

@ -11,7 +11,7 @@ class PolicyPage extends StatefulWidget {
}) : super(key: key);
@override
_PolicyPageState createState() => _PolicyPageState();
State<PolicyPage> createState() => _PolicyPageState();
}
class _PolicyPageState extends State<PolicyPage> {

View file

@ -44,14 +44,14 @@ class AvesApp extends StatefulWidget {
}) : super(key: key);
@override
_AvesAppState createState() => _AvesAppState();
State<AvesApp> createState() => _AvesAppState();
}
class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
final ValueNotifier<AppMode> appModeNotifier = ValueNotifier(AppMode.main);
late Future<void> _appSetup;
final _mediaStoreSource = MediaStoreSource();
final Debouncer _mediaStoreChangeDebouncer = Debouncer(delay: Durations.contentChangeDebounceDelay);
final Debouncer _mediaStoreChangeDebouncer = Debouncer(delay: Durations.mediaContentChangeDebounceDelay);
final Set<String> changedUris = {};
// observers are not registered when using the same list object with different items

View file

@ -43,7 +43,7 @@ class CollectionAppBar extends StatefulWidget {
}) : super(key: key);
@override
_CollectionAppBarState createState() => _CollectionAppBarState();
State<CollectionAppBar> createState() => _CollectionAppBarState();
}
class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerProviderStateMixin {

View file

@ -50,7 +50,7 @@ class CollectionGrid extends StatefulWidget {
}) : super(key: key);
@override
_CollectionGridState createState() => _CollectionGridState();
State<CollectionGrid> createState() => _CollectionGridState();
}
class _CollectionGridState extends State<CollectionGrid> {
@ -170,7 +170,7 @@ class _CollectionSectionedContent extends StatefulWidget {
});
@override
_CollectionSectionedContentState createState() => _CollectionSectionedContentState();
State<_CollectionSectionedContent> createState() => _CollectionSectionedContentState();
}
class _CollectionSectionedContentState extends State<_CollectionSectionedContent> {
@ -291,7 +291,7 @@ class _CollectionScrollView extends StatefulWidget {
});
@override
_CollectionScrollViewState createState() => _CollectionScrollViewState();
State<_CollectionScrollView> createState() => _CollectionScrollViewState();
}
class _CollectionScrollViewState extends State<_CollectionScrollView> {

View file

@ -29,7 +29,7 @@ class CollectionPage extends StatefulWidget {
}) : super(key: key);
@override
_CollectionPageState createState() => _CollectionPageState();
State<CollectionPage> createState() => _CollectionPageState();
}
class _CollectionPageState extends State<CollectionPage> {

View file

@ -20,7 +20,7 @@ class FilterBar extends StatefulWidget {
super(key: key);
@override
_FilterBarState createState() => _FilterBarState();
State<FilterBar> createState() => _FilterBarState();
}
class _FilterBarState extends State<FilterBar> {

Some files were not shown because too many files have changed in this diff Show more