diff --git a/mobile/apps/photos/lib/l10n/intl_en.arb b/mobile/apps/photos/lib/l10n/intl_en.arb index 21998814da..017637a8b8 100644 --- a/mobile/apps/photos/lib/l10n/intl_en.arb +++ b/mobile/apps/photos/lib/l10n/intl_en.arb @@ -1808,5 +1808,24 @@ "automaticallyAnalyzeAndSplitGrouping": "We will automatically analyze the grouping to determine if there are multiple people present, and separate them out again. This may take a few seconds.", "layout": "Layout", "day": "Day", - "peopleAutoAddDesc": "Select the people you want to automatically add to the album" + "peopleAutoAddDesc": "Select the people you want to automatically add to the album", + "undo": "Undo", + "redo": "Redo", + "filter": "Filter", + "adjust": "Adjust", + "draw": "Draw", + "sticker": "Sticker", + "brushColor": "Brush Color", + "font": "Font", + "background": "Background", + "align": "Align", + "addedToAlbums": "{count, plural, =1{Added successfully to 1 album} other{Added successfully to {count} albums}}", + "@addedToAlbums": { + "description": "Message shown when items are added to albums", + "placeholders": { + "count": { + "type": "int" + } + } + } } \ No newline at end of file diff --git a/mobile/apps/photos/lib/ui/collections/collection_action_sheet.dart b/mobile/apps/photos/lib/ui/collections/collection_action_sheet.dart index d049be0102..64fe799e46 100644 --- a/mobile/apps/photos/lib/ui/collections/collection_action_sheet.dart +++ b/mobile/apps/photos/lib/ui/collections/collection_action_sheet.dart @@ -310,9 +310,7 @@ class _CollectionActionSheetState extends State { if (result) { showShortToast( context, - "Added successfully to " + - _selectedCollections.length.toString() + - " albums", + S.of(context).addedToAlbums(_selectedCollections.length), ); widget.selectedFiles?.clearAll(); } diff --git a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_app_bar.dart b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_app_bar.dart index 03e84cf75d..730feb5d3a 100644 --- a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_app_bar.dart +++ b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_app_bar.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import "package:flutter_svg/svg.dart"; import "package:photos/ente_theme_data.dart"; -import "package:photos/theme/ente_theme.dart"; +import "package:photos/generated/l10n.dart"; + import "package:photos/theme/ente_theme.dart"; import "package:pro_image_editor/models/editor_configs/pro_image_editor_configs.dart"; class ImageEditorAppBar extends StatelessWidget implements PreferredSizeWidget { @@ -43,7 +44,7 @@ class ImageEditorAppBar extends StatelessWidget implements PreferredSizeWidget { enableUndo ? close() : Navigator.of(context).pop(); }, child: Text( - 'Cancel', + S.of(context).cancel, style: getEnteTextTheme(context).body, ), ), @@ -52,7 +53,7 @@ class ImageEditorAppBar extends StatelessWidget implements PreferredSizeWidget { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ IconButton( - tooltip: 'Undo', + tooltip: S.of(context).undo, onPressed: () { undo != null ? undo!() : null; }, @@ -66,7 +67,7 @@ class ImageEditorAppBar extends StatelessWidget implements PreferredSizeWidget { ), const SizedBox(width: 12), IconButton( - tooltip: 'Redo', + tooltip: S.of(context).redo, onPressed: () { redo != null ? redo!() : null; }, @@ -88,7 +89,7 @@ class ImageEditorAppBar extends StatelessWidget implements PreferredSizeWidget { key: ValueKey(isMainEditor ? 'save_copy' : 'done'), onPressed: done, child: Text( - isMainEditor ? 'Save Copy' : 'Done', + isMainEditor ? S.of(context).saveCopy : S.of(context).done, style: getEnteTextTheme(context).body.copyWith( color: isMainEditor ? (enableUndo diff --git a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_crop_rotate.dart b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_crop_rotate.dart index a222ed92e4..10333cd3ce 100644 --- a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_crop_rotate.dart +++ b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_crop_rotate.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import "package:flutter_svg/svg.dart"; +import "package:photos/generated/l10n.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/tools/editor/image_editor/circular_icon_button.dart"; import "package:photos/ui/tools/editor/image_editor/image_editor_configs_mixin.dart"; @@ -113,7 +114,7 @@ class _ImageEditorCropRotateBarState extends State children: [ CircularIconButton( svgPath: "assets/image-editor/image-editor-crop-rotate.svg", - label: "Rotate", + label: S.of(context).rotate, onTap: () { widget.editor.rotate(); }, @@ -121,7 +122,7 @@ class _ImageEditorCropRotateBarState extends State const SizedBox(width: 6), CircularIconButton( svgPath: "assets/image-editor/image-editor-flip.svg", - label: "Flip", + label: S.of(context).flip, onTap: () { widget.editor.flip(); }, diff --git a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_main_bottom_bar.dart b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_main_bottom_bar.dart index 3321e645c1..32dc0a5ed8 100644 --- a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_main_bottom_bar.dart +++ b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_main_bottom_bar.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; +import "package:photos/generated/l10n.dart"; import "package:photos/ui/tools/editor/image_editor/circular_icon_button.dart"; import "package:photos/ui/tools/editor/image_editor/image_editor_configs_mixin.dart"; import "package:photos/ui/tools/editor/image_editor/image_editor_constants.dart"; @@ -90,7 +91,7 @@ class ImageEditorMainBottomBarState extends State children: [ CircularIconButton( svgPath: "assets/image-editor/image-editor-crop.svg", - label: "Crop", + label: S.of(context).crop, onTap: () { widget.editor.openCropRotateEditor(); }, @@ -98,21 +99,21 @@ class ImageEditorMainBottomBarState extends State CircularIconButton( svgPath: "assets/image-editor/image-editor-filter.svg", - label: "Filter", + label: S.of(context).filter, onTap: () { widget.editor.openFilterEditor(); }, ), CircularIconButton( svgPath: "assets/image-editor/image-editor-tune.svg", - label: "Adjust", + label: S.of(context).adjust, onTap: () { widget.editor.openTuneEditor(); }, ), CircularIconButton( svgPath: "assets/image-editor/image-editor-paint.svg", - label: "Draw", + label: S.of(context).draw, onTap: () { widget.editor.openPaintingEditor(); }, @@ -120,7 +121,7 @@ class ImageEditorMainBottomBarState extends State CircularIconButton( svgPath: "assets/image-editor/image-editor-sticker.svg", - label: "Sticker", + label: S.of(context).sticker, onTap: () { widget.editor.openEmojiEditor(); }, diff --git a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_paint_bar.dart b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_paint_bar.dart index 0e4d1dd44f..5c7fe2c97d 100644 --- a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_paint_bar.dart +++ b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_paint_bar.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import "package:photos/generated/l10n.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/tools/editor/image_editor/image_editor_color_picker.dart"; import "package:photos/ui/tools/editor/image_editor/image_editor_configs_mixin.dart"; @@ -63,7 +64,7 @@ class _ImageEditorPaintBarState extends State Padding( padding: const EdgeInsets.only(left: 20.0), child: Text( - "Brush Color", + S.of(context).brushColor, style: getEnteTextTheme(context).body, ), ), diff --git a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_text_bar.dart b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_text_bar.dart index 3115aa3933..d4327fb136 100644 --- a/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_text_bar.dart +++ b/mobile/apps/photos/lib/ui/tools/editor/image_editor/image_editor_text_bar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import "package:flutter_svg/svg.dart"; +import "package:photos/generated/l10n.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/tools/editor/image_editor/circular_icon_button.dart"; import "package:photos/ui/tools/editor/image_editor/image_editor_color_picker.dart"; @@ -75,7 +76,7 @@ class _ImageEditorTextBarState extends State children: [ CircularIconButton( svgPath: "assets/image-editor/image-editor-text-color.svg", - label: "Color", + label: S.of(context).color, isSelected: selectedActionIndex == 0, onTap: () { _selectAction(0); @@ -83,7 +84,7 @@ class _ImageEditorTextBarState extends State ), CircularIconButton( svgPath: "assets/image-editor/image-editor-text-font.svg", - label: "Font", + label: S.of(context).font, isSelected: selectedActionIndex == 1, onTap: () { _selectAction(1); @@ -91,7 +92,7 @@ class _ImageEditorTextBarState extends State ), CircularIconButton( svgPath: "assets/image-editor/image-editor-text-background.svg", - label: "Background", + label: S.of(context).background, isSelected: selectedActionIndex == 2, onTap: () { setState(() { @@ -101,7 +102,7 @@ class _ImageEditorTextBarState extends State ), CircularIconButton( svgPath: "assets/image-editor/image-editor-text-align-left.svg", - label: "Align", + label: S.of(context).align, isSelected: selectedActionIndex == 3, onTap: () { setState(() { diff --git a/mobile/apps/photos/lib/ui/viewer/file/detail_page.dart b/mobile/apps/photos/lib/ui/viewer/file/detail_page.dart index 5cb0d8fcbe..47ff3c11cc 100644 --- a/mobile/apps/photos/lib/ui/viewer/file/detail_page.dart +++ b/mobile/apps/photos/lib/ui/viewer/file/detail_page.dart @@ -20,7 +20,6 @@ import "package:photos/states/detail_page_state.dart"; import "package:photos/ui/common/fast_scroll_physics.dart"; import 'package:photos/ui/notification/toast.dart'; import "package:photos/ui/tools/editor/image_editor/image_editor_page_new.dart"; -import 'package:photos/ui/tools/editor/image_editor_page.dart'; import "package:photos/ui/tools/editor/video_editor_page.dart"; import "package:photos/ui/viewer/file/file_app_bar.dart"; import "package:photos/ui/viewer/file/file_bottom_bar.dart"; @@ -176,7 +175,7 @@ class _DetailPageState extends State { builder: (BuildContext context, int selectedIndex, _) { return FileBottomBar( _files![selectedIndex], - _onNewImageEditor, + _onEditFileRequested, widget.config.mode == DetailPageMode.minimalistic && !isGuestView, onFileRemoved: _onFileRemoved, @@ -358,7 +357,7 @@ class _DetailPageState extends State { } } - Future _onNewImageEditor(EnteFile file) async { + Future _onEditFileRequested(EnteFile file) async { if (file.uploadedFileID != null && file.ownerID != Configuration.instance.getUserID()) { _logger.severe( @@ -420,67 +419,6 @@ class _DetailPageState extends State { } } - Future _onEditFileRequested(EnteFile file) async { - if (file.uploadedFileID != null && - file.ownerID != Configuration.instance.getUserID()) { - _logger.severe( - "Attempt to edit unowned file", - UnauthorizedEditError(), - StackTrace.current, - ); - // ignore: unawaited_futures - showErrorDialog( - context, - S.of(context).sorry, - S.of(context).weDontSupportEditingPhotosAndAlbumsThatYouDont, - ); - return; - } - final dialog = createProgressDialog(context, S.of(context).pleaseWait); - await dialog.show(); - try { - final ioFile = await getFile(file); - if (ioFile == null) { - showShortToast(context, S.of(context).failedToFetchOriginalForEdit); - await dialog.hide(); - return; - } - if (file.fileType == FileType.video) { - await dialog.hide(); - replacePage( - context, - VideoEditorPage( - file: file, - ioFile: ioFile, - detailPageConfig: widget.config.copyWith( - files: _files, - selectedIndex: _selectedIndexNotifier.value, - ), - ), - ); - return; - } - final imageProvider = - ExtendedFileImageProvider(ioFile, cacheRawData: true); - await precacheImage(imageProvider, context); - await dialog.hide(); - replacePage( - context, - ImageEditorPage( - imageProvider, - file, - widget.config.copyWith( - files: _files, - selectedIndex: _selectedIndexNotifier.value, - ), - ), - ); - } catch (e) { - await dialog.hide(); - _logger.warning("Failed to initiate edit", e); - } - } - Future _requestAuthentication() async { return await LocalAuthenticationService.instance.requestLocalAuthentication( context,