chore: migrate mobile translations accessor (5) (#30672)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong 2026-08-11 14:41:13 +05:30 committed by GitHub
parent a8b3b30aba
commit 675408b003
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
41 changed files with 268 additions and 372 deletions

View file

@ -127,8 +127,11 @@ class DeleteAction extends AssetActionBuilder {
final assetService = ref.read(assetServiceProvider);
final confirmed = await showDialog<bool>(
context: context,
builder: (_) =>
const ConfirmDialog(title: 'delete_dialog_title', content: 'delete_dialog_alert', ok: 'delete_permanently'),
builder: (_) => ConfirmDialog(
title: context.t.delete_dialog_title,
content: context.t.delete_dialog_alert,
ok: context.t.delete_permanently,
),
);
if (confirmed != true || !context.mounted) {
return null;

View file

@ -5,7 +5,7 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/domain/services/timeline.service.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
@ -19,7 +19,7 @@ class CleanupPreviewPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('cleanup_preview_title'.t(context: context, args: {'count': assets.length.toString()})),
title: Text(context.t.cleanup_preview_title(count: assets.length)),
centerTitle: true,
elevation: 0,
scrolledUnderElevation: 0,

View file

@ -4,7 +4,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/pages/common/download_panel.dart';
import 'package:immich_mobile/providers/asset_viewer/download.provider.dart';
@ -21,10 +21,7 @@ class DownloadInfoPage extends ConsumerWidget {
}
return Scaffold(
appBar: AppBar(
title: Text("download".t(context: context)),
actions: const [],
),
appBar: AppBar(title: Text(context.t.download), actions: const []),
body: ListView.builder(
physics: const ClampingScrollPhysics(),
shrinkWrap: true,
@ -49,7 +46,7 @@ class DownloadInfoPage extends ConsumerWidget {
},
style: OutlinedButton.styleFrom(side: BorderSide(color: context.colorScheme.primary)),
child: Text(
'clear_all'.t(context: context),
context.t.clear_all,
style: context.textTheme.labelLarge?.copyWith(color: context.colorScheme.primary),
),
),

View file

@ -1,7 +1,7 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
@ -28,10 +28,7 @@ class DriftFavoritePage extends StatelessWidget {
}),
],
child: Timeline(
appBar: MesmerizingSliverAppBar(
title: 'favorites'.t(context: context),
icon: Icons.favorite_outline,
),
appBar: MesmerizingSliverAppBar(title: context.t.favorites, icon: Icons.favorite_outline),
bottomSheet: const FavoriteBottomSheet(),
),
);

View file

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/pages/common/large_leading_tile.dart';
import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
@ -62,10 +62,10 @@ class _PlaceSliverAppBar extends HookWidget {
onTapOutside: (_) => searchFocusNode.unfocus(),
onChanged: (value) => search.value = value,
filled: true,
hintText: 'filter_places'.t(context: context),
hintText: context.t.filter_places,
autofocus: true,
)
: Text('places'.t(context: context)),
: Text(context.t.places),
actions: [
IconButton(
icon: Icon(search.value != null ? Icons.close : Icons.search),

View file

@ -1,7 +1,7 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -26,7 +26,7 @@ class DriftRecentlyAddedPage extends StatelessWidget {
return timelineService;
}),
],
child: Timeline(appBar: MesmerizingSliverAppBar(title: 'recently_added'.t())),
child: Timeline(appBar: MesmerizingSliverAppBar(title: context.t.recently_added)),
);
}
}

View file

@ -1,7 +1,7 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -26,7 +26,7 @@ class DriftRecentlyTakenPage extends StatelessWidget {
return timelineService;
}),
],
child: Timeline(appBar: MesmerizingSliverAppBar(title: 'recently_taken'.t())),
child: Timeline(appBar: MesmerizingSliverAppBar(title: context.t.recently_taken)),
);
}
}

View file

@ -11,7 +11,7 @@ import 'package:immich_mobile/domain/models/config/slideshow_config.dart';
import 'package:immich_mobile/domain/services/timeline.service.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/scroll_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/pages/common/settings.page.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/video_viewer.widget.dart';
import 'package:immich_mobile/presentation/widgets/images/image_provider.dart';
@ -411,7 +411,7 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> with Si
children: [
AppBar(
backgroundColor: context.scaffoldBackgroundColor,
title: Text("slideshow".t(context: context)),
title: Text(context.t.slideshow),
actions: [
IconButton(
onPressed: _paused ? _play : _pause,

View file

@ -1,7 +1,6 @@
import 'dart:async';
import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@ -9,6 +8,7 @@ import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/extensions/asyncvalue_extensions.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -86,7 +86,7 @@ class DriftUserSelectionPage extends HookConsumerWidget {
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'suggestions'.tr(),
context.t.suggestions,
style: const TextStyle(fontSize: 14, color: Colors.grey, fontWeight: FontWeight.bold),
),
),
@ -118,7 +118,7 @@ class DriftUserSelectionPage extends HookConsumerWidget {
return Scaffold(
appBar: AppBar(
title: const Text('invite_to_album').tr(),
title: Text(context.t.invite_to_album),
elevation: 0,
centerTitle: false,
leading: IconButton(
@ -130,7 +130,7 @@ class DriftUserSelectionPage extends HookConsumerWidget {
actions: [
TextButton(
onPressed: sharedUsersList.value.isEmpty ? null : () => addNewUsersHandler(),
child: const Text("add", style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold)).tr(),
child: Text(context.t.add, style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold)),
),
],
),

View file

@ -1,7 +1,7 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -26,7 +26,7 @@ class DriftVideoPage extends StatelessWidget {
return timelineService;
}),
],
child: Timeline(appBar: MesmerizingSliverAppBar(title: 'videos'.t())),
child: Timeline(appBar: MesmerizingSliverAppBar(title: context.t.videos)),
);
}
}

View file

@ -9,6 +9,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/aspect_ratios.dart';
import 'package:immich_mobile/domain/models/asset_edit.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/pages/edit/editor.provider.dart';
import 'package:immich_mobile/providers/theme.provider.dart';
import 'package:immich_mobile/theme/theme_data.dart';
@ -63,14 +64,14 @@ class _DriftEditImagePageState extends ConsumerState<DriftEditImagePage> with Ti
return;
}
ImmichToast.show(context: context, msg: 'success'.tr(), toastType: ToastType.success);
ImmichToast.show(context: context, msg: context.t.success, toastType: ToastType.success);
Navigator.of(context).pop();
} catch (e) {
if (!mounted) {
return;
}
ImmichToast.show(context: context, msg: 'error_title'.tr(), toastType: ToastType.error);
ImmichToast.show(context: context, msg: context.t.error_title, toastType: ToastType.error);
} finally {
ref.read(editorStateProvider.notifier).setIsEditing(false);
}
@ -80,17 +81,17 @@ class _DriftEditImagePageState extends ConsumerState<DriftEditImagePage> with Ti
return showDialog<bool>(
context: context,
builder: (context) => AlertDialog(
title: Text('editor_discard_edits_title'.tr()),
content: Text('editor_discard_edits_prompt'.tr()),
title: Text(context.t.editor_discard_edits_title),
content: Text(context.t.editor_discard_edits_prompt),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false),
style: ButtonStyle(
foregroundColor: WidgetStateProperty.all(context.themeData.colorScheme.onSurfaceVariant),
),
child: Text('cancel'.tr()),
child: Text(context.t.cancel),
),
TextButton(onPressed: () => Navigator.of(context).pop(true), child: Text('confirm'.tr())),
TextButton(onPressed: () => Navigator.of(context).pop(true), child: Text(context.t.confirm)),
],
),
);
@ -116,7 +117,7 @@ class _DriftEditImagePageState extends ConsumerState<DriftEditImagePage> with Ti
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
title: Text("edit".tr()),
title: Text(context.t.edit),
leading: ImmichCloseButton(onPressed: () => Navigator.of(context).maybePop()),
actions: [_SaveEditsButton(onSave: _saveEditedImage)],
),
@ -336,7 +337,7 @@ class _ResetEditsButton extends ConsumerWidget {
final editorNotifier = ref.watch(editorStateProvider.notifier);
return ImmichTextButton(
labelText: 'reset'.tr(),
labelText: context.t.reset,
onPressed: editorNotifier.resetEdits,
variant: ImmichVariant.ghost,
expanded: false,

View file

@ -1,5 +1,4 @@
import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:immich_mobile/domain/models/feature_message.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
@ -60,10 +59,10 @@ class _HighlightCard extends StatelessWidget {
),
),
const SizedBox(height: 12),
Text(highlight.titleKey.tr(), style: context.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600)),
Text(highlight.title(context.t), style: context.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600)),
const SizedBox(height: 4),
Text(
highlight.bodyKey.tr(),
highlight.body(context.t),
style: context.textTheme.bodyMedium?.copyWith(color: context.colorScheme.onSurfaceVariant),
),
],

View file

@ -2,13 +2,13 @@ import 'dart:async';
import 'package:auto_route/auto_route.dart';
import 'package:crop_image/crop_image.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:image_picker/image_picker.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/images/image_provider.dart';
import 'package:immich_mobile/providers/auth.provider.dart';
import 'package:immich_mobile/providers/backup/backup.provider.dart';
@ -93,7 +93,7 @@ class _ProfilePictureCropPageState extends ConsumerState<ProfilePictureCropPage>
ImmichToast.show(
context: context,
msg: 'profile_picture_set'.tr(),
msg: context.t.profile_picture_set,
gravity: ToastGravity.BOTTOM,
toastType: ToastType.success,
);
@ -102,7 +102,7 @@ class _ProfilePictureCropPageState extends ConsumerState<ProfilePictureCropPage>
} else {
ImmichToast.show(
context: context,
msg: 'errors.unable_to_set_profile_picture'.tr(),
msg: context.t.errors.unable_to_set_profile_picture,
toastType: ToastType.error,
gravity: ToastGravity.BOTTOM,
);
@ -114,7 +114,7 @@ class _ProfilePictureCropPageState extends ConsumerState<ProfilePictureCropPage>
ImmichToast.show(
context: context,
msg: 'errors.unable_to_set_profile_picture'.tr(),
msg: context.t.errors.unable_to_set_profile_picture,
toastType: ToastType.error,
gravity: ToastGravity.BOTTOM,
);
@ -135,7 +135,7 @@ class _ProfilePictureCropPageState extends ConsumerState<ProfilePictureCropPage>
return Scaffold(
appBar: AppBar(
backgroundColor: context.scaffoldBackgroundColor,
title: Text("set_profile_picture".tr()),
title: Text(context.t.set_profile_picture),
leading: _isLoading ? null : const ImmichCloseButton(),
actions: [
if (_isLoading)

View file

@ -12,7 +12,6 @@ import 'package:immich_mobile/domain/models/tag.model.dart';
import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/domain/services/timeline.service.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/models/search/search_filter.model.dart';
import 'package:immich_mobile/presentation/pages/search/paginated_search.provider.dart';
@ -48,9 +47,7 @@ class DriftSearchPage extends HookConsumerWidget {
serverFeatures.smartSearch ? TextSearchType.context : TextSearchType.filename,
);
final searchHintText = useState<String>(
serverFeatures.smartSearch
? 'sunrise_on_the_beach'.t(context: context)
: 'file_name_or_extension'.t(context: context),
serverFeatures.smartSearch ? context.t.sunrise_on_the_beach : context.t.file_name_or_extension,
);
final textSearchController = useTextEditingController();
final filter = useState<SearchFilter>(
@ -142,7 +139,7 @@ class DriftSearchPage extends HookConsumerWidget {
}
void handleApply() {
final label = people.map((e) => e.name != '' ? e.name : 'no_name'.t(context: context)).join(', ');
final label = people.map((e) => e.name != '' ? e.name : context.t.no_name).join(', ');
peopleCurrentFilterWidget.value = label.isNotEmpty ? Text(label, style: context.textTheme.labelLarge) : null;
search(filter.value.copyWith(people: people));
}
@ -154,7 +151,7 @@ class DriftSearchPage extends HookConsumerWidget {
child: FractionallySizedBox(
heightFactor: 0.8,
child: FilterBottomSheetScaffold(
title: 'search_filter_people_title'.t(context: context),
title: context.t.search_filter_people_title,
expanded: true,
onSearch: handleApply,
onClear: handleClear,
@ -191,7 +188,7 @@ class DriftSearchPage extends HookConsumerWidget {
child: FractionallySizedBox(
heightFactor: 0.8,
child: FilterBottomSheetScaffold(
title: 'search_filter_tags_title'.t(context: context),
title: context.t.search_filter_tags_title,
expanded: true,
onSearch: handleApply,
onClear: handleClear,
@ -232,7 +229,7 @@ class DriftSearchPage extends HookConsumerWidget {
isScrollControlled: true,
isDismissible: true,
child: FilterBottomSheetScaffold(
title: 'search_filter_location_title'.t(context: context),
title: context.t.search_filter_location_title,
onSearch: handleApply,
onClear: handleClear,
child: Padding(
@ -277,7 +274,7 @@ class DriftSearchPage extends HookConsumerWidget {
isScrollControlled: true,
isDismissible: true,
child: FilterBottomSheetScaffold(
title: 'search_filter_camera_title'.t(context: context),
title: context.t.search_filter_camera_title,
onSearch: handleApply,
onClear: handleClear,
child: Padding(
@ -333,14 +330,14 @@ class DriftSearchPage extends HookConsumerWidget {
lastDate: lastDate,
currentDate: DateTime.now(),
initialDateRange: dateRange,
helpText: 'search_filter_date_title'.t(context: context),
cancelText: 'cancel'.t(context: context),
confirmText: 'select'.t(context: context),
saveText: 'save'.t(context: context),
errorFormatText: 'invalid_date_format'.t(context: context),
errorInvalidText: 'invalid_date'.t(context: context),
fieldStartHintText: 'start_date'.t(context: context),
fieldEndHintText: 'end_date'.t(context: context),
helpText: context.t.search_filter_date_title,
cancelText: context.t.cancel,
confirmText: context.t.select,
saveText: context.t.save,
errorFormatText: context.t.invalid_date_format,
errorInvalidText: context.t.invalid_date,
fieldStartHintText: context.t.start_date,
fieldEndHintText: context.t.end_date,
initialEntryMode: DatePickerEntryMode.calendar,
keyboardType: TextInputType.text,
);
@ -357,7 +354,7 @@ class DriftSearchPage extends HookConsumerWidget {
showFilterBottomSheet(
context: context,
child: FilterBottomSheetScaffold(
title: "pick_date_range".tr(),
title: context.t.pick_date_range,
expanded: true,
onClear: () => datePicked(null),
child: QuickDatePicker(
@ -392,7 +389,7 @@ class DriftSearchPage extends HookConsumerWidget {
void handleApply() {
mediaTypeCurrentFilterWidget.value = mediaType != AssetType.other
? Text(
mediaType == AssetType.image ? 'image'.t(context: context) : 'video'.t(context: context),
mediaType == AssetType.image ? context.t.image : context.t.video,
style: context.textTheme.labelLarge,
)
: null;
@ -403,7 +400,7 @@ class DriftSearchPage extends HookConsumerWidget {
showFilterBottomSheet(
context: context,
child: FilterBottomSheetScaffold(
title: 'search_filter_media_type_title'.t(context: context),
title: context.t.search_filter_media_type_title,
onSearch: handleApply,
onClear: handleClear,
child: MediaTypePicker(onSelect: handleOnSelected, filter: filter.value.mediaType),
@ -427,10 +424,7 @@ class DriftSearchPage extends HookConsumerWidget {
void handleApply() {
ratingCurrentFilterWidget.value = rating.rating.isSome
? Text(
'rating_count'.t(args: {'count': rating.rating.unwrapOrNull ?? 0}),
style: context.textTheme.labelLarge,
)
? Text(context.t.rating_count(count: rating.rating.unwrapOrNull ?? 0), style: context.textTheme.labelLarge)
: null;
search(filter.value.copyWith(rating: rating));
}
@ -440,7 +434,7 @@ class DriftSearchPage extends HookConsumerWidget {
context: context,
isScrollControlled: true,
child: FilterBottomSheetScaffold(
title: 'rating'.t(context: context),
title: context.t.rating,
onSearch: handleApply,
onClear: handleClear,
child: StarRatingPicker(onSelect: handleOnSelected, filter: filter.value.rating),
@ -472,9 +466,9 @@ class DriftSearchPage extends HookConsumerWidget {
void handleApply() {
final filterText = [
if (display.isNotInAlbum) 'search_filter_display_option_not_in_album'.t(context: context),
if (display.isArchive) 'archive'.t(context: context),
if (display.isFavorite) 'favorite'.t(context: context),
if (display.isNotInAlbum) context.t.search_filter_display_option_not_in_album,
if (display.isArchive) context.t.archive,
if (display.isFavorite) context.t.favorite,
];
displayOptionCurrentFilterWidget.value = filterText.isNotEmpty
? Text(filterText.join(', '), style: context.textTheme.labelLarge)
@ -486,7 +480,7 @@ class DriftSearchPage extends HookConsumerWidget {
showFilterBottomSheet(
context: context,
child: FilterBottomSheetScaffold(
title: 'display_options'.t(context: context),
title: context.t.display_options,
onSearch: handleApply,
onClear: handleClear,
child: DisplayOptionPicker(onSelect: handleOnSelect, filter: filter.value.display),
@ -534,7 +528,7 @@ class DriftSearchPage extends HookConsumerWidget {
}
},
icon: const Icon(Icons.more_vert_rounded),
tooltip: 'show_text_search_menu'.tr(),
tooltip: context.t.show_text_search_menu,
);
},
menuChildren: [
@ -544,7 +538,7 @@ class DriftSearchPage extends HookConsumerWidget {
child: ListTile(
leading: const Icon(Icons.image_search_rounded),
title: Text(
'search_by_context'.t(context: context),
context.t.search_by_context,
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
color: textSearchType.value == TextSearchType.context ? context.colorScheme.primary : null,
@ -555,7 +549,7 @@ class DriftSearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.context;
searchHintText.value = 'sunrise_on_the_beach'.t(context: context);
searchHintText.value = context.t.sunrise_on_the_beach;
},
),
),
@ -563,7 +557,7 @@ class DriftSearchPage extends HookConsumerWidget {
child: ListTile(
leading: const Icon(Icons.abc_rounded),
title: Text(
'search_filter_filename'.t(context: context),
context.t.search_filter_filename,
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
color: textSearchType.value == TextSearchType.filename ? context.colorScheme.primary : null,
@ -574,14 +568,14 @@ class DriftSearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.filename;
searchHintText.value = 'file_name_or_extension'.t(context: context);
searchHintText.value = context.t.file_name_or_extension;
},
),
MenuItemButton(
child: ListTile(
leading: const Icon(Icons.text_snippet_outlined),
title: Text(
'search_by_description'.t(context: context),
context.t.search_by_description,
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
color: textSearchType.value == TextSearchType.description ? context.colorScheme.primary : null,
@ -592,7 +586,7 @@ class DriftSearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.description;
searchHintText.value = 'search_by_description_example'.t(context: context);
searchHintText.value = context.t.search_by_description_example;
},
),
FeatureCheck(
@ -601,7 +595,7 @@ class DriftSearchPage extends HookConsumerWidget {
child: ListTile(
leading: const Icon(Icons.document_scanner_outlined),
title: Text(
'search_by_ocr'.t(context: context),
context.t.search_by_ocr,
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w500,
color: textSearchType.value == TextSearchType.ocr ? context.colorScheme.primary : null,
@ -612,7 +606,7 @@ class DriftSearchPage extends HookConsumerWidget {
),
onPressed: () {
textSearchType.value = TextSearchType.ocr;
searchHintText.value = 'search_by_ocr_example'.t(context: context);
searchHintText.value = context.t.search_by_ocr_example;
},
),
),
@ -663,52 +657,52 @@ class DriftSearchPage extends HookConsumerWidget {
SearchFilterChip(
icon: Icons.people_alt_outlined,
onTap: showPeoplePicker,
label: 'people'.t(context: context),
label: context.t.people,
currentFilter: peopleCurrentFilterWidget.value,
),
SearchFilterChip(
icon: Icons.location_on_outlined,
onTap: showLocationPicker,
label: 'search_filter_location'.t(context: context),
label: context.t.search_filter_location,
currentFilter: locationCurrentFilterWidget.value,
),
if (userPreferences.valueOrNull?.tagsEnabled ?? false)
SearchFilterChip(
icon: Icons.sell_outlined,
onTap: showTagPicker,
label: 'tags'.t(context: context),
label: context.t.tags,
currentFilter: tagCurrentFilterWidget.value,
),
SearchFilterChip(
icon: Icons.camera_alt_outlined,
onTap: showCameraPicker,
label: 'camera'.t(context: context),
label: context.t.camera,
currentFilter: cameraCurrentFilterWidget.value,
),
SearchFilterChip(
icon: Icons.date_range_outlined,
onTap: showQuickDatePicker,
label: 'search_filter_date'.t(context: context),
label: context.t.search_filter_date,
currentFilter: dateRangeCurrentFilterWidget.value,
),
SearchFilterChip(
key: const Key('media_type_chip'),
icon: Icons.video_collection_outlined,
onTap: showMediaTypePicker,
label: 'search_filter_media_type'.t(context: context),
label: context.t.search_filter_media_type,
currentFilter: mediaTypeCurrentFilterWidget.value,
),
if (userPreferences.valueOrNull?.ratingsEnabled ?? false)
SearchFilterChip(
icon: Icons.star_outline_rounded,
onTap: showStarRatingPicker,
label: 'search_filter_star_rating'.t(context: context),
label: context.t.search_filter_star_rating,
currentFilter: ratingCurrentFilterWidget.value,
),
SearchFilterChip(
icon: Icons.display_settings_outlined,
onTap: showDisplayOptionPicker,
label: 'search_filter_display_options'.t(context: context),
label: context.t.search_filter_display_options,
currentFilter: displayOptionCurrentFilterWidget.value,
),
],
@ -772,7 +766,7 @@ class _SearchResultGrid extends ConsumerWidget {
padding: const EdgeInsets.symmetric(vertical: 32),
child: Center(
child: Text(
'search_no_more_result'.t(context: context),
context.t.search_no_more_result,
style: context.textTheme.bodyMedium?.copyWith(color: context.colorScheme.onSurfaceVariant),
),
),
@ -837,7 +831,7 @@ class _SearchNoResults extends StatelessWidget {
Icon(Icons.search_off_rounded, size: 72, color: context.colorScheme.onSurfaceVariant),
const SizedBox(height: 24),
Text(
'search_no_result'.t(context: context),
context.t.search_no_result,
textAlign: TextAlign.center,
style: context.textTheme.bodyLarge?.copyWith(color: context.colorScheme.onSurfaceVariant),
),
@ -865,9 +859,7 @@ class _SearchSuggestions extends StatelessWidget {
),
),
const SizedBox(height: 16),
Center(
child: Text('search_page_search_photos_videos'.t(context: context), style: context.textTheme.labelLarge),
),
Center(child: Text(context.t.search_page_search_photos_videos, style: context.textTheme.labelLarge)),
const SizedBox(height: 32),
const Padding(padding: EdgeInsets.symmetric(horizontal: 16), child: _QuickLinkList()),
],
@ -900,7 +892,7 @@ class _QuickLinkList extends StatelessWidget {
physics: const NeverScrollableScrollPhysics(),
children: [
_QuickLink(
title: 'recently_taken'.t(context: context),
title: context.t.recently_taken,
icon: Icons.schedule_outlined,
isTop: true,
onTap: () => context.pushRoute(const DriftRecentlyTakenRoute()),
@ -911,12 +903,12 @@ class _QuickLinkList extends StatelessWidget {
onTap: () => context.pushRoute(const DriftRecentlyAddedRoute()),
),
_QuickLink(
title: 'videos'.t(context: context),
title: context.t.videos,
icon: Icons.play_circle_outline_rounded,
onTap: () => context.pushRoute(const DriftVideoRoute()),
),
_QuickLink(
title: 'favorites'.t(context: context),
title: context.t.favorites,
icon: Icons.favorite_border_rounded,
isBottom: true,
onTap: () => context.pushRoute(const DriftFavoriteRoute()),

View file

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/actions/action.widget.dart';
import 'package:immich_mobile/presentation/actions/archive.action.dart';
import 'package:immich_mobile/presentation/actions/asset_debug.action.dart';
@ -43,28 +43,25 @@ class FavoriteBottomSheet extends ConsumerWidget {
}
if (selectedAssets.length != remoteAssets.length) {
ImmichToast.show(
context: context,
msg: 'add_to_album_bottom_sheet_some_local_assets'.t(context: context),
);
ImmichToast.show(context: context, msg: context.t.add_to_album_bottom_sheet_some_local_assets);
}
// Only report the failure when nothing was added; if some succeeded we show "added".
if (result.added > 0) {
ImmichToast.show(
context: context,
msg: 'add_to_album_bottom_sheet_added'.t(args: {"album": album.name}),
msg: context.t.add_to_album_bottom_sheet_added(album: album.name),
);
} else if (result.failed > 0) {
ImmichToast.show(
context: context,
msg: 'assets_cannot_be_added_to_album_count'.t(context: context, args: {'count': result.failed}),
msg: context.t.assets_cannot_be_added_to_album_count(count: result.failed),
toastType: ToastType.error,
);
} else {
ImmichToast.show(
context: context,
msg: 'add_to_album_bottom_sheet_already_exists'.t(args: {"album": album.name}),
msg: context.t.add_to_album_bottom_sheet_already_exists(album: album.name),
);
}

View file

@ -1,8 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/actions/action.widget.dart';
import 'package:immich_mobile/presentation/actions/archive.action.dart';
import 'package:immich_mobile/presentation/actions/asset_debug.action.dart';
@ -54,14 +54,14 @@ class _GeneralBottomSheetState extends ConsumerState<GeneralBottomSheet> {
}
if (!result.success) {
ImmichToast.show(context: context, msg: 'scaffold_body_error_occurred'.tr(), toastType: ToastType.error);
ImmichToast.show(context: context, msg: context.t.scaffold_body_error_occurred, toastType: ToastType.error);
return;
}
ImmichToast.show(
context: context,
msg: result.count == 0
? 'add_to_album_bottom_sheet_already_exists'.tr(namedArgs: {'album': album.name})
: 'add_to_album_bottom_sheet_added'.tr(namedArgs: {'album': album.name}),
? context.t.add_to_album_bottom_sheet_already_exists(album: album.name)
: context.t.add_to_album_bottom_sheet_added(album: album.name),
);
}

View file

@ -1,8 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/actions/action.widget.dart';
import 'package:immich_mobile/presentation/actions/asset_debug.action.dart';
import 'package:immich_mobile/presentation/actions/download.action.dart';
@ -44,15 +44,15 @@ class _PartnerDetailBottomSheetState extends ConsumerState<PartnerDetailBottomSh
}
if (!result.success) {
ImmichToast.show(context: context, msg: 'scaffold_body_error_occurred'.tr(), toastType: ToastType.error);
ImmichToast.show(context: context, msg: context.t.scaffold_body_error_occurred, toastType: ToastType.error);
return;
}
ImmichToast.show(
context: context,
msg: result.count == 0
? 'add_to_album_bottom_sheet_already_exists'.tr(namedArgs: {'album': album.name})
: 'add_to_album_bottom_sheet_added'.tr(namedArgs: {'album': album.name}),
? context.t.add_to_album_bottom_sheet_already_exists(album: album.name)
: context.t.add_to_album_bottom_sheet_added(album: album.name),
);
}

View file

@ -1,7 +1,6 @@
import 'dart:async';
import 'dart:math' as math;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:immich_mobile/domain/models/feature_message.model.dart';
@ -263,12 +262,12 @@ class _FeaturePage extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
Text(
highlight.titleKey.tr(),
highlight.title(context.t),
style: context.textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w700, fontSize: 24),
),
const SizedBox(height: 8),
Text(
highlight.bodyKey.tr(),
highlight.body(context.t),
style: context.textTheme.bodyLarge?.copyWith(color: scheme.onSurfaceVariant, height: 1.4),
),
],

View file

@ -1,7 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:intl/intl.dart';
sealed class DateFilterInputModel {
DateTimeRange<DateTime> asDateTimeRange();
@ -13,12 +13,9 @@ sealed class DateFilterInputModel {
if (date.end.difference(date.start).inHours < 24) {
return DateFormat.yMMMd().format(date.start.toLocal());
} else {
return 'search_filter_date_interval'.t(
context: context,
args: {
"start": DateFormat.yMMMd().format(date.start.toLocal()),
"end": DateFormat.yMMMd().format(date.end.toLocal()),
},
return context.t.search_filter_date_interval(
start: DateFormat.yMMMd().format(date.start.toLocal()),
end: DateFormat.yMMMd().format(date.end.toLocal()),
);
}
}
@ -38,7 +35,7 @@ class RecentMonthRangeFilter extends DateFilterInputModel {
@override
String asHumanReadable(BuildContext context) {
return 'last_months'.t(context: context, args: {"count": monthDelta.toString()});
return context.t.last_months(count: monthDelta);
}
}
@ -62,7 +59,7 @@ class YearFilter extends DateFilterInputModel {
@override
String asHumanReadable(BuildContext context) {
return 'in_year'.tr(namedArgs: {"year": year.toString()});
return context.t.in_year(year: year);
}
}
@ -121,14 +118,13 @@ class QuickDatePicker extends HookWidget {
return null;
}
Text _monthLabel(BuildContext context, int monthsFromNow) =>
const Text('last_months').t(context: context, args: {"count": monthsFromNow.toString()});
Text _monthLabel(BuildContext context, int monthsFromNow) => Text(context.t.last_months(count: monthsFromNow));
Widget _yearPicker(BuildContext context) {
final size = MediaQuery.of(context).size;
return Row(
children: [
const Text("in_year_selector").tr(),
Text(context.t.in_year_selector),
const SizedBox(width: 15),
Expanded(
child: DropdownMenu(
@ -158,7 +154,7 @@ class QuickDatePicker extends HookWidget {
child: IgnorePointer(
ignoring: true,
child: RadioListTile(
title: const Text('pick_custom_range').tr(),
title: Text(context.t.pick_custom_range),
subtitle: hasPreviousInput ? Text(currentInput!.asHumanReadable(context)) : null,
secondary: hasPreviousInput ? const Icon(Icons.edit) : null,
value: _QuickPickerType.custom,