Merge branch 'develop'
2
.github/workflows/check.yml
vendored
|
@ -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
|
||||
|
|
8
.github/workflows/release.yml
vendored
|
@ -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:
|
||||
|
|
20
CHANGELOG.md
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 =
|
||||
|
|
10
android/app/src/main/res/values-ja/strings.xml
Normal 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>
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 277 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 495 KiB |
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 208 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 366 KiB After Width: | Height: | Size: 366 KiB |
5
fastlane/metadata/android/en-US/changelogs/1068.txt
Normal 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
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 277 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 495 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 367 KiB After Width: | Height: | Size: 367 KiB |
Before Width: | Height: | Size: 277 KiB After Width: | Height: | Size: 279 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 495 KiB |
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 212 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 366 KiB After Width: | Height: | Size: 366 KiB |
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 277 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 495 KiB |
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 366 KiB After Width: | Height: | Size: 366 KiB |
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 276 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 495 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 370 KiB After Width: | Height: | Size: 366 KiB |
BIN
fastlane/metadata/android/ja/images/featureGraphics.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
fastlane/metadata/android/ja/images/phoneScreenshots/1.png
Normal file
After Width: | Height: | Size: 277 KiB |
BIN
fastlane/metadata/android/ja/images/phoneScreenshots/2.png
Normal file
After Width: | Height: | Size: 494 KiB |
BIN
fastlane/metadata/android/ja/images/phoneScreenshots/3.png
Normal file
After Width: | Height: | Size: 208 KiB |
BIN
fastlane/metadata/android/ja/images/phoneScreenshots/4.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
fastlane/metadata/android/ja/images/phoneScreenshots/5.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
fastlane/metadata/android/ja/images/phoneScreenshots/6.png
Normal file
After Width: | Height: | Size: 365 KiB |
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 274 KiB |
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 496 KiB |
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 365 KiB After Width: | Height: | Size: 365 KiB |
Before Width: | Height: | Size: 277 KiB After Width: | Height: | Size: 277 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 496 KiB |
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 366 KiB After Width: | Height: | Size: 366 KiB |
Before Width: | Height: | Size: 276 KiB After Width: | Height: | Size: 276 KiB |
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 495 KiB |
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 214 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 366 KiB After Width: | Height: | Size: 366 KiB |
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
@ -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": "このフォルダを使用"
|
||||
}
|
|
@ -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": "앨범 표시 개선을 위해",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "Используется для улучшения отображения альбомов",
|
||||
|
|
|
@ -23,9 +23,7 @@ extension ExtraChipAction on ChipAction {
|
|||
}
|
||||
}
|
||||
|
||||
Widget getIcon() {
|
||||
return Icon(_getIconData());
|
||||
}
|
||||
Widget getIcon() => Icon(_getIconData());
|
||||
|
||||
IconData _getIconData() {
|
||||
switch (this) {
|
||||
|
|
|
@ -90,9 +90,7 @@ extension ExtraChipSetAction on ChipSetAction {
|
|||
}
|
||||
}
|
||||
|
||||
Widget getIcon() {
|
||||
return Icon(_getIconData());
|
||||
}
|
||||
Widget getIcon() => Icon(_getIconData());
|
||||
|
||||
IconData _getIconData() {
|
||||
switch (this) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -159,9 +159,7 @@ extension ExtraEntrySetAction on EntrySetAction {
|
|||
}
|
||||
}
|
||||
|
||||
Widget getIcon() {
|
||||
return Icon(_getIconData());
|
||||
}
|
||||
Widget getIcon() => Icon(_getIconData());
|
||||
|
||||
IconData _getIconData() {
|
||||
switch (this) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -18,3 +18,5 @@ enum KeepScreenOn { never, viewerOnly, always }
|
|||
enum UnitSystem { metric, imperial }
|
||||
|
||||
enum VideoLoopMode { never, shortOnly, always }
|
||||
|
||||
enum VideoControls { play, playSeek, playOutside, none }
|
||||
|
|
19
lib/model/settings/enums/video_controls.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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),
|
||||
],
|
||||
),
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -11,7 +11,7 @@ class PolicyPage extends StatefulWidget {
|
|||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_PolicyPageState createState() => _PolicyPageState();
|
||||
State<PolicyPage> createState() => _PolicyPageState();
|
||||
}
|
||||
|
||||
class _PolicyPageState extends State<PolicyPage> {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -29,7 +29,7 @@ class CollectionPage extends StatefulWidget {
|
|||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CollectionPageState createState() => _CollectionPageState();
|
||||
State<CollectionPage> createState() => _CollectionPageState();
|
||||
}
|
||||
|
||||
class _CollectionPageState extends State<CollectionPage> {
|
||||
|
|
|
@ -20,7 +20,7 @@ class FilterBar extends StatefulWidget {
|
|||
super(key: key);
|
||||
|
||||
@override
|
||||
_FilterBarState createState() => _FilterBarState();
|
||||
State<FilterBar> createState() => _FilterBarState();
|
||||
}
|
||||
|
||||
class _FilterBarState extends State<FilterBar> {
|
||||
|
|