diff --git a/CHANGELOG.md b/CHANGELOG.md
index b63d076f8..8543f355d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+### Added
+
+- add and remove tags to JPEG/GIF/PNG/TIFF images
+- French translation
+
## [v1.5.6] - 2021-11-12
### Added
diff --git a/README.md b/README.md
index e86f34117..4cfec3aa7 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,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, feel free to open a PR or send the translation by [email](mailto:gallery.aves@gmail.com). You can find some localization notes in [pubspec.yaml](https://github.com/deckerst/aves/blob/develop/pubspec.yaml). English, Korean and French (soon™) are already handled.
+If you want to translate this app in your language and share the result, feel free to open a PR or send the translation by [email](mailto:gallery.aves@gmail.com). You can find some localization notes in [pubspec.yaml](https://github.com/deckerst/aves/blob/develop/pubspec.yaml). English, Korean and French are already handled.
### Donations
diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 000000000..46f2079d0
--- /dev/null
+++ b/android/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,10 @@
+
+
+ Aves
+ Recherche
+ Vidéos
+ Analyse des images
+ Analyse des images & vidéos
+ Analyse des images
+ Annuler
+
\ No newline at end of file
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index b2470baba..455fd7484 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -421,7 +421,7 @@
"removeEntryMetadataDialogMore": "More",
"@removeEntryMetadataDialogMore": {},
- "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP is required to play the video inside a motion photo. Are you sure you want to remove it?",
+ "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?",
"@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {},
"videoSpeedDialogLabel": "Playback speed",
@@ -650,6 +650,8 @@
"@drawerCollectionImages": {},
"drawerCollectionVideos": "Videos",
"@drawerCollectionVideos": {},
+ "drawerCollectionAnimated": "Animated",
+ "@drawerCollectionAnimated": {},
"drawerCollectionMotionPhotos": "Motion photos",
"@drawerCollectionMotionPhotos": {},
"drawerCollectionPanoramas": "Panoramas",
@@ -1036,6 +1038,8 @@
"@tagEditorPageNewTagFieldLabel": {},
"tagEditorPageAddTagTooltip": "Add tag",
"@tagEditorPageAddTagTooltip": {},
+ "tagEditorSectionRecent": "Recent",
+ "@tagEditorSectionRecent": {},
"panoramaEnableSensorControl": "Enable sensor control",
"@panoramaEnableSensorControl": {},
diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb
new file mode 100644
index 000000000..d853aefb4
--- /dev/null
+++ b/lib/l10n/app_fr.arb
@@ -0,0 +1,512 @@
+{
+ "appName": "Aves",
+ "welcomeMessage": "Bienvenue",
+ "welcomeOptional": "Option",
+ "welcomeTermsToggle": "J’accepte les conditions d’utilisation",
+ "itemCount": "{count, plural, =1{1 élément} other{{count} éléments}}",
+
+ "timeSeconds": "{seconds, plural, =1{1 seconde} other{{seconds} secondes}}",
+ "timeMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}",
+
+ "applyButtonLabel": "ENREGISTRER",
+ "deleteButtonLabel": "SUPPRIMER",
+ "nextButtonLabel": "SUIVANT",
+ "showButtonLabel": "AFFICHER",
+ "hideButtonLabel": "MASQUER",
+ "continueButtonLabel": "CONTINUER",
+
+ "changeTooltip": "Modifier",
+ "clearTooltip": "Effacer",
+ "previousTooltip": "Précédent",
+ "nextTooltip": "Suivant",
+ "showTooltip": "Afficher",
+ "hideTooltip": "Masquer",
+ "removeTooltip": "Supprimer",
+ "resetButtonTooltip": "Réinitialiser",
+
+ "doubleBackExitMessage": "Presser «\u00A0retour\u00A0» à nouveau pour quitter.",
+
+ "sourceStateLoading": "Chargement",
+ "sourceStateCataloguing": "Classification",
+ "sourceStateLocatingCountries": "Identification des pays",
+ "sourceStateLocatingPlaces": "Identification des lieux",
+
+ "chipActionDelete": "Supprimer",
+ "chipActionGoToAlbumPage": "Afficher dans Albums",
+ "chipActionGoToCountryPage": "Afficher dans Pays",
+ "chipActionGoToTagPage": "Afficher dans Libellés",
+ "chipActionHide": "Masquer",
+ "chipActionPin": "Épingler",
+ "chipActionUnpin": "Retirer",
+ "chipActionRename": "Renommer",
+ "chipActionSetCover": "Modifier la couverture",
+ "chipActionCreateAlbum": "Créer un album",
+
+ "entryActionCopyToClipboard": "Copier dans presse-papier",
+ "entryActionDelete": "Supprimer",
+ "entryActionExport": "Exporter",
+ "entryActionInfo": "Détails",
+ "entryActionRename": "Renommer",
+ "entryActionRotateCCW": "Pivoter à gauche",
+ "entryActionRotateCW": "Pivoter à droite",
+ "entryActionFlip": "Retourner horizontalement",
+ "entryActionPrint": "Imprimer",
+ "entryActionShare": "Partager",
+ "entryActionViewSource": "Voir le code",
+ "entryActionViewMotionPhotoVideo": "Ouvrir le clip vidéo",
+ "entryActionEdit": "Modifier avec…",
+ "entryActionOpen": "Ouvrir avec…",
+ "entryActionSetAs": "Utiliser comme…",
+ "entryActionOpenMap": "Localiser avec…",
+ "entryActionRotateScreen": "Pivoter l’écran",
+ "entryActionAddFavourite": "Ajouter aux favoris",
+ "entryActionRemoveFavourite": "Retirer des favoris",
+
+ "videoActionCaptureFrame": "Capturer l’image",
+ "videoActionPause": "Pause",
+ "videoActionPlay": "Lire",
+ "videoActionReplay10": "Reculer de 10 secondes",
+ "videoActionSkip10": "Avancer de 10 secondes",
+ "videoActionSelectStreams": "Choisir les pistes",
+ "videoActionSetSpeed": "Vitesse de lecture",
+ "videoActionSettings": "Préférences",
+
+ "entryInfoActionEditDate": "Modifier la date",
+ "entryInfoActionEditTags": "Modifier les libellés",
+ "entryInfoActionRemoveMetadata": "Retirer les métadonnées",
+
+ "filterFavouriteLabel": "Favori",
+ "filterLocationEmptyLabel": "Sans lieu",
+ "filterTagEmptyLabel": "Sans libellé",
+ "filterTypeAnimatedLabel": "Animation",
+ "filterTypeMotionPhotoLabel": "Photo animée",
+ "filterTypePanoramaLabel": "Panorama",
+ "filterTypeRawLabel": "Raw",
+ "filterTypeSphericalVideoLabel": "Vidéo à 360°",
+ "filterTypeGeotiffLabel": "GeoTIFF",
+ "filterMimeImageLabel": "Image",
+ "filterMimeVideoLabel": "Vidéo",
+
+ "coordinateFormatDms": "DMS",
+ "coordinateFormatDecimal": "Degrés décimaux",
+ "coordinateDms": "{coordinate} {direction}",
+ "coordinateDmsNorth": "N",
+ "coordinateDmsSouth": "S",
+ "coordinateDmsEast": "E",
+ "coordinateDmsWest": "O",
+
+ "unitSystemMetric": "SI",
+ "unitSystemImperial": "anglo-saxonnes",
+
+ "videoLoopModeNever": "Jamais",
+ "videoLoopModeShortOnly": "Courtes vidéos seulement",
+ "videoLoopModeAlways": "Toujours",
+
+ "mapStyleGoogleNormal": "Google Maps",
+ "mapStyleGoogleHybrid": "Google Maps (Satellite)",
+ "mapStyleGoogleTerrain": "Google Maps (Relief)",
+ "mapStyleOsmHot": "OSM Humanitaire",
+ "mapStyleStamenToner": "Stamen Toner",
+ "mapStyleStamenWatercolor": "Stamen Watercolor",
+
+ "nameConflictStrategyRename": "Renommer",
+ "nameConflictStrategyReplace": "Remplacer",
+ "nameConflictStrategySkip": "Ignorer",
+
+ "keepScreenOnNever": "Jamais",
+ "keepScreenOnViewerOnly": "Visionneuse seulement",
+ "keepScreenOnAlways": "Toujours",
+
+ "accessibilityAnimationsRemove": "Empêchez certains effets de l’écran",
+ "accessibilityAnimationsKeep": "Conserver les effets de l’écran",
+
+ "albumTierNew": "Nouveaux",
+ "albumTierPinned": "Épinglés",
+ "albumTierSpecial": "Standards",
+ "albumTierApps": "Apps",
+ "albumTierRegular": "Autres",
+
+ "storageVolumeDescriptionFallbackPrimary": "Stockage interne",
+ "storageVolumeDescriptionFallbackNonPrimary": "Carte SD",
+ "rootDirectoryDescription": "dossier racine",
+ "otherDirectoryDescription": "dossier «\u00A0{name}\u00A0»",
+ "storageAccessDialogTitle": "Accès au dossier",
+ "storageAccessDialogMessage": "Veuillez sélectionner le {directory} de «\u00A0{volume}\u00A0» à l’écran suivant, pour que l’app puisse modifier son contenu.",
+ "restrictedAccessDialogTitle": "Accès restreint",
+ "restrictedAccessDialogMessage": "Cette app ne peut pas modifier les fichiers du {directory} de «\u00A0{volume}\u00A0».\n\nVeuillez utiliser une app pré-installée pour déplacer les fichiers vers un autre dossier.",
+ "notEnoughSpaceDialogTitle": "Espace insuffisant",
+ "notEnoughSpaceDialogMessage": "Cette opération nécessite {neededSize} d’espace disponible sur «\u00A0{volume}\u00A0», mais il ne reste que {freeSize}.",
+
+ "unsupportedTypeDialogTitle": "Formats non supportés",
+ "unsupportedTypeDialogMessage": "{count, plural, =1{Cette opération n’est pas disponible pour les fichiers au format suivant : {types}.} other{Cette opération n’est pas disponible pour les fichiers aux formats suivants : {types}.}}",
+
+ "nameConflictDialogSingleSourceMessage": "Certains fichiers dans le dossier de destination ont le même nom.",
+ "nameConflictDialogMultipleSourceMessage": "Certains fichiers ont le même nom.",
+
+ "addShortcutDialogLabel": "Nom du raccourci",
+ "addShortcutButtonLabel": "AJOUTER",
+
+ "noMatchingAppDialogTitle": "App indisponible",
+ "noMatchingAppDialogMessage": "Aucune app ne peut effectuer cette opération.",
+
+ "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Voulez-vous vraiment supprimer cet élément ?} other{Voulez-vous vraiment supprimer ces {count} éléments ?}}",
+
+ "videoResumeDialogMessage": "Voulez-vous reprendre la lecture à {time} ?",
+ "videoStartOverButtonLabel": "RECOMMENCER",
+ "videoResumeButtonLabel": "REPRENDRE",
+
+ "setCoverDialogTitle": "Modifier la couverture",
+ "setCoverDialogLatest": "dernier élément",
+ "setCoverDialogCustom": "personnalisé",
+
+ "hideFilterConfirmationDialogMessage": "Les images et vidéos correspondantes n’apparaîtront plus dans votre collection. Vous pouvez les montrer à nouveau via les réglages de «\u00A0Confidentialité\u00A0».\n\nVoulez-vous vraiment les masquer ?",
+
+ "newAlbumDialogTitle": "Nouvel Album",
+ "newAlbumDialogNameLabel": "Nom de l’album",
+ "newAlbumDialogNameLabelAlreadyExistsHelper": "Le dossier existe déjà",
+ "newAlbumDialogStorageLabel": "Volume de stockage :",
+
+ "renameAlbumDialogLabel": "Nouveau nom",
+ "renameAlbumDialogLabelAlreadyExistsHelper": "Le dossier existe déjà",
+
+ "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Voulez-vous vraiment supprimer cet album et son élément ?} other{Voulez-vous vraiment supprimer cet album et ses {count} éléments ?}}",
+ "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Voulez-vous vraiment supprimer ces albums et leur élément ?} other{Voulez-vous vraiment supprimer ces albums et leurs {count} éléments ?}}",
+
+ "exportEntryDialogFormat": "Format :",
+
+ "renameEntryDialogLabel": "Nouveau nom",
+
+ "editEntryDateDialogTitle": "Date & Heure",
+ "editEntryDateDialogSet": "Régler",
+ "editEntryDateDialogShift": "Décaler",
+ "editEntryDateDialogExtractFromTitle": "Extraire du titre",
+ "editEntryDateDialogClear": "Effacer",
+ "editEntryDateDialogFieldSelection": "Champs affectés",
+ "editEntryDateDialogHours": "Heures",
+ "editEntryDateDialogMinutes": "Minutes",
+
+ "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 ?",
+
+ "videoSpeedDialogLabel": "Vitesse de lecture",
+
+ "videoStreamSelectionDialogVideo": "Vidéo",
+ "videoStreamSelectionDialogAudio": "Audio",
+ "videoStreamSelectionDialogText": "Sous-titres",
+ "videoStreamSelectionDialogOff": "Désactivé",
+ "videoStreamSelectionDialogTrack": "Piste",
+ "videoStreamSelectionDialogNoSelection": "Il n’y a pas d’autre piste.",
+
+ "genericSuccessFeedback": "Succès !",
+ "genericFailureFeedback": "Échec",
+
+ "menuActionSort": "Trier",
+ "menuActionGroup": "Grouper",
+ "menuActionSelect": "Sélectionner",
+ "menuActionSelectAll": "Tout sélectionner",
+ "menuActionSelectNone": "Tout désélectionner",
+ "menuActionMap": "Carte",
+ "menuActionStats": "Statistiques",
+
+ "aboutPageTitle": "À propos",
+ "aboutLinkSources": "Sources",
+ "aboutLinkLicense": "Licence",
+ "aboutLinkPolicy": "Politique de confidentialité",
+
+ "aboutUpdate": "Nouvelle Version",
+ "aboutUpdateLinks1": "Une nouvelle version d’Aves est disponible sur",
+ "aboutUpdateLinks2": "et",
+ "aboutUpdateLinks3": ".",
+ "aboutUpdateGitHub": "GitHub",
+ "aboutUpdateGooglePlay": "Google Play",
+
+ "aboutBug": "Rapports d’erreur",
+ "aboutBugSaveLogInstruction": "Sauvegarder les logs de l’app vers un fichier",
+ "aboutBugSaveLogButton": "Sauvegarder",
+ "aboutBugCopyInfoInstruction": "Copier les informations d’environnement",
+ "aboutBugCopyInfoButton": "Copier",
+ "aboutBugReportInstruction": "Créer une «\u00A0issue\u00A0» sur GitHub en attachant les logs et informations d’environnement",
+ "aboutBugReportButton": "Créer",
+
+ "aboutCredits": "Remerciements",
+ "aboutCreditsWorldAtlas1": "Cette app utilise un fichier TopoJSON de ",
+ "aboutCreditsWorldAtlas2": "sous licence ISC.",
+ "aboutCreditsTranslators": "Traducteurs:",
+
+ "aboutLicenses": "Licences open-source",
+ "aboutLicensesBanner": "Cette app utilise ces librairies et packages open-source.",
+ "aboutLicensesAndroidLibraries": "Librairies Android",
+ "aboutLicensesFlutterPlugins": "Plugins Flutter",
+ "aboutLicensesFlutterPackages": "Packages Flutter",
+ "aboutLicensesDartPackages": "Packages Dart",
+ "aboutLicensesShowAllButtonLabel": "Afficher toutes les licences",
+
+ "policyPageTitle": "Politique de confidentialité",
+
+ "collectionPageTitle": "Collection",
+ "collectionPickPageTitle": "Sélection",
+ "collectionSelectionPageTitle": "{count, plural, =0{Sélection} =1{1 élément} other{{count} éléments}}",
+
+ "collectionActionShowTitleSearch": "Filtrer les titres",
+ "collectionActionHideTitleSearch": "Masquer le filtre",
+ "collectionActionAddShortcut": "Créer un raccourci",
+ "collectionActionCopy": "Copier vers l’album",
+ "collectionActionMove": "Déplacer vers l’album",
+ "collectionActionRescan": "Réanalyser",
+ "collectionActionEdit": "Modifier",
+
+ "collectionSearchTitlesHintText": "Recherche de titres",
+
+ "collectionSortTitle": "Trier",
+ "collectionSortDate": "par date",
+ "collectionSortSize": "par taille",
+ "collectionSortName": "alphabétiquement",
+
+ "collectionGroupTitle": "Grouper",
+ "collectionGroupAlbum": "par album",
+ "collectionGroupMonth": "par mois",
+ "collectionGroupDay": "par jour",
+ "collectionGroupNone": "ne pas grouper",
+
+ "sectionUnknown": "Inconnu",
+ "dateToday": "Aujourd’hui",
+ "dateYesterday": "Hier",
+ "dateThisMonth": "Ce mois-ci",
+ "collectionDeleteFailureFeedback": "{count, plural, =1{Échec de la suppression d’1 élément} other{Échec de la suppression de {count} éléments}}",
+ "collectionCopyFailureFeedback": "{count, plural, =1{Échec de la copie d’1 élément} other{Échec de la copie de {count} éléments}}",
+ "collectionMoveFailureFeedback": "{count, plural, =1{Échec du déplacement d’1 élément} other{Échec du déplacement de {count} éléments}}",
+ "collectionEditFailureFeedback": "{count, plural, =1{Échec de la modification d’1 élément} other{Échec de la modification de {count} éléments}}",
+ "collectionExportFailureFeedback": "{count, plural, =1{Échec de l’export d’1 page} other{Échec de l’export de {count} pages}}",
+ "collectionCopySuccessFeedback": "{count, plural, =1{1 élément copié} other{{count} éléments copiés}}",
+ "collectionMoveSuccessFeedback": "{count, plural, =1{1 élément déplacé} other{{count} éléments déplacés}}",
+ "collectionEditSuccessFeedback": "{count, plural, =1{1 élément modifié} other{{count} éléments modifiés}}",
+
+ "collectionEmptyFavourites": "Aucun favori",
+ "collectionEmptyVideos": "Aucune vidéo",
+ "collectionEmptyImages": "Aucune image",
+
+ "collectionSelectSectionTooltip": "Sélectionner la section",
+ "collectionDeselectSectionTooltip": "Désélectionner la section",
+
+ "drawerCollectionAll": "Toute la collection",
+ "drawerCollectionFavourites": "Favoris",
+ "drawerCollectionImages": "Images",
+ "drawerCollectionVideos": "Vidéos",
+ "drawerCollectionAnimated": "Animations",
+ "drawerCollectionMotionPhotos": "Photos animées",
+ "drawerCollectionPanoramas": "Panoramas",
+ "drawerCollectionRaws": "Photos Raw",
+ "drawerCollectionSphericalVideos": "Vidéos à 360°",
+
+ "chipSortTitle": "Trier",
+ "chipSortDate": "par date",
+ "chipSortName": "par nom",
+ "chipSortCount": "par nombre d’éléments",
+
+ "albumGroupTitle": "Grouper",
+ "albumGroupTier": "par importance",
+ "albumGroupVolume": "par volume de stockage",
+ "albumGroupNone": "ne pas grouper",
+
+ "albumPickPageTitleCopy": "Copie",
+ "albumPickPageTitleExport": "Export",
+ "albumPickPageTitleMove": "Déplacement",
+ "albumPickPageTitlePick": "Sélection",
+
+ "albumCamera": "Appareil photo",
+ "albumDownload": "Téléchargements",
+ "albumScreenshots": "Captures d’écran",
+ "albumScreenRecordings": "Enregistrements d’écran",
+ "albumVideoCaptures": "Captures de vidéo",
+
+ "albumPageTitle": "Albums",
+ "albumEmpty": "Aucun album",
+ "createAlbumTooltip": "Créer un album",
+ "createAlbumButtonLabel": "CRÉER",
+ "newFilterBanner": "nouveau",
+
+ "countryPageTitle": "Pays",
+ "countryEmpty": "Aucun pays",
+
+ "tagPageTitle": "Libellés",
+ "tagEmpty": "Aucun libellé",
+
+ "searchCollectionFieldHint": "Recherche",
+ "searchSectionRecent": "Historique",
+ "searchSectionAlbums": "Albums",
+ "searchSectionCountries": "Pays",
+ "searchSectionPlaces": "Lieux",
+ "searchSectionTags": "Libellés",
+
+ "settingsPageTitle": "Réglages",
+ "settingsSystemDefault": "Système",
+ "settingsDefault": "Par défaut",
+
+ "settingsActionExport": "Exporter",
+ "settingsActionImport": "Importer",
+
+ "settingsSectionNavigation": "Navigation",
+ "settingsHome": "Page d’accueil",
+ "settingsKeepScreenOnTile": "Maintenir l’écran allumé",
+ "settingsKeepScreenOnTitle": "Allumage de l’écran",
+ "settingsDoubleBackExit": "Presser «\u00A0retour\u00A0» 2 fois pour quitter",
+
+ "settingsNavigationDrawerTile": "Menu de navigation",
+ "settingsNavigationDrawerEditorTitle": "Menu de navigation",
+ "settingsNavigationDrawerBanner": "Maintenez votre doigt appuyé pour déplacer et réorganiser les éléments de menu.",
+ "settingsNavigationDrawerTabTypes": "Types",
+ "settingsNavigationDrawerTabAlbums": "Albums",
+ "settingsNavigationDrawerTabPages": "Pages",
+ "settingsNavigationDrawerAddAlbum": "Ajouter un album",
+
+ "settingsSectionThumbnails": "Vignettes",
+ "settingsThumbnailShowLocationIcon": "Afficher l’icône de lieu",
+ "settingsThumbnailShowMotionPhotoIcon": "Afficher l’icône de photo animée",
+ "settingsThumbnailShowRawIcon": "Afficher l’icône de photo raw",
+ "settingsThumbnailShowVideoDuration": "Afficher la durée de la vidéo",
+
+ "settingsCollectionQuickActionsTile": "Actions rapides",
+ "settingsCollectionQuickActionEditorTitle": "Actions rapides",
+ "settingsCollectionQuickActionTabBrowsing": "Navigation",
+ "settingsCollectionQuickActionTabSelecting": "Sélection",
+ "settingsCollectionBrowsingQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la navigation.",
+ "settingsCollectionSelectionQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la sélection d’éléments.",
+
+ "settingsSectionViewer": "Visionneuse",
+ "settingsViewerShowOverlayOnOpening": "Afficher les incrustations à l’ouverture",
+ "settingsViewerShowMinimap": "Afficher la mini-carte",
+ "settingsViewerShowInformation": "Afficher les détails",
+ "settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.",
+ "settingsViewerShowShootingDetails": "Afficher les détails de prise de vue",
+ "settingsViewerEnableOverlayBlurEffect": "Effets de flou des incrustations",
+ "settingsViewerUseCutout": "Utiliser la zone d’encoche",
+ "settingsImageBackground": "Arrière-plan de l’image",
+
+ "settingsViewerQuickActionsTile": "Actions rapides",
+ "settingsViewerQuickActionEditorTitle": "Actions rapides",
+ "settingsViewerQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées sur la visionneuse.",
+ "settingsViewerQuickActionEditorDisplayedButtons": "Boutons affichés",
+ "settingsViewerQuickActionEditorAvailableButtons": "Boutons disponibles",
+ "settingsViewerQuickActionEmpty": "Aucun bouton",
+
+ "settingsVideoPageTitle": "Réglages vidéo",
+ "settingsSectionVideo": "Vidéo",
+ "settingsVideoShowVideos": "Afficher les vidéos",
+ "settingsVideoEnableHardwareAcceleration": "Accélération matérielle",
+ "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",
+ "settingsSubtitleThemeSample": "Ceci est un exemple.",
+ "settingsSubtitleThemeTextAlignmentTile": "Alignement du texte",
+ "settingsSubtitleThemeTextAlignmentTitle": "Alignement du texte",
+ "settingsSubtitleThemeTextSize": "Taille du texte",
+ "settingsSubtitleThemeShowOutline": "Afficher les contours et ombres",
+ "settingsSubtitleThemeTextColor": "Couleur du texte",
+ "settingsSubtitleThemeTextOpacity": "Transparence du texte",
+ "settingsSubtitleThemeBackgroundColor": "Couleur d’arrière-plan",
+ "settingsSubtitleThemeBackgroundOpacity": "Transparence de l’arrière-plan",
+ "settingsSubtitleThemeTextAlignmentLeft": "gauche",
+ "settingsSubtitleThemeTextAlignmentCenter": "centré",
+ "settingsSubtitleThemeTextAlignmentRight": "droite",
+
+ "settingsSectionPrivacy": "Confidentialité",
+ "settingsAllowInstalledAppAccess": "Autoriser l’accès à l’inventaire des apps",
+ "settingsAllowInstalledAppAccessSubtitle": "Pour un affichage amélioré des albums",
+ "settingsAllowErrorReporting": "Autoriser l’envoi de rapports d’erreur",
+ "settingsSaveSearchHistory": "Maintenir un historique des recherches",
+
+ "settingsHiddenFiltersTile": "Filtres masqués",
+ "settingsHiddenFiltersTitle": "Filtres masqués",
+ "settingsHiddenFiltersBanner": "Les images et vidéos correspondantes aux filtres masqués n’apparaîtront pas dans votre collection.",
+ "settingsHiddenFiltersEmpty": "Aucun filtre masqué",
+
+ "settingsHiddenPathsTile": "Chemins masqués",
+ "settingsHiddenPathsTitle": "Chemins masqués",
+ "settingsHiddenPathsBanner": "Les images et vidéos dans ces dossiers, ou leurs sous-dossiers, n’apparaîtront pas dans votre collection.",
+ "settingsHiddenPathsEmpty": "Aucun chemin masqué",
+ "addPathTooltip": "Ajouter un chemin",
+
+ "settingsStorageAccessTile": "Accès au stockage",
+ "settingsStorageAccessTitle": "Accès au stockage",
+ "settingsStorageAccessBanner": "Une autorisation d’accès au stockage est nécessaire pour modifier le contenu de certains dossiers. Voici la liste des autorisations couramment en vigueur.",
+ "settingsStorageAccessEmpty": "Aucune autorisation d’accès",
+ "settingsStorageAccessRevokeTooltip": "Retirer",
+
+ "settingsSectionAccessibility": "Accessibilité",
+ "settingsRemoveAnimationsTile": "Suppression des animations",
+ "settingsRemoveAnimationsTitle": "Suppression des animations",
+ "settingsTimeToTakeActionTile": "Délai pour effectuer une action",
+ "settingsTimeToTakeActionTitle": "Délai pour effectuer une action",
+
+ "settingsSectionLanguage": "Langue & Formats",
+ "settingsLanguage": "Langue",
+ "settingsCoordinateFormatTile": "Format de coordonnées",
+ "settingsCoordinateFormatTitle": "Format de coordonnées",
+ "settingsUnitSystemTile": "Unités",
+ "settingsUnitSystemTitle": "Unités",
+
+ "statsPageTitle": "Statistiques",
+ "statsWithGps": "{count, plural, =1{1 élément localisé} other{{count} éléments localisés}}",
+ "statsTopCountries": "Top pays",
+ "statsTopPlaces": "Top lieux",
+ "statsTopTags": "Top libellés",
+
+ "viewerOpenPanoramaButtonLabel": "OUVRIR LE PANORAMA",
+ "viewerErrorUnknown": "Zut !",
+ "viewerErrorDoesNotExist": "Le fichier n’existe plus.",
+
+ "viewerInfoPageTitle": "Détails",
+ "viewerInfoBackToViewerTooltip": "Retour à la visionneuse",
+
+ "viewerInfoUnknown": "inconnu",
+ "viewerInfoLabelTitle": "Titre",
+ "viewerInfoLabelDate": "Date",
+ "viewerInfoLabelResolution": "Résolution",
+ "viewerInfoLabelSize": "Taille",
+ "viewerInfoLabelUri": "URI",
+ "viewerInfoLabelPath": "Chemin",
+ "viewerInfoLabelDuration": "Durée",
+ "viewerInfoLabelOwner": "Propriétaire",
+ "viewerInfoLabelCoordinates": "Coordonnées",
+ "viewerInfoLabelAddress": "Adresse",
+
+ "mapStyleTitle": "Type de carte",
+ "mapStyleTooltip": "Sélectionner le type de carte",
+ "mapZoomInTooltip": "Zoomer",
+ "mapZoomOutTooltip": "Dézoomer",
+ "mapPointNorthUpTooltip": "Placer le nord en haut",
+ "mapAttributionOsmHot": "Données © les contributeurs d’[OpenStreetMap](https://www.openstreetmap.org/copyright) • Fond de carte par [HOT](https://www.hotosm.org/) • Hébergé par [OSM France](https://openstreetmap.fr/)",
+ "mapAttributionStamen": "Données © les contributeurs d’[OpenStreetMap](https://www.openstreetmap.org/copyright) • Fond de carte par [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)",
+ "openMapPageTooltip": "Ouvrir la page Carte",
+ "mapEmptyRegion": "Aucune image dans cette région",
+
+ "viewerInfoOpenEmbeddedFailureFeedback": "Échec de l’extraction des données",
+ "viewerInfoOpenLinkText": "Ouvrir",
+ "viewerInfoViewXmlLinkText": "Afficher le XML",
+
+ "viewerInfoSearchFieldLabel": "Recherche de métadonnées",
+ "viewerInfoSearchEmpty": "Aucune clé correspondante",
+ "viewerInfoSearchSuggestionDate": "Date & heure",
+ "viewerInfoSearchSuggestionDescription": "Description",
+ "viewerInfoSearchSuggestionDimensions": "Dimensions",
+ "viewerInfoSearchSuggestionResolution": "Résolution",
+ "viewerInfoSearchSuggestionRights": "Droits",
+
+ "tagEditorPageTitle": "Modifier les libellés",
+ "tagEditorPageNewTagFieldLabel": "Nouveau libellé",
+ "tagEditorPageAddTagTooltip": "Ajouter le libellé",
+ "tagEditorSectionRecent": "Ajouts récents",
+
+ "panoramaEnableSensorControl": "Activer le contrôle par capteurs",
+ "panoramaDisableSensorControl": "Désactiver le contrôle par capteurs",
+
+ "sourceViewerPageTitle": "Code source",
+ "@sourceViewerPageTitle": {}
+}
diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb
index 296bdac15..b39d70a9d 100644
--- a/lib/l10n/app_ko.arb
+++ b/lib/l10n/app_ko.arb
@@ -186,7 +186,7 @@
"removeEntryMetadataDialogTitle": "메타데이터 삭제",
"removeEntryMetadataDialogMore": "더 보기",
- "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP가 있어야 모션 포토에 포함되는 동영상을 재생할 수 있습니다. 삭제하시겠습니까?",
+ "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP가 있어야 모션 포토에 포함되는 동영상을 재생할 수 있습니다.\n\n삭제하시겠습니까?",
"videoSpeedDialogLabel": "재생 배속",
@@ -292,6 +292,7 @@
"drawerCollectionFavourites": "즐겨찾기",
"drawerCollectionImages": "사진",
"drawerCollectionVideos": "동영상",
+ "drawerCollectionAnimated": "애니메이션",
"drawerCollectionMotionPhotos": "모션 포토",
"drawerCollectionPanoramas": "파노라마",
"drawerCollectionRaws": "Raw 이미지",
@@ -496,6 +497,8 @@
"viewerInfoSearchSuggestionResolution": "해상도",
"viewerInfoSearchSuggestionRights": "권리",
+ "tagEditorSectionRecent": "최근 이용기록",
+
"panoramaEnableSensorControl": "센서 제어 활성화",
"panoramaDisableSensorControl": "센서 제어 비활성화",
diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb
index 1dbbe07f0..aee4bd4c0 100644
--- a/lib/l10n/app_ru.arb
+++ b/lib/l10n/app_ru.arb
@@ -186,7 +186,7 @@
"removeEntryMetadataDialogTitle": "Удаление метаданных",
"removeEntryMetadataDialogMore": "Дополнительно",
- "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Для воспроизведения видео внутри этой живой фотографии требуется XMP профиль. Вы уверены, что хотите удалить его?",
+ "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Для воспроизведения видео внутри этой живой фотографии требуется XMP профиль.\n\nВы уверены, что хотите удалить его?",
"videoSpeedDialogLabel": "Скорость воспроизведения",
@@ -292,6 +292,7 @@
"drawerCollectionFavourites": "Избранное",
"drawerCollectionImages": "Изображения",
"drawerCollectionVideos": "Видео",
+ "drawerCollectionAnimated": "GIF",
"drawerCollectionMotionPhotos": "Живые фото",
"drawerCollectionPanoramas": "Панорамы",
"drawerCollectionRaws": "RAW",
@@ -496,6 +497,8 @@
"viewerInfoSearchSuggestionResolution": "Разрешение",
"viewerInfoSearchSuggestionRights": "Права",
+ "tagEditorSectionRecent": "Недавние",
+
"panoramaEnableSensorControl": "Включить сенсорное управление",
"panoramaDisableSensorControl": "Отключить сенсорное управление",
diff --git a/lib/widgets/collection/grid/headers/date.dart b/lib/widgets/collection/grid/headers/date.dart
index 2670b1acf..adc11af73 100644
--- a/lib/widgets/collection/grid/headers/date.dart
+++ b/lib/widgets/collection/grid/headers/date.dart
@@ -65,8 +65,8 @@ class MonthSectionHeader extends StatelessWidget {
if (date == null) return l10n.sectionUnknown;
if (date.isThisMonth) return l10n.dateThisMonth;
final locale = l10n.localeName;
- if (date.isThisYear) return DateFormat.MMMM(locale).format(date);
- return DateFormat.yMMMM(locale).format(date);
+ final localized = date.isThisYear? DateFormat.MMMM(locale).format(date) : DateFormat.yMMMM(locale).format(date);
+ return '${localized.substring(0, 1).toUpperCase()}${localized.substring(1)}';
}
@override
diff --git a/lib/widgets/dialogs/entry_editors/edit_entry_tags_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_entry_tags_dialog.dart
index 9d44106c1..dac59b386 100644
--- a/lib/widgets/dialogs/entry_editors/edit_entry_tags_dialog.dart
+++ b/lib/widgets/dialogs/entry_editors/edit_entry_tags_dialog.dart
@@ -156,7 +156,7 @@ class _TagEditorPageState extends State {
),
const Divider(height: 1),
_FilterRow(
- title: l10n.searchSectionRecent,
+ title: l10n.tagEditorSectionRecent,
filters: recentFilters,
expandedNotifier: _expandedSectionNotifier,
onTap: _addTag,
diff --git a/lib/widgets/drawer/tile.dart b/lib/widgets/drawer/tile.dart
index 54daa7fea..715ddd76b 100644
--- a/lib/widgets/drawer/tile.dart
+++ b/lib/widgets/drawer/tile.dart
@@ -46,6 +46,7 @@ class DrawerFilterTitle extends StatelessWidget {
if (filter == FavouriteFilter.instance) return l10n.drawerCollectionFavourites;
if (filter == MimeFilter.image) return l10n.drawerCollectionImages;
if (filter == MimeFilter.video) return l10n.drawerCollectionVideos;
+ if (filter == TypeFilter.animated) return l10n.drawerCollectionAnimated;
if (filter == TypeFilter.motionPhoto) return l10n.drawerCollectionMotionPhotos;
if (filter == TypeFilter.panorama) return l10n.drawerCollectionPanoramas;
if (filter == TypeFilter.raw) return l10n.drawerCollectionRaws;
diff --git a/lib/widgets/settings/language/locale.dart b/lib/widgets/settings/language/locale.dart
index 18526966e..701956a39 100644
--- a/lib/widgets/settings/language/locale.dart
+++ b/lib/widgets/settings/language/locale.dart
@@ -44,6 +44,8 @@ class LocaleTile extends StatelessWidget {
switch (locale.languageCode) {
case 'en':
return 'English';
+ case 'fr':
+ return 'Français';
case 'ko':
return '한국어';
case 'ru':