From 14ab604118741cf921d3c075b9ed9e53f3a96b02 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Fri, 17 Feb 2023 00:00:13 +0100 Subject: [PATCH] feat: Migrated strings, and translations to native flutter l10n plugin --- crowdin.yml | 8 + integration_test/src/framework.dart | 4 +- l10n.yaml | 4 +- ...lor_scheme_option_localization_mapper.dart | 6 +- .../error_code_localization_mapper.dart | 70 +- ...atching_algorithm_localization_mapper.dart | 26 +- .../sort_field_localization_mapper.dart | 16 +- lib/core/widgets/app_options_popup_menu.dart | 11 +- .../dialog_utils/dialog_cancel_button.dart | 4 +- .../extended_date_range_dialog.dart | 18 +- ...rm_builder_extended_date_range_picker.dart | 14 +- ...orm_builder_relative_date_range_field.dart | 16 +- .../relative_date_range_picker_helper.dart | 10 +- .../form_builder_color_picker.dart | 7 +- lib/core/widgets/hint_card.dart | 4 +- .../widgets/material/search/m3_search.dart | 7 +- lib/core/widgets/offline_banner.dart | 4 +- lib/core/widgets/offline_widget.dart | 4 +- lib/features/app_drawer/view/app_drawer.dart | 11 +- .../application_intro_slideshow.dart | 6 +- .../view/pages/document_details_page.dart | 30 +- .../view/widgets/document_content_widget.dart | 4 +- .../widgets/document_download_button.dart | 11 +- .../widgets/document_meta_data_widget.dart | 20 +- .../widgets/document_overview_widget.dart | 14 +- .../view/document_edit_page.dart | 21 +- .../document_scan/view/scanner_page.dart | 21 +- .../view/widgets/scanned_image_item.dart | 5 +- .../view/document_search_page.dart | 9 +- .../view/remove_history_entry_dialog.dart | 6 +- .../document_upload_preparation_page.dart | 23 +- .../documents/view/pages/document_view.dart | 5 +- .../documents/view/pages/documents_page.dart | 19 +- .../view/widgets/adaptive_documents_view.dart | 2 +- .../delete_document_confirmation_dialog.dart | 12 +- .../view/widgets/documents_empty_state.dart | 8 +- .../documents_list_loading_widget.dart | 1 + .../widgets/search/document_filter_form.dart | 14 +- .../widgets/search/document_filter_panel.dart | 8 +- .../sort_field_selection_bottom_sheet.dart | 10 +- .../widgets/search/text_query_form_field.dart | 15 +- .../bulk_delete_confirmation_dialog.dart | 12 +- .../confirm_delete_saved_view_dialog.dart | 10 +- .../selection/view_type_selection_widget.dart | 8 +- .../edit_label/view/add_label_page.dart | 4 +- .../edit_label/view/edit_label_page.dart | 15 +- .../view/impl/add_correspondent_page.dart | 4 +- .../view/impl/add_document_type_page.dart | 4 +- .../view/impl/add_storage_path_page.dart | 4 +- .../edit_label/view/impl/add_tag_page.dart | 8 +- .../edit_label/view/impl/edit_tag_page.dart | 6 +- lib/features/edit_label/view/label_form.dart | 11 +- lib/features/home/view/home_page.dart | 71 +- .../view/widget/verify_identity_page.dart | 11 +- lib/features/inbox/view/pages/inbox_page.dart | 27 +- .../view/widgets/inbox_empty_widget.dart | 6 +- .../inbox/view/widgets/inbox_item.dart | 13 +- ...rage_path_autofill_form_builder_field.dart | 42 +- .../tags/view/widgets/tags_form_field.dart | 14 +- .../labels/view/pages/labels_page.dart | 20 +- .../labels/view/widgets/label_form_field.dart | 15 +- .../view/linked_documents_page.dart | 5 +- .../client_certificate_form_field.dart | 17 +- .../server_address_form_field.dart | 8 +- .../user_credentials_form_field.dart | 18 +- .../login_pages/server_connection_page.dart | 19 +- .../login_pages/server_login_page.dart | 8 +- .../saved_view/view/add_saved_view_page.dart | 18 +- .../saved_view/view/saved_view_list.dart | 6 +- .../cubit/application_settings_cubit.dart | 2 +- .../cubit/application_settings_state.dart | 2 +- .../view/dialogs/account_settings_dialog.dart | 9 +- .../view/pages/application_settings_page.dart | 5 +- .../view/pages/security_settings_page.dart | 4 +- .../view/pages/storage_settings_page.dart | 4 +- lib/features/settings/view/settings_page.dart | 20 +- .../biometric_authentication_setting.dart | 8 +- .../widgets/color_scheme_option_setting.dart | 10 +- .../widgets/language_selection_setting.dart | 6 +- .../view/widgets/radio_settings_dialog.dart | 6 +- .../view/widgets/theme_mode_setting.dart | 18 +- lib/helpers/message_helpers.dart | 4 +- lib/l10n/intl_cs.arb | 162 +++-- lib/l10n/intl_de.arb | 152 ++-- lib/l10n/intl_en.arb | 19 +- lib/l10n/intl_fr.arb | 681 ++++++++++++++++++ lib/l10n/intl_pl.arb | 152 ++-- lib/l10n/intl_tr.arb | 154 ++-- lib/main.dart | 6 +- pubspec.yaml | 8 +- 90 files changed, 1661 insertions(+), 683 deletions(-) create mode 100644 crowdin.yml create mode 100644 lib/l10n/intl_fr.arb diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 0000000..648399a --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,8 @@ +files: [ + { + "source" : "/lib/l10n/intl_en.arb", + "translation" : "/lib/l10n/intl_%two_letters_code%.arb", + "type" : "arb", + } +] +# Add your credentials here \ No newline at end of file diff --git a/integration_test/src/framework.dart b/integration_test/src/framework.dart index 4bbafc9..ef95f48 100644 --- a/integration_test/src/framework.dart +++ b/integration_test/src/framework.dart @@ -1,12 +1,12 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; Future initializeTestingFramework( {String languageCode = 'en'}) async { final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - final translations = await S.load( + final translations = await S.delegate.load( Locale.fromSubtags( languageCode: languageCode, ), diff --git a/l10n.yaml b/l10n.yaml index 05fecc9..03858f9 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -1,4 +1,6 @@ arb-dir: lib/l10n template-arb-file: intl_en.arb +output-dir: lib/generated/l10n +output-class: S output-localization-file: app_localizations.dart -untranslated-messages-file: untranslated_messages.txt \ No newline at end of file +synthetic-package: false \ No newline at end of file diff --git a/lib/core/translation/color_scheme_option_localization_mapper.dart b/lib/core/translation/color_scheme_option_localization_mapper.dart index c3ab950..8b81840 100644 --- a/lib/core/translation/color_scheme_option_localization_mapper.dart +++ b/lib/core/translation/color_scheme_option_localization_mapper.dart @@ -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; } } diff --git a/lib/core/translation/error_code_localization_mapper.dart b/lib/core/translation/error_code_localization_mapper.dart index af7d26a..4b2be11 100644 --- a/lib/core/translation/error_code_localization_mapper.dart +++ b/lib/core/translation/error_code_localization_mapper.dart @@ -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; } } diff --git a/lib/core/translation/matching_algorithm_localization_mapper.dart b/lib/core/translation/matching_algorithm_localization_mapper.dart index 83da479..ae27c60 100644 --- a/lib/core/translation/matching_algorithm_localization_mapper.dart +++ b/lib/core/translation/matching_algorithm_localization_mapper.dart @@ -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; } } diff --git a/lib/core/translation/sort_field_localization_mapper.dart b/lib/core/translation/sort_field_localization_mapper.dart index ab65f3c..88f3be7 100644 --- a/lib/core/translation/sort_field_localization_mapper.dart +++ b/lib/core/translation/sort_field_localization_mapper.dart @@ -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 ''; } diff --git a/lib/core/widgets/app_options_popup_menu.dart b/lib/core/widgets/app_options_popup_menu.dart index fec485c..91b6bee 100644 --- a/lib/core/widgets/app_options_popup_menu.dart +++ b/lib/core/widgets/app_options_popup_menu.dart @@ -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( diff --git a/lib/core/widgets/dialog_utils/dialog_cancel_button.dart b/lib/core/widgets/dialog_utils/dialog_cancel_button.dart index d7a06e2..1fede76 100644 --- a/lib/core/widgets/dialog_utils/dialog_cancel_button.dart +++ b/lib/core/widgets/dialog_utils/dialog_cancel_button.dart @@ -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), ); } diff --git a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart index f64b87b..7a8cac1 100644 --- a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart +++ b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart @@ -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 { 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 { 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 { ), 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 { 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 { : 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 { : 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( diff --git a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart index 4a27920..b8f5a64 100644 --- a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart +++ b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart @@ -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: } } diff --git a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_relative_date_range_field.dart b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_relative_date_range_field.dart index aaf0b62..9d85a4d 100644 --- a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_relative_date_range_field.dart +++ b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_relative_date_range_field.dart @@ -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); } } } diff --git a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/relative_date_range_picker_helper.dart b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/relative_date_range_picker_helper.dart index 1a1135d..5a25e87 100644 --- a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/relative_date_range_picker_helper.dart +++ b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/relative_date_range_picker_helper.dart @@ -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 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), ), ]; diff --git a/lib/core/widgets/form_builder_fields/form_builder_color_picker.dart b/lib/core/widgets/form_builder_fields/form_builder_color_picker.dart index 8ca98dd..a19c441 100644 --- a/lib/core/widgets/form_builder_fields/form_builder_color_picker.dart +++ b/lib/core/widgets/form_builder_fields/form_builder_color_picker.dart @@ -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( 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: [ 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), ), ], ); diff --git a/lib/core/widgets/hint_card.dart b/lib/core/widgets/hint_card.dart index e8d7b29..46da68b 100644 --- a/lib/core/widgets/hint_card.dart +++ b/lib/core/widgets/hint_card.dart @@ -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, ), ) diff --git a/lib/core/widgets/material/search/m3_search.dart b/lib/core/widgets/material/search/m3_search.dart index dc01985..fdc5f75 100644 --- a/lib/core/widgets/material/search/m3_search.dart +++ b/lib/core/widgets/material/search/m3_search.dart @@ -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 { /// 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 extends State<_SearchPage> { 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: diff --git a/lib/core/widgets/offline_banner.dart b/lib/core/widgets/offline_banner.dart index 6e7fe7e..db8cbe5 100644 --- a/lib/core/widgets/offline_banner.dart +++ b/lib/core/widgets/offline_banner.dart @@ -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, ), diff --git a/lib/core/widgets/offline_widget.dart b/lib/core/widgets/offline_widget.dart index 9768f14..2e5d666 100644 --- a/lib/core/widgets/offline_widget.dart +++ b/lib/core/widgets/offline_widget.dart @@ -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, ), ], diff --git a/lib/features/app_drawer/view/app_drawer.dart b/lib/features/app_drawer/view/app_drawer.dart index 049809d..59a1294 100644 --- a/lib/features/app_drawer/view/app_drawer.dart +++ b/lib/features/app_drawer/view/app_drawer.dart @@ -5,7 +5,8 @@ import 'package:paperless_mobile/core/widgets/paperless_logo.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.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'; @@ -31,14 +32,14 @@ class AppDrawer extends StatelessWidget { const Divider(), ListTile( dense: true, - title: Text(S.of(context).aboutThisApp), + title: Text(S.of(context)!.aboutThisApp), leading: const Icon(Icons.info_outline), onTap: () => _showAboutDialog(context), ), ListTile( dense: true, leading: const Icon(Icons.bug_report_outlined), - title: Text(S.of(context).reportABug), + title: Text(S.of(context)!.reportABug), onTap: () { launchUrlString( 'https://github.com/astubenbord/paperless-mobile/issues/new'); @@ -48,7 +49,7 @@ class AppDrawer extends StatelessWidget { dense: true, leading: const Icon(Icons.settings_outlined), title: Text( - S.of(context).settings, + S.of(context)!.settings, ), onTap: () => Navigator.of(context).push( MaterialPageRoute( @@ -74,7 +75,7 @@ class AppDrawer extends StatelessWidget { 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( diff --git a/lib/features/app_intro/application_intro_slideshow.dart b/lib/features/app_intro/application_intro_slideshow.dart index 60c4fca..6891d64 100644 --- a/lib/features/app_intro/application_intro_slideshow.dart +++ b/lib/features/app_intro/application_intro_slideshow.dart @@ -4,7 +4,7 @@ import 'package:paperless_mobile/core/global/asset_images.dart'; import 'package:paperless_mobile/features/settings/view/widgets/biometric_authentication_setting.dart'; import 'package:paperless_mobile/features/settings/view/widgets/language_selection_setting.dart'; import 'package:paperless_mobile/features/settings/view/widgets/theme_mode_setting.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class ApplicationIntroSlideshow extends StatefulWidget { const ApplicationIntroSlideshow({super.key}); @@ -26,8 +26,8 @@ class _ApplicationIntroSlideshowState extends State { child: IntroductionScreen( globalBackgroundColor: Theme.of(context).canvasColor, showDoneButton: true, - next: Text(S.of(context).next), - done: Text(S.of(context).done), + next: Text(S.of(context)!.next), + done: Text(S.of(context)!.done), onDone: () => Navigator.pop(context), dotsDecorator: DotsDecorator( color: Theme.of(context).colorScheme.onBackground, diff --git a/lib/features/document_details/view/pages/document_details_page.dart b/lib/features/document_details/view/pages/document_details_page.dart index 627b69c..a53d29a 100644 --- a/lib/features/document_details/view/pages/document_details_page.dart +++ b/lib/features/document_details/view/pages/document_details_page.dart @@ -21,7 +21,8 @@ import 'package:paperless_mobile/features/documents/view/widgets/delete_document import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart'; import 'package:paperless_mobile/features/similar_documents/cubit/similar_documents_cubit.dart'; import 'package:paperless_mobile/features/similar_documents/view/similar_documents_view.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; @@ -102,7 +103,7 @@ class _DocumentDetailsPageState extends State { tabs: [ Tab( child: Text( - S.of(context).overview, + S.of(context)!.overview, style: TextStyle( color: Theme.of(context) .colorScheme @@ -112,7 +113,7 @@ class _DocumentDetailsPageState extends State { ), Tab( child: Text( - S.of(context).content, + S.of(context)!.content, style: TextStyle( color: Theme.of(context) .colorScheme @@ -122,7 +123,7 @@ class _DocumentDetailsPageState extends State { ), Tab( child: Text( - S.of(context).metaData, + S.of(context)!.metaData, style: TextStyle( color: Theme.of(context) .colorScheme @@ -132,7 +133,7 @@ class _DocumentDetailsPageState extends State { ), Tab( child: Text( - S.of(context).similarDocuments, + S.of(context)!.similarDocuments, style: TextStyle( color: Theme.of(context) .colorScheme @@ -198,7 +199,7 @@ class _DocumentDetailsPageState extends State { position: b.BadgePosition.topEnd(top: -12, end: -6), showBadge: _filteredSuggestions.hasSuggestions, child: Tooltip( - message: S.of(context).editDocumentTooltip, + message: S.of(context)!.editDocumentTooltip, preferBelow: false, verticalOffset: 40, child: FloatingActionButton( @@ -231,14 +232,14 @@ class _DocumentDetailsPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton( - tooltip: S.of(context).deleteDocumentTooltip, + tooltip: S.of(context)!.deleteDocumentTooltip, icon: const Icon(Icons.delete), onPressed: widget.allowEdit && isConnected ? () => _onDelete(state.document) : null, ).paddedSymmetrically(horizontal: 4), Tooltip( - message: S.of(context).downloadDocumentTooltip, + message: S.of(context)!.downloadDocumentTooltip, child: DocumentDownloadButton( document: state.document, enabled: isConnected, @@ -246,18 +247,18 @@ class _DocumentDetailsPageState extends State { ), ), IconButton( - tooltip: S.of(context).previewTooltip, + tooltip: S.of(context)!.previewTooltip, icon: const Icon(Icons.visibility), onPressed: isConnected ? () => _onOpen(state.document) : null, ).paddedOnly(right: 4.0), IconButton( - tooltip: S.of(context).openInSystemViewer, + tooltip: S.of(context)!.openInSystemViewer, icon: const Icon(Icons.open_in_new), onPressed: isConnected ? _onOpenFileInSystemViewer : null, ).paddedOnly(right: 4.0), IconButton( - tooltip: S.of(context).shareTooltip, + tooltip: S.of(context)!.shareTooltip, icon: const Icon(Icons.share), onPressed: isConnected ? () => @@ -322,13 +323,14 @@ class _DocumentDetailsPageState extends State { await context.read().openDocumentInSystemViewer(); if (status == ResultType.done) return; if (status == ResultType.noAppToOpen) { - showGenericError(context, S.of(context).noAppToDisplayPDFFilesFound); + showGenericError(context, S.of(context)!.noAppToDisplayPDFFilesFound); } if (status == ResultType.fileNotFound) { showGenericError(context, translateError(context, ErrorCode.unknown)); } if (status == ResultType.permissionDenied) { - showGenericError(context, S.of(context).couldNotOpenFilePermissionDenied); + showGenericError( + context, S.of(context)!.couldNotOpenFilePermissionDenied); } } @@ -342,7 +344,7 @@ class _DocumentDetailsPageState extends State { if (delete) { try { await context.read().delete(document); - showSnackBar(context, S.of(context).documentSuccessfullyDeleted); + showSnackBar(context, S.of(context)!.documentSuccessfullyDeleted); } on PaperlessServerException catch (error, stackTrace) { showErrorMessage(context, error, stackTrace); } finally { diff --git a/lib/features/document_details/view/widgets/document_content_widget.dart b/lib/features/document_details/view/widgets/document_content_widget.dart index d91bb57..3ad2d77 100644 --- a/lib/features/document_details/view/widgets/document_content_widget.dart +++ b/lib/features/document_details/view/widgets/document_content_widget.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/widgets/highlighted_text.dart'; import 'package:paperless_mobile/features/document_details/cubit/document_details_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class DocumentContentWidget extends StatelessWidget { final bool isFullContentLoaded; @@ -38,7 +38,7 @@ class DocumentContentWidget extends StatelessWidget { Align( alignment: Alignment.bottomCenter, child: TextButton( - child: Text(S.of(context).loadFullContent), + child: Text(S.of(context)!.loadFullContent), onPressed: () { context.read().loadFullContent(); }, diff --git a/lib/features/document_details/view/widgets/document_download_button.dart b/lib/features/document_details/view/widgets/document_download_button.dart index 0465fe8..6158e59 100644 --- a/lib/features/document_details/view/widgets/document_download_button.dart +++ b/lib/features/document_details/view/widgets/document_download_button.dart @@ -5,7 +5,8 @@ import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/service/file_service.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/permission_helpers.dart'; import 'package:paperless_mobile/constants.dart'; @@ -53,15 +54,15 @@ class _DocumentDownloadButtonState extends State { final downloadOriginal = await showDialog( context: context, builder: (context) => RadioSettingsDialog( - titleText: S.of(context).chooseFiletype, + titleText: S.of(context)!.chooseFiletype, options: [ RadioOption( value: true, - label: S.of(context).original + + label: S.of(context)!.original + " (${meta.originalMimeType.split("/").last})"), RadioOption( value: false, - label: S.of(context).archivedPdf, + label: S.of(context)!.archivedPdf, ), ], initialValue: false, @@ -91,7 +92,7 @@ class _DocumentDownloadButtonState extends State { createdFile.createSync(recursive: true); createdFile.writeAsBytesSync(bytes); debugPrint("Downloaded file to $filePath"); - showSnackBar(context, S.of(context).documentSuccessfullyDownloaded); + showSnackBar(context, S.of(context)!.documentSuccessfullyDownloaded); } on PaperlessServerException catch (error, stackTrace) { showErrorMessage(context, error, stackTrace); } catch (error) { diff --git a/lib/features/document_details/view/widgets/document_meta_data_widget.dart b/lib/features/document_details/view/widgets/document_meta_data_widget.dart index 35a0611..1e78fbb 100644 --- a/lib/features/document_details/view/widgets/document_meta_data_widget.dart +++ b/lib/features/document_details/view/widgets/document_meta_data_widget.dart @@ -7,7 +7,8 @@ import 'package:paperless_mobile/core/widgets/offline_widget.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/document_details/cubit/document_details_cubit.dart'; import 'package:paperless_mobile/features/document_details/view/widgets/details_item.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/format_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; @@ -44,39 +45,40 @@ class DocumentMetaDataWidget extends StatelessWidget { ), children: [ DetailsItem( - label: S.of(context).archiveSerialNumber, + label: S.of(context)!.archiveSerialNumber, content: document.archiveSerialNumber != null ? Text(document.archiveSerialNumber.toString()) : TextButton.icon( icon: const Icon(Icons.archive_outlined), - label: Text(S.of(context).AssignAsn), + label: Text(S.of(context)!.assignAsn), onPressed: connectivity.isConnected ? () => _assignAsn(context) : null, ), ).paddedOnly(bottom: itemSpacing), DetailsItem.text(DateFormat().format(document.modified), - label: S.of(context).modifiedAt, context: context) + label: S.of(context)!.modifiedAt, context: context) .paddedOnly(bottom: itemSpacing), DetailsItem.text(DateFormat().format(document.added), - label: S.of(context).addedAt, context: context) + label: S.of(context)!.addedAt, context: context) .paddedOnly(bottom: itemSpacing), DetailsItem.text( meta.mediaFilename, context: context, - label: S.of(context).mediaFilename, + label: S.of(context)!.mediaFilename, ).paddedOnly(bottom: itemSpacing), DetailsItem.text( meta.originalChecksum, context: context, - label: S.of(context).originalMD5Checksum, + label: S.of(context)!.originalMD5Checksum, ).paddedOnly(bottom: itemSpacing), DetailsItem.text(formatBytes(meta.originalSize, 2), - label: S.of(context).originalFileSize, context: context) + label: S.of(context)!.originalFileSize, + context: context) .paddedOnly(bottom: itemSpacing), DetailsItem.text( meta.originalMimeType, - label: S.of(context).originalMIMEType, + label: S.of(context)!.originalMIMEType, context: context, ).paddedOnly(bottom: itemSpacing), ], diff --git a/lib/features/document_details/view/widgets/document_overview_widget.dart b/lib/features/document_details/view/widgets/document_overview_widget.dart index 4dfd00c..d498a8b 100644 --- a/lib/features/document_details/view/widgets/document_overview_widget.dart +++ b/lib/features/document_details/view/widgets/document_overview_widget.dart @@ -7,7 +7,7 @@ import 'package:paperless_mobile/features/document_details/view/widgets/details_ import 'package:paperless_mobile/features/labels/storage_path/view/widgets/storage_path_widget.dart'; import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart'; import 'package:paperless_mobile/features/labels/view/widgets/label_text.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class DocumentOverviewWidget extends StatelessWidget { final DocumentModel document; @@ -29,7 +29,7 @@ class DocumentOverviewWidget extends StatelessWidget { ), children: [ DetailsItem( - label: S.of(context).title, + label: S.of(context)!.title, content: HighlightedText( text: document.title, highlights: queryString?.split(" ") ?? [], @@ -39,12 +39,12 @@ class DocumentOverviewWidget extends StatelessWidget { DetailsItem.text( DateFormat.yMMMMd().format(document.created), context: context, - label: S.of(context).createdAt, + label: S.of(context)!.createdAt, ).paddedOnly(bottom: itemSpacing), Visibility( visible: document.documentType != null, child: DetailsItem( - label: S.of(context).documentType, + label: S.of(context)!.documentType, content: LabelText( style: Theme.of(context).textTheme.bodyLarge, id: document.documentType, @@ -54,7 +54,7 @@ class DocumentOverviewWidget extends StatelessWidget { Visibility( visible: document.correspondent != null, child: DetailsItem( - label: S.of(context).correspondent, + label: S.of(context)!.correspondent, content: LabelText( style: Theme.of(context).textTheme.bodyLarge, id: document.correspondent, @@ -64,7 +64,7 @@ class DocumentOverviewWidget extends StatelessWidget { Visibility( visible: document.storagePath != null, child: DetailsItem( - label: S.of(context).storagePath, + label: S.of(context)!.storagePath, content: StoragePathWidget( pathId: document.storagePath, ), @@ -73,7 +73,7 @@ class DocumentOverviewWidget extends StatelessWidget { Visibility( visible: document.tags.isNotEmpty, child: DetailsItem( - label: S.of(context).tags, + label: S.of(context)!.tags, content: Padding( padding: const EdgeInsets.only(top: 8.0), child: TagsWidget( diff --git a/lib/features/document_edit/view/document_edit_page.dart b/lib/features/document_edit/view/document_edit_page.dart index ccc3878..a4a210e 100644 --- a/lib/features/document_edit/view/document_edit_page.dart +++ b/lib/features/document_edit/view/document_edit_page.dart @@ -16,7 +16,8 @@ import 'package:paperless_mobile/features/edit_label/view/impl/add_document_type import 'package:paperless_mobile/features/edit_label/view/impl/add_storage_path_page.dart'; import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.dart'; import 'package:paperless_mobile/features/labels/view/widgets/label_form_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; class DocumentEditPage extends StatefulWidget { @@ -59,10 +60,10 @@ class _DocumentEditPageState extends State { floatingActionButton: FloatingActionButton.extended( onPressed: () => _onSubmit(state.document), icon: const Icon(Icons.save), - label: Text(S.of(context).saveChanges), + label: Text(S.of(context)!.saveChanges), ), appBar: AppBar( - title: Text(S.of(context).editDocument), + title: Text(S.of(context)!.editDocument), bottom: _isSubmitLoading ? const PreferredSize( preferredSize: Size.fromHeight(4), @@ -159,7 +160,7 @@ class _DocumentEditPageState extends State { create: (context) => context.read>(), child: AddStoragePathPage(initalValue: initialValue), ), - textFieldLabel: S.of(context).storagePath, + textFieldLabel: S.of(context)!.storagePath, labelOptions: options, initialValue: IdQueryParameter.fromId(initialId), name: fkStoragePath, @@ -180,7 +181,7 @@ class _DocumentEditPageState extends State { create: (context) => context.read>(), child: AddCorrespondentPage(initialName: initialValue), ), - textFieldLabel: S.of(context).correspondent, + textFieldLabel: S.of(context)!.correspondent, labelOptions: options, initialValue: IdQueryParameter.fromId(initialId), name: fkCorrespondent, @@ -214,7 +215,7 @@ class _DocumentEditPageState extends State { initialName: currentInput, ), ), - textFieldLabel: S.of(context).documentType, + textFieldLabel: S.of(context)!.documentType, initialValue: IdQueryParameter.fromId(initialId), labelOptions: options, name: fkDocumentType, @@ -249,7 +250,7 @@ class _DocumentEditPageState extends State { }); try { await context.read().updateDocument(mergedDocument); - showSnackBar(context, S.of(context).documentSuccessfullyUpdated); + showSnackBar(context, S.of(context)!.documentSuccessfullyUpdated); } on PaperlessServerException catch (error, stackTrace) { showErrorMessage(context, error, stackTrace); } finally { @@ -266,7 +267,7 @@ class _DocumentEditPageState extends State { name: fkTitle, validator: FormBuilderValidators.required(), decoration: InputDecoration( - label: Text(S.of(context).title), + label: Text(S.of(context)!.title), ), initialValue: initialTitle, ); @@ -281,7 +282,7 @@ class _DocumentEditPageState extends State { name: fkCreatedDate, decoration: InputDecoration( prefixIcon: const Icon(Icons.calendar_month_outlined), - label: Text(S.of(context).createdAt), + label: Text(S.of(context)!.createdAt), ), initialValue: initialCreatedAtDate, format: DateFormat.yMMMMd(), @@ -311,7 +312,7 @@ class _DocumentEditPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - S.of(context).suggestions, + S.of(context)!.suggestions, style: Theme.of(context).textTheme.bodySmall, ), SizedBox( diff --git a/lib/features/document_scan/view/scanner_page.dart b/lib/features/document_scan/view/scanner_page.dart index db13b0c..1d405d9 100644 --- a/lib/features/document_scan/view/scanner_page.dart +++ b/lib/features/document_scan/view/scanner_page.dart @@ -23,7 +23,8 @@ import 'package:paperless_mobile/features/document_scan/cubit/document_scanner_c import 'package:paperless_mobile/features/document_scan/view/widgets/scanned_image_item.dart'; import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/file_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/permission_helpers.dart'; @@ -72,7 +73,7 @@ class _ScannerPageState extends State state.isEmpty ? const NeverScrollableScrollPhysics() : null, slivers: [ SearchAppBar( - hintText: S.of(context).searchDocuments, + hintText: S.of(context)!.searchDocuments, onOpenSearch: showDocumentSearchPage, bottom: PreferredSize( child: _buildActions(connectedState.isConnected), @@ -97,7 +98,7 @@ class _ScannerPageState extends State floatHeaderSlivers: false, headerSliverBuilder: (context, innerBoxIsScrolled) => [ SearchAppBar( - hintText: S.of(context).searchDocuments, + hintText: S.of(context)!.searchDocuments, onOpenSearch: showDocumentSearchPage, bottom: PreferredSize( child: _buildActions(connectedState.isConnected), @@ -134,7 +135,7 @@ class _ScannerPageState extends State BlocBuilder>( builder: (context, state) { return TextButton.icon( - label: Text(S.of(context).previewScan), + label: Text(S.of(context)!.previewScan), onPressed: state.isNotEmpty ? () => Navigator.of(context).push( MaterialPageRoute( @@ -154,7 +155,7 @@ class _ScannerPageState extends State BlocBuilder>( builder: (context, state) { return TextButton.icon( - label: Text(S.of(context).clearAll), + label: Text(S.of(context)!.clearAll), onPressed: state.isEmpty ? null : () => _reset(context), icon: const Icon(Icons.delete_sweep_outlined), ); @@ -163,7 +164,7 @@ class _ScannerPageState extends State BlocBuilder>( builder: (context, state) { return TextButton.icon( - label: Text(S.of(context).upload), + label: Text(S.of(context)!.upload), onPressed: state.isEmpty || !isConnected ? null : () => _onPrepareDocumentUpload(context), @@ -247,16 +248,16 @@ class _ScannerPageState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - S.of(context).noDocumentsScannedYet, + S.of(context)!.noDocumentsScannedYet, textAlign: TextAlign.center, ), TextButton( - child: Text(S.of(context).scanADocument), + child: Text(S.of(context)!.scanADocument), onPressed: () => _openDocumentScanner(context), ), - Text(S.of(context).or), + Text(S.of(context)!.or), TextButton( - child: Text(S.of(context).uploadADocumentFromThisDevice), + child: Text(S.of(context)!.uploadADocumentFromThisDevice), onPressed: isConnected ? _onUploadFromFilesystem : null, ), ], diff --git a/lib/features/document_scan/view/widgets/scanned_image_item.dart b/lib/features/document_scan/view/widgets/scanned_image_item.dart index ddc908a..62931bf 100644 --- a/lib/features/document_scan/view/widgets/scanned_image_item.dart +++ b/lib/features/document_scan/view/widgets/scanned_image_item.dart @@ -1,7 +1,8 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:photo_view/photo_view.dart'; typedef DeleteCallback = void Function(); @@ -112,7 +113,7 @@ class _ScannedImageItemState extends State { builder: (context) => Scaffold( appBar: AppBar( title: Text( - "${S.of(context).scan} ${widget.index + 1}/${widget.totalNumberOfFiles}"), + "${S.of(context)!.scan} ${widget.index + 1}/${widget.totalNumberOfFiles}"), ), body: PhotoView(imageProvider: FileImage(widget.file)), ), diff --git a/lib/features/document_search/view/document_search_page.dart b/lib/features/document_search/view/document_search_page.dart index 0b839de..444a1f8 100644 --- a/lib/features/document_search/view/document_search_page.dart +++ b/lib/features/document_search/view/document_search_page.dart @@ -7,7 +7,8 @@ import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/document_search/cubit/document_search_cubit.dart'; import 'package:paperless_mobile/features/document_search/view/remove_history_entry_dialog.dart'; import 'package:paperless_mobile/features/documents/view/widgets/adaptive_documents_view.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/routes/document_details_route.dart'; import 'dart:math' as math; @@ -60,7 +61,7 @@ class _DocumentSearchPageState extends State { hintStyle: theme.textTheme.bodyLarge?.apply( color: theme.colorScheme.onSurfaceVariant, ), - hintText: S.of(context).searchDocuments, + hintText: S.of(context)!.searchDocuments, border: InputBorder.none, ), controller: _queryController, @@ -181,7 +182,7 @@ class _DocumentSearchPageState extends State { Widget _buildResultsView(DocumentSearchState state) { final header = Text( - S.of(context).results, + S.of(context)!.results, style: Theme.of(context).textTheme.labelSmall, ).padded(); return CustomScrollView( @@ -190,7 +191,7 @@ class _DocumentSearchPageState extends State { if (state.hasLoaded && !state.isLoading && state.documents.isEmpty) SliverToBoxAdapter( child: Center( - child: Text(S.of(context).noMatchesFound), + child: Text(S.of(context)!.noMatchesFound), ), ) else diff --git a/lib/features/document_search/view/remove_history_entry_dialog.dart b/lib/features/document_search/view/remove_history_entry_dialog.dart index da50476..cdfd371 100644 --- a/lib/features/document_search/view/remove_history_entry_dialog.dart +++ b/lib/features/document_search/view/remove_history_entry_dialog.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:paperless_mobile/core/widgets/dialog_utils/dialog_cancel_button.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class RemoveHistoryEntryDialog extends StatelessWidget { final String entry; @@ -10,11 +10,11 @@ class RemoveHistoryEntryDialog extends StatelessWidget { Widget build(BuildContext context) { return AlertDialog( title: Text(entry), - content: Text(S.of(context).removeQueryFromSearchHistory), + content: Text(S.of(context)!.removeQueryFromSearchHistory), actions: [ const DialogCancelButton(), TextButton( - child: Text(S.of(context).remove), + child: Text(S.of(context)!.remove), onPressed: () { Navigator.pop(context, true); }, diff --git a/lib/features/document_upload/view/document_upload_preparation_page.dart b/lib/features/document_upload/view/document_upload_preparation_page.dart index f105b40..6d28db3 100644 --- a/lib/features/document_upload/view/document_upload_preparation_page.dart +++ b/lib/features/document_upload/view/document_upload_preparation_page.dart @@ -15,7 +15,8 @@ import 'package:paperless_mobile/features/edit_label/view/impl/add_correspondent import 'package:paperless_mobile/features/edit_label/view/impl/add_document_type_page.dart'; import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.dart'; import 'package:paperless_mobile/features/labels/view/widgets/label_form_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; class DocumentUploadPreparationPage extends StatefulWidget { @@ -62,7 +63,7 @@ class _DocumentUploadPreparationPageState return Scaffold( resizeToAvoidBottomInset: true, appBar: AppBar( - title: Text(S.of(context).prepareDocument), + title: Text(S.of(context)!.prepareDocument), bottom: _isUploadLoading ? const PreferredSize( child: LinearProgressIndicator(), @@ -73,7 +74,7 @@ class _DocumentUploadPreparationPageState visible: MediaQuery.of(context).viewInsets.bottom == 0, child: FloatingActionButton.extended( onPressed: _onSubmit, - label: Text(S.of(context).upload), + label: Text(S.of(context)!.upload), icon: const Icon(Icons.upload), ), ), @@ -91,7 +92,7 @@ class _DocumentUploadPreparationPageState widget.title ?? "scan_${fileNameDateFormat.format(_now)}", validator: FormBuilderValidators.required(), decoration: InputDecoration( - labelText: S.of(context).title, + labelText: S.of(context)!.title, suffixIcon: IconButton( icon: const Icon(Icons.close), onPressed: () { @@ -121,7 +122,7 @@ class _DocumentUploadPreparationPageState enabled: !_syncTitleAndFilename, name: fkFileName, decoration: InputDecoration( - labelText: S.of(context).fileName, + labelText: S.of(context)!.fileName, suffixText: widget.fileExtension, suffixIcon: IconButton( icon: const Icon(Icons.clear), @@ -151,7 +152,7 @@ class _DocumentUploadPreparationPageState } }, title: Text( - S.of(context).synchronizeTitleAndFilename, + S.of(context)!.synchronizeTitleAndFilename, ), ), // Created at @@ -166,7 +167,7 @@ class _DocumentUploadPreparationPageState }, decoration: InputDecoration( prefixIcon: const Icon(Icons.calendar_month_outlined), - labelText: S.of(context).createdAt + " *", + labelText: S.of(context)!.createdAt + " *", suffixIcon: _showDatePickerDeleteIcon ? IconButton( icon: const Icon(Icons.close), @@ -189,7 +190,7 @@ class _DocumentUploadPreparationPageState context.read>(), child: AddCorrespondentPage(initialName: initialName), ), - textFieldLabel: S.of(context).correspondent + " *", + textFieldLabel: S.of(context)!.correspondent + " *", name: DocumentModel.correspondentKey, labelOptions: state.correspondents, prefixIcon: const Icon(Icons.person_outline), @@ -204,7 +205,7 @@ class _DocumentUploadPreparationPageState context.read>(), child: AddDocumentTypePage(initialName: initialName), ), - textFieldLabel: S.of(context).documentType + " *", + textFieldLabel: S.of(context)!.documentType + " *", name: DocumentModel.documentTypeKey, labelOptions: state.documentTypes, prefixIcon: const Icon(Icons.description_outlined), @@ -218,7 +219,7 @@ class _DocumentUploadPreparationPageState //Label: "Tags" + " *", ), Text( - "* " + S.of(context).uploadInferValuesHint, + "* " + S.of(context)!.uploadInferValuesHint, style: Theme.of(context).textTheme.bodySmall, ), SizedBox(height: 300), @@ -258,7 +259,7 @@ class _DocumentUploadPreparationPageState createdAt: createdAt, ); showSnackBar( - context, S.of(context).documentSuccessfullyUploadedProcessing); + context, S.of(context)!.documentSuccessfullyUploadedProcessing); Navigator.pop(context, taskId); } on PaperlessServerException catch (error, stackTrace) { showErrorMessage(context, error, stackTrace); diff --git a/lib/features/documents/view/pages/document_view.dart b/lib/features/documents/view/pages/document_view.dart index 35e8492..09131cf 100644 --- a/lib/features/documents/view/pages/document_view.dart +++ b/lib/features/documents/view/pages/document_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:pdfx/pdfx.dart'; class DocumentView extends StatefulWidget { @@ -32,7 +33,7 @@ class _DocumentViewState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).preview), + title: Text(S.of(context)!.preview), ), body: PdfView( builders: PdfViewBuilders( diff --git a/lib/features/documents/view/pages/documents_page.dart b/lib/features/documents/view/pages/documents_page.dart index d6f6a16..b094724 100644 --- a/lib/features/documents/view/pages/documents_page.dart +++ b/lib/features/documents/view/pages/documents_page.dart @@ -20,7 +20,8 @@ import 'package:paperless_mobile/features/saved_view/view/add_saved_view_page.da import 'package:paperless_mobile/features/saved_view/view/saved_view_list.dart'; import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/routes/document_details_route.dart'; @@ -112,9 +113,9 @@ class _DocumentsPageState extends State listener: (context, state) { showSnackBar( context, - S.of(context).newDocumentAvailable, + S.of(context)!.newDocumentAvailable, action: SnackBarActionConfig( - label: S.of(context).reload, + label: S.of(context)!.reload, onPressed: () { context.read().acknowledgeCurrentTask(); context.read().reload(); @@ -200,7 +201,7 @@ class _DocumentsPageState extends State .resetSelection(), ), title: Text( - "${state.selection.length} ${S.of(context).countSelected}", + "${state.selection.length} ${S.of(context)!.countSelected}", ), actions: [ IconButton( @@ -211,13 +212,13 @@ class _DocumentsPageState extends State ); } return SearchAppBar( - hintText: S.of(context).searchDocuments, + hintText: S.of(context)!.searchDocuments, onOpenSearch: showDocumentSearchPage, bottom: TabBar( controller: _tabController, tabs: [ - Tab(text: S.of(context).documents), - Tab(text: S.of(context).views), + Tab(text: S.of(context)!.documents), + Tab(text: S.of(context)!.views), ], ), ); @@ -293,7 +294,7 @@ class _DocumentsPageState extends State _nestedScrollViewKey.currentState?.outerController.jumpTo(0); }, label: Text( - S.of(context).scrollToTop, + S.of(context)!.scrollToTop, style: DefaultTextStyle.of(context).style.apply( color: Theme.of(context).colorScheme.onPrimary, ), @@ -408,7 +409,7 @@ class _DocumentsPageState extends State .bulkDelete(documentsState.selection); showSnackBar( context, - S.of(context).documentsSuccessfullyDeleted, + S.of(context)!.documentsSuccessfullyDeleted, ); context.read().resetSelection(); } on PaperlessServerException catch (error, stackTrace) { diff --git a/lib/features/documents/view/widgets/adaptive_documents_view.dart b/lib/features/documents/view/widgets/adaptive_documents_view.dart index e8c200a..9c36e6c 100644 --- a/lib/features/documents/view/widgets/adaptive_documents_view.dart +++ b/lib/features/documents/view/widgets/adaptive_documents_view.dart @@ -220,7 +220,7 @@ class DefaultAdaptiveDocumentsView extends AdaptiveDocumentsView { Widget _buildListView() { if (showLoadingPlaceholder) { - return DocumentsListLoadingWidget(); + return const DocumentsListLoadingWidget(); } return ListView.builder( diff --git a/lib/features/documents/view/widgets/delete_document_confirmation_dialog.dart b/lib/features/documents/view/widgets/delete_document_confirmation_dialog.dart index 32e8114..0405141 100644 --- a/lib/features/documents/view/widgets/delete_document_confirmation_dialog.dart +++ b/lib/features/documents/view/widgets/delete_document_confirmation_dialog.dart @@ -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'; class DeleteDocumentConfirmationDialog extends StatelessWidget { final DocumentModel document; @@ -9,12 +9,12 @@ class DeleteDocumentConfirmationDialog extends StatelessWidget { @override Widget build(BuildContext context) { return AlertDialog( - title: Text(S.of(context).confirmDeletion), + title: Text(S.of(context)!.confirmDeletion), content: Column( mainAxisSize: MainAxisSize.min, children: [ Text( - S.of(context).areYouSureYouWantToDeleteTheFollowingDocuments(1), + S.of(context)!.areYouSureYouWantToDeleteTheFollowingDocuments(1), ), const SizedBox(height: 16), Text( @@ -26,13 +26,13 @@ class DeleteDocumentConfirmationDialog extends StatelessWidget { ), ), const SizedBox(height: 16), - Text(S.of(context).thisActionIsIrreversibleDoYouWishToProceedAnyway), + Text(S.of(context)!.thisActionIsIrreversibleDoYouWishToProceedAnyway), ], ), actions: [ TextButton( onPressed: () => Navigator.pop(context, false), - child: Text(S.of(context).cancel), + child: Text(S.of(context)!.cancel), ), TextButton( style: ButtonStyle( @@ -42,7 +42,7 @@ class DeleteDocumentConfirmationDialog extends StatelessWidget { onPressed: () { Navigator.pop(context, true); }, - child: Text(S.of(context).delete), + child: Text(S.of(context)!.delete), ), ], ); diff --git a/lib/features/documents/view/widgets/documents_empty_state.dart b/lib/features/documents/view/widgets/documents_empty_state.dart index 3c7ab5d..981d87b 100644 --- a/lib/features/documents/view/widgets/documents_empty_state.dart +++ b/lib/features/documents/view/widgets/documents_empty_state.dart @@ -3,7 +3,7 @@ import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/widgets/empty_state.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/paged_document_view/cubit/paged_documents_state.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class DocumentsEmptyState extends StatelessWidget { final DocumentPagingState state; @@ -18,13 +18,13 @@ class DocumentsEmptyState extends StatelessWidget { Widget build(BuildContext context) { return Center( child: EmptyState( - title: S.of(context).oops, - subtitle: S.of(context).thereSeemsToBeNothingHere, + title: S.of(context)!.oops, + subtitle: S.of(context)!.thereSeemsToBeNothingHere, bottomChild: state.filter != DocumentFilter.initial && onReset != null ? TextButton( onPressed: onReset, child: Text( - S.of(context).resetFilter, + S.of(context)!.resetFilter, ), ).padded() : null, diff --git a/lib/features/documents/view/widgets/placeholder/documents_list_loading_widget.dart b/lib/features/documents/view/widgets/placeholder/documents_list_loading_widget.dart index aed9304..492c618 100644 --- a/lib/features/documents/view/widgets/placeholder/documents_list_loading_widget.dart +++ b/lib/features/documents/view/widgets/placeholder/documents_list_loading_widget.dart @@ -19,6 +19,7 @@ class DocumentsListLoadingWidget extends StatelessWidget { ); } else { return ListView.builder( + padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) => _buildFakeListItem(context), ); diff --git a/lib/features/documents/view/widgets/search/document_filter_form.dart b/lib/features/documents/view/widgets/search/document_filter_form.dart index 4530c25..4b05e97 100644 --- a/lib/features/documents/view/widgets/search/document_filter_form.dart +++ b/lib/features/documents/view/widgets/search/document_filter_form.dart @@ -6,7 +6,7 @@ import 'package:paperless_mobile/core/widgets/form_builder_fields/extended_date_ import 'package:paperless_mobile/features/labels/cubit/label_cubit.dart'; import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.dart'; import 'package:paperless_mobile/features/labels/view/widgets/label_form_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'text_query_form_field.dart'; @@ -96,14 +96,14 @@ class _DocumentFilterFormState extends State { Align( alignment: Alignment.centerLeft, child: Text( - S.of(context).advanced, + S.of(context)!.advanced, style: Theme.of(context).textTheme.bodySmall, ), ), FormBuilderExtendedDateRangePicker( name: DocumentFilterForm.fkCreatedAt, initialValue: widget.initialFilter.created, - labelText: S.of(context).createdAt, + labelText: S.of(context)!.createdAt, onChanged: (_) { _checkQueryConstraints(); }, @@ -111,7 +111,7 @@ class _DocumentFilterFormState extends State { FormBuilderExtendedDateRangePicker( name: DocumentFilterForm.fkAddedAt, initialValue: widget.initialFilter.added, - labelText: S.of(context).addedAt, + labelText: S.of(context)!.addedAt, onChanged: (_) { _checkQueryConstraints(); }, @@ -151,7 +151,7 @@ class _DocumentFilterFormState extends State { formBuilderState: widget.formKey.currentState, name: DocumentFilterForm.fkDocumentType, labelOptions: state.labels, - textFieldLabel: S.of(context).documentType, + textFieldLabel: S.of(context)!.documentType, initialValue: widget.initialFilter.documentType, prefixIcon: const Icon(Icons.description_outlined), ); @@ -166,7 +166,7 @@ class _DocumentFilterFormState extends State { formBuilderState: widget.formKey.currentState, name: DocumentFilterForm.fkCorrespondent, labelOptions: state.labels, - textFieldLabel: S.of(context).correspondent, + textFieldLabel: S.of(context)!.correspondent, initialValue: widget.initialFilter.correspondent, prefixIcon: const Icon(Icons.person_outline), ); @@ -181,7 +181,7 @@ class _DocumentFilterFormState extends State { formBuilderState: widget.formKey.currentState, name: DocumentFilterForm.fkStoragePath, labelOptions: state.labels, - textFieldLabel: S.of(context).storagePath, + textFieldLabel: S.of(context)!.storagePath, initialValue: widget.initialFilter.storagePath, prefixIcon: const Icon(Icons.folder_outlined), ); diff --git a/lib/features/documents/view/widgets/search/document_filter_panel.dart b/lib/features/documents/view/widgets/search/document_filter_panel.dart index b1ee243..b4d41e3 100644 --- a/lib/features/documents/view/widgets/search/document_filter_panel.dart +++ b/lib/features/documents/view/widgets/search/document_filter_panel.dart @@ -5,7 +5,7 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/features/documents/view/pages/documents_page.dart'; import 'package:paperless_mobile/features/documents/view/widgets/search/document_filter_form.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; enum DateRangeSelection { before, after } @@ -74,7 +74,7 @@ class _DocumentFilterPanelState extends State { visible: MediaQuery.of(context).viewInsets.bottom == 0, child: FloatingActionButton.extended( icon: const Icon(Icons.done), - label: Text(S.of(context).apply), + label: Text(S.of(context)!.apply), onPressed: _onApplyFilter, ), ), @@ -85,7 +85,7 @@ class _DocumentFilterPanelState extends State { TextButton.icon( onPressed: _resetFilter, icon: const Icon(Icons.refresh), - label: Text(S.of(context).reset), + label: Text(S.of(context)!.reset), ), ], ), @@ -133,7 +133,7 @@ class _DocumentFilterPanelState extends State { ), Padding( padding: EdgeInsets.only(left: _heightAnimationValue * 48), - child: Text(S.of(context).filterDocuments), + child: Text(S.of(context)!.filterDocuments), ), ], ), diff --git a/lib/features/documents/view/widgets/search/sort_field_selection_bottom_sheet.dart b/lib/features/documents/view/widgets/search/sort_field_selection_bottom_sheet.dart index a9f391a..07de4c3 100644 --- a/lib/features/documents/view/widgets/search/sort_field_selection_bottom_sheet.dart +++ b/lib/features/documents/view/widgets/search/sort_field_selection_bottom_sheet.dart @@ -5,7 +5,7 @@ import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/translation/sort_field_localization_mapper.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/labels/cubit/label_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class SortFieldSelectionBottomSheet extends StatefulWidget { final SortOrder initialSortOrder; @@ -48,12 +48,12 @@ class _SortFieldSelectionBottomSheetState mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - S.of(context).orderBy, + S.of(context)!.orderBy, style: Theme.of(context).textTheme.bodySmall, textAlign: TextAlign.start, ), TextButton( - child: Text(S.of(context).apply), + child: Text(S.of(context)!.apply), onPressed: () { widget.onSubmit( _currentSortField, @@ -105,12 +105,12 @@ class _SortFieldSelectionBottomSheetState ButtonSegment( icon: const FaIcon(FontAwesomeIcons.arrowDownAZ), value: SortOrder.descending, - label: Text(S.of(context).descending), + label: Text(S.of(context)!.descending), ), ButtonSegment( icon: const FaIcon(FontAwesomeIcons.arrowUpZA), value: SortOrder.ascending, - label: Text(S.of(context).ascending), + label: Text(S.of(context)!.ascending), ), ], emptySelectionAllowed: false, diff --git a/lib/features/documents/view/widgets/search/text_query_form_field.dart b/lib/features/documents/view/widgets/search/text_query_form_field.dart index b9c97db..d6af5b9 100644 --- a/lib/features/documents/view/widgets/search/text_query_form_field.dart +++ b/lib/features/documents/view/widgets/search/text_query_form_field.dart @@ -3,7 +3,8 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/widgets/form_builder_fields/form_builder_type_ahead.dart'; import 'package:paperless_mobile/features/documents/cubit/documents_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:provider/provider.dart'; class TextQueryFormField extends StatelessWidget { @@ -63,19 +64,19 @@ class TextQueryFormField extends StatelessWidget { itemBuilder: (context) => [ PopupMenuItem( child: ListTile( - title: Text(S.of(context).titleAndContent), + title: Text(S.of(context)!.titleAndContent), ), value: QueryType.titleAndContent, ), PopupMenuItem( child: ListTile( - title: Text(S.of(context).title), + title: Text(S.of(context)!.title), ), value: QueryType.title, ), PopupMenuItem( child: ListTile( - title: Text(S.of(context).extended), + title: Text(S.of(context)!.extended), ), value: QueryType.extended, ), @@ -89,11 +90,11 @@ class TextQueryFormField extends StatelessWidget { String _buildLabelText(BuildContext context, QueryType queryType) { switch (queryType) { case QueryType.title: - return S.of(context).title; + return S.of(context)!.title; case QueryType.titleAndContent: - return S.of(context).titleAndContent; + return S.of(context)!.titleAndContent; case QueryType.extended: - return S.of(context).extended; + return S.of(context)!.extended; default: return ''; } diff --git a/lib/features/documents/view/widgets/selection/bulk_delete_confirmation_dialog.dart b/lib/features/documents/view/widgets/selection/bulk_delete_confirmation_dialog.dart index 7d39835..e59f429 100644 --- a/lib/features/documents/view/widgets/selection/bulk_delete_confirmation_dialog.dart +++ b/lib/features/documents/view/widgets/selection/bulk_delete_confirmation_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/features/documents/cubit/documents_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class BulkDeleteConfirmationDialog extends StatelessWidget { final DocumentsState state; @@ -14,24 +14,24 @@ class BulkDeleteConfirmationDialog extends StatelessWidget { Widget build(BuildContext context) { assert(state.selection.isNotEmpty); return AlertDialog( - title: Text(S.of(context).confirmDeletion), + title: Text(S.of(context)!.confirmDeletion), content: Column( mainAxisSize: MainAxisSize.min, children: [ Text( - S.of(context).areYouSureYouWantToDeleteTheFollowingDocuments( + S.of(context)!.areYouSureYouWantToDeleteTheFollowingDocuments( state.selection.length), ), const SizedBox(height: 16), ...state.selection.map(_buildBulletPoint).toList(), const SizedBox(height: 16), - Text(S.of(context).thisActionIsIrreversibleDoYouWishToProceedAnyway), + Text(S.of(context)!.thisActionIsIrreversibleDoYouWishToProceedAnyway), ], ), actions: [ TextButton( onPressed: () => Navigator.pop(context, false), - child: Text(S.of(context).cancel), + child: Text(S.of(context)!.cancel), ), TextButton( style: ButtonStyle( @@ -41,7 +41,7 @@ class BulkDeleteConfirmationDialog extends StatelessWidget { onPressed: () { Navigator.pop(context, true); }, - child: Text(S.of(context).delete), + child: Text(S.of(context)!.delete), ), ], ); diff --git a/lib/features/documents/view/widgets/selection/confirm_delete_saved_view_dialog.dart b/lib/features/documents/view/widgets/selection/confirm_delete_saved_view_dialog.dart index 47569f7..5721277 100644 --- a/lib/features/documents/view/widgets/selection/confirm_delete_saved_view_dialog.dart +++ b/lib/features/documents/view/widgets/selection/confirm_delete_saved_view_dialog.dart @@ -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'; class ConfirmDeleteSavedViewDialog extends StatelessWidget { const ConfirmDeleteSavedViewDialog({ @@ -14,18 +14,18 @@ class ConfirmDeleteSavedViewDialog extends StatelessWidget { Widget build(BuildContext context) { return AlertDialog( title: Text( - S.of(context).deleteView + view.name + "?", + S.of(context)!.deleteView + view.name + "?", softWrap: true, ), - content: Text(S.of(context).doYouReallyWantToDeleteThisView), + content: Text(S.of(context)!.doYouReallyWantToDeleteThisView), actions: [ TextButton( - child: Text(S.of(context).cancel), + child: Text(S.of(context)!.cancel), onPressed: () => Navigator.pop(context, false), ), TextButton( child: Text( - S.of(context).delete, + S.of(context)!.delete, style: TextStyle(color: Theme.of(context).colorScheme.error), ), onPressed: () => Navigator.pop(context, true), diff --git a/lib/features/documents/view/widgets/selection/view_type_selection_widget.dart b/lib/features/documents/view/widgets/selection/view_type_selection_widget.dart index c8a3079..54e7aad 100644 --- a/lib/features/documents/view/widgets/selection/view_type_selection_widget.dart +++ b/lib/features/documents/view/widgets/selection/view_type_selection_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:paperless_mobile/features/settings/model/view_type.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; /// Meant to be used with blocbuilder. class ViewTypeSelectionWidget extends StatelessWidget { @@ -34,19 +34,19 @@ class ViewTypeSelectionWidget extends StatelessWidget { _buildViewTypeOption( context, type: ViewType.list, - label: S.of(context).list, + label: S.of(context)!.list, icon: Icons.list, ), _buildViewTypeOption( context, type: ViewType.grid, - label: S.of(context).grid, + label: S.of(context)!.grid, icon: Icons.grid_view_rounded, ), _buildViewTypeOption( context, type: ViewType.detailed, - label: S.of(context).detailed, + label: S.of(context)!.detailed, icon: Icons.article_outlined, ), ], diff --git a/lib/features/edit_label/view/add_label_page.dart b/lib/features/edit_label/view/add_label_page.dart index de18fbd..caf54e5 100644 --- a/lib/features/edit_label/view/add_label_page.dart +++ b/lib/features/edit_label/view/add_label_page.dart @@ -5,7 +5,7 @@ import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/state/indexed_repository_state.dart'; import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/label_form.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class AddLabelPage extends StatelessWidget { final String? initialName; @@ -62,7 +62,7 @@ class AddLabelFormWidget extends StatelessWidget { fromJsonT: fromJsonT, submitButtonConfig: SubmitButtonConfig( icon: const Icon(Icons.add), - label: Text(S.of(context).create), + label: Text(S.of(context)!.create), onSubmit: context.read>().create, ), additionalFields: additionalFields, diff --git a/lib/features/edit_label/view/edit_label_page.dart b/lib/features/edit_label/view/edit_label_page.dart index e2f8888..9df9c0b 100644 --- a/lib/features/edit_label/view/edit_label_page.dart +++ b/lib/features/edit_label/view/edit_label_page.dart @@ -8,7 +8,8 @@ import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/state/indexed_repository_state.dart'; import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/label_form.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/constants.dart'; @@ -55,7 +56,7 @@ class EditLabelForm extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).edit), + title: Text(S.of(context)!.edit), actions: [ IconButton( onPressed: () => _onDelete(context), @@ -68,7 +69,7 @@ class EditLabelForm extends StatelessWidget { fromJsonT: fromJsonT, submitButtonConfig: SubmitButtonConfig( icon: const Icon(Icons.save), - label: Text(S.of(context).saveChanges), + label: Text(S.of(context)!.saveChanges), onSubmit: context.read>().update, ), additionalFields: additionalFields, @@ -81,21 +82,21 @@ class EditLabelForm extends StatelessWidget { final shouldDelete = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text(S.of(context).confirmDeletion), + title: Text(S.of(context)!.confirmDeletion), content: Text( - S.of(context).deleteLabelWarningText, + S.of(context)!.deleteLabelWarningText, ), actions: [ TextButton( onPressed: () => Navigator.pop(context, false), - child: Text(S.of(context).cancel), + child: Text(S.of(context)!.cancel), ), TextButton( onPressed: () { Navigator.pop(context, true); }, child: Text( - S.of(context).delete, + S.of(context)!.delete, style: TextStyle(color: Theme.of(context).colorScheme.error), ), diff --git a/lib/features/edit_label/view/impl/add_correspondent_page.dart b/lib/features/edit_label/view/impl/add_correspondent_page.dart index f8e7b60..dfcc0da 100644 --- a/lib/features/edit_label/view/impl/add_correspondent_page.dart +++ b/lib/features/edit_label/view/impl/add_correspondent_page.dart @@ -5,7 +5,7 @@ import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/state/impl/correspondent_repository_state.dart'; import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/add_label_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class AddCorrespondentPage extends StatelessWidget { final String? initialName; @@ -18,7 +18,7 @@ class AddCorrespondentPage extends StatelessWidget { context.read>(), ), child: AddLabelPage( - pageTitle: Text(S.of(context).addCorrespondent), + pageTitle: Text(S.of(context)!.addCorrespondent), fromJsonT: Correspondent.fromJson, initialName: initialName, ), diff --git a/lib/features/edit_label/view/impl/add_document_type_page.dart b/lib/features/edit_label/view/impl/add_document_type_page.dart index 646f571..63a848d 100644 --- a/lib/features/edit_label/view/impl/add_document_type_page.dart +++ b/lib/features/edit_label/view/impl/add_document_type_page.dart @@ -5,7 +5,7 @@ import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/state/impl/document_type_repository_state.dart'; import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/add_label_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class AddDocumentTypePage extends StatelessWidget { final String? initialName; @@ -21,7 +21,7 @@ class AddDocumentTypePage extends StatelessWidget { context.read>(), ), child: AddLabelPage( - pageTitle: Text(S.of(context).addDocumentType), + pageTitle: Text(S.of(context)!.addDocumentType), fromJsonT: DocumentType.fromJson, initialName: initialName, ), diff --git a/lib/features/edit_label/view/impl/add_storage_path_page.dart b/lib/features/edit_label/view/impl/add_storage_path_page.dart index 936525b..c192588 100644 --- a/lib/features/edit_label/view/impl/add_storage_path_page.dart +++ b/lib/features/edit_label/view/impl/add_storage_path_page.dart @@ -6,7 +6,7 @@ import 'package:paperless_mobile/core/repository/state/impl/storage_path_reposit import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/add_label_page.dart'; import 'package:paperless_mobile/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class AddStoragePathPage extends StatelessWidget { final String? initalValue; @@ -19,7 +19,7 @@ class AddStoragePathPage extends StatelessWidget { context.read>(), ), child: AddLabelPage( - pageTitle: Text(S.of(context).addStoragePath), + pageTitle: Text(S.of(context)!.addStoragePath), fromJsonT: StoragePath.fromJson, initialName: initalValue, additionalFields: const [ diff --git a/lib/features/edit_label/view/impl/add_tag_page.dart b/lib/features/edit_label/view/impl/add_tag_page.dart index 61dcc31..770402a 100644 --- a/lib/features/edit_label/view/impl/add_tag_page.dart +++ b/lib/features/edit_label/view/impl/add_tag_page.dart @@ -9,7 +9,7 @@ import 'package:paperless_mobile/core/repository/state/impl/tag_repository_state import 'package:paperless_mobile/core/widgets/form_builder_fields/form_builder_color_picker.dart'; import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/add_label_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class AddTagPage extends StatelessWidget { final String? initialValue; @@ -22,7 +22,7 @@ class AddTagPage extends StatelessWidget { context.read>(), ), child: AddLabelPage( - pageTitle: Text(S.of(context).addTag), + pageTitle: Text(S.of(context)!.addTag), fromJsonT: Tag.fromJson, initialName: initialValue, additionalFields: [ @@ -30,7 +30,7 @@ class AddTagPage extends StatelessWidget { name: Tag.colorKey, valueTransformer: (color) => "#${color?.value.toRadixString(16)}", decoration: InputDecoration( - label: Text(S.of(context).color), + label: Text(S.of(context)!.color), ), colorPickerType: ColorPickerType.materialPicker, initialValue: Color((Random().nextDouble() * 0xFFFFFF).toInt()) @@ -38,7 +38,7 @@ class AddTagPage extends StatelessWidget { ), FormBuilderCheckbox( name: Tag.isInboxTagKey, - title: Text(S.of(context).inboxTag), + title: Text(S.of(context)!.inboxTag), ), ], ), diff --git a/lib/features/edit_label/view/impl/edit_tag_page.dart b/lib/features/edit_label/view/impl/edit_tag_page.dart index 1c7200b..8b6650a 100644 --- a/lib/features/edit_label/view/impl/edit_tag_page.dart +++ b/lib/features/edit_label/view/impl/edit_tag_page.dart @@ -7,7 +7,7 @@ import 'package:paperless_mobile/core/repository/state/impl/tag_repository_state import 'package:paperless_mobile/core/widgets/form_builder_fields/form_builder_color_picker.dart'; import 'package:paperless_mobile/features/edit_label/cubit/edit_label_cubit.dart'; import 'package:paperless_mobile/features/edit_label/view/edit_label_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class EditTagPage extends StatelessWidget { final Tag tag; @@ -28,14 +28,14 @@ class EditTagPage extends StatelessWidget { initialValue: tag.color, name: Tag.colorKey, decoration: InputDecoration( - label: Text(S.of(context).color), + label: Text(S.of(context)!.color), ), colorPickerType: ColorPickerType.blockPicker, ), FormBuilderCheckbox( initialValue: tag.isInboxTag, name: Tag.isInboxTagKey, - title: Text(S.of(context).inboxTag), + title: Text(S.of(context)!.inboxTag), ), ], ), diff --git a/lib/features/edit_label/view/label_form.dart b/lib/features/edit_label/view/label_form.dart index b027dd6..551b6f8 100644 --- a/lib/features/edit_label/view/label_form.dart +++ b/lib/features/edit_label/view/label_form.dart @@ -5,7 +5,8 @@ import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/translation/matching_algorithm_localization_mapper.dart'; import 'package:paperless_mobile/core/type/types.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'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/constants.dart'; @@ -75,7 +76,7 @@ class _LabelFormState extends State> { FormBuilderTextField( name: Label.nameKey, decoration: InputDecoration( - labelText: S.of(context).name, + labelText: S.of(context)!.name, errorText: _errors[Label.nameKey], ), validator: FormBuilderValidators.required(), @@ -88,7 +89,7 @@ class _LabelFormState extends State> { MatchingAlgorithm.defaultValue) .value, decoration: InputDecoration( - labelText: S.of(context).matchingAlgorithm, + labelText: S.of(context)!.matchingAlgorithm, errorText: _errors[Label.matchingAlgorithmKey], ), onChanged: (val) { @@ -112,7 +113,7 @@ class _LabelFormState extends State> { FormBuilderTextField( name: Label.matchKey, decoration: InputDecoration( - labelText: S.of(context).match, + labelText: S.of(context)!.match, errorText: _errors[Label.matchKey], ), initialValue: widget.initialValue?.match, @@ -121,7 +122,7 @@ class _LabelFormState extends State> { FormBuilderCheckbox( name: Label.isInsensitiveKey, initialValue: widget.initialValue?.isInsensitive ?? true, - title: Text(S.of(context).caseIrrelevant), + title: Text(S.of(context)!.caseIrrelevant), ), ...widget.additionalFields, ].padded(), diff --git a/lib/features/home/view/home_page.dart b/lib/features/home/view/home_page.dart index c112974..dc6f7cb 100644 --- a/lib/features/home/view/home_page.dart +++ b/lib/features/home/view/home_page.dart @@ -28,7 +28,8 @@ import 'package:paperless_mobile/features/notifications/services/local_notificat import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart'; import 'package:paperless_mobile/features/sharing/share_intent_queue.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/file_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:path/path.dart' as p; @@ -153,41 +154,41 @@ class _HomePageState extends State with WidgetsBindingObserver { } final filename = extractFilenameFromPath(mediaFile.path); final extension = p.extension(mediaFile.path); - if (await File(mediaFile.path).exists()) { - final bytes = File(mediaFile.path).readAsBytesSync(); - final success = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => BlocProvider.value( - value: DocumentUploadCubit( - documentApi: context.read(), - tagRepository: context.read(), - correspondentRepository: context.read(), - documentTypeRepository: context.read(), - ), - child: DocumentUploadPreparationPage( - fileBytes: bytes, - filename: filename, - title: filename, - fileExtension: extension, - ), + if (await File(mediaFile.path).exists()) { + final bytes = File(mediaFile.path).readAsBytesSync(); + final success = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => BlocProvider.value( + value: DocumentUploadCubit( + documentApi: context.read(), + tagRepository: context.read(), + correspondentRepository: context.read(), + documentTypeRepository: context.read(), + ), + child: DocumentUploadPreparationPage( + fileBytes: bytes, + filename: filename, + title: filename, + fileExtension: extension, ), ), - ) ?? - false; - if (success) { - await Fluttertoast.showToast( - msg: S.of(context).documentSuccessfullyUploadedProcessing, - ); - SystemNavigator.pop(); - } - } else { - Fluttertoast.showToast( - msg: S.of(context).couldNotAccessReceivedFile, - toastLength: Toast.LENGTH_LONG, + ), + ) ?? + false; + if (success) { + await Fluttertoast.showToast( + msg: S.of(context)!.documentSuccessfullyUploadedProcessing, ); + SystemNavigator.pop(); } + } else { + Fluttertoast.showToast( + msg: S.of(context)!.couldNotAccessReceivedFile, + toastLength: Toast.LENGTH_LONG, + ); } + } @override Widget build(BuildContext context) { @@ -198,7 +199,7 @@ class _HomePageState extends State with WidgetsBindingObserver { Icons.description, color: Theme.of(context).colorScheme.primary, ), - label: S.of(context).documents, + label: S.of(context)!.documents, ), RouteDescription( icon: const Icon(Icons.document_scanner_outlined), @@ -206,7 +207,7 @@ class _HomePageState extends State with WidgetsBindingObserver { Icons.document_scanner, color: Theme.of(context).colorScheme.primary, ), - label: S.of(context).scanner, + label: S.of(context)!.scanner, ), RouteDescription( icon: const Icon(Icons.sell_outlined), @@ -214,7 +215,7 @@ class _HomePageState extends State with WidgetsBindingObserver { Icons.sell, color: Theme.of(context).colorScheme.primary, ), - label: S.of(context).labels, + label: S.of(context)!.labels, ), RouteDescription( icon: const Icon(Icons.inbox_outlined), @@ -222,7 +223,7 @@ class _HomePageState extends State with WidgetsBindingObserver { Icons.inbox, color: Theme.of(context).colorScheme.primary, ), - label: S.of(context).inbox, + label: S.of(context)!.inbox, badgeBuilder: (icon) => BlocBuilder( bloc: _inboxCubit, builder: (context, state) { diff --git a/lib/features/home/view/widget/verify_identity_page.dart b/lib/features/home/view/widget/verify_identity_page.dart index 980ca57..fd34b79 100644 --- a/lib/features/home/view/widget/verify_identity_page.dart +++ b/lib/features/home/view/widget/verify_identity_page.dart @@ -6,7 +6,8 @@ import 'package:paperless_mobile/core/repository/saved_view_repository.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:provider/provider.dart'; class VerifyIdentityPage extends StatelessWidget { @@ -19,12 +20,12 @@ class VerifyIdentityPage extends StatelessWidget { appBar: AppBar( elevation: 0, backgroundColor: Theme.of(context).colorScheme.background, - title: Text(S.of(context).verifyYourIdentity), + title: Text(S.of(context)!.verifyYourIdentity), ), body: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(S.of(context).useTheConfiguredBiometricFactorToAuthenticate) + Text(S.of(context)!.useTheConfiguredBiometricFactorToAuthenticate) .paddedSymmetrically(horizontal: 16), const Icon( Icons.fingerprint, @@ -39,7 +40,7 @@ class VerifyIdentityPage extends StatelessWidget { TextButton( onPressed: () => _logout(context), child: Text( - S.of(context).disconnect, + S.of(context)!.disconnect, style: TextStyle( color: Theme.of(context).colorScheme.error, ), @@ -52,7 +53,7 @@ class VerifyIdentityPage extends StatelessWidget { .read() .state .isLocalAuthenticationEnabled), - child: Text(S.of(context).verifyIdentity), + child: Text(S.of(context)!.verifyIdentity), ), ], ).padded(16), diff --git a/lib/features/inbox/view/pages/inbox_page.dart b/lib/features/inbox/view/pages/inbox_page.dart index d4d48dc..2f8f21a 100644 --- a/lib/features/inbox/view/pages/inbox_page.dart +++ b/lib/features/inbox/view/pages/inbox_page.dart @@ -14,7 +14,8 @@ import 'package:paperless_mobile/features/inbox/view/widgets/inbox_empty_widget. import 'package:paperless_mobile/features/inbox/view/widgets/inbox_item.dart'; import 'package:paperless_mobile/features/paged_document_view/view/document_paging_view_mixin.dart'; import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; class InboxPage extends StatefulWidget { @@ -52,7 +53,7 @@ class _InboxPageState extends State return const SizedBox.shrink(); } return FloatingActionButton.extended( - label: Text(S.of(context).allSeen), + label: Text(S.of(context)!.allSeen), icon: const Icon(Icons.done_all), onPressed: state.hasLoaded && state.documents.isNotEmpty ? () => _onMarkAllAsSeen( @@ -128,7 +129,7 @@ class _InboxPageState extends State controller: pagingScrollController, slivers: [ SearchAppBar( - hintText: S.of(context).searchDocuments, + hintText: S.of(context)!.searchDocuments, onOpenSearch: showDocumentSearchPage, ), if (state.documents.isEmpty) @@ -150,7 +151,7 @@ class _InboxPageState extends State child: HintCard( show: !state.isHintAcknowledged, hintText: - S.of(context).swipeLeftToMarkADocumentAsSeen, + S.of(context)!.swipeLeftToMarkADocumentAsSeen, onHintAcknowledged: () => context.read().acknowledgeHint(), ), @@ -178,7 +179,7 @@ class _InboxPageState extends State color: Theme.of(context).colorScheme.primary, ).padded(), Text( - S.of(context).markAsSeen, + S.of(context)!.markAsSeen, style: TextStyle( color: Theme.of(context).colorScheme.primary, ), @@ -198,19 +199,19 @@ class _InboxPageState extends State final isActionConfirmed = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text(S.of(context).markAllAsSeen), + title: Text(S.of(context)!.markAllAsSeen), content: Text( - S.of(context).areYouSureYouWantToMarkAllDocumentsAsSeen, + S.of(context)!.areYouSureYouWantToMarkAllDocumentsAsSeen, ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(false), - child: Text(S.of(context).cancel), + child: Text(S.of(context)!.cancel), ), TextButton( onPressed: () => Navigator.of(context).pop(true), child: Text( - S.of(context).ok, + S.of(context)!.ok, style: TextStyle(color: Theme.of(context).colorScheme.error), ), ), @@ -228,9 +229,9 @@ class _InboxPageState extends State final removedTags = await context.read().removeFromInbox(doc); showSnackBar( context, - S.of(context).removeDocumentFromInbox, + S.of(context)!.removeDocumentFromInbox, action: SnackBarActionConfig( - label: S.of(context).undo, + label: S.of(context)!.undo, onPressed: () => _onUndoMarkAsSeen(doc, removedTags), ), ); @@ -267,10 +268,10 @@ class _InboxPageState extends State documents, (doc) { if (doc.added.isToday) { - return S.of(context).today; + return S.of(context)!.today; } if (doc.added.isYesterday) { - return S.of(context).yesterday; + return S.of(context)!.yesterday; } return DateFormat.yMMMMd().format(doc.added); }, diff --git a/lib/features/inbox/view/widgets/inbox_empty_widget.dart b/lib/features/inbox/view/widgets/inbox_empty_widget.dart index 114eb4e..a2ddf7c 100644 --- a/lib/features/inbox/view/widgets/inbox_empty_widget.dart +++ b/lib/features/inbox/view/widgets/inbox_empty_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:paperless_mobile/features/inbox/cubit/inbox_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class InboxEmptyWidget extends StatelessWidget { const InboxEmptyWidget({ @@ -23,11 +23,11 @@ class InboxEmptyWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ - Text(S.of(context).youDoNotHaveUnseenDocuments), + Text(S.of(context)!.youDoNotHaveUnseenDocuments), TextButton( onPressed: () => _emptyStateRefreshIndicatorKey.currentState?.show(), - child: Text(S.of(context).refresh), + child: Text(S.of(context)!.refresh), ), ], ), diff --git a/lib/features/inbox/view/widgets/inbox_item.dart b/lib/features/inbox/view/widgets/inbox_item.dart index a453671..8aecb92 100644 --- a/lib/features/inbox/view/widgets/inbox_item.dart +++ b/lib/features/inbox/view/widgets/inbox_item.dart @@ -8,7 +8,8 @@ import 'package:paperless_mobile/features/documents/view/widgets/document_previe import 'package:paperless_mobile/features/inbox/cubit/inbox_cubit.dart'; import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart'; import 'package:paperless_mobile/features/labels/view/widgets/label_text.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/routes/document_details_route.dart'; class InboxItem extends StatefulWidget { @@ -99,7 +100,7 @@ class _InboxItemState extends State { child: ActionChip( avatar: const Icon(Icons.delete_outline), shape: chipShape, - label: Text(S.of(context).deleteDocument), + label: Text(S.of(context)!.deleteDocument), onPressed: () async { final shouldDelete = await showDialog( context: context, @@ -147,7 +148,7 @@ class _InboxItemState extends State { maxWidth: 50, ), child: Text( - S.of(context).quickAction, + S.of(context)!.quickAction, textAlign: TextAlign.center, maxLines: 3, style: Theme.of(context).textTheme.labelSmall, @@ -190,9 +191,9 @@ class _InboxItemState extends State { shape: chipShape, label: hasAsn ? Text( - '${S.of(context).asn} #${widget.document.archiveSerialNumber}', + '${S.of(context)!.asn} #${widget.document.archiveSerialNumber}', ) - : Text(S.of(context).assignASN), + : Text(S.of(context)!.assignAsn), onPressed: !hasAsn ? () { setState(() { @@ -352,7 +353,7 @@ class _InboxItemState extends State { // avatar: const Icon(Icons.calendar_today_outlined), // shape: chipShape, // label: Text( - // "${S.of(context).createdAt}: ${DateFormat.yMd().format(e)}", + // "${S.of(context)!.createdAt}: ${DateFormat.yMd().format(e)}", // ), // onPressed: () => context // .read() diff --git a/lib/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart b/lib/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart index 64d4650..db5171f 100644 --- a/lib/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart +++ b/lib/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:form_builder_validators/form_builder_validators.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 StoragePathAutofillFormBuilderField extends StatefulWidget { final String name; @@ -48,7 +48,7 @@ class _StoragePathAutofillFormBuilderFieldState controller: _textEditingController, validator: FormBuilderValidators.required(), //TODO: INTL decoration: InputDecoration( - label: Text(S.of(context).storagePath), + label: Text(S.of(context)!.storagePath), suffixIcon: _showClearIcon ? IconButton( icon: const Icon(Icons.clear), @@ -69,65 +69,65 @@ class _StoragePathAutofillFormBuilderFieldState runSpacing: 4.0, children: [ InputChip( - label: Text(S.of(context).archiveSerialNumber), + label: Text(S.of(context)!.archiveSerialNumber), onPressed: () => _addParameterToInput("{asn}", field), ), InputChip( - label: Text(S.of(context).correspondent), + label: Text(S.of(context)!.correspondent), onPressed: () => _addParameterToInput("{correspondent}", field), ), InputChip( - label: Text(S.of(context).documentType), + label: Text(S.of(context)!.documentType), onPressed: () => _addParameterToInput("{document_type}", field), ), InputChip( - label: Text(S.of(context).tags), + label: Text(S.of(context)!.tags), onPressed: () => _addParameterToInput("{tag_list}", field), ), InputChip( - label: Text(S.of(context).title), + label: Text(S.of(context)!.title), onPressed: () => _addParameterToInput("{title}", field), ), InputChip( - label: Text(S.of(context).createdAt), + label: Text(S.of(context)!.createdAt), onPressed: () => _addParameterToInput("{created}", field), ), InputChip( - label: Text(S.of(context).createdAt + - " (${S.of(context).storagePathYear})"), + label: Text(S.of(context)!.createdAt + + " (${S.of(context)!.storagePathYear})"), onPressed: () => _addParameterToInput("{created_year}", field), ), InputChip( - label: Text(S.of(context).createdAt + - " (${S.of(context).storagePathMonth})"), + label: Text(S.of(context)!.createdAt + + " (${S.of(context)!.storagePathMonth})"), onPressed: () => _addParameterToInput("{created_month}", field), ), InputChip( - label: Text(S.of(context).createdAt + - " (${S.of(context).storagePathDay})"), + label: Text(S.of(context)!.createdAt + + " (${S.of(context)!.storagePathDay})"), onPressed: () => _addParameterToInput("{created_day}", field), ), InputChip( - label: Text(S.of(context).createdAt), + label: Text(S.of(context)!.createdAt), onPressed: () => _addParameterToInput("{added}", field), ), InputChip( - label: Text(S.of(context).createdAt + - " (${S.of(context).storagePathYear})"), + label: Text(S.of(context)!.createdAt + + " (${S.of(context)!.storagePathYear})"), onPressed: () => _addParameterToInput("{added_year}", field), ), InputChip( - label: Text(S.of(context).createdAt + - " (${S.of(context).storagePathMonth})"), + label: Text(S.of(context)!.createdAt + + " (${S.of(context)!.storagePathMonth})"), onPressed: () => _addParameterToInput("{added_month}", field), ), InputChip( - label: Text(S.of(context).createdAt + - " (${S.of(context).storagePathDay})"), + label: Text(S.of(context)!.createdAt + + " (${S.of(context)!.storagePathDay})"), onPressed: () => _addParameterToInput("{added_day}", field), ), ], diff --git a/lib/features/labels/tags/view/widgets/tags_form_field.dart b/lib/features/labels/tags/view/widgets/tags_form_field.dart index e928c09..4d926ca 100644 --- a/lib/features/labels/tags/view/widgets/tags_form_field.dart +++ b/lib/features/labels/tags/view/widgets/tags_form_field.dart @@ -10,7 +10,7 @@ import 'package:paperless_mobile/core/repository/state/impl/tag_repository_state import 'package:paperless_mobile/core/workarounds/colored_chip.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/edit_label/view/impl/add_tag_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class TagFormField extends StatefulWidget { final TagsQuery? initialValue; @@ -94,8 +94,8 @@ class _TagFormFieldState extends State { Icons.label_outline, ), suffixIcon: _buildSuffixIcon(context, field), - labelText: S.of(context).tags, - hintText: S.of(context).filterTags, + labelText: S.of(context)!.tags, + hintText: S.of(context)!.filterTags, ), controller: _textEditingController, ), @@ -138,10 +138,10 @@ class _TagFormFieldState extends State { late String? title; switch (data) { case _onlyNotAssignedId: - title = S.of(context).notAssigned; + title = S.of(context)!.notAssigned; break; case _anyAssignedId: - title = S.of(context).anyAssigned; + title = S.of(context)!.anyAssigned; break; default: title = widget.selectableOptions[data]?.name; @@ -270,7 +270,7 @@ class _TagFormFieldState extends State { materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, side: BorderSide.none, label: Text( - S.of(context).notAssigned, + S.of(context)!.notAssigned, ), backgroundColor: Theme.of(context).colorScheme.onSurface.withOpacity(0.12), @@ -323,7 +323,7 @@ class _TagFormFieldState extends State { padding: const EdgeInsets.all(4), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, side: BorderSide.none, - label: Text(S.of(context).anyAssigned), + label: Text(S.of(context)!.anyAssigned), backgroundColor: Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.12), onDeleted: () => field.didChange(const IdsTagsQuery()), diff --git a/lib/features/labels/view/pages/labels_page.dart b/lib/features/labels/view/pages/labels_page.dart index e0d09ec..7f5a26f 100644 --- a/lib/features/labels/view/pages/labels_page.dart +++ b/lib/features/labels/view/pages/labels_page.dart @@ -18,7 +18,7 @@ import 'package:paperless_mobile/features/edit_label/view/impl/edit_tag_page.dar import 'package:paperless_mobile/features/labels/cubit/label_cubit.dart'; import 'package:paperless_mobile/features/labels/view/widgets/label_tab_view.dart'; import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class LabelsPage extends StatefulWidget { const LabelsPage({Key? key}) : super(key: key); @@ -72,7 +72,7 @@ class _LabelsPageState extends State context, ), sliver: SearchAppBar( - hintText: S.of(context).searchDocuments, + hintText: S.of(context)!.searchDocuments, onOpenSearch: showDocumentSearchPage, bottom: TabBar( controller: _tabController, @@ -161,9 +161,9 @@ class _LabelsPageState extends State ), onEdit: _openEditCorrespondentPage, emptyStateActionButtonLabel: - S.of(context).addNewCorrespondent, + S.of(context)!.addNewCorrespondent, emptyStateDescription: - S.of(context).noCorrespondentsSetUp, + S.of(context)!.noCorrespondentsSetUp, onAddNew: _openAddCorrespondentPage, ), ], @@ -186,9 +186,9 @@ class _LabelsPageState extends State ), onEdit: _openEditDocumentTypePage, emptyStateActionButtonLabel: - S.of(context).addNewDocumentType, + S.of(context)!.addNewDocumentType, emptyStateDescription: - S.of(context).noDocumentTypesSetUp, + S.of(context)!.noDocumentTypesSetUp, onAddNew: _openAddDocumentTypePage, ), ], @@ -219,9 +219,9 @@ class _LabelsPageState extends State : null, ), emptyStateActionButtonLabel: - S.of(context).addNewTag, + S.of(context)!.addNewTag, emptyStateDescription: - S.of(context).noTagsSetUp, + S.of(context)!.noTagsSetUp, onAddNew: _openAddTagPage, ), ], @@ -245,9 +245,9 @@ class _LabelsPageState extends State ), contentBuilder: (path) => Text(path.path), emptyStateActionButtonLabel: - S.of(context).addNewStoragePath, + S.of(context)!.addNewStoragePath, emptyStateDescription: - S.of(context).noStoragePathsSetUp, + S.of(context)!.noStoragePathsSetUp, onAddNew: _openAddStoragePathPage, ), ], diff --git a/lib/features/labels/view/widgets/label_form_field.dart b/lib/features/labels/view/widgets/label_form_field.dart index bee07da..e6fa775 100644 --- a/lib/features/labels/view/widgets/label_form_field.dart +++ b/lib/features/labels/view/widgets/label_form_field.dart @@ -3,7 +3,7 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/widgets/form_builder_fields/form_builder_type_ahead.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; /// /// Form field allowing to select labels (i.e. correspondent, documentType) @@ -79,7 +79,7 @@ class _LabelFormFieldState extends State> { noItemsFoundBuilder: (context) => Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: Text( - S.of(context).noItemsFound, + S.of(context)!.noItemsFound, textAlign: TextAlign.center, style: TextStyle(color: Theme.of(context).disabledColor, fontSize: 18.0), @@ -97,7 +97,8 @@ class _LabelFormFieldState extends State> { ), itemBuilder: (context, suggestion) => ListTile( title: Text( - widget.labelOptions[suggestion.id]?.name ?? S.of(context).notAssigned, + widget.labelOptions[suggestion.id]?.name ?? + S.of(context)!.notAssigned, maxLines: 1, overflow: TextOverflow.ellipsis, ), @@ -141,7 +142,7 @@ class _LabelFormFieldState extends State> { ), selectionToTextTransformer: (suggestion) { if (suggestion == const IdQueryParameter.notAssigned()) { - return S.of(context).notAssigned; + return S.of(context)!.notAssigned; } return widget.labelOptions[suggestion.id]?.name ?? ""; }, @@ -194,11 +195,11 @@ class _LabelFormFieldState extends State> { String _getLocalizedHint(BuildContext context) { if (T == Correspondent) { - return S.of(context).startTyping; + return S.of(context)!.startTyping; } else if (T == DocumentType) { - return S.of(context).startTyping; + return S.of(context)!.startTyping; } else { - return S.of(context).filterTags; + return S.of(context)!.filterTags; } } } diff --git a/lib/features/linked_documents/view/linked_documents_page.dart b/lib/features/linked_documents/view/linked_documents_page.dart index a23a114..6d370e9 100644 --- a/lib/features/linked_documents/view/linked_documents_page.dart +++ b/lib/features/linked_documents/view/linked_documents_page.dart @@ -5,7 +5,8 @@ import 'package:paperless_mobile/features/documents/view/widgets/adaptive_docume import 'package:paperless_mobile/features/documents/view/widgets/selection/view_type_selection_widget.dart'; import 'package:paperless_mobile/features/linked_documents/cubit/linked_documents_cubit.dart'; import 'package:paperless_mobile/features/paged_document_view/view/document_paging_view_mixin.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/routes/document_details_route.dart'; class LinkedDocumentsPage extends StatefulWidget { @@ -24,7 +25,7 @@ class _LinkedDocumentsPageState extends State Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).linkedDocuments), + title: Text(S.of(context)!.linkedDocuments), actions: [ BlocBuilder( builder: (context, state) { diff --git a/lib/features/login/view/widgets/form_fields/client_certificate_form_field.dart b/lib/features/login/view/widgets/form_fields/client_certificate_form_field.dart index 0bb9000..d97556b 100644 --- a/lib/features/login/view/widgets/form_fields/client_certificate_form_field.dart +++ b/lib/features/login/view/widgets/form_fields/client_certificate_form_field.dart @@ -5,7 +5,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/login/model/client_certificate.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/constants.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -40,7 +41,7 @@ class _ClientCertificateFormFieldState } assert(_selectedFile != null); if (_selectedFile?.path.split(".").last != 'pfx') { - return S.of(context).invalidCertificateFormat; + return S.of(context)!.invalidCertificateFormat; } return null; }, @@ -50,8 +51,8 @@ class _ClientCertificateFormFieldState return Theme( data: theme, child: ExpansionTile( - title: Text(S.of(context).clientcertificate), - subtitle: Text(S.of(context).configureMutualTLSAuthentication), + title: Text(S.of(context)!.clientcertificate), + subtitle: Text(S.of(context)!.configureMutualTLSAuthentication), children: [ InputDecorator( decoration: InputDecoration( @@ -67,7 +68,7 @@ class _ClientCertificateFormFieldState children: [ ElevatedButton( onPressed: () => _onSelectFile(field), - child: Text(S.of(context).select), + child: Text(S.of(context)!.select), ), _buildSelectedFileText(field).paddedOnly(left: 8), ], @@ -85,7 +86,7 @@ class _ClientCertificateFormFieldState // ListTile( // leading: ElevatedButton( // onPressed: () => _onSelectFile(field), - // child: Text(S.of(context).select), + // child: Text(S.of(context)!.select), // ), // title: _buildSelectedFileText(field), // trailing: AbsorbPointer( @@ -108,7 +109,7 @@ class _ClientCertificateFormFieldState onChanged: (value) => field.didChange( field.value?.copyWith(passphrase: value), ), - label: S.of(context).passphrase, + label: S.of(context)!.passphrase, ).padded(), ] else ...[] @@ -143,7 +144,7 @@ class _ClientCertificateFormFieldState if (field.value == null) { assert(_selectedFile == null); return Text( - S.of(context).selectFile, + S.of(context)!.selectFile, style: Theme.of(context).textTheme.labelMedium?.apply( color: Theme.of(context).hintColor, ), diff --git a/lib/features/login/view/widgets/form_fields/server_address_form_field.dart b/lib/features/login/view/widgets/form_fields/server_address_form_field.dart index d394295..f4ce00f 100644 --- a/lib/features/login/view/widgets/form_fields/server_address_form_field.dart +++ b/lib/features/login/view/widgets/form_fields/server_address_form_field.dart @@ -3,7 +3,7 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class ServerAddressFormField extends StatefulWidget { static const String fkServerAddress = "serverAddress"; @@ -44,16 +44,16 @@ class _ServerAddressFormFieldState extends State { autovalidateMode: AutovalidateMode.onUserInteraction, validator: FormBuilderValidators.compose([ FormBuilderValidators.required( - errorText: S.of(context).serverAddressMustNotBeEmpty, + errorText: S.of(context)!.serverAddressMustNotBeEmpty, ), FormBuilderValidators.match( r"https?://.*", - errorText: S.of(context).serverAddressMustIncludeAScheme, + errorText: S.of(context)!.serverAddressMustIncludeAScheme, ) ]), decoration: InputDecoration( hintText: "http://192.168.1.50:8000", - labelText: S.of(context).serverAddress, + labelText: S.of(context)!.serverAddress, suffixIcon: _canClear ? IconButton( icon: const Icon(Icons.clear), diff --git a/lib/features/login/view/widgets/form_fields/user_credentials_form_field.dart b/lib/features/login/view/widgets/form_fields/user_credentials_form_field.dart index 8bf265d..04efa33 100644 --- a/lib/features/login/view/widgets/form_fields/user_credentials_form_field.dart +++ b/lib/features/login/view/widgets/form_fields/user_credentials_form_field.dart @@ -4,7 +4,7 @@ import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/login/model/user_credentials.model.dart'; import 'package:paperless_mobile/features/login/view/widgets/form_fields/obscured_input_text_form_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class UserCredentialsFormField extends StatefulWidget { static const fkCredentials = 'credentials'; @@ -37,22 +37,22 @@ class _UserCredentialsFormFieldState extends State { UserCredentials(username: username), ), validator: FormBuilderValidators.required( - errorText: S.of(context).usernameMustNotBeEmpty, + errorText: S.of(context)!.usernameMustNotBeEmpty, ), autofillHints: const [AutofillHints.username], decoration: InputDecoration( - label: Text(S.of(context).username), + label: Text(S.of(context)!.username), ), ), ObscuredInputTextFormField( key: const ValueKey('login-password'), - label: S.of(context).password, + label: S.of(context)!.password, onChanged: (password) => field.didChange( field.value?.copyWith(password: password) ?? UserCredentials(password: password), ), validator: FormBuilderValidators.required( - errorText: S.of(context).passwordMustNotBeEmpty, + errorText: S.of(context)!.passwordMustNotBeEmpty, ), ), ].map((child) => child.padded()).toList(), @@ -73,11 +73,11 @@ class _UserCredentialsFormFieldState extends State { FocusScope.of(context).requestFocus(_focusNodes[fkPassword]); }, validator: FormBuilderValidators.required( - errorText: S.of(context).usernameMustNotBeEmpty, + errorText: S.of(context)!.usernameMustNotBeEmpty, ), autofillHints: const [AutofillHints.username], decoration: InputDecoration( - labelText: S.of(context).username, + labelText: S.of(context)!.username, ), ).padded(), FormBuilderTextField( @@ -88,11 +88,11 @@ class _UserCredentialsFormFieldState extends State { }, autofillHints: const [AutofillHints.password], validator: FormBuilderValidators.required( - errorText: S.of(context).passwordMustNotBeEmpty, + errorText: S.of(context)!.passwordMustNotBeEmpty, ), obscureText: true, decoration: InputDecoration( - labelText: S.of(context).password, + labelText: S.of(context)!.password, ), ).padded(), ], diff --git a/lib/features/login/view/widgets/login_pages/server_connection_page.dart b/lib/features/login/view/widgets/login_pages/server_connection_page.dart index 766a9d1..0d89fe9 100644 --- a/lib/features/login/view/widgets/login_pages/server_connection_page.dart +++ b/lib/features/login/view/widgets/login_pages/server_connection_page.dart @@ -6,7 +6,8 @@ import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/login/model/reachability_status.dart'; import 'package:paperless_mobile/features/login/view/widgets/form_fields/client_certificate_form_field.dart'; import 'package:paperless_mobile/features/login/view/widgets/form_fields/server_address_form_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:provider/provider.dart'; class ServerConnectionPage extends StatefulWidget { @@ -32,7 +33,7 @@ class _ServerConnectionPageState extends State { return Scaffold( appBar: AppBar( toolbarHeight: kToolbarHeight - 4, - title: Text(S.of(context).connectToPaperless), + title: Text(S.of(context)!.connectToPaperless), bottom: PreferredSize( child: _isCheckingConnection ? const LinearProgressIndicator() @@ -65,7 +66,7 @@ class _ServerConnectionPageState extends State { onPressed: _updateReachability, ), FilledButton( - child: Text(S.of(context).continueLabel), + child: Text(S.of(context)!.continueLabel), onPressed: _reachabilityStatus == ReachabilityStatus.reachable ? widget.onContinue : null, @@ -108,37 +109,37 @@ class _ServerConnectionPageState extends State { case ReachabilityStatus.reachable: return _buildIconText( Icons.done, - S.of(context).connectionSuccessfulylEstablished, + S.of(context)!.connectionSuccessfulylEstablished, Colors.green, ); case ReachabilityStatus.notReachable: return _buildIconText( Icons.close, - S.of(context).couldNotEstablishConnectionToTheServer, + S.of(context)!.couldNotEstablishConnectionToTheServer, errorColor, ); case ReachabilityStatus.unknownHost: return _buildIconText( Icons.close, - S.of(context).hostCouldNotBeResolved, + S.of(context)!.hostCouldNotBeResolved, errorColor, ); case ReachabilityStatus.missingClientCertificate: return _buildIconText( Icons.close, - S.of(context).loginPageReachabilityMissingClientCertificateText, + S.of(context)!.loginPageReachabilityMissingClientCertificateText, errorColor, ); case ReachabilityStatus.invalidClientCertificateConfiguration: return _buildIconText( Icons.close, - S.of(context).incorrectOrMissingCertificatePassphrase, + S.of(context)!.incorrectOrMissingCertificatePassphrase, errorColor, ); case ReachabilityStatus.connectionTimeout: return _buildIconText( Icons.close, - S.of(context).connectionTimedOut, + S.of(context)!.connectionTimedOut, errorColor, ); } diff --git a/lib/features/login/view/widgets/login_pages/server_login_page.dart b/lib/features/login/view/widgets/login_pages/server_login_page.dart index d0d40e2..74c6d70 100644 --- a/lib/features/login/view/widgets/login_pages/server_login_page.dart +++ b/lib/features/login/view/widgets/login_pages/server_login_page.dart @@ -3,7 +3,7 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/login/view/widgets/form_fields/server_address_form_field.dart'; import 'package:paperless_mobile/features/login/view/widgets/form_fields/user_credentials_form_field.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class ServerLoginPage extends StatefulWidget { final Future Function() onDone; @@ -29,7 +29,7 @@ class _ServerLoginPageState extends State { ''; return Scaffold( appBar: AppBar( - title: Text(S.of(context).loginPageSignInTitle), + title: Text(S.of(context)!.loginPageSignInTitle), bottom: _isLoginLoading ? const PreferredSize( preferredSize: Size.fromHeight(4.0), @@ -39,7 +39,7 @@ class _ServerLoginPageState extends State { ), body: ListView( children: [ - Text(S.of(context).signInToServer(serverAddress)).padded(), + Text(S.of(context)!.signInToServer(serverAddress)).padded(), const UserCredentialsFormField(), ], ), @@ -53,7 +53,7 @@ class _ServerLoginPageState extends State { await widget.onDone(); setState(() => _isLoginLoading = false); }, - child: Text(S.of(context).signIn), + child: Text(S.of(context)!.signIn), ) ], ), diff --git a/lib/features/saved_view/view/add_saved_view_page.dart b/lib/features/saved_view/view/add_saved_view_page.dart index 0ce693f..23de7ad 100644 --- a/lib/features/saved_view/view/add_saved_view_page.dart +++ b/lib/features/saved_view/view/add_saved_view_page.dart @@ -4,7 +4,7 @@ import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/documents/view/widgets/search/document_filter_form.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class AddSavedViewPage extends StatefulWidget { final DocumentFilter currentFilter; @@ -25,12 +25,12 @@ class _AddSavedViewPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).newView), + title: Text(S.of(context)!.newView), ), floatingActionButton: FloatingActionButton.extended( icon: const Icon(Icons.add), onPressed: () => _onCreate(context), - label: Text(S.of(context).create), + label: Text(S.of(context)!.create), ), body: Padding( padding: const EdgeInsets.all(8.0), @@ -46,18 +46,18 @@ class _AddSavedViewPageState extends State { name: _AddSavedViewPageState.fkName, validator: FormBuilderValidators.required(), decoration: InputDecoration( - label: Text(S.of(context).name), + label: Text(S.of(context)!.name), ), ), FormBuilderCheckbox( name: _AddSavedViewPageState.fkShowOnDashboard, initialValue: false, - title: Text(S.of(context).showOnDashboard), + title: Text(S.of(context)!.showOnDashboard), ), FormBuilderCheckbox( name: _AddSavedViewPageState.fkShowInSidebar, initialValue: false, - title: Text(S.of(context).showInSidebar), + title: Text(S.of(context)!.showInSidebar), ), ], ), @@ -94,18 +94,18 @@ class _AddSavedViewPageState extends State { name: fkName, validator: FormBuilderValidators.required(), decoration: InputDecoration( - label: Text(S.of(context).name), + label: Text(S.of(context)!.name), ), ), FormBuilderCheckbox( name: fkShowOnDashboard, initialValue: false, - title: Text(S.of(context).showOnDashboard), + title: Text(S.of(context)!.showOnDashboard), ), FormBuilderCheckbox( name: fkShowInSidebar, initialValue: false, - title: Text(S.of(context).showInSidebar), + title: Text(S.of(context)!.showInSidebar), ), ], ), diff --git a/lib/features/saved_view/view/saved_view_list.dart b/lib/features/saved_view/view/saved_view_list.dart index bb809a2..aa0d639 100644 --- a/lib/features/saved_view/view/saved_view_list.dart +++ b/lib/features/saved_view/view/saved_view_list.dart @@ -5,7 +5,7 @@ import 'package:paperless_mobile/core/widgets/hint_card.dart'; import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart'; import 'package:paperless_mobile/features/saved_view_details/cubit/saved_view_details_cubit.dart'; import 'package:paperless_mobile/features/saved_view_details/view/saved_view_details_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class SavedViewList extends StatelessWidget { const SavedViewList({super.key}); @@ -21,7 +21,7 @@ class SavedViewList extends StatelessWidget { return SliverToBoxAdapter( child: HintCard( hintText: - S.of(context).createViewsToQuicklyFilterYourDocuments, + S.of(context)!.createViewsToQuicklyFilterYourDocuments, ), ); } @@ -33,7 +33,7 @@ class SavedViewList extends StatelessWidget { enabled: connectivity.isConnected, title: Text(view.name), subtitle: Text( - S.of(context).nFiltersSet(view.filterRules.length), + S.of(context)!.nFiltersSet(view.filterRules.length), ), onTap: () { Navigator.of(context).push( diff --git a/lib/features/settings/cubit/application_settings_cubit.dart b/lib/features/settings/cubit/application_settings_cubit.dart index 27271bb..b68201e 100644 --- a/lib/features/settings/cubit/application_settings_cubit.dart +++ b/lib/features/settings/cubit/application_settings_cubit.dart @@ -5,7 +5,7 @@ import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:paperless_mobile/features/login/services/authentication_service.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'; part 'application_settings_cubit.g.dart'; part 'application_settings_state.dart'; diff --git a/lib/features/settings/cubit/application_settings_state.dart b/lib/features/settings/cubit/application_settings_state.dart index 6737532..8a08a4b 100644 --- a/lib/features/settings/cubit/application_settings_state.dart +++ b/lib/features/settings/cubit/application_settings_state.dart @@ -44,7 +44,7 @@ class ApplicationSettingsState { static String get _defaultPreferredLocaleSubtag { String preferredLocale = Platform.localeName.split("_").first; - if (!S.delegate.supportedLocales + if (!S.supportedLocales .any((locale) => locale.languageCode == preferredLocale)) { preferredLocale = 'en'; } diff --git a/lib/features/settings/view/dialogs/account_settings_dialog.dart b/lib/features/settings/view/dialogs/account_settings_dialog.dart index d364a6d..62d5f8c 100644 --- a/lib/features/settings/view/dialogs/account_settings_dialog.dart +++ b/lib/features/settings/view/dialogs/account_settings_dialog.dart @@ -10,7 +10,8 @@ import 'package:paperless_mobile/core/widgets/hint_card.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/helpers/message_helpers.dart'; class AccountSettingsDialog extends StatelessWidget { @@ -24,7 +25,7 @@ class AccountSettingsDialog extends StatelessWidget { title: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(S.of(context).account), + Text(S.of(context)!.account), const CloseButton(), ], ), @@ -49,7 +50,7 @@ class AccountSettingsDialog extends StatelessWidget { ListTile( dense: true, leading: const Icon(Icons.person_add_rounded), - title: Text(S.of(context).addAnotherAccount), + title: Text(S.of(context)!.addAnotherAccount), onTap: () {}, ), const Divider(), @@ -60,7 +61,7 @@ class AccountSettingsDialog extends StatelessWidget { ), ), child: Text( - S.of(context).disconnect, + S.of(context)!.disconnect, style: TextStyle( color: Theme.of(context).colorScheme.onError, ), diff --git a/lib/features/settings/view/pages/application_settings_page.dart b/lib/features/settings/view/pages/application_settings_page.dart index a8eeb06..0a77dd8 100644 --- a/lib/features/settings/view/pages/application_settings_page.dart +++ b/lib/features/settings/view/pages/application_settings_page.dart @@ -5,7 +5,8 @@ import 'package:flutter/material.dart'; import 'package:paperless_mobile/features/settings/view/widgets/color_scheme_option_setting.dart'; import 'package:paperless_mobile/features/settings/view/widgets/language_selection_setting.dart'; import 'package:paperless_mobile/features/settings/view/widgets/theme_mode_setting.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; + import 'package:paperless_mobile/constants.dart'; class ApplicationSettingsPage extends StatelessWidget { @@ -15,7 +16,7 @@ class ApplicationSettingsPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).applicationSettings), + title: Text(S.of(context)!.applicationSettings), ), body: ListView( children: const [ diff --git a/lib/features/settings/view/pages/security_settings_page.dart b/lib/features/settings/view/pages/security_settings_page.dart index f9ca18d..5ff2a1e 100644 --- a/lib/features/settings/view/pages/security_settings_page.dart +++ b/lib/features/settings/view/pages/security_settings_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:paperless_mobile/features/settings/view/widgets/biometric_authentication_setting.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class SecuritySettingsPage extends StatelessWidget { const SecuritySettingsPage({super.key}); @@ -8,7 +8,7 @@ class SecuritySettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text(S.of(context).security)), + appBar: AppBar(title: Text(S.of(context)!.security)), body: ListView( children: const [ BiometricAuthenticationSetting(), diff --git a/lib/features/settings/view/pages/storage_settings_page.dart b/lib/features/settings/view/pages/storage_settings_page.dart index 1495334..6926c00 100644 --- a/lib/features/settings/view/pages/storage_settings_page.dart +++ b/lib/features/settings/view/pages/storage_settings_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:paperless_mobile/features/settings/view/widgets/clear_storage_settings.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class StorageSettingsPage extends StatelessWidget { const StorageSettingsPage({super.key}); @@ -9,7 +9,7 @@ class StorageSettingsPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).storage), + title: Text(S.of(context)!.storage), ), body: ListView( children: const [ diff --git a/lib/features/settings/view/settings_page.dart b/lib/features/settings/view/settings_page.dart index c76bbd5..2e02498 100644 --- a/lib/features/settings/view/settings_page.dart +++ b/lib/features/settings/view/settings_page.dart @@ -5,7 +5,7 @@ import 'package:paperless_mobile/core/bloc/paperless_server_information_state.da import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; import 'package:paperless_mobile/features/settings/view/pages/application_settings_page.dart'; import 'package:paperless_mobile/features/settings/view/pages/security_settings_page.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class SettingsPage extends StatelessWidget { const SettingsPage({super.key}); @@ -14,7 +14,7 @@ class SettingsPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).settings), + title: Text(S.of(context)!.settings), ), bottomNavigationBar: BlocBuilder( @@ -22,13 +22,13 @@ class SettingsPage extends StatelessWidget { final info = state.information!; return ListTile( title: Text( - S.of(context).loggedInAs(info.username ?? 'unknown') + + S.of(context)!.loggedInAs(info.username ?? 'unknown') + "@${info.host}", style: Theme.of(context).textTheme.labelSmall, textAlign: TextAlign.center, ), subtitle: Text( - S.of(context).paperlessServerVersion + + S.of(context)!.paperlessServerVersion + ' ' + info.version.toString() + ' (API v${info.apiVersion})', @@ -42,21 +42,21 @@ class SettingsPage extends StatelessWidget { children: [ ListTile( // leading: const Icon(Icons.style_outlined), - title: Text(S.of(context).applicationSettings), - subtitle: Text(S.of(context).languageAndVisualAppearance), + title: Text(S.of(context)!.applicationSettings), + subtitle: Text(S.of(context)!.languageAndVisualAppearance), onTap: () => _goto(const ApplicationSettingsPage(), context), ), ListTile( // leading: const Icon(Icons.security_outlined), - title: Text(S.of(context).security), - subtitle: Text(S.of(context).biometricAuthentication), + title: Text(S.of(context)!.security), + subtitle: Text(S.of(context)!.biometricAuthentication), onTap: () => _goto(const SecuritySettingsPage(), context), ), // ListTile( // // leading: const Icon(Icons.storage_outlined), - // title: Text(S.of(context).storage), + // title: Text(S.of(context)!.storage), // subtitle: - // Text(S.of(context).mangeFilesAndStorageSpace), + // Text(S.of(context)!.mangeFilesAndStorageSpace), // onTap: () => _goto(const StorageSettingsPage(), context), // ), ], diff --git a/lib/features/settings/view/widgets/biometric_authentication_setting.dart b/lib/features/settings/view/widgets/biometric_authentication_setting.dart index 841a05d..fc06e64 100644 --- a/lib/features/settings/view/widgets/biometric_authentication_setting.dart +++ b/lib/features/settings/view/widgets/biometric_authentication_setting.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class BiometricAuthenticationSetting extends StatelessWidget { const BiometricAuthenticationSetting({super.key}); @@ -12,11 +12,11 @@ class BiometricAuthenticationSetting extends StatelessWidget { builder: (context, settings) { return SwitchListTile( value: settings.isLocalAuthenticationEnabled, - title: Text(S.of(context).biometricAuthentication), - subtitle: Text(S.of(context).authenticateOnAppStart), + title: Text(S.of(context)!.biometricAuthentication), + subtitle: Text(S.of(context)!.authenticateOnAppStart), onChanged: (val) async { final String localizedReason = - S.of(context).authenticateToToggleBiometricAuthentication( + S.of(context)!.authenticateToToggleBiometricAuthentication( val ? 'enable' : 'disable', ); await context diff --git a/lib/features/settings/view/widgets/color_scheme_option_setting.dart b/lib/features/settings/view/widgets/color_scheme_option_setting.dart index af33407..beb2dd5 100644 --- a/lib/features/settings/view/widgets/color_scheme_option_setting.dart +++ b/lib/features/settings/view/widgets/color_scheme_option_setting.dart @@ -8,7 +8,7 @@ import 'package:paperless_mobile/core/widgets/hint_card.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; import 'package:paperless_mobile/features/settings/model/color_scheme_option.dart'; import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class ColorSchemeOptionSetting extends StatelessWidget { const ColorSchemeOptionSetting({super.key}); @@ -18,7 +18,7 @@ class ColorSchemeOptionSetting extends StatelessWidget { return BlocBuilder( builder: (context, settings) { return ListTile( - title: Text(S.of(context).colors), + title: Text(S.of(context)!.colors), subtitle: Text( translateColorSchemeOption( context, @@ -28,8 +28,8 @@ class ColorSchemeOptionSetting extends StatelessWidget { onTap: () => showDialog( context: context, builder: (_) => RadioSettingsDialog( - titleText: S.of(context).colors, - descriptionText: S.of(context).colorSchemeHint, + titleText: S.of(context)!.colors, + descriptionText: S.of(context)!.colorSchemeHint, options: [ RadioOption( value: ColorSchemeOption.classic, @@ -46,7 +46,7 @@ class ColorSchemeOptionSetting extends StatelessWidget { ], footer: _isBelowAndroid12() ? HintCard( - hintText: S.of(context).colorSchemeNotSupportedWarning, + hintText: S.of(context)!.colorSchemeNotSupportedWarning, hintIcon: Icons.warning_amber, ) : null, diff --git a/lib/features/settings/view/widgets/language_selection_setting.dart b/lib/features/settings/view/widgets/language_selection_setting.dart index d3f6740..2c60e4b 100644 --- a/lib/features/settings/view/widgets/language_selection_setting.dart +++ b/lib/features/settings/view/widgets/language_selection_setting.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class LanguageSelectionSetting extends StatefulWidget { const LanguageSelectionSetting({super.key}); @@ -25,7 +25,7 @@ class _LanguageSelectionSettingState extends State { return BlocBuilder( builder: (context, settings) { return ListTile( - title: Text(S.of(context).language), + title: Text(S.of(context)!.language), subtitle: Text(_languageOptions[settings.preferredLocaleSubtag]!), onTap: () => showDialog( context: context, @@ -33,7 +33,7 @@ class _LanguageSelectionSettingState extends State { footer: const Text( "* Work in progress, not fully translated yet. Some words may be displayed in English!", ), - titleText: S.of(context).language, + titleText: S.of(context)!.language, options: [ RadioOption( value: 'en', diff --git a/lib/features/settings/view/widgets/radio_settings_dialog.dart b/lib/features/settings/view/widgets/radio_settings_dialog.dart index cbf5e90..035901c 100644 --- a/lib/features/settings/view/widgets/radio_settings_dialog.dart +++ b/lib/features/settings/view/widgets/radio_settings_dialog.dart @@ -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 RadioSettingsDialog extends StatefulWidget { final List> options; @@ -41,11 +41,11 @@ class _RadioSettingsDialogState extends State> { widget.confirmButton ?? TextButton( onPressed: () => Navigator.pop(context), - child: Text(S.of(context).cancel)), + child: Text(S.of(context)!.cancel)), widget.confirmButton ?? TextButton( onPressed: () => Navigator.pop(context, _groupValue), - child: Text(S.of(context).ok)), + child: Text(S.of(context)!.ok)), ], title: widget.titleText != null ? Text(widget.titleText!) : null, content: Column( diff --git a/lib/features/settings/view/widgets/theme_mode_setting.dart b/lib/features/settings/view/widgets/theme_mode_setting.dart index e691de5..a7d8667 100644 --- a/lib/features/settings/view/widgets/theme_mode_setting.dart +++ b/lib/features/settings/view/widgets/theme_mode_setting.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class ThemeModeSetting extends StatelessWidget { const ThemeModeSetting({super.key}); @@ -12,13 +12,13 @@ class ThemeModeSetting extends StatelessWidget { return BlocBuilder( builder: (context, settings) { return ListTile( - title: Text(S.of(context).appearance), + title: Text(S.of(context)!.appearance), subtitle: Text(_mapThemeModeToLocalizedString( settings.preferredThemeMode, context)), onTap: () => showDialog( context: context, builder: (_) => RadioSettingsDialog( - titleText: S.of(context).appearance, + titleText: S.of(context)!.appearance, initialValue: context .read() .state @@ -26,15 +26,15 @@ class ThemeModeSetting extends StatelessWidget { options: [ RadioOption( value: ThemeMode.system, - label: S.of(context).systemTheme, + label: S.of(context)!.systemTheme, ), RadioOption( value: ThemeMode.light, - label: S.of(context).lightTheme, + label: S.of(context)!.lightTheme, ), RadioOption( value: ThemeMode.dark, - label: S.of(context).darkTheme, + label: S.of(context)!.darkTheme, ) ], ), @@ -51,11 +51,11 @@ class ThemeModeSetting extends StatelessWidget { String _mapThemeModeToLocalizedString(ThemeMode theme, BuildContext context) { switch (theme) { case ThemeMode.system: - return S.of(context).system; + return S.of(context)!.system; case ThemeMode.light: - return S.of(context).light; + return S.of(context)!.light; case ThemeMode.dark: - return S.of(context).dark; + return S.of(context)!.dark; } } } diff --git a/lib/helpers/message_helpers.dart b/lib/helpers/message_helpers.dart index 46854fb..4e5d977 100644 --- a/lib/helpers/message_helpers.dart +++ b/lib/helpers/message_helpers.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/service/github_issue_service.dart'; import 'package:paperless_mobile/core/translation/error_code_localization_mapper.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; class SnackBarActionConfig { final String label; @@ -68,7 +68,7 @@ void showGenericError( context, error.toString(), action: SnackBarActionConfig( - label: S.of(context).report, + label: S.of(context)!.report, onPressed: () => GithubIssueService.createIssueFromError( context, stackTrace: stackTrace, diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index c8eeede..0fe34da 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -1,5 +1,4 @@ { - "@@locale": "cs", "developedBy": "Vyvíjí {name}", "@developedBy": { "placeholders": { @@ -11,29 +10,51 @@ "account": "Účet", "@account": {}, "addCorrespondent": "Nový korespondent", - "@addCorrespondent": {}, + "@addCorrespondent": { + "description": "Title when adding a new correspondent" + }, "addDocumentType": "Nový typ dokumentu", - "@addDocumentType": {}, + "@addDocumentType": { + "description": "Title when adding a new document type" + }, "addStoragePath": "Nová cesta úložiště", - "@addStoragePath": {}, + "@addStoragePath": { + "description": "Title when adding a new storage path" + }, "addTag": "Nový tag", - "@addTag": {}, + "@addTag": { + "description": "Title when adding a new tag" + }, "aboutThisApp": "O aplikaci", - "@aboutThisApp": {}, - "loggedInAs": "Přihlášeno jako ", - "@loggedInAs": {}, + "@aboutThisApp": { + "description": "Label for about this app tile displayed in the drawer" + }, + "loggedInAs": "Přihlášeno jako {name}", + "@loggedInAs": { + "placeholders": { + "name": {} + } + }, "disconnect": "Odpojit", - "@disconnect": {}, + "@disconnect": { + "description": "Logout button label" + }, "reportABug": "Nahlásit chybu", "@reportABug": {}, "settings": "Nastavení", "@settings": {}, "authenticateOnAppStart": "Přihlášení při spuštění aplikace", - "@authenticateOnAppStart": {}, + "@authenticateOnAppStart": { + "description": "Description of the biometric authentication settings tile" + }, "biometricAuthentication": "Zapnout biometrické ověření", "@biometricAuthentication": {}, - "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Pro zapnutí biometrického ověřování je třeba se přihlásit.} disable{Pro vypnutí biometrického ověřování je třeba se přihlásit.}}", - "@authenticateToToggleBiometricAuthentication": {}, + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Pro zapnutí biometrického ověřování je třeba se přihlásit} disable{Pro vypnutí biometrického ověřování je třeba se přihlásit} other{}}", + "@authenticateToToggleBiometricAuthentication": { + "placeholders": { + "mode": {} + } + }, "documents": "Dokumenty", "@documents": {}, "inbox": "Inbox", @@ -42,10 +63,6 @@ "@labels": {}, "scanner": "Skener", "@scanner": {}, - "classic": "Klasicky", - "@classic": {}, - "dynamic": "Dynamicky", - "@dynamic": {}, "startTyping": "Začni psát...", "@startTyping": {}, "doYouReallyWantToDeleteThisView": "Opravdu chceš tento náhled smazat?", @@ -64,14 +81,20 @@ "@createdAt": {}, "documentSuccessfullyDeleted": "Dokument byl úspěšně smazán.", "@documentSuccessfullyDeleted": {}, - "AssignAsn": "Přiřadit", - "@AssignAsn": {}, + "assignAsn": "Assign ASN", + "@assignAsn": {}, "deleteDocumentTooltip": "Smazat", - "@deleteDocumentTooltip": {}, + "@deleteDocumentTooltip": { + "description": "Tooltip shown for the delete button on details page" + }, "downloadDocumentTooltip": "Stáhnout", - "@downloadDocumentTooltip": {}, + "@downloadDocumentTooltip": { + "description": "Tooltip shown for the download button on details page" + }, "editDocumentTooltip": "Upravit", - "@editDocumentTooltip": {}, + "@editDocumentTooltip": { + "description": "Tooltip shown for the edit button on details page" + }, "loadFullContent": "Načíst celý obsah", "@loadFullContent": {}, "noAppToDisplayPDFFilesFound": "Aplikace pro otevírání PDF souborů nenalezena.", @@ -81,25 +104,41 @@ "couldNotOpenFilePermissionDenied": "Soubor nelze otevřít: přístup zamítnut.", "@couldNotOpenFilePermissionDenied": {}, "previewTooltip": "Náhled", - "@previewTooltip": {}, + "@previewTooltip": { + "description": "Tooltip shown for the preview button on details page" + }, "shareTooltip": "Sdílet", - "@shareTooltip": {}, + "@shareTooltip": { + "description": "Tooltip shown for the share button on details page" + }, "similarDocuments": "Podobné dokumenty", - "@similarDocuments": {}, + "@similarDocuments": { + "description": "Label shown in the tabbar on details page" + }, "content": "Obsah", - "@content": {}, + "@content": { + "description": "Label shown in the tabbar on details page" + }, "metaData": "Metadata", - "@metaData": {}, + "@metaData": { + "description": "Label shown in the tabbar on details page" + }, "overview": "Přehled", - "@overview": {}, + "@overview": { + "description": "Label shown in the tabbar on details page" + }, "documentType": "Typ dokumentu", "@documentType": {}, "archivedPdf": "Archived (pdf)", - "@archivedPdf": {}, + "@archivedPdf": { + "description": "Option to chose when downloading a document" + }, "chooseFiletype": "Choose filetype", "@chooseFiletype": {}, "original": "Original", - "@original": {}, + "@original": { + "description": "Option to chose when downloading a document" + }, "documentSuccessfullyDownloaded": "Dokument úspěšně stažen.", "@documentSuccessfullyDownloaded": {}, "suggestions": "Návrhy:", @@ -119,7 +158,9 @@ "reset": "Zrušit", "@reset": {}, "filterDocuments": "Filtrovat dokumenty", - "@filterDocuments": {}, + "@filterDocuments": { + "description": "Title of the document filter" + }, "originalMD5Checksum": "MD5 součet originálu", "@originalMD5Checksum": {}, "mediaFilename": "Jméno souboru média", @@ -131,23 +172,33 @@ "modifiedAt": "Pozměněno", "@modifiedAt": {}, "preview": "Náhled", - "@preview": {}, + "@preview": { + "description": "Title of the document preview page" + }, "scanADocument": "Oskenovat dokument", "@scanADocument": {}, "noDocumentsScannedYet": "Zatím nebyly naskenovány žádné dokumenty.", "@noDocumentsScannedYet": {}, "or": "nebo", - "@or": {}, + "@or": { + "description": "Used on the scanner page between both main actions when no scans have been captured." + }, "deleteAllScans": "Smazat všechny skeny", "@deleteAllScans": {}, "uploadADocumentFromThisDevice": "Nahrát jeden dokument z tohoto zařízení", - "@uploadADocumentFromThisDevice": {}, + "@uploadADocumentFromThisDevice": { + "description": "Button label on scanner page" + }, "noMatchesFound": "Žádné shody.", - "@noMatchesFound": {}, + "@noMatchesFound": { + "description": "Displayed when no documents were found in the document search." + }, "removeFromSearchHistory": "Odstranit z historie vyhledávání?", "@removeFromSearchHistory": {}, "results": "Výsledky", - "@results": {}, + "@results": { + "description": "Label displayed above search results in document search." + }, "searchDocuments": "Prohledat dokumenty", "@searchDocuments": {}, "resetFilter": "Zrušit", @@ -176,10 +227,19 @@ "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "confirmDeletion": "Potvrdit smazání", "@confirmDeletion": {}, - "areYouSureYouWantToDeleteTheFollowingDocuments": "Jste si jisti že chcete smazat následující dokumenty?", - "@areYouSureYouWantToDeleteTheFollowingDocuments": {}, + "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Jste si jisti že chcete smazat následující dokument?} other{Jste si jisti že chcete smazat následující dokumenty?}}", + "@areYouSureYouWantToDeleteTheFollowingDocuments": { + "placeholders": { + "count": {} + } + }, "countSelected": "{count} vybrány", - "@countSelected": {}, + "@countSelected": { + "description": "Displayed in the appbar when at least one document is selected.", + "placeholders": { + "count": {} + } + }, "storagePath": "Cesta k úložišti", "@storagePath": {}, "prepareDocument": "Připravit dokument", @@ -271,7 +331,9 @@ "absolute": "Absolutní", "@absolute": {}, "hintYouCanAlsoSpecifyRelativeValues": "Tip: Kromě konkrétního data lze také specifikovat relativní časovou odchylku k aktuálnímu datu.", - "@hintYouCanAlsoSpecifyRelativeValues": {}, + "@hintYouCanAlsoSpecifyRelativeValues": { + "description": "Displayed in the extended date range picker" + }, "amount": "Počet", "@amount": {}, "relative": "Relativní", @@ -358,10 +420,10 @@ "@upload": {}, "youreOffline": "Jste offline.", "@youreOffline": {}, - "assignASN": "Přiřadit ASČ", - "@assignASN": {}, "deleteDocument": "Smazat dokument", - "@deleteDocument": {}, + "@deleteDocument": { + "description": "Used as an action label on each inbox item" + }, "removeDocumentFromInbox": "Dokument odstraněn z inboxu.", "@removeDocumentFromInbox": {}, "areYouSureYouWantToMarkAllDocumentsAsSeen": "Opravdu chcete označit všechny dokumenty jako shlédnuté? Toto provede hromadnou úpravu a odstraní inbox tag u všech dokumentů.\nToto je nevratná akce! Opravdu chcete pokračovat?", @@ -385,7 +447,11 @@ "undo": "Vrátit", "@undo": {}, "nUnseen": "{count} neshlédnuté", - "@nUnseen": {}, + "@nUnseen": { + "placeholders": { + "count": {} + } + }, "swipeLeftToMarkADocumentAsSeen": "Tip: Potáhnutím doleva označit dokument jako shlédnutý a odstranit všechny inbox tagy.", "@swipeLeftToMarkADocumentAsSeen": {}, "yesterday": "Včera", @@ -514,8 +580,8 @@ "@done": {}, "next": "Další", "@next": {}, - "receiveSharedFilePermissionDeniedMessage": "Přístup k obdrženému souboru zamítnut. Než budeš sdílet, zkus nejdříve otevřít aplikaci.", - "@receiveSharedFilePermissionDeniedMessage": {}, + "couldNotAccessReceivedFile": "Could not access the received file. Please try to open the app before sharing.", + "@couldNotAccessReceivedFile": {}, "newView": "Nový náhled", "@newView": {}, "createsASavedViewBasedOnTheCurrentFilterCriteria": "Vytvoří nový náhled na základě aktuálních pravidel filtru.", @@ -607,5 +673,9 @@ "list": "List", "@list": {}, "remove": "Remove", - "removeQueryFromSearchHistory": "Remove query from search history?" + "removeQueryFromSearchHistory": "Remove query from search history?", + "dynamicColorScheme": "Dynamicky", + "@dynamicColorScheme": {}, + "classicColorScheme": "Klasicky", + "@classicColorScheme": {} } \ No newline at end of file diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 288e033..a5cd2ee 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1,5 +1,4 @@ { - "@@locale": "de", "developedBy": "Entwickelt von {name}", "@developedBy": { "placeholders": { @@ -11,28 +10,46 @@ "account": "Account", "@account": {}, "addCorrespondent": "Neuer Korrespondent", - "@addCorrespondent": {}, + "@addCorrespondent": { + "description": "Title when adding a new correspondent" + }, "addDocumentType": "Neuer Dokumenttyp", - "@addDocumentType": {}, + "@addDocumentType": { + "description": "Title when adding a new document type" + }, "addStoragePath": "Neuer Speicherpfad", - "@addStoragePath": {}, + "@addStoragePath": { + "description": "Title when adding a new storage path" + }, "addTag": "Neuer Tag", - "@addTag": {}, + "@addTag": { + "description": "Title when adding a new tag" + }, "aboutThisApp": "Über diese App", - "@aboutThisApp": {}, - "loggedInAs": "Eingeloggt als ", - "@loggedInAs": {}, + "@aboutThisApp": { + "description": "Label for about this app tile displayed in the drawer" + }, + "loggedInAs": "Eingeloggt als {name}", + "@loggedInAs": { + "placeholders": { + "name": {} + } + }, "disconnect": "Verbindung trennen", - "@disconnect": {}, + "@disconnect": { + "description": "Logout button label" + }, "reportABug": "Einen Fehler melden", "@reportABug": {}, "settings": "Einstellungen", "@settings": {}, "authenticateOnAppStart": "Authentifizierung beim Start der Anwendung", - "@authenticateOnAppStart": {}, + "@authenticateOnAppStart": { + "description": "Description of the biometric authentication settings tile" + }, "biometricAuthentication": "Biometrische Authentifizierung aktivieren", "@biometricAuthentication": {}, - "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authentifizieren, um die biometrische Authentifizierung zu aktivieren.} disable{Authentifizieren, um die biometrische Authentifizierung zu deaktivieren.}}", + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authentifizieren, um die biometrische Authentifizierung zu aktivieren} disable{Authentifizieren, um die biometrische Authentifizierung zu deaktivieren} other{}}", "@authenticateToToggleBiometricAuthentication": { "placeholders": { "mode": {} @@ -46,10 +63,6 @@ "@labels": {}, "scanner": "Scanner", "@scanner": {}, - "classic": "Klassisch", - "@classic": {}, - "dynamic": "Dynamisch", - "@dynamic": {}, "startTyping": "Beginne zu tippen...", "@startTyping": {}, "doYouReallyWantToDeleteThisView": "Möchtest Du diese Ansicht wirklich löschen?", @@ -68,14 +81,20 @@ "@createdAt": {}, "documentSuccessfullyDeleted": "Das Dokument wurde erfolgreich gelöscht.", "@documentSuccessfullyDeleted": {}, - "AssignAsn": "Zuweisen", - "@AssignAsn": {}, + "assignAsn": "ASN zuweisen", + "@assignAsn": {}, "deleteDocumentTooltip": "Löschen", - "@deleteDocumentTooltip": {}, + "@deleteDocumentTooltip": { + "description": "Tooltip shown for the delete button on details page" + }, "downloadDocumentTooltip": "Herunterladen", - "@downloadDocumentTooltip": {}, + "@downloadDocumentTooltip": { + "description": "Tooltip shown for the download button on details page" + }, "editDocumentTooltip": "Bearbeiten", - "@editDocumentTooltip": {}, + "@editDocumentTooltip": { + "description": "Tooltip shown for the edit button on details page" + }, "loadFullContent": "Lade gesamten Inhalt", "@loadFullContent": {}, "noAppToDisplayPDFFilesFound": "Es wurde keine App zum Anzeigen von PDF Dateien gefunden!", @@ -85,25 +104,41 @@ "couldNotOpenFilePermissionDenied": "Datei konnte nicht geöffnet werden: Zugriff verweigert.", "@couldNotOpenFilePermissionDenied": {}, "previewTooltip": "Vorschau", - "@previewTooltip": {}, + "@previewTooltip": { + "description": "Tooltip shown for the preview button on details page" + }, "shareTooltip": "Teilen", - "@shareTooltip": {}, + "@shareTooltip": { + "description": "Tooltip shown for the share button on details page" + }, "similarDocuments": "Similar Documents", - "@similarDocuments": {}, + "@similarDocuments": { + "description": "Label shown in the tabbar on details page" + }, "content": "Inhalt", - "@content": {}, + "@content": { + "description": "Label shown in the tabbar on details page" + }, "metaData": "Metadaten", - "@metaData": {}, + "@metaData": { + "description": "Label shown in the tabbar on details page" + }, "overview": "Übersicht", - "@overview": {}, + "@overview": { + "description": "Label shown in the tabbar on details page" + }, "documentType": "Dokumenttyp", "@documentType": {}, "archivedPdf": "Archiviert (pdf)", - "@archivedPdf": {}, + "@archivedPdf": { + "description": "Option to chose when downloading a document" + }, "chooseFiletype": "Wähle Dateityp", "@chooseFiletype": {}, "original": "Original", - "@original": {}, + "@original": { + "description": "Option to chose when downloading a document" + }, "documentSuccessfullyDownloaded": "Dokument erfolgreich heruntergeladen.", "@documentSuccessfullyDownloaded": {}, "suggestions": "Vorschläge: ", @@ -123,7 +158,9 @@ "reset": "Zurücksetzen", "@reset": {}, "filterDocuments": "Dokumente filtern", - "@filterDocuments": {}, + "@filterDocuments": { + "description": "Title of the document filter" + }, "originalMD5Checksum": "MD5-Prüfsumme Original", "@originalMD5Checksum": {}, "mediaFilename": "Media-Dateiname", @@ -135,23 +172,33 @@ "modifiedAt": "Geändert am", "@modifiedAt": {}, "preview": "Vorschau", - "@preview": {}, + "@preview": { + "description": "Title of the document preview page" + }, "scanADocument": "Scanne ein Dokument", "@scanADocument": {}, "noDocumentsScannedYet": "Es wurden noch keine Dokumente gescannt.", "@noDocumentsScannedYet": {}, "or": "oder", - "@or": {}, + "@or": { + "description": "Used on the scanner page between both main actions when no scans have been captured." + }, "deleteAllScans": "Alle scans löschen", "@deleteAllScans": {}, "uploadADocumentFromThisDevice": "Lade ein Dokument von diesem Gerät hoch", - "@uploadADocumentFromThisDevice": {}, + "@uploadADocumentFromThisDevice": { + "description": "Button label on scanner page" + }, "noMatchesFound": "Keine Treffer.", - "@noMatchesFound": {}, + "@noMatchesFound": { + "description": "Displayed when no documents were found in the document search." + }, "removeFromSearchHistory": "Aus dem Suchverlauf entfernen?", "@removeFromSearchHistory": {}, "results": "Ergebnisse", - "@results": {}, + "@results": { + "description": "Label displayed above search results in document search." + }, "searchDocuments": "Durchsuche Dokumente", "@searchDocuments": {}, "resetFilter": "Filter zurücksetzen", @@ -180,10 +227,19 @@ "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "confirmDeletion": "Löschen bestätigen", "@confirmDeletion": {}, - "areYouSureYouWantToDeleteTheFollowingDocuments": "Bist Du sicher, dass Du folgende Dokumente löschen möchtest?", - "@areYouSureYouWantToDeleteTheFollowingDocuments": {}, + "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Bist Du sicher, dass Du folgendes Dokument löschen möchtest?} other{Bist Du sicher, dass Du folgende Dokumente löschen möchtest?}}", + "@areYouSureYouWantToDeleteTheFollowingDocuments": { + "placeholders": { + "count": {} + } + }, "countSelected": "{count} ausgewählt", - "@countSelected": {}, + "@countSelected": { + "description": "Displayed in the appbar when at least one document is selected.", + "placeholders": { + "count": {} + } + }, "storagePath": "Speicherpfad", "@storagePath": {}, "prepareDocument": "Dokument vorbereiten", @@ -275,7 +331,9 @@ "absolute": "Absolut", "@absolute": {}, "hintYouCanAlsoSpecifyRelativeValues": "Hinweis: Neben konkreten Daten kannst du den Zeitraum auch über eine relative Zeitspanne einschränken.", - "@hintYouCanAlsoSpecifyRelativeValues": {}, + "@hintYouCanAlsoSpecifyRelativeValues": { + "description": "Displayed in the extended date range picker" + }, "amount": "Anzahl", "@amount": {}, "relative": "Relativ", @@ -362,10 +420,10 @@ "@upload": {}, "youreOffline": "Du bist offline.", "@youreOffline": {}, - "assignASN": "ASN zuweisen", - "@assignASN": {}, "deleteDocument": "Dokument löschen", - "@deleteDocument": {}, + "@deleteDocument": { + "description": "Used as an action label on each inbox item" + }, "removeDocumentFromInbox": "Dokument aus Posteingang entfernt.", "@removeDocumentFromInbox": {}, "areYouSureYouWantToMarkAllDocumentsAsSeen": "Bist Du sicher, dass Du alle Dokumente als gesehen markieren möchtest? Dadurch wird eine Massenbearbeitung durchgeführt, bei der alle Posteingangs-Tags von den Dokumenten entfernt werden. Diese Aktion kann nicht rückgängig gemacht werden! Möchtest Du trotzdem fortfahren?", @@ -389,7 +447,11 @@ "undo": "Undo", "@undo": {}, "nUnseen": "{count} ungesehen", - "@nUnseen": {}, + "@nUnseen": { + "placeholders": { + "count": {} + } + }, "swipeLeftToMarkADocumentAsSeen": "Tipp: Wische nach links um ein Dokument als gesehen zu markieren und alle Posteingangs-Tags von diesem Dokument zu entfernen.", "@swipeLeftToMarkADocumentAsSeen": {}, "yesterday": "Gestern", @@ -611,5 +673,9 @@ "list": "Liste", "@list": {}, "remove": "Remove", - "removeQueryFromSearchHistory": "Remove query from search history?" + "removeQueryFromSearchHistory": "Remove query from search history?", + "dynamicColorScheme": "Dynamisch", + "@dynamicColorScheme": {}, + "classicColorScheme": "Klassisch", + "@classicColorScheme": {} } \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index a477ce6..9cd23e8 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,5 +1,4 @@ { - "@@locale": "en", "developedBy": "Developed by {name}", "@developedBy": { "placeholders": { @@ -50,7 +49,7 @@ }, "biometricAuthentication": "Biometric authentication", "@biometricAuthentication": {}, - "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authenticate enable biometric authentication} disable{Authenticate to disable biometric authentication}}", + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authenticate enable biometric authentication} disable{Authenticate to disable biometric authentication} other{}}", "@authenticateToToggleBiometricAuthentication": { "placeholders": { "mode": {} @@ -64,10 +63,6 @@ "@labels": {}, "scanner": "Scanner", "@scanner": {}, - "classic": "Classic", - "@classic": {}, - "dynamic": "Dynamic", - "@dynamic": {}, "startTyping": "Start typing...", "@startTyping": {}, "doYouReallyWantToDeleteThisView": "Do you really want to delete this view?", @@ -86,8 +81,8 @@ "@createdAt": {}, "documentSuccessfullyDeleted": "Document successfully deleted.", "@documentSuccessfullyDeleted": {}, - "AssignAsn": "Assign ASN", - "@AssignAsn": {}, + "assignAsn": "Assign ASN", + "@assignAsn": {}, "deleteDocumentTooltip": "Delete", "@deleteDocumentTooltip": { "description": "Tooltip shown for the delete button on details page" @@ -425,8 +420,6 @@ "@upload": {}, "youreOffline": "You're offline.", "@youreOffline": {}, - "assignASN": "Assign ASN", - "@assignASN": {}, "deleteDocument": "Delete document", "@deleteDocument": { "description": "Used as an action label on each inbox item" @@ -680,5 +673,9 @@ "list": "List", "@list": {}, "remove": "Remove", - "removeQueryFromSearchHistory": "Remove query from search history?" + "removeQueryFromSearchHistory": "Remove query from search history?", + "dynamicColorScheme": "Dynamic", + "@dynamicColorScheme": {}, + "classicColorScheme": "Classic", + "@classicColorScheme": {} } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb new file mode 100644 index 0000000..9cd23e8 --- /dev/null +++ b/lib/l10n/intl_fr.arb @@ -0,0 +1,681 @@ +{ + "developedBy": "Developed by {name}", + "@developedBy": { + "placeholders": { + "name": {} + } + }, + "addAnotherAccount": "Add another account", + "@addAnotherAccount": {}, + "account": "Account", + "@account": {}, + "addCorrespondent": "New Correspondent", + "@addCorrespondent": { + "description": "Title when adding a new correspondent" + }, + "addDocumentType": "New Document Type", + "@addDocumentType": { + "description": "Title when adding a new document type" + }, + "addStoragePath": "New Storage Path", + "@addStoragePath": { + "description": "Title when adding a new storage path" + }, + "addTag": "New Tag", + "@addTag": { + "description": "Title when adding a new tag" + }, + "aboutThisApp": "About this app", + "@aboutThisApp": { + "description": "Label for about this app tile displayed in the drawer" + }, + "loggedInAs": "Logged in as {name}", + "@loggedInAs": { + "placeholders": { + "name": {} + } + }, + "disconnect": "Disconnect", + "@disconnect": { + "description": "Logout button label" + }, + "reportABug": "Report a Bug", + "@reportABug": {}, + "settings": "Settings", + "@settings": {}, + "authenticateOnAppStart": "Authenticate on app start", + "@authenticateOnAppStart": { + "description": "Description of the biometric authentication settings tile" + }, + "biometricAuthentication": "Biometric authentication", + "@biometricAuthentication": {}, + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authenticate enable biometric authentication} disable{Authenticate to disable biometric authentication} other{}}", + "@authenticateToToggleBiometricAuthentication": { + "placeholders": { + "mode": {} + } + }, + "documents": "Documents", + "@documents": {}, + "inbox": "Inbox", + "@inbox": {}, + "labels": "Labels", + "@labels": {}, + "scanner": "Scanner", + "@scanner": {}, + "startTyping": "Start typing...", + "@startTyping": {}, + "doYouReallyWantToDeleteThisView": "Do you really want to delete this view?", + "@doYouReallyWantToDeleteThisView": {}, + "deleteView": "Delete view ", + "@deleteView": {}, + "addedAt": "Added at", + "@addedAt": {}, + "archiveSerialNumber": "Archive Serial Number", + "@archiveSerialNumber": {}, + "asn": "ASN", + "@asn": {}, + "correspondent": "Correspondent", + "@correspondent": {}, + "createdAt": "Created at", + "@createdAt": {}, + "documentSuccessfullyDeleted": "Document successfully deleted.", + "@documentSuccessfullyDeleted": {}, + "assignAsn": "Assign ASN", + "@assignAsn": {}, + "deleteDocumentTooltip": "Delete", + "@deleteDocumentTooltip": { + "description": "Tooltip shown for the delete button on details page" + }, + "downloadDocumentTooltip": "Download", + "@downloadDocumentTooltip": { + "description": "Tooltip shown for the download button on details page" + }, + "editDocumentTooltip": "Edit", + "@editDocumentTooltip": { + "description": "Tooltip shown for the edit button on details page" + }, + "loadFullContent": "Load full content", + "@loadFullContent": {}, + "noAppToDisplayPDFFilesFound": "No app to display PDF files found!", + "@noAppToDisplayPDFFilesFound": {}, + "openInSystemViewer": "Open in system viewer", + "@openInSystemViewer": {}, + "couldNotOpenFilePermissionDenied": "Could not open file: Permission denied.", + "@couldNotOpenFilePermissionDenied": {}, + "previewTooltip": "Preview", + "@previewTooltip": { + "description": "Tooltip shown for the preview button on details page" + }, + "shareTooltip": "Share", + "@shareTooltip": { + "description": "Tooltip shown for the share button on details page" + }, + "similarDocuments": "Similar Documents", + "@similarDocuments": { + "description": "Label shown in the tabbar on details page" + }, + "content": "Content", + "@content": { + "description": "Label shown in the tabbar on details page" + }, + "metaData": "Meta Data", + "@metaData": { + "description": "Label shown in the tabbar on details page" + }, + "overview": "Overview", + "@overview": { + "description": "Label shown in the tabbar on details page" + }, + "documentType": "Document Type", + "@documentType": {}, + "archivedPdf": "Archived (pdf)", + "@archivedPdf": { + "description": "Option to chose when downloading a document" + }, + "chooseFiletype": "Choose filetype", + "@chooseFiletype": {}, + "original": "Original", + "@original": { + "description": "Option to chose when downloading a document" + }, + "documentSuccessfullyDownloaded": "Document successfully downloaded.", + "@documentSuccessfullyDownloaded": {}, + "suggestions": "Suggestions: ", + "@suggestions": {}, + "editDocument": "Edit Document", + "@editDocument": {}, + "advanced": "Advanced", + "@advanced": {}, + "apply": "Apply", + "@apply": {}, + "extended": "Extended", + "@extended": {}, + "titleAndContent": "Title & Content", + "@titleAndContent": {}, + "title": "Title", + "@title": {}, + "reset": "Reset", + "@reset": {}, + "filterDocuments": "Filter Documents", + "@filterDocuments": { + "description": "Title of the document filter" + }, + "originalMD5Checksum": "Original MD5-Checksum", + "@originalMD5Checksum": {}, + "mediaFilename": "Media Filename", + "@mediaFilename": {}, + "originalFileSize": "Original File Size", + "@originalFileSize": {}, + "originalMIMEType": "Original MIME-Type", + "@originalMIMEType": {}, + "modifiedAt": "Modified at", + "@modifiedAt": {}, + "preview": "Preview", + "@preview": { + "description": "Title of the document preview page" + }, + "scanADocument": "Scan a document", + "@scanADocument": {}, + "noDocumentsScannedYet": "No documents scanned yet.", + "@noDocumentsScannedYet": {}, + "or": "or", + "@or": { + "description": "Used on the scanner page between both main actions when no scans have been captured." + }, + "deleteAllScans": "Delete all scans", + "@deleteAllScans": {}, + "uploadADocumentFromThisDevice": "Upload a document from this device", + "@uploadADocumentFromThisDevice": { + "description": "Button label on scanner page" + }, + "noMatchesFound": "No matches found.", + "@noMatchesFound": { + "description": "Displayed when no documents were found in the document search." + }, + "removeFromSearchHistory": "Remove from search history?", + "@removeFromSearchHistory": {}, + "results": "Results", + "@results": { + "description": "Label displayed above search results in document search." + }, + "searchDocuments": "Search documents", + "@searchDocuments": {}, + "resetFilter": "Reset filter", + "@resetFilter": {}, + "lastMonth": "Last Month", + "@lastMonth": {}, + "last7Days": "Last 7 Days", + "@last7Days": {}, + "last3Months": "Last 3 Months", + "@last3Months": {}, + "lastYear": "Last Year", + "@lastYear": {}, + "search": "Search", + "@search": {}, + "documentsSuccessfullyDeleted": "Documents successfully deleted.", + "@documentsSuccessfullyDeleted": {}, + "thereSeemsToBeNothingHere": "There seems to be nothing here...", + "@thereSeemsToBeNothingHere": {}, + "oops": "Oops.", + "@oops": {}, + "newDocumentAvailable": "New document available!", + "@newDocumentAvailable": {}, + "orderBy": "Order By", + "@orderBy": {}, + "thisActionIsIrreversibleDoYouWishToProceedAnyway": "This action is irreversible. Do you wish to proceed anyway?", + "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, + "confirmDeletion": "Confirm deletion", + "@confirmDeletion": {}, + "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Are you sure you want to delete the following document?} other{Are you sure you want to delete the following documents?}}", + "@areYouSureYouWantToDeleteTheFollowingDocuments": { + "placeholders": { + "count": {} + } + }, + "countSelected": "{count} selected", + "@countSelected": { + "description": "Displayed in the appbar when at least one document is selected.", + "placeholders": { + "count": {} + } + }, + "storagePath": "Storage Path", + "@storagePath": {}, + "prepareDocument": "Prepare document", + "@prepareDocument": {}, + "tags": "Tags", + "@tags": {}, + "documentSuccessfullyUpdated": "Document successfully updated.", + "@documentSuccessfullyUpdated": {}, + "fileName": "File Name", + "@fileName": {}, + "synchronizeTitleAndFilename": "Synchronize title and filename", + "@synchronizeTitleAndFilename": {}, + "reload": "Reload", + "@reload": {}, + "documentSuccessfullyUploadedProcessing": "Document successfully uploaded, processing...", + "@documentSuccessfullyUploadedProcessing": {}, + "deleteLabelWarningText": "This label contains references to other documents. By deleting this label, all references will be removed. Continue?", + "@deleteLabelWarningText": {}, + "couldNotAcknowledgeTasks": "Could not acknowledge tasks.", + "@couldNotAcknowledgeTasks": {}, + "authenticationFailedPleaseTryAgain": "Authentication failed, please try again.", + "@authenticationFailedPleaseTryAgain": {}, + "anErrorOccurredWhileTryingToAutocompleteYourQuery": "An error ocurred while trying to autocomplete your query.", + "@anErrorOccurredWhileTryingToAutocompleteYourQuery": {}, + "biometricAuthenticationFailed": "Biometric authentication failed.", + "@biometricAuthenticationFailed": {}, + "biometricAuthenticationNotSupported": "Biometric authentication not supported on this device.", + "@biometricAuthenticationNotSupported": {}, + "couldNotBulkEditDocuments": "Could not bulk edit documents.", + "@couldNotBulkEditDocuments": {}, + "couldNotCreateCorrespondent": "Could not create correspondent, please try again.", + "@couldNotCreateCorrespondent": {}, + "couldNotLoadCorrespondents": "Could not load correspondents.", + "@couldNotLoadCorrespondents": {}, + "couldNotCreateSavedView": "Could not create saved view, please try again.", + "@couldNotCreateSavedView": {}, + "couldNotDeleteSavedView": "Could not delete saved view, please try again", + "@couldNotDeleteSavedView": {}, + "youAreCurrentlyOffline": "You are currently offline. Please make sure you are connected to the internet.", + "@youAreCurrentlyOffline": {}, + "couldNotAssignArchiveSerialNumber": "Could not assign archive serial number.", + "@couldNotAssignArchiveSerialNumber": {}, + "couldNotDeleteDocument": "Could not delete document, please try again.", + "@couldNotDeleteDocument": {}, + "couldNotLoadDocuments": "Could not load documents, please try again.", + "@couldNotLoadDocuments": {}, + "couldNotLoadDocumentPreview": "Could not load document preview.", + "@couldNotLoadDocumentPreview": {}, + "couldNotCreateDocument": "Could not create document, please try again.", + "@couldNotCreateDocument": {}, + "couldNotLoadDocumentTypes": "Could not load document types, please try again.", + "@couldNotLoadDocumentTypes": {}, + "couldNotUpdateDocument": "Could not update document, please try again.", + "@couldNotUpdateDocument": {}, + "couldNotUploadDocument": "Could not upload document, please try again.", + "@couldNotUploadDocument": {}, + "invalidCertificateOrMissingPassphrase": "Invalid certificate or missing passphrase, please try again", + "@invalidCertificateOrMissingPassphrase": {}, + "couldNotLoadSavedViews": "Could not load saved views.", + "@couldNotLoadSavedViews": {}, + "aClientCertificateWasExpectedButNotSent": "A client certificate was expected but not sent. Please provide a valid client certificate.", + "@aClientCertificateWasExpectedButNotSent": {}, + "userIsNotAuthenticated": "User is not authenticated.", + "@userIsNotAuthenticated": {}, + "requestTimedOut": "The request to the server timed out.", + "@requestTimedOut": {}, + "anErrorOccurredRemovingTheScans": "An error occurred removing the scans.", + "@anErrorOccurredRemovingTheScans": {}, + "couldNotReachYourPaperlessServer": "Could not reach your Paperless server, is it up and running?", + "@couldNotReachYourPaperlessServer": {}, + "couldNotLoadSimilarDocuments": "Could not load similar documents.", + "@couldNotLoadSimilarDocuments": {}, + "couldNotCreateStoragePath": "Could not create storage path, please try again.", + "@couldNotCreateStoragePath": {}, + "couldNotLoadStoragePaths": "Could not load storage paths.", + "@couldNotLoadStoragePaths": {}, + "couldNotLoadSuggestions": "Could not load suggestions.", + "@couldNotLoadSuggestions": {}, + "couldNotCreateTag": "Could not create tag, please try again.", + "@couldNotCreateTag": {}, + "couldNotLoadTags": "Could not load tags.", + "@couldNotLoadTags": {}, + "anUnknownErrorOccurred": "An unknown error occurred.", + "@anUnknownErrorOccurred": {}, + "fileFormatNotSupported": "This file format is not supported.", + "@fileFormatNotSupported": {}, + "report": "REPORT", + "@report": {}, + "absolute": "Absolute", + "@absolute": {}, + "hintYouCanAlsoSpecifyRelativeValues": "Hint: Apart from concrete dates, you can also specify a time range relative to the current date.", + "@hintYouCanAlsoSpecifyRelativeValues": { + "description": "Displayed in the extended date range picker" + }, + "amount": "Amount", + "@amount": {}, + "relative": "Relative", + "@relative": {}, + "last": "Last", + "@last": {}, + "timeUnit": "Time unit", + "@timeUnit": {}, + "selectDateRange": "Select date range", + "@selectDateRange": {}, + "after": "After", + "@after": {}, + "before": "Before", + "@before": {}, + "days": "{count, plural, zero{days} one{day} other{days}}", + "@days": { + "placeholders": { + "count": {} + } + }, + "lastNDays": "{count, plural, zero{} one{Yesterday} other{Last {count} days}}", + "@lastNDays": { + "placeholders": { + "count": {} + } + }, + "lastNMonths": "{count, plural, zero{} one{Last month} other{Last {count} months}}", + "@lastNMonths": { + "placeholders": { + "count": {} + } + }, + "lastNWeeks": "{count, plural, zero{} one{Last week} other{Last {count} weeks}}", + "@lastNWeeks": { + "placeholders": { + "count": {} + } + }, + "lastNYears": "{count, plural, zero{} one{Last year} other{Last {count} years}}", + "@lastNYears": { + "placeholders": { + "count": {} + } + }, + "months": "{count, plural, zero{} one{month} other{months}}", + "@months": { + "placeholders": { + "count": {} + } + }, + "weeks": "{count, plural, zero{} one{week} other{weeks}}", + "@weeks": { + "placeholders": { + "count": {} + } + }, + "years": "{count, plural, zero{} one{year} other{years}}", + "@years": { + "placeholders": { + "count": {} + } + }, + "gotIt": "Got it!", + "@gotIt": {}, + "cancel": "Cancel", + "@cancel": {}, + "close": "Close", + "@close": {}, + "create": "Create", + "@create": {}, + "delete": "Delete", + "@delete": {}, + "edit": "Edit", + "@edit": {}, + "ok": "Ok", + "@ok": {}, + "save": "Save", + "@save": {}, + "select": "Select", + "@select": {}, + "saveChanges": "Save changes", + "@saveChanges": {}, + "upload": "Upload", + "@upload": {}, + "youreOffline": "You're offline.", + "@youreOffline": {}, + "deleteDocument": "Delete document", + "@deleteDocument": { + "description": "Used as an action label on each inbox item" + }, + "removeDocumentFromInbox": "Document removed from inbox.", + "@removeDocumentFromInbox": {}, + "areYouSureYouWantToMarkAllDocumentsAsSeen": "Are you sure you want to mark all documents as seen? This will perform a bulk edit operation removing all inbox tags from the documents. This action is not reversible! Are you sure you want to continue?", + "@areYouSureYouWantToMarkAllDocumentsAsSeen": {}, + "markAllAsSeen": "Mark all as seen?", + "@markAllAsSeen": {}, + "allSeen": "All seen", + "@allSeen": {}, + "markAsSeen": "Mark as seen", + "@markAsSeen": {}, + "refresh": "Refresh", + "@refresh": {}, + "youDoNotHaveUnseenDocuments": "You do not have unseen documents.", + "@youDoNotHaveUnseenDocuments": {}, + "quickAction": "Quick Action", + "@quickAction": {}, + "suggestionSuccessfullyApplied": "Suggestion successfully applied.", + "@suggestionSuccessfullyApplied": {}, + "today": "Today", + "@today": {}, + "undo": "Undo", + "@undo": {}, + "nUnseen": "{count} unseen", + "@nUnseen": { + "placeholders": { + "count": {} + } + }, + "swipeLeftToMarkADocumentAsSeen": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.", + "@swipeLeftToMarkADocumentAsSeen": {}, + "yesterday": "Yesterday", + "@yesterday": {}, + "anyAssigned": "Any assigned", + "@anyAssigned": {}, + "noItemsFound": "No items found!", + "@noItemsFound": {}, + "caseIrrelevant": "Case Irrelevant", + "@caseIrrelevant": {}, + "matchingAlgorithm": "Matching Algorithm", + "@matchingAlgorithm": {}, + "match": "Match", + "@match": {}, + "name": "Name", + "@name": {}, + "notAssigned": "Not assigned", + "@notAssigned": {}, + "addNewCorrespondent": "Add new correspondent", + "@addNewCorrespondent": {}, + "noCorrespondentsSetUp": "You don't seem to have any correspondents set up.", + "@noCorrespondentsSetUp": {}, + "correspondents": "Correspondents", + "@correspondents": {}, + "addNewDocumentType": "Add new document type", + "@addNewDocumentType": {}, + "noDocumentTypesSetUp": "You don't seem to have any document types set up.", + "@noDocumentTypesSetUp": {}, + "documentTypes": "Document Types", + "@documentTypes": {}, + "addNewStoragePath": "Add new storage path", + "@addNewStoragePath": {}, + "noStoragePathsSetUp": "You don't seem to have any storage paths set up.", + "@noStoragePathsSetUp": {}, + "storagePaths": "Storage Paths", + "@storagePaths": {}, + "addNewTag": "Add new tag", + "@addNewTag": {}, + "noTagsSetUp": "You don't seem to have any tags set up.", + "@noTagsSetUp": {}, + "linkedDocuments": "Linked Documents", + "@linkedDocuments": {}, + "advancedSettings": "Advanced Settings", + "@advancedSettings": {}, + "passphrase": "Passphrase", + "@passphrase": {}, + "configureMutualTLSAuthentication": "Configure Mutual TLS Authentication", + "@configureMutualTLSAuthentication": {}, + "invalidCertificateFormat": "Invalid certificate format, only .pfx is allowed", + "@invalidCertificateFormat": {}, + "clientcertificate": "Client Certificate", + "@clientcertificate": {}, + "selectFile": "Select file...", + "@selectFile": {}, + "continueLabel": "Continue", + "@continueLabel": {}, + "incorrectOrMissingCertificatePassphrase": "Incorrect or missing certificate passphrase.", + "@incorrectOrMissingCertificatePassphrase": {}, + "connect": "Connect", + "@connect": {}, + "password": "Password", + "@password": {}, + "passwordMustNotBeEmpty": "Password must not be empty.", + "@passwordMustNotBeEmpty": {}, + "connectionTimedOut": "Connection timed out.", + "@connectionTimedOut": {}, + "loginPageReachabilityMissingClientCertificateText": "A client certificate was expected but not sent. Please provide a certificate.", + "@loginPageReachabilityMissingClientCertificateText": {}, + "couldNotEstablishConnectionToTheServer": "Could not establish a connection to the server.", + "@couldNotEstablishConnectionToTheServer": {}, + "connectionSuccessfulylEstablished": "Connection successfully established.", + "@connectionSuccessfulylEstablished": {}, + "hostCouldNotBeResolved": "Host could not be resolved. Please check the server address and your internet connection. ", + "@hostCouldNotBeResolved": {}, + "serverAddress": "Server Address", + "@serverAddress": {}, + "invalidAddress": "Invalid address.", + "@invalidAddress": {}, + "serverAddressMustIncludeAScheme": "Server address must include a scheme.", + "@serverAddressMustIncludeAScheme": {}, + "serverAddressMustNotBeEmpty": "Server address must not be empty.", + "@serverAddressMustNotBeEmpty": {}, + "signIn": "Sign In", + "@signIn": {}, + "loginPageSignInTitle": "Sign In", + "@loginPageSignInTitle": {}, + "signInToServer": "Sign in to {serverAddress}", + "@signInToServer": { + "placeholders": { + "serverAddress": {} + } + }, + "connectToPaperless": "Connect to Paperless", + "@connectToPaperless": {}, + "username": "Username", + "@username": {}, + "usernameMustNotBeEmpty": "Username must not be empty.", + "@usernameMustNotBeEmpty": {}, + "documentContainsAllOfTheseWords": "Document contains all of these words", + "@documentContainsAllOfTheseWords": {}, + "all": "All", + "@all": {}, + "documentContainsAnyOfTheseWords": "Document contains any of these words", + "@documentContainsAnyOfTheseWords": {}, + "any": "Any", + "@any": {}, + "learnMatchingAutomatically": "Learn matching automatically", + "@learnMatchingAutomatically": {}, + "auto": "Auto", + "@auto": {}, + "documentContainsThisString": "Document contains this string", + "@documentContainsThisString": {}, + "exact": "Exact", + "@exact": {}, + "documentContainsAWordSimilarToThisWord": "Document contains a word similar to this word", + "@documentContainsAWordSimilarToThisWord": {}, + "fuzzy": "Fuzzy", + "@fuzzy": {}, + "documentMatchesThisRegularExpression": "Document matches this regular expression", + "@documentMatchesThisRegularExpression": {}, + "regularExpression": "Regular Expression", + "@regularExpression": {}, + "anInternetConnectionCouldNotBeEstablished": "An internet connection could not be established.", + "@anInternetConnectionCouldNotBeEstablished": {}, + "done": "Done", + "@done": {}, + "next": "Next", + "@next": {}, + "couldNotAccessReceivedFile": "Could not access the received file. Please try to open the app before sharing.", + "@couldNotAccessReceivedFile": {}, + "newView": "New View", + "@newView": {}, + "createsASavedViewBasedOnTheCurrentFilterCriteria": "Creates a new view based on the current filter criteria.", + "@createsASavedViewBasedOnTheCurrentFilterCriteria": {}, + "createViewsToQuicklyFilterYourDocuments": "Create views to quickly filter your documents.", + "@createViewsToQuicklyFilterYourDocuments": {}, + "nFiltersSet": "{count, plural, zero{{count} filters set} one{{count} filter set} other{{count} filters set}}", + "@nFiltersSet": { + "placeholders": { + "count": {} + } + }, + "showInSidebar": "Show in sidebar", + "@showInSidebar": {}, + "showOnDashboard": "Show on dashboard", + "@showOnDashboard": {}, + "views": "Views", + "@views": {}, + "clearAll": "Clear all", + "@clearAll": {}, + "scan": "Scan", + "@scan": {}, + "previewScan": "Preview", + "@previewScan": {}, + "scrollToTop": "Scroll to top", + "@scrollToTop": {}, + "paperlessServerVersion": "Paperless server version", + "@paperlessServerVersion": {}, + "darkTheme": "Dark Theme", + "@darkTheme": {}, + "lightTheme": "Light Theme", + "@lightTheme": {}, + "systemTheme": "Use system theme", + "@systemTheme": {}, + "appearance": "Appearance", + "@appearance": {}, + "languageAndVisualAppearance": "Language and visual appearance", + "@languageAndVisualAppearance": {}, + "applicationSettings": "Application", + "@applicationSettings": {}, + "colorSchemeHint": "Choose between a classic color scheme inspired by a traditional Paperless green or use the dynamic color scheme based on your system theme.", + "@colorSchemeHint": {}, + "colorSchemeNotSupportedWarning": "Dynamic theming is only supported for devices running Android 12 and above. Selecting the 'Dynamic' option might not have any effect depending on your OS implementation.", + "@colorSchemeNotSupportedWarning": {}, + "colors": "Colors", + "@colors": {}, + "language": "Language", + "@language": {}, + "security": "Security", + "@security": {}, + "mangeFilesAndStorageSpace": "Manage files and storage space", + "@mangeFilesAndStorageSpace": {}, + "storage": "Storage", + "@storage": {}, + "dark": "Dark", + "@dark": {}, + "light": "Light", + "@light": {}, + "system": "System", + "@system": {}, + "ascending": "Ascending", + "@ascending": {}, + "descending": "Descending", + "@descending": {}, + "storagePathDay": "day", + "@storagePathDay": {}, + "storagePathMonth": "month", + "@storagePathMonth": {}, + "storagePathYear": "year", + "@storagePathYear": {}, + "color": "Color", + "@color": {}, + "filterTags": "Filter tags...", + "@filterTags": {}, + "inboxTag": "Inbox-Tag", + "@inboxTag": {}, + "uploadInferValuesHint": "If you specify values for these fields, your paperless instance will not automatically derive a value. If you want these values to be automatically populated by your server, leave the fields blank.", + "@uploadInferValuesHint": {}, + "useTheConfiguredBiometricFactorToAuthenticate": "Use the configured biometric factor to authenticate and unlock your documents.", + "@useTheConfiguredBiometricFactorToAuthenticate": {}, + "verifyYourIdentity": "Verify your identity", + "@verifyYourIdentity": {}, + "verifyIdentity": "Verify Identity", + "@verifyIdentity": {}, + "detailed": "Detailed", + "@detailed": {}, + "grid": "Grid", + "@grid": {}, + "list": "List", + "@list": {}, + "remove": "Remove", + "removeQueryFromSearchHistory": "Remove query from search history?", + "dynamicColorScheme": "Dynamic", + "@dynamicColorScheme": {}, + "classicColorScheme": "Classic", + "@classicColorScheme": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index 89a8601..ef659ce 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1,5 +1,4 @@ { - "@@locale": "pl", "developedBy": "Developed by {name}", "@developedBy": { "placeholders": { @@ -11,28 +10,46 @@ "account": "Account", "@account": {}, "addCorrespondent": "New Correspondent", - "@addCorrespondent": {}, + "@addCorrespondent": { + "description": "Title when adding a new correspondent" + }, "addDocumentType": "Nowy rodzaj dokumentu", - "@addDocumentType": {}, + "@addDocumentType": { + "description": "Title when adding a new document type" + }, "addStoragePath": "New Storage Path", - "@addStoragePath": {}, + "@addStoragePath": { + "description": "Title when adding a new storage path" + }, "addTag": "Nowy tag", - "@addTag": {}, + "@addTag": { + "description": "Title when adding a new tag" + }, "aboutThisApp": "O aplikacji", - "@aboutThisApp": {}, - "loggedInAs": "Zalogowano jako", - "@loggedInAs": {}, + "@aboutThisApp": { + "description": "Label for about this app tile displayed in the drawer" + }, + "loggedInAs": "Zalogowano jako {name}", + "@loggedInAs": { + "placeholders": { + "name": {} + } + }, "disconnect": "Disconnect", - "@disconnect": {}, + "@disconnect": { + "description": "Logout button label" + }, "reportABug": "Report a Bug", "@reportABug": {}, "settings": "Ustawienia", "@settings": {}, "authenticateOnAppStart": "Authenticate on app start", - "@authenticateOnAppStart": {}, + "@authenticateOnAppStart": { + "description": "Description of the biometric authentication settings tile" + }, "biometricAuthentication": "Biometric authentication", "@biometricAuthentication": {}, - "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authenticate enable biometric authentication} disable{Authenticate to disable biometric authentication}}", + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authenticate enable biometric authentication} disable{Authenticate to disable biometric authentication} other{}}", "@authenticateToToggleBiometricAuthentication": { "placeholders": { "mode": {} @@ -46,10 +63,6 @@ "@labels": {}, "scanner": "Scanner", "@scanner": {}, - "classic": "Classic", - "@classic": {}, - "dynamic": "Dynamic", - "@dynamic": {}, "startTyping": "Zacznij pisać...", "@startTyping": {}, "doYouReallyWantToDeleteThisView": "Do you really want to delete this view?", @@ -68,14 +81,20 @@ "@createdAt": {}, "documentSuccessfullyDeleted": "Dokument pomyślnie usunięty.", "@documentSuccessfullyDeleted": {}, - "AssignAsn": "Assign", - "@AssignAsn": {}, + "assignAsn": "Assign ASN", + "@assignAsn": {}, "deleteDocumentTooltip": "Usuń", - "@deleteDocumentTooltip": {}, + "@deleteDocumentTooltip": { + "description": "Tooltip shown for the delete button on details page" + }, "downloadDocumentTooltip": "Pobierz", - "@downloadDocumentTooltip": {}, + "@downloadDocumentTooltip": { + "description": "Tooltip shown for the download button on details page" + }, "editDocumentTooltip": "Edytuj", - "@editDocumentTooltip": {}, + "@editDocumentTooltip": { + "description": "Tooltip shown for the edit button on details page" + }, "loadFullContent": "Load full content", "@loadFullContent": {}, "noAppToDisplayPDFFilesFound": "Nie znaleziono aplikacji do wyświetlania plików PDF", @@ -85,25 +104,41 @@ "couldNotOpenFilePermissionDenied": "Nie można otworzyć pliku: ", "@couldNotOpenFilePermissionDenied": {}, "previewTooltip": "Podgląd", - "@previewTooltip": {}, + "@previewTooltip": { + "description": "Tooltip shown for the preview button on details page" + }, "shareTooltip": "Udostępnij", - "@shareTooltip": {}, + "@shareTooltip": { + "description": "Tooltip shown for the share button on details page" + }, "similarDocuments": "Podobne Dokumenty", - "@similarDocuments": {}, + "@similarDocuments": { + "description": "Label shown in the tabbar on details page" + }, "content": "Treść", - "@content": {}, + "@content": { + "description": "Label shown in the tabbar on details page" + }, "metaData": "Meta dane", - "@metaData": {}, + "@metaData": { + "description": "Label shown in the tabbar on details page" + }, "overview": "Przegląd", - "@overview": {}, + "@overview": { + "description": "Label shown in the tabbar on details page" + }, "documentType": "Rodzaj dokumentu", "@documentType": {}, "archivedPdf": "Archived (pdf)", - "@archivedPdf": {}, + "@archivedPdf": { + "description": "Option to chose when downloading a document" + }, "chooseFiletype": "Choose filetype", "@chooseFiletype": {}, "original": "Original", - "@original": {}, + "@original": { + "description": "Option to chose when downloading a document" + }, "documentSuccessfullyDownloaded": "Document successfully downloaded.", "@documentSuccessfullyDownloaded": {}, "suggestions": "Suggestions: ", @@ -123,7 +158,9 @@ "reset": "Reset", "@reset": {}, "filterDocuments": "Filter Documents", - "@filterDocuments": {}, + "@filterDocuments": { + "description": "Title of the document filter" + }, "originalMD5Checksum": "Original MD5-Checksum", "@originalMD5Checksum": {}, "mediaFilename": "Media Filename", @@ -135,23 +172,33 @@ "modifiedAt": "Modified at", "@modifiedAt": {}, "preview": "Podgląd", - "@preview": {}, + "@preview": { + "description": "Title of the document preview page" + }, "scanADocument": "Zeskanuj dokument", "@scanADocument": {}, "noDocumentsScannedYet": "No documents scanned yet.", "@noDocumentsScannedYet": {}, "or": "lub", - "@or": {}, + "@or": { + "description": "Used on the scanner page between both main actions when no scans have been captured." + }, "deleteAllScans": "Delete all scans", "@deleteAllScans": {}, "uploadADocumentFromThisDevice": "Upload a document from this device", - "@uploadADocumentFromThisDevice": {}, + "@uploadADocumentFromThisDevice": { + "description": "Button label on scanner page" + }, "noMatchesFound": "No matches found.", - "@noMatchesFound": {}, + "@noMatchesFound": { + "description": "Displayed when no documents were found in the document search." + }, "removeFromSearchHistory": "Usunąć z historii wyszukiwania?", "@removeFromSearchHistory": {}, "results": "Wyniki", - "@results": {}, + "@results": { + "description": "Label displayed above search results in document search." + }, "searchDocuments": "Search documents", "@searchDocuments": {}, "resetFilter": "Reset filter", @@ -180,10 +227,19 @@ "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "confirmDeletion": "Potwierdź usunięcie", "@confirmDeletion": {}, - "areYouSureYouWantToDeleteTheFollowingDocuments": "Are you sure you want to delete the following documents?", - "@areYouSureYouWantToDeleteTheFollowingDocuments": {}, + "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Are you sure you want to delete the following document?} other{Are you sure you want to delete the following documents?}}", + "@areYouSureYouWantToDeleteTheFollowingDocuments": { + "placeholders": { + "count": {} + } + }, "countSelected": "{count} selected", - "@countSelected": {}, + "@countSelected": { + "description": "Displayed in the appbar when at least one document is selected.", + "placeholders": { + "count": {} + } + }, "storagePath": "Storage Path", "@storagePath": {}, "prepareDocument": "Prepare document", @@ -275,7 +331,9 @@ "absolute": "Absolute", "@absolute": {}, "hintYouCanAlsoSpecifyRelativeValues": "Hint: Apart from concrete dates, you can also specify a time range relative to the current date.", - "@hintYouCanAlsoSpecifyRelativeValues": {}, + "@hintYouCanAlsoSpecifyRelativeValues": { + "description": "Displayed in the extended date range picker" + }, "amount": "Amount", "@amount": {}, "relative": "Relative", @@ -362,10 +420,10 @@ "@upload": {}, "youreOffline": "Jesteście w trybie offline.", "@youreOffline": {}, - "assignASN": "Assign ASN", - "@assignASN": {}, "deleteDocument": "Delete document", - "@deleteDocument": {}, + "@deleteDocument": { + "description": "Used as an action label on each inbox item" + }, "removeDocumentFromInbox": "Dokument usunięty ze skrzynki odbiorczej", "@removeDocumentFromInbox": {}, "areYouSureYouWantToMarkAllDocumentsAsSeen": "Are you sure you want to mark all documents as seen? This will perform a bulk edit operation removing all inbox tags from the documents. This action is not reversible! Are you sure you want to continue?", @@ -389,7 +447,11 @@ "undo": "Cofnij", "@undo": {}, "nUnseen": "{count} unseen", - "@nUnseen": {}, + "@nUnseen": { + "placeholders": { + "count": {} + } + }, "swipeLeftToMarkADocumentAsSeen": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.", "@swipeLeftToMarkADocumentAsSeen": {}, "yesterday": "Wczoraj", @@ -611,5 +673,9 @@ "list": "List", "@list": {}, "remove": "Remove", - "removeQueryFromSearchHistory": "Remove query from search history?" + "removeQueryFromSearchHistory": "Remove query from search history?", + "dynamicColorScheme": "Dynamic", + "@dynamicColorScheme": {}, + "classicColorScheme": "Classic", + "@classicColorScheme": {} } \ No newline at end of file diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb index e443a5e..8774be3 100644 --- a/lib/l10n/intl_tr.arb +++ b/lib/l10n/intl_tr.arb @@ -1,5 +1,4 @@ { - "@@locale": "tr", "developedBy": "Developed by {name}", "@developedBy": { "placeholders": { @@ -11,35 +10,51 @@ "account": "Account", "@account": {}, "addCorrespondent": "Yeni ek yazar", - "@addCorrespondent": {}, + "@addCorrespondent": { + "description": "Title when adding a new correspondent" + }, "addDocumentType": "Yeni Belge Türü", - "@addDocumentType": {}, + "@addDocumentType": { + "description": "Title when adding a new document type" + }, "addStoragePath": "Yeni Depolama Yolu", - "@addStoragePath": {}, + "@addStoragePath": { + "description": "Title when adding a new storage path" + }, "addTag": "Yeni Etiket", - "@addTag": {}, + "@addTag": { + "description": "Title when adding a new tag" + }, "aboutThisApp": "Bu uygulama hakkında", - "@aboutThisApp": {}, - "loggedInAs": "Olarak giriş yapıldı", - "@loggedInAs": {}, + "@aboutThisApp": { + "description": "Label for about this app tile displayed in the drawer" + }, + "loggedInAs": "Olarak giriş yapıldı {name}", + "@loggedInAs": { + "placeholders": { + "name": {} + } + }, "disconnect": "Bağlantıyı kes", - "@disconnect": {}, + "@disconnect": { + "description": "Logout button label" + }, "reportABug": "Hata Bildir", "@reportABug": {}, "settings": "Ayarlar", "@settings": {}, "authenticateOnAppStart": "Uygulama başlangıcında kimlik doğrulaması yapın", - "@authenticateOnAppStart": {}, + "@authenticateOnAppStart": { + "description": "Description of the biometric authentication settings tile" + }, "biometricAuthentication": "Biyometrik kimlik doğrulama", "@biometricAuthentication": {}, - "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Biyometrik kimlik doğrulamayı etkinleştirmek için kimlik doğrulaması yapın} disable{Biyometrik kimlik doğrulamayı devre dışı bırakmak için kimlik doğrulaması yapın}}", + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Biyometrik kimlik doğrulamayı etkinleştirmek için kimlik doğrulaması yapın} disable{Biyometrik kimlik doğrulamayı devre dışı bırakmak için kimlik doğrulaması yapın} other{}}", "@authenticateToToggleBiometricAuthentication": { "placeholders": { "mode": {} } }, - "authenticateToEnableBiometricAuthentication": "", - "@authenticateToEnableBiometricAuthentication": {}, "documents": "Dökümanlar", "@documents": {}, "inbox": "Gelen Kutusu", @@ -48,10 +63,6 @@ "@labels": {}, "scanner": "Tarayıcı", "@scanner": {}, - "classic": "Classic", - "@classic": {}, - "dynamic": "Dynamic", - "@dynamic": {}, "startTyping": "Yazmaya başlayın...", "@startTyping": {}, "doYouReallyWantToDeleteThisView": "Bu görünümü gerçekten silmek istiyor musunuz?", @@ -70,14 +81,20 @@ "@createdAt": {}, "documentSuccessfullyDeleted": "Doküman başarıyla silindi.", "@documentSuccessfullyDeleted": {}, - "AssignAsn": "Ata", - "@AssignAsn": {}, + "assignAsn": "Assign ASN", + "@assignAsn": {}, "deleteDocumentTooltip": "Delete", - "@deleteDocumentTooltip": {}, + "@deleteDocumentTooltip": { + "description": "Tooltip shown for the delete button on details page" + }, "downloadDocumentTooltip": "Download", - "@downloadDocumentTooltip": {}, + "@downloadDocumentTooltip": { + "description": "Tooltip shown for the download button on details page" + }, "editDocumentTooltip": "Edit", - "@editDocumentTooltip": {}, + "@editDocumentTooltip": { + "description": "Tooltip shown for the edit button on details page" + }, "loadFullContent": "Tüm içeriği yükle", "@loadFullContent": {}, "noAppToDisplayPDFFilesFound": "No app to display PDF files found!", @@ -87,25 +104,41 @@ "couldNotOpenFilePermissionDenied": "Could not open file: Permission denied.", "@couldNotOpenFilePermissionDenied": {}, "previewTooltip": "Preview", - "@previewTooltip": {}, + "@previewTooltip": { + "description": "Tooltip shown for the preview button on details page" + }, "shareTooltip": "Share", - "@shareTooltip": {}, + "@shareTooltip": { + "description": "Tooltip shown for the share button on details page" + }, "similarDocuments": "Benzer Belgeler", - "@similarDocuments": {}, + "@similarDocuments": { + "description": "Label shown in the tabbar on details page" + }, "content": "İçerik", - "@content": {}, + "@content": { + "description": "Label shown in the tabbar on details page" + }, "metaData": "Meta Veri", - "@metaData": {}, + "@metaData": { + "description": "Label shown in the tabbar on details page" + }, "overview": "Genel bakış", - "@overview": {}, + "@overview": { + "description": "Label shown in the tabbar on details page" + }, "documentType": "Döküman tipi", "@documentType": {}, "archivedPdf": "Archived (pdf)", - "@archivedPdf": {}, + "@archivedPdf": { + "description": "Option to chose when downloading a document" + }, "chooseFiletype": "Choose filetype", "@chooseFiletype": {}, "original": "Original", - "@original": {}, + "@original": { + "description": "Option to chose when downloading a document" + }, "documentSuccessfullyDownloaded": "Döküman başarıyla indirildi.", "@documentSuccessfullyDownloaded": {}, "suggestions": "Öneriler:", @@ -125,7 +158,9 @@ "reset": "Sıfırla", "@reset": {}, "filterDocuments": "Dökümanları Filtrele", - "@filterDocuments": {}, + "@filterDocuments": { + "description": "Title of the document filter" + }, "originalMD5Checksum": "Orijinal MD5-Sağlaması", "@originalMD5Checksum": {}, "mediaFilename": "Medya Dosya Adı", @@ -137,23 +172,33 @@ "modifiedAt": "Modified at", "@modifiedAt": {}, "preview": "Ön izleme", - "@preview": {}, + "@preview": { + "description": "Title of the document preview page" + }, "scanADocument": "Belge tarat", "@scanADocument": {}, "noDocumentsScannedYet": "Henüz taranan belge yok.", "@noDocumentsScannedYet": {}, "or": "yada", - "@or": {}, + "@or": { + "description": "Used on the scanner page between both main actions when no scans have been captured." + }, "deleteAllScans": "Tüm tarananları sil", "@deleteAllScans": {}, "uploadADocumentFromThisDevice": "Bu cihazdan bir döküman yükleyin", - "@uploadADocumentFromThisDevice": {}, + "@uploadADocumentFromThisDevice": { + "description": "Button label on scanner page" + }, "noMatchesFound": "No matches found.", - "@noMatchesFound": {}, + "@noMatchesFound": { + "description": "Displayed when no documents were found in the document search." + }, "removeFromSearchHistory": "Remove from search history?", "@removeFromSearchHistory": {}, "results": "Results", - "@results": {}, + "@results": { + "description": "Label displayed above search results in document search." + }, "searchDocuments": "Search documents", "@searchDocuments": {}, "resetFilter": "Filtreyi sıfırla", @@ -182,10 +227,19 @@ "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "confirmDeletion": "Silmeyi onayla", "@confirmDeletion": {}, - "areYouSureYouWantToDeleteTheFollowingDocuments": "Aşağıdaki belgeleri silmek istediğinizden emin misiniz?", - "@areYouSureYouWantToDeleteTheFollowingDocuments": {}, + "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Aşağıdaki belgeyi silmek istediğinizden emin misiniz?} other{Aşağıdaki belgeleri silmek istediğinizden emin misiniz?}}", + "@areYouSureYouWantToDeleteTheFollowingDocuments": { + "placeholders": { + "count": {} + } + }, "countSelected": "{count} seçilmiş", - "@countSelected": {}, + "@countSelected": { + "description": "Displayed in the appbar when at least one document is selected.", + "placeholders": { + "count": {} + } + }, "storagePath": "Depolama Yolu", "@storagePath": {}, "prepareDocument": "Belge hazırla", @@ -277,7 +331,9 @@ "absolute": "Mutlak", "@absolute": {}, "hintYouCanAlsoSpecifyRelativeValues": "İpucu: Somut tarihlerin yanı sıra, geçerli tarihe göre bir zaman aralığı da belirleyebilirsiniz.", - "@hintYouCanAlsoSpecifyRelativeValues": {}, + "@hintYouCanAlsoSpecifyRelativeValues": { + "description": "Displayed in the extended date range picker" + }, "amount": "Miktar", "@amount": {}, "relative": "Bağıl", @@ -364,10 +420,10 @@ "@upload": {}, "youreOffline": "Çevrimdışısınız.", "@youreOffline": {}, - "assignASN": "Assign ASN", - "@assignASN": {}, "deleteDocument": "Delete document", - "@deleteDocument": {}, + "@deleteDocument": { + "description": "Used as an action label on each inbox item" + }, "removeDocumentFromInbox": "Döküman gelen kutusundan kaldırıldı.", "@removeDocumentFromInbox": {}, "areYouSureYouWantToMarkAllDocumentsAsSeen": "Tüm belgeleri görüntülendi olarak işaretlemek istediğinizden emin misiniz? Bu, tüm gelen kutusu etiketlerini belgelerden kaldırarak, toplu bir düzenleme işlemi gerçekleştirecektir. Bu eylem geri alınamaz! Devam etmek istediğine emin misiniz?", @@ -391,7 +447,11 @@ "undo": "Geri al", "@undo": {}, "nUnseen": "{count} görüntülenmemiş", - "@nUnseen": {}, + "@nUnseen": { + "placeholders": { + "count": {} + } + }, "swipeLeftToMarkADocumentAsSeen": "İpucu: Bir belgeyi görüntülendi olarak işaretlemek ve tüm gelen kutusu etiketlerini belgeden kaldırmak için sola kaydırın.", "@swipeLeftToMarkADocumentAsSeen": {}, "yesterday": "Dün", @@ -613,5 +673,9 @@ "list": "List", "@list": {}, "remove": "Remove", - "removeQueryFromSearchHistory": "Remove query from search history?" + "removeQueryFromSearchHistory": "Remove query from search history?", + "dynamicColorScheme": "Dynamic", + "@dynamicColorScheme": {}, + "classicColorScheme": "Classic", + "@classicColorScheme": {} } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 296919c..8ac517e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -42,7 +42,7 @@ import 'package:paperless_mobile/features/notifications/services/local_notificat import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart'; import 'package:paperless_mobile/features/sharing/share_intent_queue.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; -import 'package:paperless_mobile/generated/l10n.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'package:paperless_mobile/routes/document_details_route.dart'; import 'package:paperless_mobile/theme.dart'; import 'package:paperless_mobile/constants.dart'; @@ -136,7 +136,7 @@ void main() async { //Update language header in interceptor on language change. appSettingsCubit.stream.listen((event) => languageHeaderInterceptor .preferredLocaleSubtag = event.preferredLocaleSubtag); - + runApp( MultiProvider( providers: [ @@ -232,7 +232,7 @@ class _PaperlessMobileEntrypointState extends State { preferredColorScheme: settings.preferredColorSchemeOption, ), themeMode: settings.preferredThemeMode, - supportedLocales: S.delegate.supportedLocales, + supportedLocales: S.supportedLocales, locale: Locale.fromSubtags( languageCode: settings.preferredLocaleSubtag, ), diff --git a/pubspec.yaml b/pubspec.yaml index 6ce1a1f..3a9a27c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,7 +61,6 @@ dependencies: font_awesome_flutter: ^10.1.0 local_auth: ^2.1.2 connectivity_plus: ^3.0.3 - flutter_native_splash: ^2.2.11 share_plus: ^6.2.0 introduction_screen: ^3.0.2 @@ -148,12 +147,7 @@ flutter: # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages -flutter_intl: - enabled: true - main_locale: en - localizely: - project_id: 84b4144d-a628-4ba6-a8d0-4f9917444057 - download_empty_as: main + flutter_native_splash: image: assets/logos/paperless_logo_green.png