feat: Migrated strings, and translations to native flutter l10n plugin

This commit is contained in:
Anton Stubenbord
2023-02-17 00:00:13 +01:00
parent 7b55a96164
commit 14ab604118
90 changed files with 1661 additions and 683 deletions

View File

@@ -1,13 +1,13 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/model/color_scheme_option.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
String translateColorSchemeOption(
BuildContext context, ColorSchemeOption option) {
switch (option) {
case ColorSchemeOption.classic:
return S.of(context).classic;
return S.of(context)!.classicColorScheme;
case ColorSchemeOption.dynamic:
return S.of(context).dynamic;
return S.of(context)!.dynamicColorScheme;
}
}

View File

@@ -1,76 +1,76 @@
import 'package:flutter/cupertino.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
String translateError(BuildContext context, ErrorCode code) {
switch (code) {
case ErrorCode.unknown:
return S.of(context).anUnknownErrorOccurred;
return S.of(context)!.anUnknownErrorOccurred;
case ErrorCode.authenticationFailed:
return S.of(context).authenticationFailedPleaseTryAgain;
return S.of(context)!.authenticationFailedPleaseTryAgain;
case ErrorCode.notAuthenticated:
return S.of(context).userIsNotAuthenticated;
return S.of(context)!.userIsNotAuthenticated;
case ErrorCode.documentUploadFailed:
return S.of(context).couldNotUploadDocument;
return S.of(context)!.couldNotUploadDocument;
case ErrorCode.documentUpdateFailed:
return S.of(context).couldNotUpdateDocument;
return S.of(context)!.couldNotUpdateDocument;
case ErrorCode.documentLoadFailed:
return S.of(context).couldNotLoadDocuments;
return S.of(context)!.couldNotLoadDocuments;
case ErrorCode.documentDeleteFailed:
return S.of(context).couldNotDeleteDocument;
return S.of(context)!.couldNotDeleteDocument;
case ErrorCode.documentPreviewFailed:
return S.of(context).couldNotLoadDocumentPreview;
return S.of(context)!.couldNotLoadDocumentPreview;
case ErrorCode.documentAsnQueryFailed:
return S.of(context).couldNotAssignArchiveSerialNumber;
return S.of(context)!.couldNotAssignArchiveSerialNumber;
case ErrorCode.tagCreateFailed:
return S.of(context).couldNotCreateTag;
return S.of(context)!.couldNotCreateTag;
case ErrorCode.tagLoadFailed:
return S.of(context).couldNotLoadTags;
return S.of(context)!.couldNotLoadTags;
case ErrorCode.documentTypeCreateFailed:
return S.of(context).couldNotCreateDocument;
return S.of(context)!.couldNotCreateDocument;
case ErrorCode.documentTypeLoadFailed:
return S.of(context).couldNotLoadDocumentTypes;
return S.of(context)!.couldNotLoadDocumentTypes;
case ErrorCode.correspondentCreateFailed:
return S.of(context).couldNotCreateCorrespondent;
return S.of(context)!.couldNotCreateCorrespondent;
case ErrorCode.correspondentLoadFailed:
return S.of(context).couldNotLoadCorrespondents;
return S.of(context)!.couldNotLoadCorrespondents;
case ErrorCode.scanRemoveFailed:
return S.of(context).anErrorOccurredRemovingTheScans;
return S.of(context)!.anErrorOccurredRemovingTheScans;
case ErrorCode.invalidClientCertificateConfiguration:
return S.of(context).invalidCertificateOrMissingPassphrase;
return S.of(context)!.invalidCertificateOrMissingPassphrase;
case ErrorCode.documentBulkActionFailed:
return S.of(context).couldNotBulkEditDocuments;
return S.of(context)!.couldNotBulkEditDocuments;
case ErrorCode.biometricsNotSupported:
return S.of(context).biometricAuthenticationNotSupported;
return S.of(context)!.biometricAuthenticationNotSupported;
case ErrorCode.biometricAuthenticationFailed:
return S.of(context).biometricAuthenticationFailed;
return S.of(context)!.biometricAuthenticationFailed;
case ErrorCode.deviceOffline:
return S.of(context).youAreCurrentlyOffline;
return S.of(context)!.youAreCurrentlyOffline;
case ErrorCode.serverUnreachable:
return S.of(context).couldNotReachYourPaperlessServer;
return S.of(context)!.couldNotReachYourPaperlessServer;
case ErrorCode.similarQueryError:
return S.of(context).couldNotLoadSimilarDocuments;
return S.of(context)!.couldNotLoadSimilarDocuments;
case ErrorCode.autocompleteQueryError:
return S.of(context).anErrorOccurredWhileTryingToAutocompleteYourQuery;
return S.of(context)!.anErrorOccurredWhileTryingToAutocompleteYourQuery;
case ErrorCode.storagePathLoadFailed:
return S.of(context).couldNotLoadStoragePaths;
return S.of(context)!.couldNotLoadStoragePaths;
case ErrorCode.storagePathCreateFailed:
return S.of(context).couldNotCreateStoragePath;
return S.of(context)!.couldNotCreateStoragePath;
case ErrorCode.loadSavedViewsError:
return S.of(context).couldNotLoadSavedViews;
return S.of(context)!.couldNotLoadSavedViews;
case ErrorCode.createSavedViewError:
return S.of(context).couldNotCreateSavedView;
return S.of(context)!.couldNotCreateSavedView;
case ErrorCode.deleteSavedViewError:
return S.of(context).couldNotDeleteSavedView;
return S.of(context)!.couldNotDeleteSavedView;
case ErrorCode.requestTimedOut:
return S.of(context).requestTimedOut;
return S.of(context)!.requestTimedOut;
case ErrorCode.unsupportedFileFormat:
return S.of(context).fileFormatNotSupported;
return S.of(context)!.fileFormatNotSupported;
case ErrorCode.missingClientCertificate:
return S.of(context).aClientCertificateWasExpectedButNotSent;
return S.of(context)!.aClientCertificateWasExpectedButNotSent;
case ErrorCode.suggestionsQueryError:
return S.of(context).couldNotLoadSuggestions;
return S.of(context)!.couldNotLoadSuggestions;
case ErrorCode.acknowledgeTasksError:
return S.of(context).couldNotAcknowledgeTasks;
return S.of(context)!.couldNotAcknowledgeTasks;
}
}

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
String translateMatchingAlgorithmDescription(
BuildContext context,
@@ -8,17 +8,17 @@ String translateMatchingAlgorithmDescription(
) {
switch (algorithm) {
case MatchingAlgorithm.anyWord:
return S.of(context).documentContainsAnyOfTheseWords;
return S.of(context)!.documentContainsAnyOfTheseWords;
case MatchingAlgorithm.allWords:
return S.of(context).documentContainsAllOfTheseWords;
return S.of(context)!.documentContainsAllOfTheseWords;
case MatchingAlgorithm.exactMatch:
return S.of(context).documentContainsThisString;
return S.of(context)!.documentContainsThisString;
case MatchingAlgorithm.regex:
return S.of(context).documentMatchesThisRegularExpression;
return S.of(context)!.documentMatchesThisRegularExpression;
case MatchingAlgorithm.fuzzy:
return S.of(context).documentContainsAWordSimilarToThisWord;
return S.of(context)!.documentContainsAWordSimilarToThisWord;
case MatchingAlgorithm.auto:
return S.of(context).learnMatchingAutomatically;
return S.of(context)!.learnMatchingAutomatically;
}
}
@@ -28,16 +28,16 @@ String translateMatchingAlgorithmName(
) {
switch (algorithm) {
case MatchingAlgorithm.anyWord:
return S.of(context).any;
return S.of(context)!.any;
case MatchingAlgorithm.allWords:
return S.of(context).all;
return S.of(context)!.all;
case MatchingAlgorithm.exactMatch:
return S.of(context).exact;
return S.of(context)!.exact;
case MatchingAlgorithm.regex:
return S.of(context).regularExpression;
return S.of(context)!.regularExpression;
case MatchingAlgorithm.fuzzy:
return S.of(context).fuzzy;
return S.of(context)!.fuzzy;
case MatchingAlgorithm.auto:
return S.of(context).auto;
return S.of(context)!.auto;
}
}

View File

@@ -1,23 +1,23 @@
import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
String translateSortField(BuildContext context, SortField? sortField) {
switch (sortField) {
case SortField.archiveSerialNumber:
return S.of(context).asn;
return S.of(context)!.asn;
case SortField.correspondentName:
return S.of(context).correspondent;
return S.of(context)!.correspondent;
case SortField.title:
return S.of(context).title;
return S.of(context)!.title;
case SortField.documentType:
return S.of(context).documentType;
return S.of(context)!.documentType;
case SortField.created:
return S.of(context).createdAt;
return S.of(context)!.createdAt;
case SortField.added:
return S.of(context).addedAt;
return S.of(context)!.addedAt;
case SortField.modified:
return S.of(context).modifiedAt;
return S.of(context)!.modifiedAt;
default:
return '';
}

View File

@@ -5,7 +5,8 @@
// import 'package:paperless_mobile/features/settings/bloc/application_settings_state.dart';
// import 'package:paperless_mobile/features/settings/model/view_type.dart';
// import 'package:paperless_mobile/features/settings/view/settings_page.dart';
// import 'package:paperless_mobile/generated/l10n.dart';
// import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
// import 'package:url_launcher/link.dart';
// import 'package:url_launcher/url_launcher_string.dart';
@@ -74,7 +75,7 @@
// padding: EdgeInsets.zero,
// child: ListTile(
// leading: const Icon(Icons.bug_report),
// title: Text(S.of(context).reportABug),
// title: Text(S.of(context)!.reportABug),
// ),
// );
// }
@@ -85,7 +86,7 @@
// value: AppPopupMenuEntries.openSettings,
// child: ListTile(
// leading: const Icon(Icons.settings_outlined),
// title: Text(S.of(context).settings),
// title: Text(S.of(context)!.settings),
// ),
// );
// }
@@ -96,7 +97,7 @@
// value: AppPopupMenuEntries.openAboutThisAppDialog,
// child: ListTile(
// leading: const Icon(Icons.info_outline),
// title: Text(S.of(context).aboutThisApp),
// title: Text(S.of(context)!.aboutThisApp),
// ),
// );
// }
@@ -146,7 +147,7 @@
// applicationName: 'Paperless Mobile',
// applicationVersion: packageInfo.version + '+' + packageInfo.buildNumber,
// children: [
// Text(S.of(context).developedBy('Anton Stubenbord')),
// Text(S.of(context)!.developedBy('Anton Stubenbord')),
// Link(
// uri: Uri.parse('https://github.com/astubenbord/paperless-mobile'),
// builder: (context, followLink) => GestureDetector(

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/src/widgets/placeholder.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class DialogCancelButton extends StatelessWidget {
final void Function()? onTap;
@@ -10,7 +10,7 @@ class DialogCancelButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TextButton(
child: Text(S.of(context).cancel),
child: Text(S.of(context)!.cancel),
onPressed: onTap ?? () => Navigator.pop(context),
);
}

View File

@@ -4,7 +4,7 @@ import 'package:intl/intl.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_relative_date_range_field.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class ExtendedDateRangeDialog extends StatefulWidget {
final DateRangeQuery initialValue;
@@ -47,7 +47,7 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
Widget build(BuildContext context) {
return AlertDialog(
insetPadding: const EdgeInsets.all(24.0),
title: Text(S.of(context).selectDateRange),
title: Text(S.of(context)!.selectDateRange),
content: FormBuilder(
key: _formKey,
child: Column(
@@ -56,7 +56,7 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
children: [
_buildDateRangeQueryTypeSelection(),
Text(
S.of(context).hintYouCanAlsoSpecifyRelativeValues,
S.of(context)!.hintYouCanAlsoSpecifyRelativeValues,
style: Theme.of(context).textTheme.bodySmall,
).paddedOnly(top: 8, bottom: 16),
Builder(
@@ -83,11 +83,11 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
),
actions: [
TextButton(
child: Text(S.of(context).cancel),
child: Text(S.of(context)!.cancel),
onPressed: () => Navigator.pop(context),
),
TextButton(
child: Text(S.of(context).save),
child: Text(S.of(context)!.save),
onPressed: () {
_formKey.currentState?.save();
if (_formKey.currentState?.validate() ?? false) {
@@ -110,12 +110,12 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
ButtonSegment(
value: DateRangeType.absolute,
enabled: true,
label: Text(S.of(context).absolute),
label: Text(S.of(context)!.absolute),
),
ButtonSegment(
value: DateRangeType.relative,
enabled: true,
label: Text(S.of(context).relative),
label: Text(S.of(context)!.relative),
),
],
selected: {_selectedDateRangeType},
@@ -133,7 +133,7 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
: null,
initialDate: _before?.subtract(const Duration(days: 1)),
decoration: InputDecoration(
labelText: S.of(context).after,
labelText: S.of(context)!.after,
prefixIcon: const Icon(Icons.date_range),
suffixIcon: _after != null
? IconButton(
@@ -161,7 +161,7 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
: null,
inputType: InputType.date,
decoration: InputDecoration(
labelText: S.of(context).before,
labelText: S.of(context)!.before,
prefixIcon: const Icon(Icons.date_range),
suffixIcon: _before != null
? IconButton(

View File

@@ -4,7 +4,7 @@ import 'package:intl/intl.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart';
import 'package:paperless_mobile/core/widgets/form_builder_fields/extended_date_range_form_field/relative_date_range_picker_helper.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class FormBuilderExtendedDateRangePicker extends StatefulWidget {
final String name;
@@ -90,21 +90,21 @@ class _FormBuilderExtendedDateRangePickerState
return '${df.format(query.after!)} ${df.format(query.before!)}';
}
if (query.before != null) {
return '${S.of(context).before} ${df.format(query.before!)}';
return '${S.of(context)!.before} ${df.format(query.before!)}';
}
if (query.after != null) {
return '${S.of(context).after} ${df.format(query.after!)}';
return '${S.of(context)!.after} ${df.format(query.after!)}';
}
} else if (query is RelativeDateRangeQuery) {
switch (query.unit) {
case DateRangeUnit.day:
return S.of(context).lastNDays(query.offset);
return S.of(context)!.lastNDays(query.offset);
case DateRangeUnit.week:
return S.of(context).lastNWeeks(query.offset);
return S.of(context)!.lastNWeeks(query.offset);
case DateRangeUnit.month:
return S.of(context).lastNMonths(query.offset);
return S.of(context)!.lastNMonths(query.offset);
case DateRangeUnit.year:
return S.of(context).lastNYears(query.offset);
return S.of(context)!.lastNYears(query.offset);
default:
}
}

View File

@@ -3,7 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class FormBuilderRelativeDateRangePicker extends StatefulWidget {
final String name;
@@ -46,12 +46,12 @@ class _FormBuilderRelativeDateRangePickerState
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(S.of(context).last),
Text(S.of(context)!.last),
SizedBox(
width: 80,
child: TextFormField(
decoration: InputDecoration(
labelText: S.of(context).amount,
labelText: S.of(context)!.amount,
),
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
@@ -90,7 +90,7 @@ class _FormBuilderRelativeDateRangePickerState
onChanged: (value) =>
field.didChange(field.value!.copyWith(unit: value)),
decoration: InputDecoration(
labelText: S.of(context).timeUnit,
labelText: S.of(context)!.timeUnit,
),
),
),
@@ -113,13 +113,13 @@ class _FormBuilderRelativeDateRangePickerState
String _dateRangeUnitToLocalizedString(DateRangeUnit unit, int? count) {
switch (unit) {
case DateRangeUnit.day:
return S.of(context).days(count ?? 1);
return S.of(context)!.days(count ?? 1);
case DateRangeUnit.week:
return S.of(context).weeks(count ?? 1);
return S.of(context)!.weeks(count ?? 1);
case DateRangeUnit.month:
return S.of(context).months(count ?? 1);
return S.of(context)!.months(count ?? 1);
case DateRangeUnit.year:
return S.of(context).years(count ?? 1);
return S.of(context)!.years(count ?? 1);
}
}
}

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/workarounds/colored_chip.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class RelativeDateRangePickerHelper extends StatefulWidget {
final FormFieldState<DateRangeQuery> field;
@@ -49,19 +49,19 @@ class _RelativeDateRangePickerHelperState
List<_ExtendedDateRangeQueryOption> get _options => [
_ExtendedDateRangeQueryOption(
S.of(context).lastNWeeks(1),
S.of(context)!.lastNWeeks(1),
const RelativeDateRangeQuery(1, DateRangeUnit.week),
),
_ExtendedDateRangeQueryOption(
S.of(context).lastNMonths(1),
S.of(context)!.lastNMonths(1),
const RelativeDateRangeQuery(1, DateRangeUnit.month),
),
_ExtendedDateRangeQueryOption(
S.of(context).lastNMonths(3),
S.of(context)!.lastNMonths(3),
const RelativeDateRangeQuery(3, DateRangeUnit.month),
),
_ExtendedDateRangeQueryOption(
S.of(context).lastNYears(1),
S.of(context)!.lastNYears(1),
const RelativeDateRangeQuery(1, DateRangeUnit.year),
),
];

View File

@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
extension on Color {
/// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#".
@@ -213,7 +214,7 @@ class FormBuilderColorPickerFieldState
final selected = await showDialog<bool>(
context: context,
builder: (BuildContext context) {
final materialLocalizations = MaterialLocalizations.of(context);
final materialLocalizations = S.of(context)!;
return AlertDialog(
// title: null, //const Text('Pick a color!'),
@@ -223,11 +224,11 @@ class FormBuilderColorPickerFieldState
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, false),
child: Text(materialLocalizations.cancelButtonLabel),
child: Text(materialLocalizations.cancel),
),
TextButton(
onPressed: () => Navigator.pop(context, true),
child: Text(materialLocalizations.okButtonLabel),
child: Text(materialLocalizations.ok),
),
],
);

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class HintCard extends StatelessWidget {
final String hintText;
@@ -52,7 +52,7 @@ class HintCard extends StatelessWidget {
Align(
alignment: Alignment.bottomRight,
child: TextButton(
child: Text(S.of(context).gotIt),
child: Text(S.of(context)!.gotIt),
onPressed: onHintAcknowledged,
),
)

View File

@@ -5,6 +5,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
/// Shows a full screen search page and returns the search result selected by
/// the user when the page is closed.
@@ -308,7 +309,7 @@ abstract class SearchDelegate<T> {
/// The hint text that is shown in the search field when it is empty.
///
/// If this value is set to null, the value of
/// `MaterialLocalizations.of(context).searchFieldLabel` will be used instead.
/// `MaterialLocalizationS.of(context)!.searchFieldLabel` will be used instead.
final String? searchFieldLabel;
/// The style of the [searchFieldLabel].
@@ -532,8 +533,8 @@ class _SearchPageState<T> extends State<_SearchPage<T>> {
Widget build(BuildContext context) {
assert(debugCheckHasMaterialLocalizations(context));
final ThemeData theme = widget.delegate.appBarTheme(context);
final String searchFieldLabel = widget.delegate.searchFieldLabel ??
MaterialLocalizations.of(context).searchFieldLabel;
final String searchFieldLabel =
widget.delegate.searchFieldLabel ?? S.of(context)!.search;
Widget? body;
switch (widget.delegate._currentBody) {
case _SearchBody.suggestions:

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class OfflineBanner extends StatelessWidget with PreferredSizeWidget {
const OfflineBanner({super.key});
@@ -21,7 +21,7 @@ class OfflineBanner extends StatelessWidget with PreferredSizeWidget {
),
),
Text(
S.of(context).youreOffline,
S.of(context)!.youreOffline,
style: TextStyle(
color: Theme.of(context).colorScheme.onErrorContainer,
),

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class OfflineWidget extends StatelessWidget {
const OfflineWidget({super.key});
@@ -15,7 +15,7 @@ class OfflineWidget extends StatelessWidget {
color: Theme.of(context).disabledColor,
size: (Theme.of(context).iconTheme.size ?? 24) * 3),
Text(
S.of(context).anInternetConnectionCouldNotBeEstablished,
S.of(context)!.anInternetConnectionCouldNotBeEstablished,
textAlign: TextAlign.center,
),
],