From e809e8df4866a4a7bb1303324e20df0a13067ac9 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 16 Dec 2022 13:05:48 +0100 Subject: [PATCH] accessibility: optional alternative to pinch-to-zoom thumbnails --- CHANGELOG.md | 1 + lib/l10n/app_en.arb | 7 ++ lib/model/settings/defaults.dart | 1 + lib/model/settings/settings.dart | 7 ++ lib/theme/icons.dart | 2 + lib/widgets/collection/app_bar.dart | 3 + .../common/tile_extent_controller.dart | 5 ++ lib/widgets/dialogs/tile_view_dialog.dart | 41 +++++++++- .../common/action_delegates/album_set.dart | 3 + .../common/action_delegates/chip_set.dart | 3 + .../settings/accessibility/accessibility.dart | 14 ++++ .../settings/navigation/navigation.dart | 4 +- untranslated.json | 80 +++++++++++++++++-- 13 files changed, 161 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 563a0266b..95cc21808 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Viewer: long press on share quick action to share parts of motion photo - Search: missing address, portrait, landscape filters - Map: edit cluster location +- Accessibility: optional alternative to pinch-to-zoom thumbnails - Lithuanian translation (thanks Gediminas Murauskas) - Norsk (Bokmål) translation (thanks Allan Nordhøy) - Chinese (Traditional) translation (thanks pemibe) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 1fb20fa0f..d07023bad 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -9,6 +9,12 @@ "count": {} } }, + "columnCount": "{count, plural, =1{1 column} other{{count} columns}}", + "@columnCount": { + "placeholders": { + "count": {} + } + }, "timeSeconds": "{seconds, plural, =1{1 second} other{{seconds} seconds}}", "@timeSeconds": { @@ -800,6 +806,7 @@ "settingsRemoveAnimationsTile": "Remove animations", "settingsRemoveAnimationsDialogTitle": "Remove Animations", "settingsTimeToTakeActionTile": "Time to take action", + "settingsAccessibilityShowPinchGestureAlternatives": "Show pinch gesture alternatives", "settingsDisplaySectionTitle": "Display", "settingsThemeBrightnessTile": "Theme", diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index f8879a9ec..db0c59c8d 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -123,6 +123,7 @@ class SettingsDefaults { static const enableBin = true; // accessibility + static const showPinchGestureAlternatives = false; static const accessibilityAnimations = AccessibilityAnimations.system; static const timeToTakeAction = AccessibilityTimeout.s3; diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 68fa968b1..f49a55362 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -163,6 +163,7 @@ class Settings extends ChangeNotifier { static const enableBinKey = 'enable_bin'; // accessibility + static const showPinchGestureAlternativesKey = 'show_pinch_gesture_alternatives'; static const accessibilityAnimationsKey = 'accessibility_animations'; static const timeToTakeActionKey = 'time_to_take_action'; @@ -266,6 +267,7 @@ class Settings extends ChangeNotifier { videoGestureDoubleTapTogglePlay = false; videoGestureSideDoubleTapSeek = false; enableBin = false; + showPinchGestureAlternatives = true; } } @@ -707,6 +709,10 @@ class Settings extends ChangeNotifier { // accessibility + bool get showPinchGestureAlternatives => getBool(showPinchGestureAlternativesKey) ?? SettingsDefaults.showPinchGestureAlternatives; + + set showPinchGestureAlternatives(bool newValue) => setAndNotify(showPinchGestureAlternativesKey, newValue); + AccessibilityAnimations get accessibilityAnimations => getEnumOrDefault(accessibilityAnimationsKey, SettingsDefaults.accessibilityAnimations, AccessibilityAnimations.values); set accessibilityAnimations(AccessibilityAnimations newValue) => setAndNotify(accessibilityAnimationsKey, newValue.toString()); @@ -1010,6 +1016,7 @@ class Settings extends ChangeNotifier { case subtitleShowOutlineKey: case tagEditorCurrentFilterSectionExpandedKey: case saveSearchHistoryKey: + case showPinchGestureAlternativesKey: case filePickerShowHiddenFilesKey: case screenSaverFillScreenKey: case screenSaverAnimatedZoomEffectKey: diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart index 860ed66dd..50185d2b2 100644 --- a/lib/theme/icons.dart +++ b/lib/theme/icons.dart @@ -61,6 +61,8 @@ class AIcons { static const IconData layoutList = Icons.list_outlined; static const IconData sort = Icons.sort_outlined; static const IconData sortOrder = Icons.swap_vert_outlined; + static const IconData thumbnailLarge = Icons.photo_size_select_large_outlined; + static const IconData thumbnailSmall = Icons.photo_size_select_small_outlined; // actions static const IconData add = Icons.add_circle_outline; diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 3d2fbeaad..a76e63f95 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -30,6 +30,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_app_bar.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; import 'package:aves/widgets/dialogs/tile_view_dialog.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart'; import 'package:aves/widgets/search/search_delegate.dart'; @@ -638,6 +639,7 @@ class _CollectionAppBarState extends State with SingleTickerPr settings.getTileLayout(CollectionPage.routeName), settings.collectionSortReverse, ); + final extentController = context.read(); final value = await showDialog>( context: context, builder: (context) { @@ -648,6 +650,7 @@ class _CollectionAppBarState extends State with SingleTickerPr layoutOptions: _layoutOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), sortOrder: (factor, reverse) => factor.getOrderName(context, reverse), canGroup: (s, g, l) => s == EntrySortFactor.date, + tileExtentController: extentController, ); }, ); diff --git a/lib/widgets/common/tile_extent_controller.dart b/lib/widgets/common/tile_extent_controller.dart index 71e9e277e..e32d8662d 100644 --- a/lib/widgets/common/tile_extent_controller.dart +++ b/lib/widgets/common/tile_extent_controller.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:aves/model/settings/settings.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/widgets.dart'; +import 'package:tuple/tuple.dart'; class TileExtentController { final String settingsRouteKey; @@ -52,6 +53,8 @@ class TileExtentController { } } + double setUserPreferredColumnCount(int columnCount) => _update(userPreferredExtent: _extentForColumnCount(columnCount)); + double setUserPreferredExtent(double extent) => _update(userPreferredExtent: extent.roundToDouble()); double _update({double? userPreferredExtent}) { @@ -95,6 +98,8 @@ class TileExtentController { double get effectiveExtentMax => _extentForColumnCount(_effectiveColumnCountMin()); + Tuple2 get effectiveColumnRange => Tuple2(_effectiveColumnCountMin(), _effectiveColumnCountMax()); + int get columnCount => _effectiveColumnCountForExtent(extentNotifier.value); Duration getTileAnimationDelay(Duration pageTarget) { diff --git a/lib/widgets/dialogs/tile_view_dialog.dart b/lib/widgets/dialogs/tile_view_dialog.dart index d7c577385..9e0386225 100644 --- a/lib/widgets/dialogs/tile_view_dialog.dart +++ b/lib/widgets/dialogs/tile_view_dialog.dart @@ -1,3 +1,4 @@ +import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; @@ -5,6 +6,7 @@ import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_caption.dart'; import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; @@ -17,6 +19,7 @@ class TileViewDialog extends StatefulWidget { final List> groupOptions; final List> layoutOptions; final String Function(S sort, bool reverse) sortOrder; + final TileExtentController tileExtentController; final bool Function(S? sort, G? group, L? layout)? canGroup; const TileViewDialog({ @@ -27,6 +30,7 @@ class TileViewDialog extends StatefulWidget { this.layoutOptions = const [], required this.sortOrder, this.canGroup, + required this.tileExtentController, }); @override @@ -38,6 +42,8 @@ class _TileViewDialogState extends State> with late G? _selectedGroup; late L? _selectedLayout; late bool _reverseSort; + late int _columnMin, _columnMax; + late final ValueNotifier _columnCountNotifier = ValueNotifier(tileExtentController.columnCount); List> get sortOptions => widget.sortOptions; @@ -45,6 +51,8 @@ class _TileViewDialogState extends State> with List> get layoutOptions => widget.layoutOptions; + TileExtentController get tileExtentController => widget.tileExtentController; + bool get canGroup => (widget.canGroup ?? (s, g, l) => true).call(_selectedSort, _selectedGroup, _selectedLayout); @override @@ -55,6 +63,11 @@ class _TileViewDialogState extends State> with _selectedGroup = initialValue.item2; _selectedLayout = initialValue.item3; _reverseSort = initialValue.item4; + + final extentController = tileExtentController; + final columnRange = extentController.effectiveColumnRange; + _columnMin = columnRange.item1; + _columnMax = columnRange.item2; } @override @@ -107,6 +120,29 @@ class _TileViewDialogState extends State> with value: _selectedLayout, onChanged: (v) => _selectedLayout = v, ), + if (settings.showPinchGestureAlternatives) + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + children: [ + const Icon(AIcons.thumbnailLarge), + Expanded( + child: ValueListenableBuilder( + valueListenable: _columnCountNotifier, + builder: (context, columnCount, child) => Slider( + label: context.l10n.columnCount(columnCount), + value: columnCount.toDouble(), + onChanged: (v) => _columnCountNotifier.value = v.round(), + min: _columnMin.toDouble(), + max: _columnMax.toDouble(), + divisions: (_columnMax - _columnMin), + ), + ), + ), + const Icon(AIcons.thumbnailSmall), + ], + ), + ), ], actions: [ TextButton( @@ -115,7 +151,10 @@ class _TileViewDialogState extends State> with ), TextButton( key: const Key('button-apply'), - onPressed: () => Navigator.pop(context, Tuple4(_selectedSort, _selectedGroup, _selectedLayout, _reverseSort)), + onPressed: () { + tileExtentController.setUserPreferredColumnCount(_columnCountNotifier.value); + Navigator.pop(context, Tuple4(_selectedSort, _selectedGroup, _selectedLayout, _reverseSort)); + }, child: Text(l10n.applyButtonLabel), ) ], diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart index 86a629abe..25cc2a85d 100644 --- a/lib/widgets/filter_grids/common/action_delegates/album_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -20,6 +20,7 @@ import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/action_mixins/entry_storage.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart'; import 'package:aves/widgets/dialogs/filter_editors/rename_album_dialog.dart'; @@ -146,6 +147,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with tileLayout, sortReverse, ); + final extentController = context.read(); final value = await showDialog>( context: context, builder: (context) { @@ -155,6 +157,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with groupOptions: _groupOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), layoutOptions: ChipSetActionDelegate.layoutOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), sortOrder: (factor, reverse) => factor.getOrderName(context, reverse), + tileExtentController: extentController, ); }, ); diff --git a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart index d6341bac1..e095ccb7f 100644 --- a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart @@ -19,6 +19,7 @@ import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/filter_editors/cover_selection_dialog.dart'; import 'package:aves/widgets/dialogs/tile_view_dialog.dart'; @@ -220,6 +221,7 @@ abstract class ChipSetActionDelegate with FeedbackMi tileLayout, sortReverse, ); + final extentController = context.read(); final value = await showDialog>( context: context, builder: (context) { @@ -228,6 +230,7 @@ abstract class ChipSetActionDelegate with FeedbackMi sortOptions: sortOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), layoutOptions: layoutOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), sortOrder: (factor, reverse) => factor.getOrderName(context, reverse), + tileExtentController: extentController, ); }, ); diff --git a/lib/widgets/settings/accessibility/accessibility.dart b/lib/widgets/settings/accessibility/accessibility.dart index 74f2c9f52..6f90eb815 100644 --- a/lib/widgets/settings/accessibility/accessibility.dart +++ b/lib/widgets/settings/accessibility/accessibility.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:aves/model/device.dart'; import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; @@ -28,11 +29,24 @@ class AccessibilitySection extends SettingsSection { @override FutureOr> tiles(BuildContext context) => [ + if (!device.isTelevision) SettingsTileAccessibilityShowPinchGestureAlternatives(), SettingsTileAccessibilityAnimations(), SettingsTileAccessibilityTimeToTakeAction(), ]; } +class SettingsTileAccessibilityShowPinchGestureAlternatives extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsAccessibilityShowPinchGestureAlternatives; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.showPinchGestureAlternatives, + onChanged: (v) => settings.showPinchGestureAlternatives = v, + title: title(context), + ); +} + class SettingsTileAccessibilityAnimations extends SettingsTile { @override String title(BuildContext context) => context.l10n.settingsRemoveAnimationsTile; diff --git a/lib/widgets/settings/navigation/navigation.dart b/lib/widgets/settings/navigation/navigation.dart index d77016d25..4b756171f 100644 --- a/lib/widgets/settings/navigation/navigation.dart +++ b/lib/widgets/settings/navigation/navigation.dart @@ -32,11 +32,11 @@ class NavigationSection extends SettingsSection { @override FutureOr> tiles(BuildContext context) => [ SettingsTileNavigationHomePage(), + if (!device.isTelevision) SettingsTileNavigationKeepScreenOn(), if (!device.isTelevision) SettingsTileShowBottomNavigationBar(), + if (!device.isTelevision) SettingsTileNavigationDoubleBackExit(), SettingsTileNavigationDrawer(), if (!device.isTelevision) SettingsTileNavigationConfirmationDialog(), - if (!device.isTelevision) SettingsTileNavigationKeepScreenOn(), - if (!device.isTelevision) SettingsTileNavigationDoubleBackExit(), ]; } diff --git a/untranslated.json b/untranslated.json index 00453ca3b..d8972359d 100644 --- a/untranslated.json +++ b/untranslated.json @@ -5,6 +5,7 @@ "welcomeOptional", "welcomeTermsToggle", "itemCount", + "columnCount", "timeSeconds", "timeMinutes", "timeDays", @@ -516,6 +517,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -588,7 +590,13 @@ "filePickerUseThisFolder" ], + "de": [ + "columnCount", + "settingsAccessibilityShowPinchGestureAlternatives" + ], + "el": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionRemoveLocation", @@ -596,10 +604,17 @@ "filterAspectRatioPortraitLabel", "filterNoAddressLabel", "keepScreenOnVideoPlayback", - "settingsViewerShowRatingTags" + "settingsViewerShowRatingTags", + "settingsAccessibilityShowPinchGestureAlternatives" + ], + + "es": [ + "columnCount", + "settingsAccessibilityShowPinchGestureAlternatives" ], "fa": [ + "columnCount", "clearTooltip", "entryActionCopyToClipboard", "entryActionShowGeoTiffOnMap", @@ -982,6 +997,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -1061,7 +1077,13 @@ "filePickerUseThisFolder" ], + "fr": [ + "columnCount", + "settingsAccessibilityShowPinchGestureAlternatives" + ], + "gl": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionExportMetadata", @@ -1445,6 +1467,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -1527,6 +1550,7 @@ ], "id": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionExportMetadata", @@ -1542,10 +1566,12 @@ "settingsViewerShowRatingTags", "settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionDialogTitle", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsWidgetDisplayedItem" ], "it": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionRemoveLocation", @@ -1553,10 +1579,12 @@ "filterAspectRatioPortraitLabel", "filterNoAddressLabel", "keepScreenOnVideoPlayback", - "settingsViewerShowRatingTags" + "settingsViewerShowRatingTags", + "settingsAccessibilityShowPinchGestureAlternatives" ], "ja": [ + "columnCount", "chipActionFilterIn", "filterAspectRatioLandscapeLabel", "filterAspectRatioPortraitLabel", @@ -1564,21 +1592,32 @@ "keepScreenOnVideoPlayback", "subtitlePositionTop", "subtitlePositionBottom", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsWidgetDisplayedItem" ], + "ko": [ + "columnCount", + "settingsAccessibilityShowPinchGestureAlternatives" + ], + "lt": [ - "keepScreenOnVideoPlayback" + "columnCount", + "keepScreenOnVideoPlayback", + "settingsAccessibilityShowPinchGestureAlternatives" ], "nb": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionRemoveLocation", - "keepScreenOnVideoPlayback" + "keepScreenOnVideoPlayback", + "settingsAccessibilityShowPinchGestureAlternatives" ], "nl": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionExportMetadata", @@ -1594,10 +1633,12 @@ "settingsViewerShowRatingTags", "settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionDialogTitle", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsWidgetDisplayedItem" ], "nn": [ + "columnCount", "sourceStateLoading", "sourceStateCataloguing", "entryActionShareImageOnly", @@ -1964,6 +2005,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -2047,6 +2089,7 @@ "pl": [ "itemCount", + "columnCount", "timeSeconds", "timeMinutes", "timeDays", @@ -2469,6 +2512,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -2551,6 +2595,7 @@ ], "pt": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionExportMetadata", @@ -2566,10 +2611,12 @@ "settingsViewerShowRatingTags", "settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionDialogTitle", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsWidgetDisplayedItem" ], "ro": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionRemoveLocation", @@ -2577,18 +2624,22 @@ "filterAspectRatioPortraitLabel", "filterNoAddressLabel", "keepScreenOnVideoPlayback", - "settingsViewerShowRatingTags" + "settingsViewerShowRatingTags", + "settingsAccessibilityShowPinchGestureAlternatives" ], "ru": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionRemoveLocation", - "keepScreenOnVideoPlayback" + "keepScreenOnVideoPlayback", + "settingsAccessibilityShowPinchGestureAlternatives" ], "th": [ "itemCount", + "columnCount", "timeSeconds", "timeMinutes", "timeDays", @@ -2846,6 +2897,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -2927,7 +2979,13 @@ "filePickerUseThisFolder" ], + "tr": [ + "columnCount", + "settingsAccessibilityShowPinchGestureAlternatives" + ], + "uk": [ + "columnCount", "setCoverDialogCustom", "menuActionSelectNone", "albumPageTitle", @@ -3083,6 +3141,7 @@ "settingsRemoveAnimationsTile", "settingsRemoveAnimationsDialogTitle", "settingsTimeToTakeActionTile", + "settingsAccessibilityShowPinchGestureAlternatives", "settingsDisplaySectionTitle", "settingsThemeBrightnessTile", "settingsThemeBrightnessDialogTitle", @@ -3164,6 +3223,7 @@ ], "zh": [ + "columnCount", "entryActionShareImageOnly", "entryActionShareVideoOnly", "entryInfoActionRemoveLocation", @@ -3171,6 +3231,12 @@ "filterAspectRatioPortraitLabel", "filterNoAddressLabel", "keepScreenOnVideoPlayback", - "settingsViewerShowRatingTags" + "settingsViewerShowRatingTags", + "settingsAccessibilityShowPinchGestureAlternatives" + ], + + "zh_Hant": [ + "columnCount", + "settingsAccessibilityShowPinchGestureAlternatives" ] }