Simplify localized string access

This commit is contained in:
Ming Ming 2021-07-25 13:00:38 +08:00
parent 2472f839e8
commit bbb9eb14be
30 changed files with 250 additions and 301 deletions

View file

@ -0,0 +1,8 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
/// Simplify localized string access
class L10n {
static AppLocalizations of(BuildContext context) =>
AppLocalizations.of(context)!;
}

View file

@ -1,7 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/exception.dart'; import 'package:nc_photos/exception.dart';
/// Convert an exception to a user-facing string /// Convert an exception to a user-facing string
@ -10,16 +10,16 @@ import 'package:nc_photos/exception.dart';
String toUserString(dynamic exception, BuildContext context) { String toUserString(dynamic exception, BuildContext context) {
if (exception is ApiException) { if (exception is ApiException) {
if (exception.response.statusCode == 401) { if (exception.response.statusCode == 401) {
return AppLocalizations.of(context)!.errorUnauthenticated; return L10n.of(context).errorUnauthenticated;
} else if (exception.response.statusCode == 423) { } else if (exception.response.statusCode == 423) {
return AppLocalizations.of(context)!.errorLocked; return L10n.of(context).errorLocked;
} else if (exception.response.statusCode == 500) { } else if (exception.response.statusCode == 500) {
return AppLocalizations.of(context)!.errorServerError; return L10n.of(context).errorServerError;
} }
} else if (exception is SocketException) { } else if (exception is SocketException) {
return AppLocalizations.of(context)!.errorDisconnected; return L10n.of(context).errorDisconnected;
} else if (exception is InvalidBaseUrlException) { } else if (exception is InvalidBaseUrlException) {
return AppLocalizations.of(context)!.errorInvalidBaseUrl; return L10n.of(context).errorInvalidBaseUrl;
} }
return exception.toString(); return exception.toString();
} }

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/exception.dart'; import 'package:nc_photos/exception.dart';
import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/exception_util.dart' as exception_util;
@ -23,7 +23,7 @@ class ShareHandler {
showDialog( showDialog(
context: context, context: context,
builder: (context) => ProcessingDialog( builder: (context) => ProcessingDialog(
text: AppLocalizations.of(context)!.shareDownloadingDialogContent), text: L10n.of(context).shareDownloadingDialogContent),
); );
final results = <Tuple2<File, dynamic>>[]; final results = <Tuple2<File, dynamic>>[];
for (final f in files) { for (final f in files) {
@ -33,8 +33,8 @@ class ShareHandler {
} on PermissionException catch (_) { } on PermissionException catch (_) {
_log.warning("[shareFiles] Permission not granted"); _log.warning("[shareFiles] Permission not granted");
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content:
.downloadFailureNoPermissionNotification), Text(L10n.of(context).downloadFailureNoPermissionNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
// dismiss the dialog // dismiss the dialog

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/exception_util.dart' as exception_util;
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
@ -48,7 +48,7 @@ class _AccountPickerDialogState extends State<AccountPickerDialog> {
Icons.close, Icons.close,
color: AppTheme.getSecondaryTextColor(context), color: AppTheme.getSecondaryTextColor(context),
), ),
tooltip: AppLocalizations.of(context)!.deleteTooltip, tooltip: L10n.of(context).deleteTooltip,
onPressed: () => _onRemoveItemPressed(a), onPressed: () => _onRemoveItemPressed(a),
), ),
), ),
@ -63,7 +63,7 @@ class _AccountPickerDialogState extends State<AccountPickerDialog> {
..pushNamed(SignIn.routeName); ..pushNamed(SignIn.routeName);
}, },
child: Tooltip( child: Tooltip(
message: AppLocalizations.of(context)!.addServerTooltip, message: L10n.of(context).addServerTooltip,
child: Center( child: Center(
child: Icon( child: Icon(
Icons.add, Icons.add,
@ -89,7 +89,7 @@ class _AccountPickerDialogState extends State<AccountPickerDialog> {
Icons.edit, Icons.edit,
color: AppTheme.getSecondaryTextColor(context), color: AppTheme.getSecondaryTextColor(context),
), ),
tooltip: AppLocalizations.of(context)!.editTooltip, tooltip: L10n.of(context).editTooltip,
onPressed: () => _onEditPressed(), onPressed: () => _onEditPressed(),
), ),
), ),
@ -112,8 +112,8 @@ class _AccountPickerDialogState extends State<AccountPickerDialog> {
_accounts = Pref.inst().getAccounts()!; _accounts = Pref.inst().getAccounts()!;
}); });
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content:
.removeServerSuccessNotification(account.url)), Text(L10n.of(context).removeServerSuccessNotification(account.url)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} catch (e) { } catch (e) {
@ -143,8 +143,8 @@ class _AccountPickerDialogState extends State<AccountPickerDialog> {
// the app passwords are unique to each entry, but just in case // the app passwords are unique to each entry, but just in case
Navigator.of(context).pop(); Navigator.of(context).pop();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content:
.editAccountConflictFailureNotification), Text(L10n.of(context).editAccountConflictFailureNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
return; return;

View file

@ -1,10 +1,10 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/iterable_extension.dart'; import 'package:nc_photos/iterable_extension.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
@ -86,7 +86,7 @@ class _AlbumDirPickerState extends State<AlbumDirPicker>
child: Column( child: Column(
children: [ children: [
Text( Text(
AppLocalizations.of(context)!.albumDirPickerHeaderText, L10n.of(context).albumDirPickerHeaderText,
style: Theme.of(context).textTheme.headline5, style: Theme.of(context).textTheme.headline5,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
@ -94,7 +94,7 @@ class _AlbumDirPickerState extends State<AlbumDirPicker>
Align( Align(
alignment: AlignmentDirectional.topStart, alignment: AlignmentDirectional.topStart,
child: Text( child: Text(
AppLocalizations.of(context)!.albumDirPickerSubHeaderText, L10n.of(context).albumDirPickerSubHeaderText,
), ),
), ),
], ],
@ -117,7 +117,7 @@ class _AlbumDirPickerState extends State<AlbumDirPicker>
), ),
ElevatedButton( ElevatedButton(
onPressed: () => _onConfirmPressed(context), onPressed: () => _onConfirmPressed(context),
child: Text(AppLocalizations.of(context)!.confirmButtonLabel), child: Text(L10n.of(context).confirmButtonLabel),
), ),
], ],
), ),
@ -131,8 +131,7 @@ class _AlbumDirPickerState extends State<AlbumDirPicker>
final picked = getPickedDirs(); final picked = getPickedDirs();
if (picked.isEmpty) { if (picked.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).albumDirPickerListEmptyNotification),
AppLocalizations.of(context)!.albumDirPickerListEmptyNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} else { } else {

View file

@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/list_importable_album.dart'; import 'package:nc_photos/bloc/list_importable_album.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/cover_provider.dart'; import 'package:nc_photos/entity/album/cover_provider.dart';
@ -102,7 +102,7 @@ class _AlbumImporterState extends State<AlbumImporter> {
child: Column( child: Column(
children: [ children: [
Text( Text(
AppLocalizations.of(context)!.albumImporterHeaderText, L10n.of(context).albumImporterHeaderText,
style: Theme.of(context).textTheme.headline5, style: Theme.of(context).textTheme.headline5,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
@ -110,7 +110,7 @@ class _AlbumImporterState extends State<AlbumImporter> {
Align( Align(
alignment: AlignmentDirectional.topStart, alignment: AlignmentDirectional.topStart,
child: Text( child: Text(
AppLocalizations.of(context)!.albumImporterSubHeaderText, L10n.of(context).albumImporterSubHeaderText,
), ),
), ),
], ],
@ -145,7 +145,7 @@ class _AlbumImporterState extends State<AlbumImporter> {
), ),
ElevatedButton( ElevatedButton(
onPressed: () => _onImportPressed(context), onPressed: () => _onImportPressed(context),
child: Text(AppLocalizations.of(context)!.importButtonLabel), child: Text(L10n.of(context).importButtonLabel),
), ),
], ],
), ),
@ -217,8 +217,8 @@ class _AlbumImporterState extends State<AlbumImporter> {
showDialog( showDialog(
barrierDismissible: false, barrierDismissible: false,
context: context, context: context,
builder: (context) => ProcessingDialog( builder: (context) =>
text: AppLocalizations.of(context)!.albumImporterProgressText), ProcessingDialog(text: L10n.of(context).albumImporterProgressText),
); );
try { try {
await _createAllAlbums(context); await _createAllAlbums(context);

View file

@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/list_album.dart'; import 'package:nc_photos/bloc/list_album.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/provider.dart';
@ -81,7 +81,7 @@ class _AlbumPickerDialogState extends State<AlbumPickerDialog> {
SimpleDialogOption( SimpleDialogOption(
onPressed: () => _onNewAlbumPressed(context), onPressed: () => _onNewAlbumPressed(context),
child: Tooltip( child: Tooltip(
message: AppLocalizations.of(context)!.createAlbumTooltip, message: L10n.of(context).createAlbumTooltip,
child: Center( child: Center(
child: Icon( child: Icon(
Icons.add, Icons.add,

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/album_search.dart'; import 'package:nc_photos/bloc/album_search.dart';
import 'package:nc_photos/bloc/album_search_suggestion.dart'; import 'package:nc_photos/bloc/album_search_suggestion.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
@ -17,8 +17,7 @@ import 'package:nc_photos/widget/builder/album_grid_item_builder.dart';
class AlbumSearchDelegate extends SearchDelegate { class AlbumSearchDelegate extends SearchDelegate {
AlbumSearchDelegate(BuildContext context, this.account) AlbumSearchDelegate(BuildContext context, this.account)
: super( : super(
searchFieldLabel: searchFieldLabel: L10n.of(context).albumSearchTextFieldHint,
AppLocalizations.of(context)!.albumSearchTextFieldHint,
) { ) {
final fileRepo = FileRepo(FileCachedDataSource()); final fileRepo = FileRepo(FileCachedDataSource());
final albumRepo = AlbumRepo(AlbumCachedDataSource()); final albumRepo = AlbumRepo(AlbumCachedDataSource());
@ -38,7 +37,7 @@ class AlbumSearchDelegate extends SearchDelegate {
return [ return [
IconButton( IconButton(
icon: Icon(Icons.clear), icon: Icon(Icons.clear),
tooltip: AppLocalizations.of(context)!.clearTooltip, tooltip: L10n.of(context).clearTooltip,
onPressed: () { onPressed: () {
query = ""; query = "";
}, },
@ -88,7 +87,7 @@ class AlbumSearchDelegate extends SearchDelegate {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
AppLocalizations.of(context)!.listNoResultsText, L10n.of(context).listNoResultsText,
style: const TextStyle(fontSize: 24), style: const TextStyle(fontSize: 24),
), ),
], ],

View file

@ -1,11 +1,11 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/item.dart'; import 'package:nc_photos/entity/album/item.dart';
import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/provider.dart';
@ -107,8 +107,7 @@ class _AlbumViewerState extends State<AlbumViewer>
if (!SessionStorage().hasShowDragRearrangeNotification) { if (!SessionStorage().hasShowDragRearrangeNotification) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).albumEditDragRearrangeNotification),
AppLocalizations.of(context)!.albumEditDragRearrangeNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
SessionStorage().hasShowDragRearrangeNotification = true; SessionStorage().hasShowDragRearrangeNotification = true;
@ -230,14 +229,14 @@ class _AlbumViewerState extends State<AlbumViewer>
if (platform_k.isAndroid) if (platform_k.isAndroid)
IconButton( IconButton(
icon: const Icon(Icons.share), icon: const Icon(Icons.share),
tooltip: AppLocalizations.of(context)!.shareSelectedTooltip, tooltip: L10n.of(context).shareSelectedTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarSharePressed(context); _onSelectionAppBarSharePressed(context);
}, },
), ),
IconButton( IconButton(
icon: const Icon(Icons.remove), icon: const Icon(Icons.remove),
tooltip: AppLocalizations.of(context)!.removeSelectedFromAlbumTooltip, tooltip: L10n.of(context).removeSelectedFromAlbumTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarRemovePressed(); _onSelectionAppBarRemovePressed();
}, },
@ -249,12 +248,12 @@ class _AlbumViewerState extends State<AlbumViewer>
return buildEditAppBar(context, widget.account, widget.album, actions: [ return buildEditAppBar(context, widget.account, widget.album, actions: [
IconButton( IconButton(
icon: Icon(Icons.text_fields), icon: Icon(Icons.text_fields),
tooltip: AppLocalizations.of(context)!.albumAddTextTooltip, tooltip: L10n.of(context).albumAddTextTooltip,
onPressed: _onEditAppBarAddTextPressed, onPressed: _onEditAppBarAddTextPressed,
), ),
IconButton( IconButton(
icon: Icon(Icons.sort_by_alpha), icon: Icon(Icons.sort_by_alpha),
tooltip: AppLocalizations.of(context)!.sortTooltip, tooltip: L10n.of(context).sortTooltip,
onPressed: _onEditAppBarSortPressed, onPressed: _onEditAppBarSortPressed,
), ),
]); ]);
@ -282,8 +281,7 @@ class _AlbumViewerState extends State<AlbumViewer>
.toList(); .toList();
if (selected.isEmpty) { if (selected.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: content: Text(L10n.of(context).shareSelectedEmptyNotification),
Text(AppLocalizations.of(context)!.shareSelectedEmptyNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
return; return;
@ -312,7 +310,7 @@ class _AlbumViewerState extends State<AlbumViewer>
); );
UpdateAlbum(albumRepo)(widget.account, newAlbum).then((_) { UpdateAlbum(albumRepo)(widget.account, newAlbum).then((_) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.removeSelectedFromAlbumSuccessNotification( .removeSelectedFromAlbumSuccessNotification(
selectedIndexes.length)), selectedIndexes.length)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
@ -327,7 +325,7 @@ class _AlbumViewerState extends State<AlbumViewer>
stacktrace); stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(
"${AppLocalizations.of(context)!.removeSelectedFromAlbumFailureNotification}: " "${L10n.of(context).removeSelectedFromAlbumFailureNotification}: "
"${exception_util.toUserString(e, context)}"), "${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
@ -342,10 +340,10 @@ class _AlbumViewerState extends State<AlbumViewer>
showDialog( showDialog(
context: context, context: context,
builder: (context) => FancyOptionPicker( builder: (context) => FancyOptionPicker(
title: AppLocalizations.of(context)!.sortOptionDialogTitle, title: L10n.of(context).sortOptionDialogTitle,
items: [ items: [
FancyOptionPickerItem( FancyOptionPickerItem(
label: AppLocalizations.of(context)!.sortOptionTimeAscendingLabel, label: L10n.of(context).sortOptionTimeAscendingLabel,
isSelected: sortProvider is AlbumTimeSortProvider && isSelected: sortProvider is AlbumTimeSortProvider &&
sortProvider.isAscending, sortProvider.isAscending,
onSelect: () { onSelect: () {
@ -354,7 +352,7 @@ class _AlbumViewerState extends State<AlbumViewer>
}, },
), ),
FancyOptionPickerItem( FancyOptionPickerItem(
label: AppLocalizations.of(context)!.sortOptionTimeDescendingLabel, label: L10n.of(context).sortOptionTimeDescendingLabel,
isSelected: sortProvider is AlbumTimeSortProvider && isSelected: sortProvider is AlbumTimeSortProvider &&
!sortProvider.isAscending, !sortProvider.isAscending,
onSelect: () { onSelect: () {
@ -878,7 +876,7 @@ class _EditLabelListItem extends _LabelListItem {
end: 0, end: 0,
child: IconButton( child: IconButton(
icon: Icon(Icons.edit), icon: Icon(Icons.edit),
tooltip: AppLocalizations.of(context)!.editTooltip, tooltip: L10n.of(context).editTooltip,
onPressed: onEditPressed, onPressed: onEditPressed,
), ),
), ),

View file

@ -1,11 +1,11 @@
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api.dart'; import 'package:nc_photos/api/api.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
@ -55,7 +55,7 @@ mixin AlbumViewerMixin<T extends StatefulWidget>
actions: [ actions: [
PopupMenuButton( PopupMenuButton(
icon: const Icon(Icons.photo_size_select_large), icon: const Icon(Icons.photo_size_select_large),
tooltip: AppLocalizations.of(context)!.zoomTooltip, tooltip: L10n.of(context).zoomTooltip,
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuZoom( PopupMenuZoom(
initialValue: _thumbZoomLevel, initialValue: _thumbZoomLevel,
@ -76,7 +76,7 @@ mixin AlbumViewerMixin<T extends StatefulWidget>
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuItem( PopupMenuItem(
value: -1, value: -1,
child: Text(AppLocalizations.of(context)!.editAlbumMenuLabel), child: Text(L10n.of(context).editAlbumMenuLabel),
), ),
...(menuItemBuilder?.call(context) ?? []), ...(menuItemBuilder?.call(context) ?? []),
], ],
@ -117,8 +117,8 @@ mixin AlbumViewerMixin<T extends StatefulWidget>
}); });
}, },
), ),
title: Text(AppLocalizations.of(context)! title: Text(
.selectionAppBarTitle(selectedListItems.length)), L10n.of(context).selectionAppBarTitle(selectedListItems.length)),
actions: actions, actions: actions,
), ),
); );
@ -138,13 +138,13 @@ mixin AlbumViewerMixin<T extends StatefulWidget>
background: _getAppBarCover(context, account), background: _getAppBarCover(context, account),
title: TextFormField( title: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: AppLocalizations.of(context)!.nameInputHint, hintText: L10n.of(context).nameInputHint,
), ),
validator: (value) { validator: (value) {
if (value?.isNotEmpty == true) { if (value?.isNotEmpty == true) {
return null; return null;
} else { } else {
return AppLocalizations.of(context)!.albumNameInputInvalidEmpty; return L10n.of(context).albumNameInputInvalidEmpty;
} }
}, },
onSaved: (value) { onSaved: (value) {
@ -164,7 +164,7 @@ mixin AlbumViewerMixin<T extends StatefulWidget>
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.check), icon: const Icon(Icons.check),
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
tooltip: AppLocalizations.of(context)!.doneButtonTooltip, tooltip: L10n.of(context).doneButtonTooltip,
onPressed: () { onPressed: () {
if (validateEditMode()) { if (validateEditMode()) {
setState(() { setState(() {

View file

@ -2,11 +2,11 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/scan_dir.dart'; import 'package:nc_photos/bloc/scan_dir.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/file/data_source.dart'; import 'package:nc_photos/entity/file/data_source.dart';
@ -148,12 +148,12 @@ class _ArchiveViewerState extends State<ArchiveViewer>
}); });
}, },
), ),
title: Text(AppLocalizations.of(context)! title: Text(
.selectionAppBarTitle(selectedListItems.length)), L10n.of(context).selectionAppBarTitle(selectedListItems.length)),
actions: [ actions: [
IconButton( IconButton(
icon: const Icon(Icons.unarchive), icon: const Icon(Icons.unarchive),
tooltip: AppLocalizations.of(context)!.unarchiveSelectedTooltip, tooltip: L10n.of(context).unarchiveSelectedTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarUnarchivePressed(); _onSelectionAppBarUnarchivePressed();
}, },
@ -165,12 +165,12 @@ class _ArchiveViewerState extends State<ArchiveViewer>
Widget _buildNormalAppBar(BuildContext context) { Widget _buildNormalAppBar(BuildContext context) {
return SliverAppBar( return SliverAppBar(
title: Text(AppLocalizations.of(context)!.albumArchiveLabel), title: Text(L10n.of(context).albumArchiveLabel),
floating: true, floating: true,
actions: [ actions: [
PopupMenuButton( PopupMenuButton(
icon: const Icon(Icons.photo_size_select_large), icon: const Icon(Icons.photo_size_select_large),
tooltip: AppLocalizations.of(context)!.zoomTooltip, tooltip: L10n.of(context).zoomTooltip,
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuZoom( PopupMenuZoom(
initialValue: _thumbZoomLevel, initialValue: _thumbZoomLevel,
@ -212,7 +212,7 @@ class _ArchiveViewerState extends State<ArchiveViewer>
Future<void> _onSelectionAppBarUnarchivePressed() async { Future<void> _onSelectionAppBarUnarchivePressed() async {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.unarchiveSelectedProcessingNotification(selectedListItems.length)), .unarchiveSelectedProcessingNotification(selectedListItems.length)),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
@ -240,13 +240,12 @@ class _ArchiveViewerState extends State<ArchiveViewer>
} }
if (failures.isEmpty) { if (failures.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).unarchiveSelectedSuccessNotification),
AppLocalizations.of(context)!.unarchiveSelectedSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.unarchiveSelectedFailureNotification(failures.length)), .unarchiveSelectedFailureNotification(failures.length)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));

View file

@ -1,10 +1,10 @@
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api.dart'; import 'package:nc_photos/api/api.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/provider.dart';
import 'package:nc_photos/theme.dart'; import 'package:nc_photos/theme.dart';
@ -24,7 +24,7 @@ class AlbumGridItemBuilder {
var subtitle = ""; var subtitle = "";
String? subtitle2; String? subtitle2;
if (album.provider is AlbumStaticProvider) { if (album.provider is AlbumStaticProvider) {
subtitle = AppLocalizations.of(context)! subtitle = L10n.of(context)
.albumSize(AlbumStaticProvider.of(album).items.length); .albumSize(AlbumStaticProvider.of(album).items.length);
} else if (album.provider is AlbumDirProvider) { } else if (album.provider is AlbumDirProvider) {
final provider = album.provider as AlbumDirProvider; final provider = album.provider as AlbumDirProvider;

View file

@ -4,9 +4,9 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/app_password_exchange.dart'; import 'package:nc_photos/bloc/app_password_exchange.dart';
import 'package:nc_photos/exception.dart'; import 'package:nc_photos/exception.dart';
import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/exception_util.dart' as exception_util;
@ -86,8 +86,7 @@ class _ConnectState extends State<Connect> {
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
Text( Text(
AppLocalizations.of(context)! L10n.of(context).connectingToServer(widget.account.url),
.connectingToServer(widget.account.url),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
) )
@ -110,7 +109,7 @@ class _ConnectState extends State<Connect> {
} else if (state.exception is ApiException && } else if (state.exception is ApiException &&
(state.exception as ApiException).response.statusCode == 401) { (state.exception as ApiException).response.statusCode == 401) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)!.errorWrongPassword), content: Text(L10n.of(context).errorWrongPassword),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
Navigator.of(context).pop(null); Navigator.of(context).pop(null);
@ -128,9 +127,8 @@ class _ConnectState extends State<Connect> {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(AppLocalizations.of(context)!.serverCertErrorDialogTitle), title: Text(L10n.of(context).serverCertErrorDialogTitle),
content: content: Text(L10n.of(context).serverCertErrorDialogContent),
Text(AppLocalizations.of(context)!.serverCertErrorDialogContent),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () { onPressed: () {
@ -142,7 +140,7 @@ class _ConnectState extends State<Connect> {
onPressed: () { onPressed: () {
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}, },
child: Text(AppLocalizations.of(context)!.advancedButtonLabel), child: Text(L10n.of(context).advancedButtonLabel),
), ),
], ],
), ),
@ -154,11 +152,10 @@ class _ConnectState extends State<Connect> {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(AppLocalizations.of(context)!.whitelistCertDialogTitle), title: Text(L10n.of(context).whitelistCertDialogTitle),
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context).whitelistCertDialogContent(
.whitelistCertDialogContent( SelfSignedCertManager().getLastBadCertHost(),
SelfSignedCertManager().getLastBadCertHost(), SelfSignedCertManager().getLastBadCertFingerprint())),
SelfSignedCertManager().getLastBadCertFingerprint())),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () { onPressed: () {
@ -170,8 +167,7 @@ class _ConnectState extends State<Connect> {
onPressed: () { onPressed: () {
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}, },
child: child: Text(L10n.of(context).whitelistCertButtonLabel),
Text(AppLocalizations.of(context)!.whitelistCertButtonLabel),
), ),
], ],
), ),

View file

@ -4,9 +4,9 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/ls_dir.dart'; import 'package:nc_photos/bloc/ls_dir.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/exception_util.dart' as exception_util;
@ -99,8 +99,7 @@ mixin DirPickerMixin<T extends StatefulWidget> on State<T> {
return ListTile( return ListTile(
dense: true, dense: true,
leading: const SizedBox(width: 24), leading: const SizedBox(width: 24),
title: Text( title: Text(L10n.of(context).rootPickerNavigateUpItemText),
AppLocalizations.of(context)!.rootPickerNavigateUpItemText),
onTap: () { onTap: () {
try { try {
_navigateInto(File(path: path.dirname(_currentPath))); _navigateInto(File(path: path.dirname(_currentPath)));
@ -283,8 +282,8 @@ mixin DirPickerMixin<T extends StatefulWidget> on State<T> {
_picks.removeWhere((element) => identical(element, parent)); _picks.removeWhere((element) => identical(element, parent));
} catch (_) { } catch (_) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content:
.rootPickerUnpickFailureNotification))); Text(L10n.of(context).rootPickerUnpickFailureNotification)));
} }
} }
}); });

View file

@ -1,11 +1,11 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/cover_provider.dart'; import 'package:nc_photos/entity/album/cover_provider.dart';
import 'package:nc_photos/entity/album/item.dart'; import 'package:nc_photos/entity/album/item.dart';
@ -250,7 +250,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
menuItemBuilder: (context) => [ menuItemBuilder: (context) => [
PopupMenuItem( PopupMenuItem(
value: _menuValueConvertBasic, value: _menuValueConvertBasic,
child: Text(AppLocalizations.of(context)!.convertBasicAlbumMenuLabel), child: Text(L10n.of(context).convertBasicAlbumMenuLabel),
), ),
], ],
onSelectedMenuItem: (option) { onSelectedMenuItem: (option) {
@ -272,7 +272,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
if (platform_k.isAndroid) if (platform_k.isAndroid)
IconButton( IconButton(
icon: const Icon(Icons.share), icon: const Icon(Icons.share),
tooltip: AppLocalizations.of(context)!.shareSelectedTooltip, tooltip: L10n.of(context).shareSelectedTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarSharePressed(context); _onSelectionAppBarSharePressed(context);
}, },
@ -282,7 +282,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuItem( PopupMenuItem(
value: _SelectionAppBarOption.delete, value: _SelectionAppBarOption.delete,
child: Text(AppLocalizations.of(context)!.deleteSelectedTooltip), child: Text(L10n.of(context).deleteSelectedTooltip),
), ),
], ],
onSelected: (option) { onSelected: (option) {
@ -298,7 +298,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
return buildEditAppBar(context, widget.account, widget.album, actions: [ return buildEditAppBar(context, widget.account, widget.album, actions: [
IconButton( IconButton(
icon: Icon(Icons.sort_by_alpha), icon: Icon(Icons.sort_by_alpha),
tooltip: AppLocalizations.of(context)!.sortTooltip, tooltip: L10n.of(context).sortTooltip,
onPressed: _onEditAppBarSortPressed, onPressed: _onEditAppBarSortPressed,
), ),
]); ]);
@ -322,10 +322,9 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(AppLocalizations.of(context)! title: Text(L10n.of(context).convertBasicAlbumConfirmationDialogTitle),
.convertBasicAlbumConfirmationDialogTitle), content:
content: Text(AppLocalizations.of(context)! Text(L10n.of(context).convertBasicAlbumConfirmationDialogContent),
.convertBasicAlbumConfirmationDialogContent),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () { onPressed: () {
@ -356,8 +355,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
), ),
).then((value) { ).then((value) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context).convertBasicAlbumSuccessNotification),
.convertBasicAlbumSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
if (mounted) { if (mounted) {
@ -391,7 +389,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
void _onSelectionAppBarDeletePressed() async { void _onSelectionAppBarDeletePressed() async {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.deleteSelectedProcessingNotification(selectedListItems.length)), .deleteSelectedProcessingNotification(selectedListItems.length)),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
@ -421,13 +419,12 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
if (failures.isEmpty) { if (failures.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).deleteSelectedSuccessNotification),
AppLocalizations.of(context)!.deleteSelectedSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.deleteSelectedFailureNotification(failures.length)), .deleteSelectedFailureNotification(failures.length)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
@ -448,10 +445,10 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
showDialog( showDialog(
context: context, context: context,
builder: (context) => FancyOptionPicker( builder: (context) => FancyOptionPicker(
title: AppLocalizations.of(context)!.sortOptionDialogTitle, title: L10n.of(context).sortOptionDialogTitle,
items: [ items: [
FancyOptionPickerItem( FancyOptionPickerItem(
label: AppLocalizations.of(context)!.sortOptionTimeAscendingLabel, label: L10n.of(context).sortOptionTimeAscendingLabel,
isSelected: sortProvider is AlbumTimeSortProvider && isSelected: sortProvider is AlbumTimeSortProvider &&
sortProvider.isAscending, sortProvider.isAscending,
onSelect: () { onSelect: () {
@ -460,7 +457,7 @@ class _DynamicAlbumViewerState extends State<DynamicAlbumViewer>
}, },
), ),
FancyOptionPickerItem( FancyOptionPickerItem(
label: AppLocalizations.of(context)!.sortOptionTimeDescendingLabel, label: L10n.of(context).sortOptionTimeDescendingLabel,
isSelected: sortProvider is AlbumTimeSortProvider && isSelected: sortProvider is AlbumTimeSortProvider &&
!sortProvider.isAscending, !sortProvider.isAscending,
onSelect: () { onSelect: () {

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/theme.dart'; import 'package:nc_photos/theme.dart';
import 'package:nc_photos/widget/home_albums.dart'; import 'package:nc_photos/widget/home_albums.dart';
@ -52,11 +52,11 @@ class _HomeState extends State<Home> {
items: <BottomNavigationBarItem>[ items: <BottomNavigationBarItem>[
BottomNavigationBarItem( BottomNavigationBarItem(
icon: const Icon(Icons.photo_outlined), icon: const Icon(Icons.photo_outlined),
label: AppLocalizations.of(context)!.photosTabLabel, label: L10n.of(context).photosTabLabel,
), ),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: const Icon(Icons.photo_album_outlined), icon: const Icon(Icons.photo_album_outlined),
label: AppLocalizations.of(context)!.albumsTabLabel, label: L10n.of(context).albumsTabLabel,
), ),
], ],
currentIndex: _nextPage, currentIndex: _nextPage,

View file

@ -2,11 +2,11 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/list_album.dart'; import 'package:nc_photos/bloc/list_album.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/provider.dart';
@ -149,12 +149,12 @@ class _HomeAlbumsState extends State<HomeAlbums>
}); });
}, },
), ),
title: Text(AppLocalizations.of(context)! title:
.selectionAppBarTitle(_selectedItems.length)), Text(L10n.of(context).selectionAppBarTitle(_selectedItems.length)),
actions: [ actions: [
IconButton( IconButton(
icon: const Icon(Icons.delete), icon: const Icon(Icons.delete),
tooltip: AppLocalizations.of(context)!.deleteSelectedTooltip, tooltip: L10n.of(context).deleteSelectedTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarDeletePressed(); _onSelectionAppBarDeletePressed();
}, },
@ -171,13 +171,13 @@ class _HomeAlbumsState extends State<HomeAlbums>
IconButton( IconButton(
onPressed: () => _onSearchPressed(context), onPressed: () => _onSearchPressed(context),
icon: const Icon(Icons.search), icon: const Icon(Icons.search),
tooltip: AppLocalizations.of(context)!.searchTooltip, tooltip: L10n.of(context).searchTooltip,
), ),
], ],
menuActions: [ menuActions: [
PopupMenuItem( PopupMenuItem(
value: _menuValueImport, value: _menuValueImport,
child: Text(AppLocalizations.of(context)!.importFoldersTooltip), child: Text(L10n.of(context).importFoldersTooltip),
), ),
], ],
onSelectedMenuActions: (option) { onSelectedMenuActions: (option) {
@ -225,7 +225,7 @@ class _HomeAlbumsState extends State<HomeAlbums>
), ),
), ),
), ),
title: AppLocalizations.of(context)!.albumArchiveLabel, title: L10n.of(context).albumArchiveLabel,
onTap: () { onTap: () {
Navigator.of(context).pushNamed(ArchiveViewer.routeName, Navigator.of(context).pushNamed(ArchiveViewer.routeName,
arguments: ArchiveViewerArguments(widget.account)); arguments: ArchiveViewerArguments(widget.account));
@ -247,7 +247,7 @@ class _HomeAlbumsState extends State<HomeAlbums>
), ),
), ),
), ),
title: AppLocalizations.of(context)!.createAlbumTooltip, title: L10n.of(context).createAlbumTooltip,
onTap: () => _onNewAlbumItemTap(context), onTap: () => _onNewAlbumItemTap(context),
); );
} }
@ -323,8 +323,7 @@ class _HomeAlbumsState extends State<HomeAlbums>
_log.severe( _log.severe(
"[_onNewAlbumItemTap] Failed while showDialog", e, stacktrace); "[_onNewAlbumItemTap] Failed while showDialog", e, stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: content: Text(L10n.of(context).createAlbumFailureNotification),
Text(AppLocalizations.of(context)!.createAlbumFailureNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
}); });
@ -337,7 +336,7 @@ class _HomeAlbumsState extends State<HomeAlbums>
Future<void> _onSelectionAppBarDeletePressed() async { Future<void> _onSelectionAppBarDeletePressed() async {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.deleteSelectedProcessingNotification(_selectedItems.length)), .deleteSelectedProcessingNotification(_selectedItems.length)),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
@ -363,13 +362,12 @@ class _HomeAlbumsState extends State<HomeAlbums>
} }
if (failures.isEmpty) { if (failures.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).deleteSelectedSuccessNotification),
AppLocalizations.of(context)!.deleteSelectedSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.deleteSelectedFailureNotification(failures.length)), .deleteSelectedFailureNotification(failures.length)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));

View file

@ -1,9 +1,9 @@
import 'package:event_bus/event_bus.dart'; import 'package:event_bus/event_bus.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/event.dart';
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
import 'package:nc_photos/theme.dart'; import 'package:nc_photos/theme.dart';
@ -97,8 +97,7 @@ class HomeSliverAppBar extends StatelessWidget {
[ [
PopupMenuItem( PopupMenuItem(
value: _menuValueAbout, value: _menuValueAbout,
child: child: Text(L10n.of(context).settingsMenuLabel),
Text(AppLocalizations.of(context)!.settingsMenuLabel),
), ),
], ],
onSelected: (option) { onSelected: (option) {

View file

@ -3,13 +3,13 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/scan_dir.dart'; import 'package:nc_photos/bloc/scan_dir.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/item.dart'; import 'package:nc_photos/entity/album/item.dart';
@ -162,20 +162,20 @@ class _HomePhotosState extends State<HomePhotos>
}); });
}, },
), ),
title: Text(AppLocalizations.of(context)! title: Text(
.selectionAppBarTitle(selectedListItems.length)), L10n.of(context).selectionAppBarTitle(selectedListItems.length)),
actions: [ actions: [
if (platform_k.isAndroid) if (platform_k.isAndroid)
IconButton( IconButton(
icon: const Icon(Icons.share), icon: const Icon(Icons.share),
tooltip: AppLocalizations.of(context)!.shareSelectedTooltip, tooltip: L10n.of(context).shareSelectedTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarSharePressed(context); _onSelectionAppBarSharePressed(context);
}, },
), ),
IconButton( IconButton(
icon: const Icon(Icons.playlist_add), icon: const Icon(Icons.playlist_add),
tooltip: AppLocalizations.of(context)!.addSelectedToAlbumTooltip, tooltip: L10n.of(context).addSelectedToAlbumTooltip,
onPressed: () { onPressed: () {
_onSelectionAppBarAddToAlbumPressed(context); _onSelectionAppBarAddToAlbumPressed(context);
}, },
@ -185,13 +185,11 @@ class _HomePhotosState extends State<HomePhotos>
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuItem( PopupMenuItem(
value: _SelectionAppBarMenuOption.archive, value: _SelectionAppBarMenuOption.archive,
child: Text( child: Text(L10n.of(context).archiveSelectedMenuLabel),
AppLocalizations.of(context)!.archiveSelectedMenuLabel),
), ),
PopupMenuItem( PopupMenuItem(
value: _SelectionAppBarMenuOption.delete, value: _SelectionAppBarMenuOption.delete,
child: child: Text(L10n.of(context).deleteSelectedTooltip),
Text(AppLocalizations.of(context)!.deleteSelectedTooltip),
), ),
], ],
onSelected: (option) { onSelected: (option) {
@ -213,7 +211,7 @@ class _HomePhotosState extends State<HomePhotos>
actions: [ actions: [
PopupMenuButton( PopupMenuButton(
icon: const Icon(Icons.photo_size_select_large), icon: const Icon(Icons.photo_size_select_large),
tooltip: AppLocalizations.of(context)!.zoomTooltip, tooltip: L10n.of(context).zoomTooltip,
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuZoom( PopupMenuZoom(
initialValue: _thumbZoomLevel, initialValue: _thumbZoomLevel,
@ -232,7 +230,7 @@ class _HomePhotosState extends State<HomePhotos>
menuActions: [ menuActions: [
PopupMenuItem( PopupMenuItem(
value: _menuValueRefresh, value: _menuValueRefresh,
child: Text(AppLocalizations.of(context)!.refreshMenuLabel), child: Text(L10n.of(context).refreshMenuLabel),
), ),
], ],
onSelectedMenuActions: (option) { onSelectedMenuActions: (option) {
@ -307,15 +305,14 @@ class _HomePhotosState extends State<HomePhotos>
clearSelectedItems(); clearSelectedItems();
}); });
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.addSelectedToAlbumSuccessNotification(value.name)), .addSelectedToAlbumSuccessNotification(value.name)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
}).catchError((_) {}); }).catchError((_) {});
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context).addSelectedToAlbumFailureNotification),
.addSelectedToAlbumFailureNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} }
@ -325,9 +322,9 @@ class _HomePhotosState extends State<HomePhotos>
e, e,
stacktrace); stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content:
"${AppLocalizations.of(context)!.addSelectedToAlbumFailureNotification}: " Text("${L10n.of(context).addSelectedToAlbumFailureNotification}: "
"${exception_util.toUserString(e, context)}"), "${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
}); });
@ -355,9 +352,9 @@ class _HomePhotosState extends State<HomePhotos>
_log.shout( _log.shout(
"[_addSelectedToAlbum] Failed while updating album", e, stacktrace); "[_addSelectedToAlbum] Failed while updating album", e, stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content:
"${AppLocalizations.of(context)!.addSelectedToAlbumFailureNotification}: " Text("${L10n.of(context).addSelectedToAlbumFailureNotification}: "
"${exception_util.toUserString(e, context)}"), "${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
rethrow; rethrow;
@ -366,7 +363,7 @@ class _HomePhotosState extends State<HomePhotos>
Future<void> _onSelectionAppBarDeletePressed(BuildContext context) async { Future<void> _onSelectionAppBarDeletePressed(BuildContext context) async {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.deleteSelectedProcessingNotification(selectedListItems.length)), .deleteSelectedProcessingNotification(selectedListItems.length)),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
@ -394,13 +391,12 @@ class _HomePhotosState extends State<HomePhotos>
} }
if (failures.isEmpty) { if (failures.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).deleteSelectedSuccessNotification),
AppLocalizations.of(context)!.deleteSelectedSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.deleteSelectedFailureNotification(failures.length)), .deleteSelectedFailureNotification(failures.length)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
@ -426,7 +422,7 @@ class _HomePhotosState extends State<HomePhotos>
Future<void> _onSelectionAppBarArchivePressed(BuildContext context) async { Future<void> _onSelectionAppBarArchivePressed(BuildContext context) async {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.archiveSelectedProcessingNotification(selectedListItems.length)), .archiveSelectedProcessingNotification(selectedListItems.length)),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
@ -454,13 +450,12 @@ class _HomePhotosState extends State<HomePhotos>
} }
if (failures.isEmpty) { if (failures.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).archiveSelectedSuccessNotification),
AppLocalizations.of(context)!.archiveSelectedSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context)
.archiveSelectedFailureNotification(failures.length)), .archiveSelectedFailureNotification(failures.length)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));

View file

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/event.dart';
import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/language_util.dart' as language_util;
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
@ -45,7 +45,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
@override @override
build(BuildContext context) { build(BuildContext context) {
return MaterialApp( return MaterialApp(
onGenerateTitle: (context) => AppLocalizations.of(context)!.appTitle, onGenerateTitle: (context) => L10n.of(context).appTitle,
theme: _getLightTheme(), theme: _getLightTheme(),
darkTheme: _getDarkTheme(), darkTheme: _getDarkTheme(),
themeMode: themeMode:

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/cover_provider.dart'; import 'package:nc_photos/entity/album/cover_provider.dart';
import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/provider.dart';
@ -40,7 +40,7 @@ class _NewAlbumDialogState extends State<NewAlbumDialog> {
return Visibility( return Visibility(
visible: _isVisible, visible: _isVisible,
child: AlertDialog( child: AlertDialog(
title: Text(AppLocalizations.of(context)!.createAlbumTooltip), title: Text(L10n.of(context).createAlbumTooltip),
content: Form( content: Form(
key: _formKey, key: _formKey,
child: Container( child: Container(
@ -51,12 +51,11 @@ class _NewAlbumDialogState extends State<NewAlbumDialog> {
children: [ children: [
TextFormField( TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: AppLocalizations.of(context)!.nameInputHint, hintText: L10n.of(context).nameInputHint,
), ),
validator: (value) { validator: (value) {
if (value!.isEmpty) { if (value!.isEmpty) {
return AppLocalizations.of(context)! return L10n.of(context).albumNameInputInvalidEmpty;
.albumNameInputInvalidEmpty;
} }
return null; return null;
}, },
@ -188,10 +187,10 @@ extension on _Provider {
String toValueString(BuildContext context) { String toValueString(BuildContext context) {
switch (this) { switch (this) {
case _Provider.static: case _Provider.static:
return AppLocalizations.of(context)!.createAlbumDialogBasicLabel; return L10n.of(context).createAlbumDialogBasicLabel;
case _Provider.dir: case _Provider.dir:
return AppLocalizations.of(context)!.createAlbumDialogFolderBasedLabel; return L10n.of(context).createAlbumDialogFolderBasedLabel;
default: default:
throw StateError("Unknown value: $this"); throw StateError("Unknown value: $this");
@ -201,11 +200,10 @@ extension on _Provider {
String toDescription(BuildContext context) { String toDescription(BuildContext context) {
switch (this) { switch (this) {
case _Provider.static: case _Provider.static:
return AppLocalizations.of(context)!.createAlbumDialogBasicDescription; return L10n.of(context).createAlbumDialogBasicDescription;
case _Provider.dir: case _Provider.dir:
return AppLocalizations.of(context)! return L10n.of(context).createAlbumDialogFolderBasedDescription;
.createAlbumDialogFolderBasedDescription;
default: default:
throw StateError("Unknown value: $this"); throw StateError("Unknown value: $this");

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/num_extension.dart'; import 'package:nc_photos/num_extension.dart';
class PhotoDateTimeEditDialog extends StatefulWidget { class PhotoDateTimeEditDialog extends StatefulWidget {
@ -20,7 +20,7 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
@override @override
build(BuildContext context) { build(BuildContext context) {
return AlertDialog( return AlertDialog(
title: Text(AppLocalizations.of(context)!.updateDateTimeDialogTitle), title: Text(L10n.of(context).updateDateTimeDialogTitle),
content: Form( content: Form(
key: _formKey, key: _formKey,
child: Container( child: Container(
@ -29,7 +29,7 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
AppLocalizations.of(context)!.dateSubtitle, L10n.of(context).dateSubtitle,
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
), ),
Row( Row(
@ -37,8 +37,7 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
Flexible( Flexible(
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText: L10n.of(context).dateYearInputHint,
AppLocalizations.of(context)!.dateYearInputHint,
), ),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
validator: (value) { validator: (value) {
@ -46,8 +45,7 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
int.parse(value!); int.parse(value!);
return null; return null;
} catch (_) { } catch (_) {
return AppLocalizations.of(context)! return L10n.of(context).dateTimeInputInvalid;
.dateTimeInputInvalid;
} }
}, },
onSaved: (value) { onSaved: (value) {
@ -61,16 +59,14 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
Flexible( Flexible(
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText: L10n.of(context).dateMonthInputHint,
AppLocalizations.of(context)!.dateMonthInputHint,
), ),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
validator: (value) { validator: (value) {
if (int.tryParse(value!)?.inRange(1, 12) == true) { if (int.tryParse(value!)?.inRange(1, 12) == true) {
return null; return null;
} }
return AppLocalizations.of(context)! return L10n.of(context).dateTimeInputInvalid;
.dateTimeInputInvalid;
}, },
onSaved: (value) { onSaved: (value) {
_formValue.month = int.parse(value!); _formValue.month = int.parse(value!);
@ -85,16 +81,14 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
Flexible( Flexible(
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText: L10n.of(context).dateDayInputHint,
AppLocalizations.of(context)!.dateDayInputHint,
), ),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
validator: (value) { validator: (value) {
if (int.tryParse(value!)?.inRange(1, 31) == true) { if (int.tryParse(value!)?.inRange(1, 31) == true) {
return null; return null;
} }
return AppLocalizations.of(context)! return L10n.of(context).dateTimeInputInvalid;
.dateTimeInputInvalid;
}, },
onSaved: (value) { onSaved: (value) {
_formValue.day = int.parse(value!); _formValue.day = int.parse(value!);
@ -108,7 +102,7 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Text( Text(
AppLocalizations.of(context)!.timeSubtitle, L10n.of(context).timeSubtitle,
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
), ),
Row( Row(
@ -116,16 +110,14 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
Flexible( Flexible(
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText: L10n.of(context).timeHourInputHint,
AppLocalizations.of(context)!.timeHourInputHint,
), ),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
validator: (value) { validator: (value) {
if (int.tryParse(value!)?.inRange(0, 23) == true) { if (int.tryParse(value!)?.inRange(0, 23) == true) {
return null; return null;
} }
return AppLocalizations.of(context)! return L10n.of(context).dateTimeInputInvalid;
.dateTimeInputInvalid;
}, },
onSaved: (value) { onSaved: (value) {
_formValue.hour = int.parse(value!); _formValue.hour = int.parse(value!);
@ -140,16 +132,14 @@ class _PhotoDateTimeEditDialogState extends State<PhotoDateTimeEditDialog> {
Flexible( Flexible(
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText: L10n.of(context).timeMinuteInputHint,
AppLocalizations.of(context)!.timeMinuteInputHint,
), ),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
validator: (value) { validator: (value) {
if (int.tryParse(value!)?.inRange(0, 59) == true) { if (int.tryParse(value!)?.inRange(0, 59) == true) {
return null; return null;
} }
return AppLocalizations.of(context)! return L10n.of(context).dateTimeInputInvalid;
.dateTimeInputInvalid;
}, },
onSaved: (value) { onSaved: (value) {
_formValue.minute = int.parse(value!); _formValue.minute = int.parse(value!);

View file

@ -2,10 +2,10 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/api/api_util.dart' as api_util;
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/file/data_source.dart'; import 'package:nc_photos/entity/file/data_source.dart';
import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/exception_util.dart' as exception_util;
@ -105,7 +105,7 @@ class _RootPickerState extends State<RootPicker>
child: Column( child: Column(
children: [ children: [
Text( Text(
AppLocalizations.of(context)!.rootPickerHeaderText, L10n.of(context).rootPickerHeaderText,
style: Theme.of(context).textTheme.headline5, style: Theme.of(context).textTheme.headline5,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
@ -113,7 +113,7 @@ class _RootPickerState extends State<RootPicker>
Align( Align(
alignment: AlignmentDirectional.topStart, alignment: AlignmentDirectional.topStart,
child: Text( child: Text(
AppLocalizations.of(context)!.rootPickerSubHeaderText, L10n.of(context).rootPickerSubHeaderText,
), ),
), ),
], ],
@ -132,11 +132,11 @@ class _RootPickerState extends State<RootPicker>
children: [ children: [
TextButton( TextButton(
onPressed: () => _onSkipPressed(context), onPressed: () => _onSkipPressed(context),
child: Text(AppLocalizations.of(context)!.skipButtonLabel), child: Text(L10n.of(context).skipButtonLabel),
), ),
ElevatedButton( ElevatedButton(
onPressed: () => _onConfirmPressed(context), onPressed: () => _onConfirmPressed(context),
child: Text(AppLocalizations.of(context)!.confirmButtonLabel), child: Text(L10n.of(context).confirmButtonLabel),
), ),
], ],
), ),
@ -150,8 +150,8 @@ class _RootPickerState extends State<RootPicker>
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
content: Text(AppLocalizations.of(context)! content: Text(
.rootPickerSkipConfirmationDialogContent), L10n.of(context).rootPickerSkipConfirmationDialogContent),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () { onPressed: () {
@ -178,8 +178,7 @@ class _RootPickerState extends State<RootPicker>
final roots = getPickedDirs().map((e) => e.strippedPath).toList(); final roots = getPickedDirs().map((e) => e.strippedPath).toList();
if (roots.isEmpty) { if (roots.isEmpty) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: content: Text(L10n.of(context).rootPickerListEmptyNotification),
Text(AppLocalizations.of(context)!.rootPickerListEmptyNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
return; return;
@ -199,7 +198,7 @@ class _RootPickerState extends State<RootPicker>
barrierDismissible: false, barrierDismissible: false,
context: context, context: context,
builder: (context) => ProcessingDialog( builder: (context) => ProcessingDialog(
text: AppLocalizations.of(context)!.genericProcessingDialogContent), text: L10n.of(context).genericProcessingDialogContent),
); );
}); });
} }

View file

@ -4,9 +4,9 @@ import 'dart:math' as math;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/iterable_extension.dart'; import 'package:nc_photos/iterable_extension.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/platform/k.dart' as platform_k; import 'package:nc_photos/platform/k.dart' as platform_k;
@ -184,8 +184,8 @@ mixin SelectableItemStreamListMixin<T extends StatefulWidget> on State<T> {
if (!SessionStorage().hasShowRangeSelectNotification) { if (!SessionStorage().hasShowRangeSelectNotification) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(platform_k.isWeb content: Text(platform_k.isWeb
? AppLocalizations.of(context)!.webSelectRangeNotification ? L10n.of(context).webSelectRangeNotification
: AppLocalizations.of(context)!.mobileSelectRangeNotification), : L10n.of(context).mobileSelectRangeNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
SessionStorage().hasShowRangeSelectNotification = true; SessionStorage().hasShowRangeSelectNotification = true;

View file

@ -1,10 +1,10 @@
import 'package:event_bus/event_bus.dart'; import 'package:event_bus/event_bus.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/event.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/language_util.dart' as language_util;
@ -62,57 +62,51 @@ class _SettingsState extends State<Settings> {
} }
Widget _buildContent(BuildContext context) { Widget _buildContent(BuildContext context) {
final translator = AppLocalizations.of(context)!.translator; final translator = L10n.of(context).translator;
return CustomScrollView( return CustomScrollView(
slivers: [ slivers: [
SliverAppBar( SliverAppBar(
pinned: true, pinned: true,
title: Text(AppLocalizations.of(context)!.settingsWidgetTitle), title: Text(L10n.of(context).settingsWidgetTitle),
), ),
SliverList( SliverList(
delegate: SliverChildListDelegate( delegate: SliverChildListDelegate(
[ [
ListTile( ListTile(
title: title: Text(L10n.of(context).settingsLanguageTitle),
Text(AppLocalizations.of(context)!.settingsLanguageTitle),
subtitle: Text(language_util.getSelectedLanguageName(context)), subtitle: Text(language_util.getSelectedLanguageName(context)),
onTap: () => _onLanguageTap(context), onTap: () => _onLanguageTap(context),
), ),
SwitchListTile( SwitchListTile(
title: Text( title: Text(L10n.of(context).settingsExifSupportTitle),
AppLocalizations.of(context)!.settingsExifSupportTitle),
subtitle: _isEnableExif subtitle: _isEnableExif
? Text(AppLocalizations.of(context)! ? Text(L10n.of(context).settingsExifSupportTrueSubtitle)
.settingsExifSupportTrueSubtitle)
: null, : null,
value: _isEnableExif, value: _isEnableExif,
onChanged: (value) => _onExifSupportChanged(context, value), onChanged: (value) => _onExifSupportChanged(context, value),
), ),
_buildCaption(context, _buildCaption(
AppLocalizations.of(context)!.settingsAboutSectionTitle), context, L10n.of(context).settingsAboutSectionTitle),
ListTile( ListTile(
title: Text(AppLocalizations.of(context)!.settingsVersionTitle), title: Text(L10n.of(context).settingsVersionTitle),
subtitle: const Text(k.versionStr), subtitle: const Text(k.versionStr),
), ),
ListTile( ListTile(
title: title: Text(L10n.of(context).settingsSourceCodeTitle),
Text(AppLocalizations.of(context)!.settingsSourceCodeTitle),
subtitle: Text(_sourceRepo), subtitle: Text(_sourceRepo),
onTap: () async { onTap: () async {
await launch(_sourceRepo); await launch(_sourceRepo);
}, },
), ),
ListTile( ListTile(
title: title: Text(L10n.of(context).settingsBugReportTitle),
Text(AppLocalizations.of(context)!.settingsBugReportTitle),
onTap: () { onTap: () {
launch(_bugReportUrl); launch(_bugReportUrl);
}, },
), ),
if (translator.isNotEmpty) if (translator.isNotEmpty)
ListTile( ListTile(
title: Text( title: Text(L10n.of(context).settingsTranslatorTitle),
AppLocalizations.of(context)!.settingsTranslatorTitle),
subtitle: Text(translator), subtitle: Text(translator),
onTap: () { onTap: () {
launch(_translationUrl); launch(_translationUrl);
@ -176,9 +170,8 @@ class _SettingsState extends State<Settings> {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text( title: Text(L10n.of(context).exifSupportConfirmationDialogTitle),
AppLocalizations.of(context)!.exifSupportConfirmationDialogTitle), content: Text(L10n.of(context).exifSupportDetails),
content: Text(AppLocalizations.of(context)!.exifSupportDetails),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () { onPressed: () {
@ -190,7 +183,7 @@ class _SettingsState extends State<Settings> {
onPressed: () { onPressed: () {
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}, },
child: Text(AppLocalizations.of(context)!.enableButtonLabel), child: Text(L10n.of(context).enableButtonLabel),
), ),
], ],
), ),
@ -219,8 +212,7 @@ class _SettingsState extends State<Settings> {
} else { } else {
_log.severe("[_setExifSupport] Failed writing pref"); _log.severe("[_setExifSupport] Failed writing pref");
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).writePreferenceFailureNotification),
AppLocalizations.of(context)!.writePreferenceFailureNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
setState(() { setState(() {

View file

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
import 'package:nc_photos/theme.dart'; import 'package:nc_photos/theme.dart';
@ -31,7 +31,7 @@ class _SetupState extends State<Setup> {
PreferredSizeWidget _buildAppBar(BuildContext context) { PreferredSizeWidget _buildAppBar(BuildContext context) {
return AppBar( return AppBar(
title: Text(AppLocalizations.of(context)!.setupWidgetTitle), title: Text(L10n.of(context).setupWidgetTitle),
elevation: 0, elevation: 0,
); );
} }
@ -69,8 +69,7 @@ class _SetupState extends State<Setup> {
? [ ? [
ElevatedButton( ElevatedButton(
onPressed: _onDonePressed, onPressed: _onDonePressed,
child: Text( child: Text(L10n.of(context).doneButtonLabel),
AppLocalizations.of(context)!.doneButtonLabel),
), ),
] ]
: [ : [
@ -83,8 +82,7 @@ class _SetupState extends State<Setup> {
.getPageId()); .getPageId());
} }
}, },
child: Text( child: Text(L10n.of(context).nextButtonLabel),
AppLocalizations.of(context)!.nextButtonLabel),
), ),
], ],
), ),
@ -148,20 +146,19 @@ class _ExifState extends State<_Exif> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SwitchListTile( SwitchListTile(
title: Text(AppLocalizations.of(context)!.settingsExifSupportTitle), title: Text(L10n.of(context).settingsExifSupportTitle),
value: _isEnableExif, value: _isEnableExif,
onChanged: _onValueChanged, onChanged: _onValueChanged,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(AppLocalizations.of(context)!.exifSupportDetails), child: Text(L10n.of(context).exifSupportDetails),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text( child: Text(L10n.of(context).setupSettingsModifyLaterHint,
AppLocalizations.of(context)!.setupSettingsModifyLaterHint,
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
.bodyText2! .bodyText2!
@ -200,8 +197,7 @@ class _HiddenPrefDirNoticeState extends State<_HiddenPrefDirNotice> {
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text( child: Text(L10n.of(context).setupHiddenPrefDirNoticeDetail),
AppLocalizations.of(context)!.setupHiddenPrefDirNoticeDetail),
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
Align( Align(

View file

@ -1,9 +1,9 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/list_extension.dart'; import 'package:nc_photos/list_extension.dart';
import 'package:nc_photos/platform/k.dart' as platform_k; import 'package:nc_photos/platform/k.dart' as platform_k;
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
@ -49,7 +49,7 @@ class _SignInState extends State<SignIn> {
Padding( Padding(
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
child: Text( child: Text(
AppLocalizations.of(context)!.signInHeaderText, L10n.of(context).signInHeaderText,
style: Theme.of(context).textTheme.headline5, style: Theme.of(context).textTheme.headline5,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
@ -70,7 +70,7 @@ class _SignInState extends State<SignIn> {
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 32, vertical: 16), horizontal: 32, vertical: 16),
child: Text( child: Text(
AppLocalizations.of(context)!.signIn2faHintText, L10n.of(context).signIn2faHintText,
style: TextStyle(fontStyle: FontStyle.italic), style: TextStyle(fontStyle: FontStyle.italic),
), ),
), ),
@ -98,8 +98,7 @@ class _SignInState extends State<SignIn> {
_connect(); _connect();
} }
}, },
child: Text(AppLocalizations.of(context)! child: Text(L10n.of(context).connectButtonLabel),
.connectButtonLabel),
), ),
], ],
), ),
@ -159,14 +158,12 @@ class _SignInState extends State<SignIn> {
Expanded( Expanded(
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: hintText: L10n.of(context).serverAddressInputHint,
AppLocalizations.of(context)!.serverAddressInputHint,
), ),
keyboardType: TextInputType.url, keyboardType: TextInputType.url,
validator: (value) { validator: (value) {
if (value!.trim().trimRightAny("/").isEmpty) { if (value!.trim().trimRightAny("/").isEmpty) {
return AppLocalizations.of(context)! return L10n.of(context).serverAddressInputInvalidEmpty;
.serverAddressInputInvalidEmpty;
} }
return null; return null;
}, },
@ -180,11 +177,11 @@ class _SignInState extends State<SignIn> {
const SizedBox(height: 8), const SizedBox(height: 8),
TextFormField( TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: AppLocalizations.of(context)!.usernameInputHint, hintText: L10n.of(context).usernameInputHint,
), ),
validator: (value) { validator: (value) {
if (value!.trim().isEmpty) { if (value!.trim().isEmpty) {
return AppLocalizations.of(context)!.usernameInputInvalidEmpty; return L10n.of(context).usernameInputInvalidEmpty;
} }
return null; return null;
}, },
@ -195,12 +192,12 @@ class _SignInState extends State<SignIn> {
const SizedBox(height: 8), const SizedBox(height: 8),
TextFormField( TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: AppLocalizations.of(context)!.passwordInputHint, hintText: L10n.of(context).passwordInputHint,
), ),
obscureText: true, obscureText: true,
validator: (value) { validator: (value) {
if (value!.trim().isEmpty) { if (value!.trim().isEmpty) {
return AppLocalizations.of(context)!.passwordInputInvalidEmpty; return L10n.of(context).passwordInputInvalidEmpty;
} }
return null; return null;
}, },

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/changelog.dart' as changelog; import 'package:nc_photos/changelog.dart' as changelog;
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
@ -56,7 +56,7 @@ class _SplashState extends State<Splash> {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
AppLocalizations.of(context)!.appTitle, L10n.of(context).appTitle,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline4, style: Theme.of(context).textTheme.headline4,
) )
@ -94,7 +94,7 @@ class _SplashState extends State<Splash> {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(AppLocalizations.of(context)!.changelogTitle), title: Text(L10n.of(context).changelogTitle),
content: SingleChildScrollView( content: SingleChildScrollView(
child: Text(change), child: Text(change),
), ),

View file

@ -4,9 +4,9 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/file/data_source.dart'; import 'package:nc_photos/entity/file/data_source.dart';
@ -264,7 +264,7 @@ class _ViewerState extends State<Viewer> {
if (!_isDetailPaneActive && _canOpenDetailPane()) if (!_isDetailPaneActive && _canOpenDetailPane())
IconButton( IconButton(
icon: const Icon(Icons.more_vert), icon: const Icon(Icons.more_vert),
tooltip: AppLocalizations.of(context)!.detailsTooltip, tooltip: L10n.of(context).detailsTooltip,
onPressed: _onDetailsPressed, onPressed: _onDetailsPressed,
), ),
], ],
@ -311,7 +311,7 @@ class _ViewerState extends State<Viewer> {
Icons.share_outlined, Icons.share_outlined,
color: Colors.white.withOpacity(.87), color: Colors.white.withOpacity(.87),
), ),
tooltip: AppLocalizations.of(context)!.shareTooltip, tooltip: L10n.of(context).shareTooltip,
onPressed: () => _onSharePressed(context), onPressed: () => _onSharePressed(context),
), ),
), ),
@ -322,7 +322,7 @@ class _ViewerState extends State<Viewer> {
Icons.download_outlined, Icons.download_outlined,
color: Colors.white.withOpacity(.87), color: Colors.white.withOpacity(.87),
), ),
tooltip: AppLocalizations.of(context)!.downloadTooltip, tooltip: L10n.of(context).downloadTooltip,
onPressed: () => _onDownloadPressed(context), onPressed: () => _onDownloadPressed(context),
), ),
), ),
@ -333,7 +333,7 @@ class _ViewerState extends State<Viewer> {
Icons.delete_outlined, Icons.delete_outlined,
color: Colors.white.withOpacity(.87), color: Colors.white.withOpacity(.87),
), ),
tooltip: AppLocalizations.of(context)!.deleteTooltip, tooltip: L10n.of(context).deleteTooltip,
onPressed: () => _onDeletePressed(context), onPressed: () => _onDeletePressed(context),
), ),
), ),
@ -571,8 +571,7 @@ class _ViewerState extends State<Viewer> {
final file = widget.streamFiles[_pageController.page!.round()]; final file = widget.streamFiles[_pageController.page!.round()];
_log.info("[_onDownloadPressed] Downloading file: ${file.path}"); _log.info("[_onDownloadPressed] Downloading file: ${file.path}");
var controller = SnackBarManager().showSnackBar(SnackBar( var controller = SnackBarManager().showSnackBar(SnackBar(
content: content: Text(L10n.of(context).downloadProcessingNotification),
Text(AppLocalizations.of(context)!.downloadProcessingNotification),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
controller?.closed.whenComplete(() { controller?.closed.whenComplete(() {
@ -586,8 +585,7 @@ class _ViewerState extends State<Viewer> {
_log.warning("[_onDownloadPressed] Permission not granted"); _log.warning("[_onDownloadPressed] Permission not granted");
controller?.close(); controller?.close();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(L10n.of(context).downloadFailureNoPermissionNotification),
.downloadFailureNoPermissionNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
return; return;
@ -596,8 +594,7 @@ class _ViewerState extends State<Viewer> {
"[_onDownloadPressed] Failed while downloadFile", e, stacktrace); "[_onDownloadPressed] Failed while downloadFile", e, stacktrace);
controller?.close(); controller?.close();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text("${L10n.of(context).downloadFailureNotification}: "
"${AppLocalizations.of(context)!.downloadFailureNotification}: "
"${exception_util.toUserString(e, context)}"), "${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
@ -627,7 +624,7 @@ class _ViewerState extends State<Viewer> {
// fallback // fallback
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)!.downloadSuccessNotification), content: Text(L10n.of(context).downloadSuccessNotification),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
} }
@ -636,7 +633,7 @@ class _ViewerState extends State<Viewer> {
final file = widget.streamFiles[_pageController.page!.round()]; final file = widget.streamFiles[_pageController.page!.round()];
_log.info("[_onDeletePressed] Removing file: ${file.path}"); _log.info("[_onDeletePressed] Removing file: ${file.path}");
var controller = SnackBarManager().showSnackBar(SnackBar( var controller = SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)!.deleteProcessingNotification), content: Text(L10n.of(context).deleteProcessingNotification),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
controller?.closed.whenComplete(() { controller?.closed.whenComplete(() {
@ -647,7 +644,7 @@ class _ViewerState extends State<Viewer> {
AlbumRepo(AlbumCachedDataSource()))(widget.account, file); AlbumRepo(AlbumCachedDataSource()))(widget.account, file);
controller?.close(); controller?.close();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)!.deleteSuccessNotification), content: Text(L10n.of(context).deleteSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -659,9 +656,8 @@ class _ViewerState extends State<Viewer> {
stacktrace); stacktrace);
controller?.close(); controller?.close();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: content: Text("${L10n.of(context).deleteFailureNotification}: "
Text("${AppLocalizations.of(context)!.deleteFailureNotification}: " "${exception_util.toUserString(e, context)}"),
"${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} }

View file

@ -3,10 +3,10 @@ import 'package:exifdart/exifdart.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/double_extension.dart'; import 'package:nc_photos/double_extension.dart';
import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/item.dart'; import 'package:nc_photos/entity/album/item.dart';
@ -77,8 +77,8 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
widget.file.metadata!.imageHeight!; widget.file.metadata!.imageHeight!;
if (pixelCount >= 500000) { if (pixelCount >= 500000) {
final mpCount = pixelCount / 1000000.0; final mpCount = pixelCount / 1000000.0;
sizeSubStr += AppLocalizations.of(context)! sizeSubStr +=
.megapixelCount(mpCount.toStringAsFixed(1)); L10n.of(context).megapixelCount(mpCount.toStringAsFixed(1));
sizeSubStr += space; sizeSubStr += space;
} }
sizeSubStr += _byteSizeToString(widget.file.contentLength ?? 0); sizeSubStr += _byteSizeToString(widget.file.contentLength ?? 0);
@ -89,12 +89,11 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
cameraSubStr += "f/${_fNumber!.toStringAsFixed(1)}$space"; cameraSubStr += "f/${_fNumber!.toStringAsFixed(1)}$space";
} }
if (_exposureTime != null) { if (_exposureTime != null) {
cameraSubStr += cameraSubStr += L10n.of(context).secondCountSymbol(_exposureTime!);
AppLocalizations.of(context)!.secondCountSymbol(_exposureTime!);
cameraSubStr += space; cameraSubStr += space;
} }
if (_focalLength != null) { if (_focalLength != null) {
cameraSubStr += AppLocalizations.of(context)! cameraSubStr += L10n.of(context)
.millimeterCountSymbol(_focalLength!.toStringAsFixedTruncated(2)); .millimeterCountSymbol(_focalLength!.toStringAsFixedTruncated(2));
cameraSubStr += space; cameraSubStr += space;
} }
@ -112,12 +111,12 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
children: [ children: [
_DetailPaneButton( _DetailPaneButton(
icon: Icons.playlist_add_outlined, icon: Icons.playlist_add_outlined,
label: AppLocalizations.of(context)!.addToAlbumTooltip, label: L10n.of(context).addToAlbumTooltip,
onPressed: () => _onAddToAlbumPressed(context), onPressed: () => _onAddToAlbumPressed(context),
), ),
_DetailPaneButton( _DetailPaneButton(
icon: Icons.delete_outline, icon: Icons.delete_outline,
label: AppLocalizations.of(context)!.deleteTooltip, label: L10n.of(context).deleteTooltip,
onPressed: () => _onDeletePressed(context), onPressed: () => _onDeletePressed(context),
), ),
], ],
@ -238,15 +237,14 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
_log.info("[_onAddToAlbumPressed] Album picked: ${value.name}"); _log.info("[_onAddToAlbumPressed] Album picked: ${value.name}");
_addToAlbum(context, value).then((_) { _addToAlbum(context, value).then((_) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)! content: Text(
.addToAlbumSuccessNotification(value.name)), L10n.of(context).addToAlbumSuccessNotification(value.name)),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
}).catchError((_) {}); }).catchError((_) {});
} else { } else {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: content: Text(L10n.of(context).addToAlbumFailureNotification),
Text(AppLocalizations.of(context)!.addToAlbumFailureNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} }
@ -254,8 +252,7 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
_log.severe( _log.severe(
"[_onAddToAlbumPressed] Failed while showDialog", e, stacktrace); "[_onAddToAlbumPressed] Failed while showDialog", e, stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text("${L10n.of(context).addToAlbumFailureNotification}: "
"${AppLocalizations.of(context)!.addToAlbumFailureNotification}: "
"${exception_util.toUserString(e, context)}"), "${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
@ -265,7 +262,7 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
void _onDeletePressed(BuildContext context) async { void _onDeletePressed(BuildContext context) async {
_log.info("[_onDeletePressed] Removing file: ${widget.file.path}"); _log.info("[_onDeletePressed] Removing file: ${widget.file.path}");
var controller = SnackBarManager().showSnackBar(SnackBar( var controller = SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)!.deleteProcessingNotification), content: Text(L10n.of(context).deleteProcessingNotification),
duration: k.snackBarDurationShort, duration: k.snackBarDurationShort,
)); ));
controller?.closed.whenComplete(() { controller?.closed.whenComplete(() {
@ -276,7 +273,7 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
AlbumRepo(AlbumCachedDataSource()))(widget.account, widget.file); AlbumRepo(AlbumCachedDataSource()))(widget.account, widget.file);
controller?.close(); controller?.close();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)!.deleteSuccessNotification), content: Text(L10n.of(context).deleteSuccessNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -288,9 +285,8 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
stacktrace); stacktrace);
controller?.close(); controller?.close();
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: content: Text("${L10n.of(context).deleteFailureNotification}: "
Text("${AppLocalizations.of(context)!.deleteFailureNotification}: " "${exception_util.toUserString(e, context)}"),
"${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} }
@ -328,8 +324,7 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
e, e,
stacktrace); stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text(L10n.of(context).updateDateTimeFailureNotification),
AppLocalizations.of(context)!.updateDateTimeFailureNotification),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
} }
@ -361,8 +356,8 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
// already added, do nothing // already added, do nothing
_log.info("[_addToAlbum] File already in album: ${widget.file.path}"); _log.info("[_addToAlbum] File already in album: ${widget.file.path}");
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content:
"${AppLocalizations.of(context)!.addToAlbumAlreadyAddedNotification}"), Text("${L10n.of(context).addToAlbumAlreadyAddedNotification}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));
return Future.error(ArgumentError("File already in album")); return Future.error(ArgumentError("File already in album"));
@ -380,8 +375,7 @@ class _ViewerDetailPaneState extends State<ViewerDetailPane> {
} catch (e, stacktrace) { } catch (e, stacktrace) {
_log.shout("[_addToAlbum] Failed while updating album", e, stacktrace); _log.shout("[_addToAlbum] Failed while updating album", e, stacktrace);
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text( content: Text("${L10n.of(context).addToAlbumFailureNotification}: "
"${AppLocalizations.of(context)!.addToAlbumFailureNotification}: "
"${exception_util.toUserString(e, context)}"), "${exception_util.toUserString(e, context)}"),
duration: k.snackBarDurationNormal, duration: k.snackBarDurationNormal,
)); ));