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

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

8
crowdin.yml Normal file
View File

@@ -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

View File

@@ -1,12 +1,12 @@
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_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<TestingFrameworkVariables> initializeTestingFramework( Future<TestingFrameworkVariables> initializeTestingFramework(
{String languageCode = 'en'}) async { {String languageCode = 'en'}) async {
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
final translations = await S.load( final translations = await S.delegate.load(
Locale.fromSubtags( Locale.fromSubtags(
languageCode: languageCode, languageCode: languageCode,
), ),

View File

@@ -1,4 +1,6 @@
arb-dir: lib/l10n arb-dir: lib/l10n
template-arb-file: intl_en.arb template-arb-file: intl_en.arb
output-dir: lib/generated/l10n
output-class: S
output-localization-file: app_localizations.dart output-localization-file: app_localizations.dart
untranslated-messages-file: untranslated_messages.txt synthetic-package: false

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,7 +4,7 @@ import 'package:intl/intl.dart';
import 'package:paperless_api/paperless_api.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/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/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 { class FormBuilderExtendedDateRangePicker extends StatefulWidget {
final String name; final String name;
@@ -90,21 +90,21 @@ class _FormBuilderExtendedDateRangePickerState
return '${df.format(query.after!)} ${df.format(query.before!)}'; return '${df.format(query.after!)} ${df.format(query.before!)}';
} }
if (query.before != null) { 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) { 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) { } else if (query is RelativeDateRangeQuery) {
switch (query.unit) { switch (query.unit) {
case DateRangeUnit.day: case DateRangeUnit.day:
return S.of(context).lastNDays(query.offset); return S.of(context)!.lastNDays(query.offset);
case DateRangeUnit.week: case DateRangeUnit.week:
return S.of(context).lastNWeeks(query.offset); return S.of(context)!.lastNWeeks(query.offset);
case DateRangeUnit.month: case DateRangeUnit.month:
return S.of(context).lastNMonths(query.offset); return S.of(context)!.lastNMonths(query.offset);
case DateRangeUnit.year: case DateRangeUnit.year:
return S.of(context).lastNYears(query.offset); return S.of(context)!.lastNYears(query.offset);
default: default:
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.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/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/link.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
@@ -31,14 +32,14 @@ class AppDrawer extends StatelessWidget {
const Divider(), const Divider(),
ListTile( ListTile(
dense: true, dense: true,
title: Text(S.of(context).aboutThisApp), title: Text(S.of(context)!.aboutThisApp),
leading: const Icon(Icons.info_outline), leading: const Icon(Icons.info_outline),
onTap: () => _showAboutDialog(context), onTap: () => _showAboutDialog(context),
), ),
ListTile( ListTile(
dense: true, dense: true,
leading: const Icon(Icons.bug_report_outlined), leading: const Icon(Icons.bug_report_outlined),
title: Text(S.of(context).reportABug), title: Text(S.of(context)!.reportABug),
onTap: () { onTap: () {
launchUrlString( launchUrlString(
'https://github.com/astubenbord/paperless-mobile/issues/new'); 'https://github.com/astubenbord/paperless-mobile/issues/new');
@@ -48,7 +49,7 @@ class AppDrawer extends StatelessWidget {
dense: true, dense: true,
leading: const Icon(Icons.settings_outlined), leading: const Icon(Icons.settings_outlined),
title: Text( title: Text(
S.of(context).settings, S.of(context)!.settings,
), ),
onTap: () => Navigator.of(context).push( onTap: () => Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
@@ -74,7 +75,7 @@ class AppDrawer extends StatelessWidget {
applicationName: 'Paperless Mobile', applicationName: 'Paperless Mobile',
applicationVersion: packageInfo.version + '+' + packageInfo.buildNumber, applicationVersion: packageInfo.version + '+' + packageInfo.buildNumber,
children: [ children: [
Text(S.of(context).developedBy('Anton Stubenbord')), Text(S.of(context)!.developedBy('Anton Stubenbord')),
Link( Link(
uri: Uri.parse('https://github.com/astubenbord/paperless-mobile'), uri: Uri.parse('https://github.com/astubenbord/paperless-mobile'),
builder: (context, followLink) => GestureDetector( builder: (context, followLink) => GestureDetector(

View File

@@ -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/biometric_authentication_setting.dart';
import 'package:paperless_mobile/features/settings/view/widgets/language_selection_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/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 { class ApplicationIntroSlideshow extends StatefulWidget {
const ApplicationIntroSlideshow({super.key}); const ApplicationIntroSlideshow({super.key});
@@ -26,8 +26,8 @@ class _ApplicationIntroSlideshowState extends State<ApplicationIntroSlideshow> {
child: IntroductionScreen( child: IntroductionScreen(
globalBackgroundColor: Theme.of(context).canvasColor, globalBackgroundColor: Theme.of(context).canvasColor,
showDoneButton: true, showDoneButton: true,
next: Text(S.of(context).next), next: Text(S.of(context)!.next),
done: Text(S.of(context).done), done: Text(S.of(context)!.done),
onDone: () => Navigator.pop(context), onDone: () => Navigator.pop(context),
dotsDecorator: DotsDecorator( dotsDecorator: DotsDecorator(
color: Theme.of(context).colorScheme.onBackground, color: Theme.of(context).colorScheme.onBackground,

View File

@@ -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/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/cubit/similar_documents_cubit.dart';
import 'package:paperless_mobile/features/similar_documents/view/similar_documents_view.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:paperless_mobile/helpers/message_helpers.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
@@ -102,7 +103,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
tabs: [ tabs: [
Tab( Tab(
child: Text( child: Text(
S.of(context).overview, S.of(context)!.overview,
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
@@ -112,7 +113,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
), ),
Tab( Tab(
child: Text( child: Text(
S.of(context).content, S.of(context)!.content,
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
@@ -122,7 +123,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
), ),
Tab( Tab(
child: Text( child: Text(
S.of(context).metaData, S.of(context)!.metaData,
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
@@ -132,7 +133,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
), ),
Tab( Tab(
child: Text( child: Text(
S.of(context).similarDocuments, S.of(context)!.similarDocuments,
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
@@ -198,7 +199,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
position: b.BadgePosition.topEnd(top: -12, end: -6), position: b.BadgePosition.topEnd(top: -12, end: -6),
showBadge: _filteredSuggestions.hasSuggestions, showBadge: _filteredSuggestions.hasSuggestions,
child: Tooltip( child: Tooltip(
message: S.of(context).editDocumentTooltip, message: S.of(context)!.editDocumentTooltip,
preferBelow: false, preferBelow: false,
verticalOffset: 40, verticalOffset: 40,
child: FloatingActionButton( child: FloatingActionButton(
@@ -231,14 +232,14 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
IconButton( IconButton(
tooltip: S.of(context).deleteDocumentTooltip, tooltip: S.of(context)!.deleteDocumentTooltip,
icon: const Icon(Icons.delete), icon: const Icon(Icons.delete),
onPressed: widget.allowEdit && isConnected onPressed: widget.allowEdit && isConnected
? () => _onDelete(state.document) ? () => _onDelete(state.document)
: null, : null,
).paddedSymmetrically(horizontal: 4), ).paddedSymmetrically(horizontal: 4),
Tooltip( Tooltip(
message: S.of(context).downloadDocumentTooltip, message: S.of(context)!.downloadDocumentTooltip,
child: DocumentDownloadButton( child: DocumentDownloadButton(
document: state.document, document: state.document,
enabled: isConnected, enabled: isConnected,
@@ -246,18 +247,18 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
), ),
), ),
IconButton( IconButton(
tooltip: S.of(context).previewTooltip, tooltip: S.of(context)!.previewTooltip,
icon: const Icon(Icons.visibility), icon: const Icon(Icons.visibility),
onPressed: onPressed:
isConnected ? () => _onOpen(state.document) : null, isConnected ? () => _onOpen(state.document) : null,
).paddedOnly(right: 4.0), ).paddedOnly(right: 4.0),
IconButton( IconButton(
tooltip: S.of(context).openInSystemViewer, tooltip: S.of(context)!.openInSystemViewer,
icon: const Icon(Icons.open_in_new), icon: const Icon(Icons.open_in_new),
onPressed: isConnected ? _onOpenFileInSystemViewer : null, onPressed: isConnected ? _onOpenFileInSystemViewer : null,
).paddedOnly(right: 4.0), ).paddedOnly(right: 4.0),
IconButton( IconButton(
tooltip: S.of(context).shareTooltip, tooltip: S.of(context)!.shareTooltip,
icon: const Icon(Icons.share), icon: const Icon(Icons.share),
onPressed: isConnected onPressed: isConnected
? () => ? () =>
@@ -322,13 +323,14 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
await context.read<DocumentDetailsCubit>().openDocumentInSystemViewer(); await context.read<DocumentDetailsCubit>().openDocumentInSystemViewer();
if (status == ResultType.done) return; if (status == ResultType.done) return;
if (status == ResultType.noAppToOpen) { if (status == ResultType.noAppToOpen) {
showGenericError(context, S.of(context).noAppToDisplayPDFFilesFound); showGenericError(context, S.of(context)!.noAppToDisplayPDFFilesFound);
} }
if (status == ResultType.fileNotFound) { if (status == ResultType.fileNotFound) {
showGenericError(context, translateError(context, ErrorCode.unknown)); showGenericError(context, translateError(context, ErrorCode.unknown));
} }
if (status == ResultType.permissionDenied) { if (status == ResultType.permissionDenied) {
showGenericError(context, S.of(context).couldNotOpenFilePermissionDenied); showGenericError(
context, S.of(context)!.couldNotOpenFilePermissionDenied);
} }
} }
@@ -342,7 +344,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
if (delete) { if (delete) {
try { try {
await context.read<DocumentDetailsCubit>().delete(document); await context.read<DocumentDetailsCubit>().delete(document);
showSnackBar(context, S.of(context).documentSuccessfullyDeleted); showSnackBar(context, S.of(context)!.documentSuccessfullyDeleted);
} on PaperlessServerException catch (error, stackTrace) { } on PaperlessServerException catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace); showErrorMessage(context, error, stackTrace);
} finally { } finally {

View File

@@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/widgets/highlighted_text.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/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 { class DocumentContentWidget extends StatelessWidget {
final bool isFullContentLoaded; final bool isFullContentLoaded;
@@ -38,7 +38,7 @@ class DocumentContentWidget extends StatelessWidget {
Align( Align(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
child: TextButton( child: TextButton(
child: Text(S.of(context).loadFullContent), child: Text(S.of(context)!.loadFullContent),
onPressed: () { onPressed: () {
context.read<DocumentDetailsCubit>().loadFullContent(); context.read<DocumentDetailsCubit>().loadFullContent();
}, },

View File

@@ -5,7 +5,8 @@ import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/service/file_service.dart'; import 'package:paperless_mobile/core/service/file_service.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.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/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/message_helpers.dart';
import 'package:paperless_mobile/helpers/permission_helpers.dart'; import 'package:paperless_mobile/helpers/permission_helpers.dart';
import 'package:paperless_mobile/constants.dart'; import 'package:paperless_mobile/constants.dart';
@@ -53,15 +54,15 @@ class _DocumentDownloadButtonState extends State<DocumentDownloadButton> {
final downloadOriginal = await showDialog<bool>( final downloadOriginal = await showDialog<bool>(
context: context, context: context,
builder: (context) => RadioSettingsDialog( builder: (context) => RadioSettingsDialog(
titleText: S.of(context).chooseFiletype, titleText: S.of(context)!.chooseFiletype,
options: [ options: [
RadioOption( RadioOption(
value: true, value: true,
label: S.of(context).original + label: S.of(context)!.original +
" (${meta.originalMimeType.split("/").last})"), " (${meta.originalMimeType.split("/").last})"),
RadioOption( RadioOption(
value: false, value: false,
label: S.of(context).archivedPdf, label: S.of(context)!.archivedPdf,
), ),
], ],
initialValue: false, initialValue: false,
@@ -91,7 +92,7 @@ class _DocumentDownloadButtonState extends State<DocumentDownloadButton> {
createdFile.createSync(recursive: true); createdFile.createSync(recursive: true);
createdFile.writeAsBytesSync(bytes); createdFile.writeAsBytesSync(bytes);
debugPrint("Downloaded file to $filePath"); debugPrint("Downloaded file to $filePath");
showSnackBar(context, S.of(context).documentSuccessfullyDownloaded); showSnackBar(context, S.of(context)!.documentSuccessfullyDownloaded);
} on PaperlessServerException catch (error, stackTrace) { } on PaperlessServerException catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace); showErrorMessage(context, error, stackTrace);
} catch (error) { } catch (error) {

View File

@@ -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/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/document_details/cubit/document_details_cubit.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/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/format_helpers.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart';
@@ -44,39 +45,40 @@ class DocumentMetaDataWidget extends StatelessWidget {
), ),
children: [ children: [
DetailsItem( DetailsItem(
label: S.of(context).archiveSerialNumber, label: S.of(context)!.archiveSerialNumber,
content: document.archiveSerialNumber != null content: document.archiveSerialNumber != null
? Text(document.archiveSerialNumber.toString()) ? Text(document.archiveSerialNumber.toString())
: TextButton.icon( : TextButton.icon(
icon: const Icon(Icons.archive_outlined), icon: const Icon(Icons.archive_outlined),
label: Text(S.of(context).AssignAsn), label: Text(S.of(context)!.assignAsn),
onPressed: connectivity.isConnected onPressed: connectivity.isConnected
? () => _assignAsn(context) ? () => _assignAsn(context)
: null, : null,
), ),
).paddedOnly(bottom: itemSpacing), ).paddedOnly(bottom: itemSpacing),
DetailsItem.text(DateFormat().format(document.modified), DetailsItem.text(DateFormat().format(document.modified),
label: S.of(context).modifiedAt, context: context) label: S.of(context)!.modifiedAt, context: context)
.paddedOnly(bottom: itemSpacing), .paddedOnly(bottom: itemSpacing),
DetailsItem.text(DateFormat().format(document.added), DetailsItem.text(DateFormat().format(document.added),
label: S.of(context).addedAt, context: context) label: S.of(context)!.addedAt, context: context)
.paddedOnly(bottom: itemSpacing), .paddedOnly(bottom: itemSpacing),
DetailsItem.text( DetailsItem.text(
meta.mediaFilename, meta.mediaFilename,
context: context, context: context,
label: S.of(context).mediaFilename, label: S.of(context)!.mediaFilename,
).paddedOnly(bottom: itemSpacing), ).paddedOnly(bottom: itemSpacing),
DetailsItem.text( DetailsItem.text(
meta.originalChecksum, meta.originalChecksum,
context: context, context: context,
label: S.of(context).originalMD5Checksum, label: S.of(context)!.originalMD5Checksum,
).paddedOnly(bottom: itemSpacing), ).paddedOnly(bottom: itemSpacing),
DetailsItem.text(formatBytes(meta.originalSize, 2), DetailsItem.text(formatBytes(meta.originalSize, 2),
label: S.of(context).originalFileSize, context: context) label: S.of(context)!.originalFileSize,
context: context)
.paddedOnly(bottom: itemSpacing), .paddedOnly(bottom: itemSpacing),
DetailsItem.text( DetailsItem.text(
meta.originalMimeType, meta.originalMimeType,
label: S.of(context).originalMIMEType, label: S.of(context)!.originalMIMEType,
context: context, context: context,
).paddedOnly(bottom: itemSpacing), ).paddedOnly(bottom: itemSpacing),
], ],

View File

@@ -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/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/tags/view/widgets/tags_widget.dart';
import 'package:paperless_mobile/features/labels/view/widgets/label_text.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 { class DocumentOverviewWidget extends StatelessWidget {
final DocumentModel document; final DocumentModel document;
@@ -29,7 +29,7 @@ class DocumentOverviewWidget extends StatelessWidget {
), ),
children: [ children: [
DetailsItem( DetailsItem(
label: S.of(context).title, label: S.of(context)!.title,
content: HighlightedText( content: HighlightedText(
text: document.title, text: document.title,
highlights: queryString?.split(" ") ?? [], highlights: queryString?.split(" ") ?? [],
@@ -39,12 +39,12 @@ class DocumentOverviewWidget extends StatelessWidget {
DetailsItem.text( DetailsItem.text(
DateFormat.yMMMMd().format(document.created), DateFormat.yMMMMd().format(document.created),
context: context, context: context,
label: S.of(context).createdAt, label: S.of(context)!.createdAt,
).paddedOnly(bottom: itemSpacing), ).paddedOnly(bottom: itemSpacing),
Visibility( Visibility(
visible: document.documentType != null, visible: document.documentType != null,
child: DetailsItem( child: DetailsItem(
label: S.of(context).documentType, label: S.of(context)!.documentType,
content: LabelText<DocumentType>( content: LabelText<DocumentType>(
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
id: document.documentType, id: document.documentType,
@@ -54,7 +54,7 @@ class DocumentOverviewWidget extends StatelessWidget {
Visibility( Visibility(
visible: document.correspondent != null, visible: document.correspondent != null,
child: DetailsItem( child: DetailsItem(
label: S.of(context).correspondent, label: S.of(context)!.correspondent,
content: LabelText<Correspondent>( content: LabelText<Correspondent>(
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
id: document.correspondent, id: document.correspondent,
@@ -64,7 +64,7 @@ class DocumentOverviewWidget extends StatelessWidget {
Visibility( Visibility(
visible: document.storagePath != null, visible: document.storagePath != null,
child: DetailsItem( child: DetailsItem(
label: S.of(context).storagePath, label: S.of(context)!.storagePath,
content: StoragePathWidget( content: StoragePathWidget(
pathId: document.storagePath, pathId: document.storagePath,
), ),
@@ -73,7 +73,7 @@ class DocumentOverviewWidget extends StatelessWidget {
Visibility( Visibility(
visible: document.tags.isNotEmpty, visible: document.tags.isNotEmpty,
child: DetailsItem( child: DetailsItem(
label: S.of(context).tags, label: S.of(context)!.tags,
content: Padding( content: Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),
child: TagsWidget( child: TagsWidget(

View File

@@ -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/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/tags/view/widgets/tags_form_field.dart';
import 'package:paperless_mobile/features/labels/view/widgets/label_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'; import 'package:paperless_mobile/helpers/message_helpers.dart';
class DocumentEditPage extends StatefulWidget { class DocumentEditPage extends StatefulWidget {
@@ -59,10 +60,10 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
floatingActionButton: FloatingActionButton.extended( floatingActionButton: FloatingActionButton.extended(
onPressed: () => _onSubmit(state.document), onPressed: () => _onSubmit(state.document),
icon: const Icon(Icons.save), icon: const Icon(Icons.save),
label: Text(S.of(context).saveChanges), label: Text(S.of(context)!.saveChanges),
), ),
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).editDocument), title: Text(S.of(context)!.editDocument),
bottom: _isSubmitLoading bottom: _isSubmitLoading
? const PreferredSize( ? const PreferredSize(
preferredSize: Size.fromHeight(4), preferredSize: Size.fromHeight(4),
@@ -159,7 +160,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
create: (context) => context.read<LabelRepository<StoragePath>>(), create: (context) => context.read<LabelRepository<StoragePath>>(),
child: AddStoragePathPage(initalValue: initialValue), child: AddStoragePathPage(initalValue: initialValue),
), ),
textFieldLabel: S.of(context).storagePath, textFieldLabel: S.of(context)!.storagePath,
labelOptions: options, labelOptions: options,
initialValue: IdQueryParameter.fromId(initialId), initialValue: IdQueryParameter.fromId(initialId),
name: fkStoragePath, name: fkStoragePath,
@@ -180,7 +181,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
create: (context) => context.read<LabelRepository<Correspondent>>(), create: (context) => context.read<LabelRepository<Correspondent>>(),
child: AddCorrespondentPage(initialName: initialValue), child: AddCorrespondentPage(initialName: initialValue),
), ),
textFieldLabel: S.of(context).correspondent, textFieldLabel: S.of(context)!.correspondent,
labelOptions: options, labelOptions: options,
initialValue: IdQueryParameter.fromId(initialId), initialValue: IdQueryParameter.fromId(initialId),
name: fkCorrespondent, name: fkCorrespondent,
@@ -214,7 +215,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
initialName: currentInput, initialName: currentInput,
), ),
), ),
textFieldLabel: S.of(context).documentType, textFieldLabel: S.of(context)!.documentType,
initialValue: IdQueryParameter.fromId(initialId), initialValue: IdQueryParameter.fromId(initialId),
labelOptions: options, labelOptions: options,
name: fkDocumentType, name: fkDocumentType,
@@ -249,7 +250,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
}); });
try { try {
await context.read<DocumentEditCubit>().updateDocument(mergedDocument); await context.read<DocumentEditCubit>().updateDocument(mergedDocument);
showSnackBar(context, S.of(context).documentSuccessfullyUpdated); showSnackBar(context, S.of(context)!.documentSuccessfullyUpdated);
} on PaperlessServerException catch (error, stackTrace) { } on PaperlessServerException catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace); showErrorMessage(context, error, stackTrace);
} finally { } finally {
@@ -266,7 +267,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
name: fkTitle, name: fkTitle,
validator: FormBuilderValidators.required(), validator: FormBuilderValidators.required(),
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).title), label: Text(S.of(context)!.title),
), ),
initialValue: initialTitle, initialValue: initialTitle,
); );
@@ -281,7 +282,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
name: fkCreatedDate, name: fkCreatedDate,
decoration: InputDecoration( decoration: InputDecoration(
prefixIcon: const Icon(Icons.calendar_month_outlined), prefixIcon: const Icon(Icons.calendar_month_outlined),
label: Text(S.of(context).createdAt), label: Text(S.of(context)!.createdAt),
), ),
initialValue: initialCreatedAtDate, initialValue: initialCreatedAtDate,
format: DateFormat.yMMMMd(), format: DateFormat.yMMMMd(),
@@ -311,7 +312,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
S.of(context).suggestions, S.of(context)!.suggestions,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
SizedBox( SizedBox(

View File

@@ -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/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/search_app_bar/view/search_app_bar.dart';
import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.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/file_helpers.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart';
import 'package:paperless_mobile/helpers/permission_helpers.dart'; import 'package:paperless_mobile/helpers/permission_helpers.dart';
@@ -72,7 +73,7 @@ class _ScannerPageState extends State<ScannerPage>
state.isEmpty ? const NeverScrollableScrollPhysics() : null, state.isEmpty ? const NeverScrollableScrollPhysics() : null,
slivers: [ slivers: [
SearchAppBar( SearchAppBar(
hintText: S.of(context).searchDocuments, hintText: S.of(context)!.searchDocuments,
onOpenSearch: showDocumentSearchPage, onOpenSearch: showDocumentSearchPage,
bottom: PreferredSize( bottom: PreferredSize(
child: _buildActions(connectedState.isConnected), child: _buildActions(connectedState.isConnected),
@@ -97,7 +98,7 @@ class _ScannerPageState extends State<ScannerPage>
floatHeaderSlivers: false, floatHeaderSlivers: false,
headerSliverBuilder: (context, innerBoxIsScrolled) => [ headerSliverBuilder: (context, innerBoxIsScrolled) => [
SearchAppBar( SearchAppBar(
hintText: S.of(context).searchDocuments, hintText: S.of(context)!.searchDocuments,
onOpenSearch: showDocumentSearchPage, onOpenSearch: showDocumentSearchPage,
bottom: PreferredSize( bottom: PreferredSize(
child: _buildActions(connectedState.isConnected), child: _buildActions(connectedState.isConnected),
@@ -134,7 +135,7 @@ class _ScannerPageState extends State<ScannerPage>
BlocBuilder<DocumentScannerCubit, List<File>>( BlocBuilder<DocumentScannerCubit, List<File>>(
builder: (context, state) { builder: (context, state) {
return TextButton.icon( return TextButton.icon(
label: Text(S.of(context).previewScan), label: Text(S.of(context)!.previewScan),
onPressed: state.isNotEmpty onPressed: state.isNotEmpty
? () => Navigator.of(context).push( ? () => Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
@@ -154,7 +155,7 @@ class _ScannerPageState extends State<ScannerPage>
BlocBuilder<DocumentScannerCubit, List<File>>( BlocBuilder<DocumentScannerCubit, List<File>>(
builder: (context, state) { builder: (context, state) {
return TextButton.icon( return TextButton.icon(
label: Text(S.of(context).clearAll), label: Text(S.of(context)!.clearAll),
onPressed: state.isEmpty ? null : () => _reset(context), onPressed: state.isEmpty ? null : () => _reset(context),
icon: const Icon(Icons.delete_sweep_outlined), icon: const Icon(Icons.delete_sweep_outlined),
); );
@@ -163,7 +164,7 @@ class _ScannerPageState extends State<ScannerPage>
BlocBuilder<DocumentScannerCubit, List<File>>( BlocBuilder<DocumentScannerCubit, List<File>>(
builder: (context, state) { builder: (context, state) {
return TextButton.icon( return TextButton.icon(
label: Text(S.of(context).upload), label: Text(S.of(context)!.upload),
onPressed: state.isEmpty || !isConnected onPressed: state.isEmpty || !isConnected
? null ? null
: () => _onPrepareDocumentUpload(context), : () => _onPrepareDocumentUpload(context),
@@ -247,16 +248,16 @@ class _ScannerPageState extends State<ScannerPage>
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text( Text(
S.of(context).noDocumentsScannedYet, S.of(context)!.noDocumentsScannedYet,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
TextButton( TextButton(
child: Text(S.of(context).scanADocument), child: Text(S.of(context)!.scanADocument),
onPressed: () => _openDocumentScanner(context), onPressed: () => _openDocumentScanner(context),
), ),
Text(S.of(context).or), Text(S.of(context)!.or),
TextButton( TextButton(
child: Text(S.of(context).uploadADocumentFromThisDevice), child: Text(S.of(context)!.uploadADocumentFromThisDevice),
onPressed: isConnected ? _onUploadFromFilesystem : null, onPressed: isConnected ? _onUploadFromFilesystem : null,
), ),
], ],

View File

@@ -1,7 +1,8 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; 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'; import 'package:photo_view/photo_view.dart';
typedef DeleteCallback = void Function(); typedef DeleteCallback = void Function();
@@ -112,7 +113,7 @@ class _ScannedImageItemState extends State<ScannedImageItem> {
builder: (context) => Scaffold( builder: (context) => Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text( 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)), body: PhotoView(imageProvider: FileImage(widget.file)),
), ),

View File

@@ -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/cubit/document_search_cubit.dart';
import 'package:paperless_mobile/features/document_search/view/remove_history_entry_dialog.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/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 'package:paperless_mobile/routes/document_details_route.dart';
import 'dart:math' as math; import 'dart:math' as math;
@@ -60,7 +61,7 @@ class _DocumentSearchPageState extends State<DocumentSearchPage> {
hintStyle: theme.textTheme.bodyLarge?.apply( hintStyle: theme.textTheme.bodyLarge?.apply(
color: theme.colorScheme.onSurfaceVariant, color: theme.colorScheme.onSurfaceVariant,
), ),
hintText: S.of(context).searchDocuments, hintText: S.of(context)!.searchDocuments,
border: InputBorder.none, border: InputBorder.none,
), ),
controller: _queryController, controller: _queryController,
@@ -181,7 +182,7 @@ class _DocumentSearchPageState extends State<DocumentSearchPage> {
Widget _buildResultsView(DocumentSearchState state) { Widget _buildResultsView(DocumentSearchState state) {
final header = Text( final header = Text(
S.of(context).results, S.of(context)!.results,
style: Theme.of(context).textTheme.labelSmall, style: Theme.of(context).textTheme.labelSmall,
).padded(); ).padded();
return CustomScrollView( return CustomScrollView(
@@ -190,7 +191,7 @@ class _DocumentSearchPageState extends State<DocumentSearchPage> {
if (state.hasLoaded && !state.isLoading && state.documents.isEmpty) if (state.hasLoaded && !state.isLoading && state.documents.isEmpty)
SliverToBoxAdapter( SliverToBoxAdapter(
child: Center( child: Center(
child: Text(S.of(context).noMatchesFound), child: Text(S.of(context)!.noMatchesFound),
), ),
) )
else else

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_mobile/core/widgets/dialog_utils/dialog_cancel_button.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 { class RemoveHistoryEntryDialog extends StatelessWidget {
final String entry; final String entry;
@@ -10,11 +10,11 @@ class RemoveHistoryEntryDialog extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AlertDialog( return AlertDialog(
title: Text(entry), title: Text(entry),
content: Text(S.of(context).removeQueryFromSearchHistory), content: Text(S.of(context)!.removeQueryFromSearchHistory),
actions: [ actions: [
const DialogCancelButton(), const DialogCancelButton(),
TextButton( TextButton(
child: Text(S.of(context).remove), child: Text(S.of(context)!.remove),
onPressed: () { onPressed: () {
Navigator.pop(context, true); Navigator.pop(context, true);
}, },

View File

@@ -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/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/tags/view/widgets/tags_form_field.dart';
import 'package:paperless_mobile/features/labels/view/widgets/label_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'; import 'package:paperless_mobile/helpers/message_helpers.dart';
class DocumentUploadPreparationPage extends StatefulWidget { class DocumentUploadPreparationPage extends StatefulWidget {
@@ -62,7 +63,7 @@ class _DocumentUploadPreparationPageState
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: true, resizeToAvoidBottomInset: true,
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).prepareDocument), title: Text(S.of(context)!.prepareDocument),
bottom: _isUploadLoading bottom: _isUploadLoading
? const PreferredSize( ? const PreferredSize(
child: LinearProgressIndicator(), child: LinearProgressIndicator(),
@@ -73,7 +74,7 @@ class _DocumentUploadPreparationPageState
visible: MediaQuery.of(context).viewInsets.bottom == 0, visible: MediaQuery.of(context).viewInsets.bottom == 0,
child: FloatingActionButton.extended( child: FloatingActionButton.extended(
onPressed: _onSubmit, onPressed: _onSubmit,
label: Text(S.of(context).upload), label: Text(S.of(context)!.upload),
icon: const Icon(Icons.upload), icon: const Icon(Icons.upload),
), ),
), ),
@@ -91,7 +92,7 @@ class _DocumentUploadPreparationPageState
widget.title ?? "scan_${fileNameDateFormat.format(_now)}", widget.title ?? "scan_${fileNameDateFormat.format(_now)}",
validator: FormBuilderValidators.required(), validator: FormBuilderValidators.required(),
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).title, labelText: S.of(context)!.title,
suffixIcon: IconButton( suffixIcon: IconButton(
icon: const Icon(Icons.close), icon: const Icon(Icons.close),
onPressed: () { onPressed: () {
@@ -121,7 +122,7 @@ class _DocumentUploadPreparationPageState
enabled: !_syncTitleAndFilename, enabled: !_syncTitleAndFilename,
name: fkFileName, name: fkFileName,
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).fileName, labelText: S.of(context)!.fileName,
suffixText: widget.fileExtension, suffixText: widget.fileExtension,
suffixIcon: IconButton( suffixIcon: IconButton(
icon: const Icon(Icons.clear), icon: const Icon(Icons.clear),
@@ -151,7 +152,7 @@ class _DocumentUploadPreparationPageState
} }
}, },
title: Text( title: Text(
S.of(context).synchronizeTitleAndFilename, S.of(context)!.synchronizeTitleAndFilename,
), ),
), ),
// Created at // Created at
@@ -166,7 +167,7 @@ class _DocumentUploadPreparationPageState
}, },
decoration: InputDecoration( decoration: InputDecoration(
prefixIcon: const Icon(Icons.calendar_month_outlined), prefixIcon: const Icon(Icons.calendar_month_outlined),
labelText: S.of(context).createdAt + " *", labelText: S.of(context)!.createdAt + " *",
suffixIcon: _showDatePickerDeleteIcon suffixIcon: _showDatePickerDeleteIcon
? IconButton( ? IconButton(
icon: const Icon(Icons.close), icon: const Icon(Icons.close),
@@ -189,7 +190,7 @@ class _DocumentUploadPreparationPageState
context.read<LabelRepository<Correspondent>>(), context.read<LabelRepository<Correspondent>>(),
child: AddCorrespondentPage(initialName: initialName), child: AddCorrespondentPage(initialName: initialName),
), ),
textFieldLabel: S.of(context).correspondent + " *", textFieldLabel: S.of(context)!.correspondent + " *",
name: DocumentModel.correspondentKey, name: DocumentModel.correspondentKey,
labelOptions: state.correspondents, labelOptions: state.correspondents,
prefixIcon: const Icon(Icons.person_outline), prefixIcon: const Icon(Icons.person_outline),
@@ -204,7 +205,7 @@ class _DocumentUploadPreparationPageState
context.read<LabelRepository<DocumentType>>(), context.read<LabelRepository<DocumentType>>(),
child: AddDocumentTypePage(initialName: initialName), child: AddDocumentTypePage(initialName: initialName),
), ),
textFieldLabel: S.of(context).documentType + " *", textFieldLabel: S.of(context)!.documentType + " *",
name: DocumentModel.documentTypeKey, name: DocumentModel.documentTypeKey,
labelOptions: state.documentTypes, labelOptions: state.documentTypes,
prefixIcon: const Icon(Icons.description_outlined), prefixIcon: const Icon(Icons.description_outlined),
@@ -218,7 +219,7 @@ class _DocumentUploadPreparationPageState
//Label: "Tags" + " *", //Label: "Tags" + " *",
), ),
Text( Text(
"* " + S.of(context).uploadInferValuesHint, "* " + S.of(context)!.uploadInferValuesHint,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
SizedBox(height: 300), SizedBox(height: 300),
@@ -258,7 +259,7 @@ class _DocumentUploadPreparationPageState
createdAt: createdAt, createdAt: createdAt,
); );
showSnackBar( showSnackBar(
context, S.of(context).documentSuccessfullyUploadedProcessing); context, S.of(context)!.documentSuccessfullyUploadedProcessing);
Navigator.pop(context, taskId); Navigator.pop(context, taskId);
} on PaperlessServerException catch (error, stackTrace) { } on PaperlessServerException catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace); showErrorMessage(context, error, stackTrace);

View File

@@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.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'; import 'package:pdfx/pdfx.dart';
class DocumentView extends StatefulWidget { class DocumentView extends StatefulWidget {
@@ -32,7 +33,7 @@ class _DocumentViewState extends State<DocumentView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).preview), title: Text(S.of(context)!.preview),
), ),
body: PdfView( body: PdfView(
builders: PdfViewBuilders<DefaultBuilderOptions>( builders: PdfViewBuilders<DefaultBuilderOptions>(

View File

@@ -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/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/search_app_bar/view/search_app_bar.dart';
import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.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/helpers/message_helpers.dart';
import 'package:paperless_mobile/routes/document_details_route.dart'; import 'package:paperless_mobile/routes/document_details_route.dart';
@@ -112,9 +113,9 @@ class _DocumentsPageState extends State<DocumentsPage>
listener: (context, state) { listener: (context, state) {
showSnackBar( showSnackBar(
context, context,
S.of(context).newDocumentAvailable, S.of(context)!.newDocumentAvailable,
action: SnackBarActionConfig( action: SnackBarActionConfig(
label: S.of(context).reload, label: S.of(context)!.reload,
onPressed: () { onPressed: () {
context.read<TaskStatusCubit>().acknowledgeCurrentTask(); context.read<TaskStatusCubit>().acknowledgeCurrentTask();
context.read<DocumentsCubit>().reload(); context.read<DocumentsCubit>().reload();
@@ -200,7 +201,7 @@ class _DocumentsPageState extends State<DocumentsPage>
.resetSelection(), .resetSelection(),
), ),
title: Text( title: Text(
"${state.selection.length} ${S.of(context).countSelected}", "${state.selection.length} ${S.of(context)!.countSelected}",
), ),
actions: [ actions: [
IconButton( IconButton(
@@ -211,13 +212,13 @@ class _DocumentsPageState extends State<DocumentsPage>
); );
} }
return SearchAppBar( return SearchAppBar(
hintText: S.of(context).searchDocuments, hintText: S.of(context)!.searchDocuments,
onOpenSearch: showDocumentSearchPage, onOpenSearch: showDocumentSearchPage,
bottom: TabBar( bottom: TabBar(
controller: _tabController, controller: _tabController,
tabs: [ tabs: [
Tab(text: S.of(context).documents), Tab(text: S.of(context)!.documents),
Tab(text: S.of(context).views), Tab(text: S.of(context)!.views),
], ],
), ),
); );
@@ -293,7 +294,7 @@ class _DocumentsPageState extends State<DocumentsPage>
_nestedScrollViewKey.currentState?.outerController.jumpTo(0); _nestedScrollViewKey.currentState?.outerController.jumpTo(0);
}, },
label: Text( label: Text(
S.of(context).scrollToTop, S.of(context)!.scrollToTop,
style: DefaultTextStyle.of(context).style.apply( style: DefaultTextStyle.of(context).style.apply(
color: Theme.of(context).colorScheme.onPrimary, color: Theme.of(context).colorScheme.onPrimary,
), ),
@@ -408,7 +409,7 @@ class _DocumentsPageState extends State<DocumentsPage>
.bulkDelete(documentsState.selection); .bulkDelete(documentsState.selection);
showSnackBar( showSnackBar(
context, context,
S.of(context).documentsSuccessfullyDeleted, S.of(context)!.documentsSuccessfullyDeleted,
); );
context.read<DocumentsCubit>().resetSelection(); context.read<DocumentsCubit>().resetSelection();
} on PaperlessServerException catch (error, stackTrace) { } on PaperlessServerException catch (error, stackTrace) {

View File

@@ -220,7 +220,7 @@ class DefaultAdaptiveDocumentsView extends AdaptiveDocumentsView {
Widget _buildListView() { Widget _buildListView() {
if (showLoadingPlaceholder) { if (showLoadingPlaceholder) {
return DocumentsListLoadingWidget(); return const DocumentsListLoadingWidget();
} }
return ListView.builder( return ListView.builder(

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.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 { class DeleteDocumentConfirmationDialog extends StatelessWidget {
final DocumentModel document; final DocumentModel document;
@@ -9,12 +9,12 @@ class DeleteDocumentConfirmationDialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AlertDialog( return AlertDialog(
title: Text(S.of(context).confirmDeletion), title: Text(S.of(context)!.confirmDeletion),
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
S.of(context).areYouSureYouWantToDeleteTheFollowingDocuments(1), S.of(context)!.areYouSureYouWantToDeleteTheFollowingDocuments(1),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Text( Text(
@@ -26,13 +26,13 @@ class DeleteDocumentConfirmationDialog extends StatelessWidget {
), ),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Text(S.of(context).thisActionIsIrreversibleDoYouWishToProceedAnyway), Text(S.of(context)!.thisActionIsIrreversibleDoYouWishToProceedAnyway),
], ],
), ),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Navigator.pop(context, false), onPressed: () => Navigator.pop(context, false),
child: Text(S.of(context).cancel), child: Text(S.of(context)!.cancel),
), ),
TextButton( TextButton(
style: ButtonStyle( style: ButtonStyle(
@@ -42,7 +42,7 @@ class DeleteDocumentConfirmationDialog extends StatelessWidget {
onPressed: () { onPressed: () {
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
child: Text(S.of(context).delete), child: Text(S.of(context)!.delete),
), ),
], ],
); );

View File

@@ -3,7 +3,7 @@ import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/widgets/empty_state.dart'; import 'package:paperless_mobile/core/widgets/empty_state.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.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/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 { class DocumentsEmptyState extends StatelessWidget {
final DocumentPagingState state; final DocumentPagingState state;
@@ -18,13 +18,13 @@ class DocumentsEmptyState extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( return Center(
child: EmptyState( child: EmptyState(
title: S.of(context).oops, title: S.of(context)!.oops,
subtitle: S.of(context).thereSeemsToBeNothingHere, subtitle: S.of(context)!.thereSeemsToBeNothingHere,
bottomChild: state.filter != DocumentFilter.initial && onReset != null bottomChild: state.filter != DocumentFilter.initial && onReset != null
? TextButton( ? TextButton(
onPressed: onReset, onPressed: onReset,
child: Text( child: Text(
S.of(context).resetFilter, S.of(context)!.resetFilter,
), ),
).padded() ).padded()
: null, : null,

View File

@@ -19,6 +19,7 @@ class DocumentsListLoadingWidget extends StatelessWidget {
); );
} else { } else {
return ListView.builder( return ListView.builder(
padding: EdgeInsets.zero,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => _buildFakeListItem(context), itemBuilder: (context, index) => _buildFakeListItem(context),
); );

View File

@@ -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/cubit/label_cubit.dart';
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.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/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'; import 'text_query_form_field.dart';
@@ -96,14 +96,14 @@ class _DocumentFilterFormState extends State<DocumentFilterForm> {
Align( Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Text( child: Text(
S.of(context).advanced, S.of(context)!.advanced,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
), ),
FormBuilderExtendedDateRangePicker( FormBuilderExtendedDateRangePicker(
name: DocumentFilterForm.fkCreatedAt, name: DocumentFilterForm.fkCreatedAt,
initialValue: widget.initialFilter.created, initialValue: widget.initialFilter.created,
labelText: S.of(context).createdAt, labelText: S.of(context)!.createdAt,
onChanged: (_) { onChanged: (_) {
_checkQueryConstraints(); _checkQueryConstraints();
}, },
@@ -111,7 +111,7 @@ class _DocumentFilterFormState extends State<DocumentFilterForm> {
FormBuilderExtendedDateRangePicker( FormBuilderExtendedDateRangePicker(
name: DocumentFilterForm.fkAddedAt, name: DocumentFilterForm.fkAddedAt,
initialValue: widget.initialFilter.added, initialValue: widget.initialFilter.added,
labelText: S.of(context).addedAt, labelText: S.of(context)!.addedAt,
onChanged: (_) { onChanged: (_) {
_checkQueryConstraints(); _checkQueryConstraints();
}, },
@@ -151,7 +151,7 @@ class _DocumentFilterFormState extends State<DocumentFilterForm> {
formBuilderState: widget.formKey.currentState, formBuilderState: widget.formKey.currentState,
name: DocumentFilterForm.fkDocumentType, name: DocumentFilterForm.fkDocumentType,
labelOptions: state.labels, labelOptions: state.labels,
textFieldLabel: S.of(context).documentType, textFieldLabel: S.of(context)!.documentType,
initialValue: widget.initialFilter.documentType, initialValue: widget.initialFilter.documentType,
prefixIcon: const Icon(Icons.description_outlined), prefixIcon: const Icon(Icons.description_outlined),
); );
@@ -166,7 +166,7 @@ class _DocumentFilterFormState extends State<DocumentFilterForm> {
formBuilderState: widget.formKey.currentState, formBuilderState: widget.formKey.currentState,
name: DocumentFilterForm.fkCorrespondent, name: DocumentFilterForm.fkCorrespondent,
labelOptions: state.labels, labelOptions: state.labels,
textFieldLabel: S.of(context).correspondent, textFieldLabel: S.of(context)!.correspondent,
initialValue: widget.initialFilter.correspondent, initialValue: widget.initialFilter.correspondent,
prefixIcon: const Icon(Icons.person_outline), prefixIcon: const Icon(Icons.person_outline),
); );
@@ -181,7 +181,7 @@ class _DocumentFilterFormState extends State<DocumentFilterForm> {
formBuilderState: widget.formKey.currentState, formBuilderState: widget.formKey.currentState,
name: DocumentFilterForm.fkStoragePath, name: DocumentFilterForm.fkStoragePath,
labelOptions: state.labels, labelOptions: state.labels,
textFieldLabel: S.of(context).storagePath, textFieldLabel: S.of(context)!.storagePath,
initialValue: widget.initialFilter.storagePath, initialValue: widget.initialFilter.storagePath,
prefixIcon: const Icon(Icons.folder_outlined), prefixIcon: const Icon(Icons.folder_outlined),
); );

View File

@@ -5,7 +5,7 @@ import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:paperless_api/paperless_api.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/pages/documents_page.dart';
import 'package:paperless_mobile/features/documents/view/widgets/search/document_filter_form.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 } enum DateRangeSelection { before, after }
@@ -74,7 +74,7 @@ class _DocumentFilterPanelState extends State<DocumentFilterPanel> {
visible: MediaQuery.of(context).viewInsets.bottom == 0, visible: MediaQuery.of(context).viewInsets.bottom == 0,
child: FloatingActionButton.extended( child: FloatingActionButton.extended(
icon: const Icon(Icons.done), icon: const Icon(Icons.done),
label: Text(S.of(context).apply), label: Text(S.of(context)!.apply),
onPressed: _onApplyFilter, onPressed: _onApplyFilter,
), ),
), ),
@@ -85,7 +85,7 @@ class _DocumentFilterPanelState extends State<DocumentFilterPanel> {
TextButton.icon( TextButton.icon(
onPressed: _resetFilter, onPressed: _resetFilter,
icon: const Icon(Icons.refresh), 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<DocumentFilterPanel> {
), ),
Padding( Padding(
padding: EdgeInsets.only(left: _heightAnimationValue * 48), padding: EdgeInsets.only(left: _heightAnimationValue * 48),
child: Text(S.of(context).filterDocuments), child: Text(S.of(context)!.filterDocuments),
), ),
], ],
), ),

View File

@@ -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/core/translation/sort_field_localization_mapper.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/labels/cubit/label_cubit.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 { class SortFieldSelectionBottomSheet extends StatefulWidget {
final SortOrder initialSortOrder; final SortOrder initialSortOrder;
@@ -48,12 +48,12 @@ class _SortFieldSelectionBottomSheetState
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
S.of(context).orderBy, S.of(context)!.orderBy,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
textAlign: TextAlign.start, textAlign: TextAlign.start,
), ),
TextButton( TextButton(
child: Text(S.of(context).apply), child: Text(S.of(context)!.apply),
onPressed: () { onPressed: () {
widget.onSubmit( widget.onSubmit(
_currentSortField, _currentSortField,
@@ -105,12 +105,12 @@ class _SortFieldSelectionBottomSheetState
ButtonSegment( ButtonSegment(
icon: const FaIcon(FontAwesomeIcons.arrowDownAZ), icon: const FaIcon(FontAwesomeIcons.arrowDownAZ),
value: SortOrder.descending, value: SortOrder.descending,
label: Text(S.of(context).descending), label: Text(S.of(context)!.descending),
), ),
ButtonSegment( ButtonSegment(
icon: const FaIcon(FontAwesomeIcons.arrowUpZA), icon: const FaIcon(FontAwesomeIcons.arrowUpZA),
value: SortOrder.ascending, value: SortOrder.ascending,
label: Text(S.of(context).ascending), label: Text(S.of(context)!.ascending),
), ),
], ],
emptySelectionAllowed: false, emptySelectionAllowed: false,

View File

@@ -3,7 +3,8 @@ import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:paperless_api/paperless_api.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/core/widgets/form_builder_fields/form_builder_type_ahead.dart';
import 'package:paperless_mobile/features/documents/cubit/documents_cubit.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'; import 'package:provider/provider.dart';
class TextQueryFormField extends StatelessWidget { class TextQueryFormField extends StatelessWidget {
@@ -63,19 +64,19 @@ class TextQueryFormField extends StatelessWidget {
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuItem( PopupMenuItem(
child: ListTile( child: ListTile(
title: Text(S.of(context).titleAndContent), title: Text(S.of(context)!.titleAndContent),
), ),
value: QueryType.titleAndContent, value: QueryType.titleAndContent,
), ),
PopupMenuItem( PopupMenuItem(
child: ListTile( child: ListTile(
title: Text(S.of(context).title), title: Text(S.of(context)!.title),
), ),
value: QueryType.title, value: QueryType.title,
), ),
PopupMenuItem( PopupMenuItem(
child: ListTile( child: ListTile(
title: Text(S.of(context).extended), title: Text(S.of(context)!.extended),
), ),
value: QueryType.extended, value: QueryType.extended,
), ),
@@ -89,11 +90,11 @@ class TextQueryFormField extends StatelessWidget {
String _buildLabelText(BuildContext context, QueryType queryType) { String _buildLabelText(BuildContext context, QueryType queryType) {
switch (queryType) { switch (queryType) {
case QueryType.title: case QueryType.title:
return S.of(context).title; return S.of(context)!.title;
case QueryType.titleAndContent: case QueryType.titleAndContent:
return S.of(context).titleAndContent; return S.of(context)!.titleAndContent;
case QueryType.extended: case QueryType.extended:
return S.of(context).extended; return S.of(context)!.extended;
default: default:
return ''; return '';
} }

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/features/documents/cubit/documents_cubit.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 { class BulkDeleteConfirmationDialog extends StatelessWidget {
final DocumentsState state; final DocumentsState state;
@@ -14,24 +14,24 @@ class BulkDeleteConfirmationDialog extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
assert(state.selection.isNotEmpty); assert(state.selection.isNotEmpty);
return AlertDialog( return AlertDialog(
title: Text(S.of(context).confirmDeletion), title: Text(S.of(context)!.confirmDeletion),
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
S.of(context).areYouSureYouWantToDeleteTheFollowingDocuments( S.of(context)!.areYouSureYouWantToDeleteTheFollowingDocuments(
state.selection.length), state.selection.length),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
...state.selection.map(_buildBulletPoint).toList(), ...state.selection.map(_buildBulletPoint).toList(),
const SizedBox(height: 16), const SizedBox(height: 16),
Text(S.of(context).thisActionIsIrreversibleDoYouWishToProceedAnyway), Text(S.of(context)!.thisActionIsIrreversibleDoYouWishToProceedAnyway),
], ],
), ),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Navigator.pop(context, false), onPressed: () => Navigator.pop(context, false),
child: Text(S.of(context).cancel), child: Text(S.of(context)!.cancel),
), ),
TextButton( TextButton(
style: ButtonStyle( style: ButtonStyle(
@@ -41,7 +41,7 @@ class BulkDeleteConfirmationDialog extends StatelessWidget {
onPressed: () { onPressed: () {
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
child: Text(S.of(context).delete), child: Text(S.of(context)!.delete),
), ),
], ],
); );

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.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 { class ConfirmDeleteSavedViewDialog extends StatelessWidget {
const ConfirmDeleteSavedViewDialog({ const ConfirmDeleteSavedViewDialog({
@@ -14,18 +14,18 @@ class ConfirmDeleteSavedViewDialog extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AlertDialog( return AlertDialog(
title: Text( title: Text(
S.of(context).deleteView + view.name + "?", S.of(context)!.deleteView + view.name + "?",
softWrap: true, softWrap: true,
), ),
content: Text(S.of(context).doYouReallyWantToDeleteThisView), content: Text(S.of(context)!.doYouReallyWantToDeleteThisView),
actions: [ actions: [
TextButton( TextButton(
child: Text(S.of(context).cancel), child: Text(S.of(context)!.cancel),
onPressed: () => Navigator.pop(context, false), onPressed: () => Navigator.pop(context, false),
), ),
TextButton( TextButton(
child: Text( child: Text(
S.of(context).delete, S.of(context)!.delete,
style: TextStyle(color: Theme.of(context).colorScheme.error), style: TextStyle(color: Theme.of(context).colorScheme.error),
), ),
onPressed: () => Navigator.pop(context, true), onPressed: () => Navigator.pop(context, true),

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/model/view_type.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. /// Meant to be used with blocbuilder.
class ViewTypeSelectionWidget extends StatelessWidget { class ViewTypeSelectionWidget extends StatelessWidget {
@@ -34,19 +34,19 @@ class ViewTypeSelectionWidget extends StatelessWidget {
_buildViewTypeOption( _buildViewTypeOption(
context, context,
type: ViewType.list, type: ViewType.list,
label: S.of(context).list, label: S.of(context)!.list,
icon: Icons.list, icon: Icons.list,
), ),
_buildViewTypeOption( _buildViewTypeOption(
context, context,
type: ViewType.grid, type: ViewType.grid,
label: S.of(context).grid, label: S.of(context)!.grid,
icon: Icons.grid_view_rounded, icon: Icons.grid_view_rounded,
), ),
_buildViewTypeOption( _buildViewTypeOption(
context, context,
type: ViewType.detailed, type: ViewType.detailed,
label: S.of(context).detailed, label: S.of(context)!.detailed,
icon: Icons.article_outlined, icon: Icons.article_outlined,
), ),
], ],

View File

@@ -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/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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/label_form.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<T extends Label> extends StatelessWidget { class AddLabelPage<T extends Label> extends StatelessWidget {
final String? initialName; final String? initialName;
@@ -62,7 +62,7 @@ class AddLabelFormWidget<T extends Label> extends StatelessWidget {
fromJsonT: fromJsonT, fromJsonT: fromJsonT,
submitButtonConfig: SubmitButtonConfig<T>( submitButtonConfig: SubmitButtonConfig<T>(
icon: const Icon(Icons.add), icon: const Icon(Icons.add),
label: Text(S.of(context).create), label: Text(S.of(context)!.create),
onSubmit: context.read<EditLabelCubit<T>>().create, onSubmit: context.read<EditLabelCubit<T>>().create,
), ),
additionalFields: additionalFields, additionalFields: additionalFields,

View File

@@ -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/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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/label_form.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/helpers/message_helpers.dart';
import 'package:paperless_mobile/constants.dart'; import 'package:paperless_mobile/constants.dart';
@@ -55,7 +56,7 @@ class EditLabelForm<T extends Label> extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).edit), title: Text(S.of(context)!.edit),
actions: [ actions: [
IconButton( IconButton(
onPressed: () => _onDelete(context), onPressed: () => _onDelete(context),
@@ -68,7 +69,7 @@ class EditLabelForm<T extends Label> extends StatelessWidget {
fromJsonT: fromJsonT, fromJsonT: fromJsonT,
submitButtonConfig: SubmitButtonConfig<T>( submitButtonConfig: SubmitButtonConfig<T>(
icon: const Icon(Icons.save), icon: const Icon(Icons.save),
label: Text(S.of(context).saveChanges), label: Text(S.of(context)!.saveChanges),
onSubmit: context.read<EditLabelCubit<T>>().update, onSubmit: context.read<EditLabelCubit<T>>().update,
), ),
additionalFields: additionalFields, additionalFields: additionalFields,
@@ -81,21 +82,21 @@ class EditLabelForm<T extends Label> extends StatelessWidget {
final shouldDelete = await showDialog<bool>( final shouldDelete = await showDialog<bool>(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(S.of(context).confirmDeletion), title: Text(S.of(context)!.confirmDeletion),
content: Text( content: Text(
S.of(context).deleteLabelWarningText, S.of(context)!.deleteLabelWarningText,
), ),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Navigator.pop(context, false), onPressed: () => Navigator.pop(context, false),
child: Text(S.of(context).cancel), child: Text(S.of(context)!.cancel),
), ),
TextButton( TextButton(
onPressed: () { onPressed: () {
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
child: Text( child: Text(
S.of(context).delete, S.of(context)!.delete,
style: style:
TextStyle(color: Theme.of(context).colorScheme.error), TextStyle(color: Theme.of(context).colorScheme.error),
), ),

View File

@@ -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/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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/add_label_page.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 { class AddCorrespondentPage extends StatelessWidget {
final String? initialName; final String? initialName;
@@ -18,7 +18,7 @@ class AddCorrespondentPage extends StatelessWidget {
context.read<LabelRepository<Correspondent>>(), context.read<LabelRepository<Correspondent>>(),
), ),
child: AddLabelPage<Correspondent>( child: AddLabelPage<Correspondent>(
pageTitle: Text(S.of(context).addCorrespondent), pageTitle: Text(S.of(context)!.addCorrespondent),
fromJsonT: Correspondent.fromJson, fromJsonT: Correspondent.fromJson,
initialName: initialName, initialName: initialName,
), ),

View File

@@ -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/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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/add_label_page.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 { class AddDocumentTypePage extends StatelessWidget {
final String? initialName; final String? initialName;
@@ -21,7 +21,7 @@ class AddDocumentTypePage extends StatelessWidget {
context.read<LabelRepository<DocumentType>>(), context.read<LabelRepository<DocumentType>>(),
), ),
child: AddLabelPage<DocumentType>( child: AddLabelPage<DocumentType>(
pageTitle: Text(S.of(context).addDocumentType), pageTitle: Text(S.of(context)!.addDocumentType),
fromJsonT: DocumentType.fromJson, fromJsonT: DocumentType.fromJson,
initialName: initialName, initialName: initialName,
), ),

View File

@@ -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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/add_label_page.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/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 { class AddStoragePathPage extends StatelessWidget {
final String? initalValue; final String? initalValue;
@@ -19,7 +19,7 @@ class AddStoragePathPage extends StatelessWidget {
context.read<LabelRepository<StoragePath>>(), context.read<LabelRepository<StoragePath>>(),
), ),
child: AddLabelPage<StoragePath>( child: AddLabelPage<StoragePath>(
pageTitle: Text(S.of(context).addStoragePath), pageTitle: Text(S.of(context)!.addStoragePath),
fromJsonT: StoragePath.fromJson, fromJsonT: StoragePath.fromJson,
initialName: initalValue, initialName: initalValue,
additionalFields: const [ additionalFields: const [

View File

@@ -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/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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/add_label_page.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 { class AddTagPage extends StatelessWidget {
final String? initialValue; final String? initialValue;
@@ -22,7 +22,7 @@ class AddTagPage extends StatelessWidget {
context.read<LabelRepository<Tag>>(), context.read<LabelRepository<Tag>>(),
), ),
child: AddLabelPage<Tag>( child: AddLabelPage<Tag>(
pageTitle: Text(S.of(context).addTag), pageTitle: Text(S.of(context)!.addTag),
fromJsonT: Tag.fromJson, fromJsonT: Tag.fromJson,
initialName: initialValue, initialName: initialValue,
additionalFields: [ additionalFields: [
@@ -30,7 +30,7 @@ class AddTagPage extends StatelessWidget {
name: Tag.colorKey, name: Tag.colorKey,
valueTransformer: (color) => "#${color?.value.toRadixString(16)}", valueTransformer: (color) => "#${color?.value.toRadixString(16)}",
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).color), label: Text(S.of(context)!.color),
), ),
colorPickerType: ColorPickerType.materialPicker, colorPickerType: ColorPickerType.materialPicker,
initialValue: Color((Random().nextDouble() * 0xFFFFFF).toInt()) initialValue: Color((Random().nextDouble() * 0xFFFFFF).toInt())
@@ -38,7 +38,7 @@ class AddTagPage extends StatelessWidget {
), ),
FormBuilderCheckbox( FormBuilderCheckbox(
name: Tag.isInboxTagKey, name: Tag.isInboxTagKey,
title: Text(S.of(context).inboxTag), title: Text(S.of(context)!.inboxTag),
), ),
], ],
), ),

View File

@@ -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/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/cubit/edit_label_cubit.dart';
import 'package:paperless_mobile/features/edit_label/view/edit_label_page.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 { class EditTagPage extends StatelessWidget {
final Tag tag; final Tag tag;
@@ -28,14 +28,14 @@ class EditTagPage extends StatelessWidget {
initialValue: tag.color, initialValue: tag.color,
name: Tag.colorKey, name: Tag.colorKey,
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).color), label: Text(S.of(context)!.color),
), ),
colorPickerType: ColorPickerType.blockPicker, colorPickerType: ColorPickerType.blockPicker,
), ),
FormBuilderCheckbox( FormBuilderCheckbox(
initialValue: tag.isInboxTag, initialValue: tag.isInboxTag,
name: Tag.isInboxTagKey, name: Tag.isInboxTagKey,
title: Text(S.of(context).inboxTag), title: Text(S.of(context)!.inboxTag),
), ),
], ],
), ),

View File

@@ -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/translation/matching_algorithm_localization_mapper.dart';
import 'package:paperless_mobile/core/type/types.dart'; import 'package:paperless_mobile/core/type/types.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.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/helpers/message_helpers.dart';
import 'package:paperless_mobile/constants.dart'; import 'package:paperless_mobile/constants.dart';
@@ -75,7 +76,7 @@ class _LabelFormState<T extends Label> extends State<LabelForm<T>> {
FormBuilderTextField( FormBuilderTextField(
name: Label.nameKey, name: Label.nameKey,
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).name, labelText: S.of(context)!.name,
errorText: _errors[Label.nameKey], errorText: _errors[Label.nameKey],
), ),
validator: FormBuilderValidators.required(), validator: FormBuilderValidators.required(),
@@ -88,7 +89,7 @@ class _LabelFormState<T extends Label> extends State<LabelForm<T>> {
MatchingAlgorithm.defaultValue) MatchingAlgorithm.defaultValue)
.value, .value,
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).matchingAlgorithm, labelText: S.of(context)!.matchingAlgorithm,
errorText: _errors[Label.matchingAlgorithmKey], errorText: _errors[Label.matchingAlgorithmKey],
), ),
onChanged: (val) { onChanged: (val) {
@@ -112,7 +113,7 @@ class _LabelFormState<T extends Label> extends State<LabelForm<T>> {
FormBuilderTextField( FormBuilderTextField(
name: Label.matchKey, name: Label.matchKey,
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).match, labelText: S.of(context)!.match,
errorText: _errors[Label.matchKey], errorText: _errors[Label.matchKey],
), ),
initialValue: widget.initialValue?.match, initialValue: widget.initialValue?.match,
@@ -121,7 +122,7 @@ class _LabelFormState<T extends Label> extends State<LabelForm<T>> {
FormBuilderCheckbox( FormBuilderCheckbox(
name: Label.isInsensitiveKey, name: Label.isInsensitiveKey,
initialValue: widget.initialValue?.isInsensitive ?? true, initialValue: widget.initialValue?.isInsensitive ?? true,
title: Text(S.of(context).caseIrrelevant), title: Text(S.of(context)!.caseIrrelevant),
), ),
...widget.additionalFields, ...widget.additionalFields,
].padded(), ].padded(),

View File

@@ -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/saved_view/cubit/saved_view_cubit.dart';
import 'package:paperless_mobile/features/sharing/share_intent_queue.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/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/file_helpers.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
@@ -177,13 +178,13 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
false; false;
if (success) { if (success) {
await Fluttertoast.showToast( await Fluttertoast.showToast(
msg: S.of(context).documentSuccessfullyUploadedProcessing, msg: S.of(context)!.documentSuccessfullyUploadedProcessing,
); );
SystemNavigator.pop(); SystemNavigator.pop();
} }
} else { } else {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: S.of(context).couldNotAccessReceivedFile, msg: S.of(context)!.couldNotAccessReceivedFile,
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
); );
} }
@@ -198,7 +199,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
Icons.description, Icons.description,
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
label: S.of(context).documents, label: S.of(context)!.documents,
), ),
RouteDescription( RouteDescription(
icon: const Icon(Icons.document_scanner_outlined), icon: const Icon(Icons.document_scanner_outlined),
@@ -206,7 +207,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
Icons.document_scanner, Icons.document_scanner,
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
label: S.of(context).scanner, label: S.of(context)!.scanner,
), ),
RouteDescription( RouteDescription(
icon: const Icon(Icons.sell_outlined), icon: const Icon(Icons.sell_outlined),
@@ -214,7 +215,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
Icons.sell, Icons.sell,
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
label: S.of(context).labels, label: S.of(context)!.labels,
), ),
RouteDescription( RouteDescription(
icon: const Icon(Icons.inbox_outlined), icon: const Icon(Icons.inbox_outlined),
@@ -222,7 +223,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
Icons.inbox, Icons.inbox,
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
label: S.of(context).inbox, label: S.of(context)!.inbox,
badgeBuilder: (icon) => BlocBuilder<InboxCubit, InboxState>( badgeBuilder: (icon) => BlocBuilder<InboxCubit, InboxState>(
bloc: _inboxCubit, bloc: _inboxCubit,
builder: (context, state) { builder: (context, state) {

View File

@@ -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/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/login/cubit/authentication_cubit.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/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'; import 'package:provider/provider.dart';
class VerifyIdentityPage extends StatelessWidget { class VerifyIdentityPage extends StatelessWidget {
@@ -19,12 +20,12 @@ class VerifyIdentityPage extends StatelessWidget {
appBar: AppBar( appBar: AppBar(
elevation: 0, elevation: 0,
backgroundColor: Theme.of(context).colorScheme.background, backgroundColor: Theme.of(context).colorScheme.background,
title: Text(S.of(context).verifyYourIdentity), title: Text(S.of(context)!.verifyYourIdentity),
), ),
body: Column( body: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(S.of(context).useTheConfiguredBiometricFactorToAuthenticate) Text(S.of(context)!.useTheConfiguredBiometricFactorToAuthenticate)
.paddedSymmetrically(horizontal: 16), .paddedSymmetrically(horizontal: 16),
const Icon( const Icon(
Icons.fingerprint, Icons.fingerprint,
@@ -39,7 +40,7 @@ class VerifyIdentityPage extends StatelessWidget {
TextButton( TextButton(
onPressed: () => _logout(context), onPressed: () => _logout(context),
child: Text( child: Text(
S.of(context).disconnect, S.of(context)!.disconnect,
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.error, color: Theme.of(context).colorScheme.error,
), ),
@@ -52,7 +53,7 @@ class VerifyIdentityPage extends StatelessWidget {
.read<ApplicationSettingsCubit>() .read<ApplicationSettingsCubit>()
.state .state
.isLocalAuthenticationEnabled), .isLocalAuthenticationEnabled),
child: Text(S.of(context).verifyIdentity), child: Text(S.of(context)!.verifyIdentity),
), ),
], ],
).padded(16), ).padded(16),

View File

@@ -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/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/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/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'; import 'package:paperless_mobile/helpers/message_helpers.dart';
class InboxPage extends StatefulWidget { class InboxPage extends StatefulWidget {
@@ -52,7 +53,7 @@ class _InboxPageState extends State<InboxPage>
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return FloatingActionButton.extended( return FloatingActionButton.extended(
label: Text(S.of(context).allSeen), label: Text(S.of(context)!.allSeen),
icon: const Icon(Icons.done_all), icon: const Icon(Icons.done_all),
onPressed: state.hasLoaded && state.documents.isNotEmpty onPressed: state.hasLoaded && state.documents.isNotEmpty
? () => _onMarkAllAsSeen( ? () => _onMarkAllAsSeen(
@@ -128,7 +129,7 @@ class _InboxPageState extends State<InboxPage>
controller: pagingScrollController, controller: pagingScrollController,
slivers: [ slivers: [
SearchAppBar( SearchAppBar(
hintText: S.of(context).searchDocuments, hintText: S.of(context)!.searchDocuments,
onOpenSearch: showDocumentSearchPage, onOpenSearch: showDocumentSearchPage,
), ),
if (state.documents.isEmpty) if (state.documents.isEmpty)
@@ -150,7 +151,7 @@ class _InboxPageState extends State<InboxPage>
child: HintCard( child: HintCard(
show: !state.isHintAcknowledged, show: !state.isHintAcknowledged,
hintText: hintText:
S.of(context).swipeLeftToMarkADocumentAsSeen, S.of(context)!.swipeLeftToMarkADocumentAsSeen,
onHintAcknowledged: () => onHintAcknowledged: () =>
context.read<InboxCubit>().acknowledgeHint(), context.read<InboxCubit>().acknowledgeHint(),
), ),
@@ -178,7 +179,7 @@ class _InboxPageState extends State<InboxPage>
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
).padded(), ).padded(),
Text( Text(
S.of(context).markAsSeen, S.of(context)!.markAsSeen,
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
@@ -198,19 +199,19 @@ class _InboxPageState extends State<InboxPage>
final isActionConfirmed = await showDialog( final isActionConfirmed = await showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(S.of(context).markAllAsSeen), title: Text(S.of(context)!.markAllAsSeen),
content: Text( content: Text(
S.of(context).areYouSureYouWantToMarkAllDocumentsAsSeen, S.of(context)!.areYouSureYouWantToMarkAllDocumentsAsSeen,
), ),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Navigator.of(context).pop(false), onPressed: () => Navigator.of(context).pop(false),
child: Text(S.of(context).cancel), child: Text(S.of(context)!.cancel),
), ),
TextButton( TextButton(
onPressed: () => Navigator.of(context).pop(true), onPressed: () => Navigator.of(context).pop(true),
child: Text( child: Text(
S.of(context).ok, S.of(context)!.ok,
style: TextStyle(color: Theme.of(context).colorScheme.error), style: TextStyle(color: Theme.of(context).colorScheme.error),
), ),
), ),
@@ -228,9 +229,9 @@ class _InboxPageState extends State<InboxPage>
final removedTags = await context.read<InboxCubit>().removeFromInbox(doc); final removedTags = await context.read<InboxCubit>().removeFromInbox(doc);
showSnackBar( showSnackBar(
context, context,
S.of(context).removeDocumentFromInbox, S.of(context)!.removeDocumentFromInbox,
action: SnackBarActionConfig( action: SnackBarActionConfig(
label: S.of(context).undo, label: S.of(context)!.undo,
onPressed: () => _onUndoMarkAsSeen(doc, removedTags), onPressed: () => _onUndoMarkAsSeen(doc, removedTags),
), ),
); );
@@ -267,10 +268,10 @@ class _InboxPageState extends State<InboxPage>
documents, documents,
(doc) { (doc) {
if (doc.added.isToday) { if (doc.added.isToday) {
return S.of(context).today; return S.of(context)!.today;
} }
if (doc.added.isYesterday) { if (doc.added.isYesterday) {
return S.of(context).yesterday; return S.of(context)!.yesterday;
} }
return DateFormat.yMMMMd().format(doc.added); return DateFormat.yMMMMd().format(doc.added);
}, },

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/inbox/cubit/inbox_cubit.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 { class InboxEmptyWidget extends StatelessWidget {
const InboxEmptyWidget({ const InboxEmptyWidget({
@@ -23,11 +23,11 @@ class InboxEmptyWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text(S.of(context).youDoNotHaveUnseenDocuments), Text(S.of(context)!.youDoNotHaveUnseenDocuments),
TextButton( TextButton(
onPressed: () => onPressed: () =>
_emptyStateRefreshIndicatorKey.currentState?.show(), _emptyStateRefreshIndicatorKey.currentState?.show(),
child: Text(S.of(context).refresh), child: Text(S.of(context)!.refresh),
), ),
], ],
), ),

View File

@@ -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/inbox/cubit/inbox_cubit.dart';
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_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/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'; import 'package:paperless_mobile/routes/document_details_route.dart';
class InboxItem extends StatefulWidget { class InboxItem extends StatefulWidget {
@@ -99,7 +100,7 @@ class _InboxItemState extends State<InboxItem> {
child: ActionChip( child: ActionChip(
avatar: const Icon(Icons.delete_outline), avatar: const Icon(Icons.delete_outline),
shape: chipShape, shape: chipShape,
label: Text(S.of(context).deleteDocument), label: Text(S.of(context)!.deleteDocument),
onPressed: () async { onPressed: () async {
final shouldDelete = await showDialog<bool>( final shouldDelete = await showDialog<bool>(
context: context, context: context,
@@ -147,7 +148,7 @@ class _InboxItemState extends State<InboxItem> {
maxWidth: 50, maxWidth: 50,
), ),
child: Text( child: Text(
S.of(context).quickAction, S.of(context)!.quickAction,
textAlign: TextAlign.center, textAlign: TextAlign.center,
maxLines: 3, maxLines: 3,
style: Theme.of(context).textTheme.labelSmall, style: Theme.of(context).textTheme.labelSmall,
@@ -190,9 +191,9 @@ class _InboxItemState extends State<InboxItem> {
shape: chipShape, shape: chipShape,
label: hasAsn label: hasAsn
? Text( ? 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 onPressed: !hasAsn
? () { ? () {
setState(() { setState(() {
@@ -352,7 +353,7 @@ class _InboxItemState extends State<InboxItem> {
// avatar: const Icon(Icons.calendar_today_outlined), // avatar: const Icon(Icons.calendar_today_outlined),
// shape: chipShape, // shape: chipShape,
// label: Text( // label: Text(
// "${S.of(context).createdAt}: ${DateFormat.yMd().format(e)}", // "${S.of(context)!.createdAt}: ${DateFormat.yMd().format(e)}",
// ), // ),
// onPressed: () => context // onPressed: () => context
// .read<InboxCubit>() // .read<InboxCubit>()

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:paperless_mobile/core/workarounds/colored_chip.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 { class StoragePathAutofillFormBuilderField extends StatefulWidget {
final String name; final String name;
@@ -48,7 +48,7 @@ class _StoragePathAutofillFormBuilderFieldState
controller: _textEditingController, controller: _textEditingController,
validator: FormBuilderValidators.required(), //TODO: INTL validator: FormBuilderValidators.required(), //TODO: INTL
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).storagePath), label: Text(S.of(context)!.storagePath),
suffixIcon: _showClearIcon suffixIcon: _showClearIcon
? IconButton( ? IconButton(
icon: const Icon(Icons.clear), icon: const Icon(Icons.clear),
@@ -69,65 +69,65 @@ class _StoragePathAutofillFormBuilderFieldState
runSpacing: 4.0, runSpacing: 4.0,
children: [ children: [
InputChip( InputChip(
label: Text(S.of(context).archiveSerialNumber), label: Text(S.of(context)!.archiveSerialNumber),
onPressed: () => _addParameterToInput("{asn}", field), onPressed: () => _addParameterToInput("{asn}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).correspondent), label: Text(S.of(context)!.correspondent),
onPressed: () => onPressed: () =>
_addParameterToInput("{correspondent}", field), _addParameterToInput("{correspondent}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).documentType), label: Text(S.of(context)!.documentType),
onPressed: () => onPressed: () =>
_addParameterToInput("{document_type}", field), _addParameterToInput("{document_type}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).tags), label: Text(S.of(context)!.tags),
onPressed: () => _addParameterToInput("{tag_list}", field), onPressed: () => _addParameterToInput("{tag_list}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).title), label: Text(S.of(context)!.title),
onPressed: () => _addParameterToInput("{title}", field), onPressed: () => _addParameterToInput("{title}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt), label: Text(S.of(context)!.createdAt),
onPressed: () => _addParameterToInput("{created}", field), onPressed: () => _addParameterToInput("{created}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt + label: Text(S.of(context)!.createdAt +
" (${S.of(context).storagePathYear})"), " (${S.of(context)!.storagePathYear})"),
onPressed: () => onPressed: () =>
_addParameterToInput("{created_year}", field), _addParameterToInput("{created_year}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt + label: Text(S.of(context)!.createdAt +
" (${S.of(context).storagePathMonth})"), " (${S.of(context)!.storagePathMonth})"),
onPressed: () => onPressed: () =>
_addParameterToInput("{created_month}", field), _addParameterToInput("{created_month}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt + label: Text(S.of(context)!.createdAt +
" (${S.of(context).storagePathDay})"), " (${S.of(context)!.storagePathDay})"),
onPressed: () => _addParameterToInput("{created_day}", field), onPressed: () => _addParameterToInput("{created_day}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt), label: Text(S.of(context)!.createdAt),
onPressed: () => _addParameterToInput("{added}", field), onPressed: () => _addParameterToInput("{added}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt + label: Text(S.of(context)!.createdAt +
" (${S.of(context).storagePathYear})"), " (${S.of(context)!.storagePathYear})"),
onPressed: () => _addParameterToInput("{added_year}", field), onPressed: () => _addParameterToInput("{added_year}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt + label: Text(S.of(context)!.createdAt +
" (${S.of(context).storagePathMonth})"), " (${S.of(context)!.storagePathMonth})"),
onPressed: () => _addParameterToInput("{added_month}", field), onPressed: () => _addParameterToInput("{added_month}", field),
), ),
InputChip( InputChip(
label: Text(S.of(context).createdAt + label: Text(S.of(context)!.createdAt +
" (${S.of(context).storagePathDay})"), " (${S.of(context)!.storagePathDay})"),
onPressed: () => _addParameterToInput("{added_day}", field), onPressed: () => _addParameterToInput("{added_day}", field),
), ),
], ],

View File

@@ -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/core/workarounds/colored_chip.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.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/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 { class TagFormField extends StatefulWidget {
final TagsQuery? initialValue; final TagsQuery? initialValue;
@@ -94,8 +94,8 @@ class _TagFormFieldState extends State<TagFormField> {
Icons.label_outline, Icons.label_outline,
), ),
suffixIcon: _buildSuffixIcon(context, field), suffixIcon: _buildSuffixIcon(context, field),
labelText: S.of(context).tags, labelText: S.of(context)!.tags,
hintText: S.of(context).filterTags, hintText: S.of(context)!.filterTags,
), ),
controller: _textEditingController, controller: _textEditingController,
), ),
@@ -138,10 +138,10 @@ class _TagFormFieldState extends State<TagFormField> {
late String? title; late String? title;
switch (data) { switch (data) {
case _onlyNotAssignedId: case _onlyNotAssignedId:
title = S.of(context).notAssigned; title = S.of(context)!.notAssigned;
break; break;
case _anyAssignedId: case _anyAssignedId:
title = S.of(context).anyAssigned; title = S.of(context)!.anyAssigned;
break; break;
default: default:
title = widget.selectableOptions[data]?.name; title = widget.selectableOptions[data]?.name;
@@ -270,7 +270,7 @@ class _TagFormFieldState extends State<TagFormField> {
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
side: BorderSide.none, side: BorderSide.none,
label: Text( label: Text(
S.of(context).notAssigned, S.of(context)!.notAssigned,
), ),
backgroundColor: backgroundColor:
Theme.of(context).colorScheme.onSurface.withOpacity(0.12), Theme.of(context).colorScheme.onSurface.withOpacity(0.12),
@@ -323,7 +323,7 @@ class _TagFormFieldState extends State<TagFormField> {
padding: const EdgeInsets.all(4), padding: const EdgeInsets.all(4),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
side: BorderSide.none, side: BorderSide.none,
label: Text(S.of(context).anyAssigned), label: Text(S.of(context)!.anyAssigned),
backgroundColor: backgroundColor:
Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.12), Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.12),
onDeleted: () => field.didChange(const IdsTagsQuery()), onDeleted: () => field.didChange(const IdsTagsQuery()),

View File

@@ -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/cubit/label_cubit.dart';
import 'package:paperless_mobile/features/labels/view/widgets/label_tab_view.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/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 { class LabelsPage extends StatefulWidget {
const LabelsPage({Key? key}) : super(key: key); const LabelsPage({Key? key}) : super(key: key);
@@ -72,7 +72,7 @@ class _LabelsPageState extends State<LabelsPage>
context, context,
), ),
sliver: SearchAppBar( sliver: SearchAppBar(
hintText: S.of(context).searchDocuments, hintText: S.of(context)!.searchDocuments,
onOpenSearch: showDocumentSearchPage, onOpenSearch: showDocumentSearchPage,
bottom: TabBar( bottom: TabBar(
controller: _tabController, controller: _tabController,
@@ -161,9 +161,9 @@ class _LabelsPageState extends State<LabelsPage>
), ),
onEdit: _openEditCorrespondentPage, onEdit: _openEditCorrespondentPage,
emptyStateActionButtonLabel: emptyStateActionButtonLabel:
S.of(context).addNewCorrespondent, S.of(context)!.addNewCorrespondent,
emptyStateDescription: emptyStateDescription:
S.of(context).noCorrespondentsSetUp, S.of(context)!.noCorrespondentsSetUp,
onAddNew: _openAddCorrespondentPage, onAddNew: _openAddCorrespondentPage,
), ),
], ],
@@ -186,9 +186,9 @@ class _LabelsPageState extends State<LabelsPage>
), ),
onEdit: _openEditDocumentTypePage, onEdit: _openEditDocumentTypePage,
emptyStateActionButtonLabel: emptyStateActionButtonLabel:
S.of(context).addNewDocumentType, S.of(context)!.addNewDocumentType,
emptyStateDescription: emptyStateDescription:
S.of(context).noDocumentTypesSetUp, S.of(context)!.noDocumentTypesSetUp,
onAddNew: _openAddDocumentTypePage, onAddNew: _openAddDocumentTypePage,
), ),
], ],
@@ -219,9 +219,9 @@ class _LabelsPageState extends State<LabelsPage>
: null, : null,
), ),
emptyStateActionButtonLabel: emptyStateActionButtonLabel:
S.of(context).addNewTag, S.of(context)!.addNewTag,
emptyStateDescription: emptyStateDescription:
S.of(context).noTagsSetUp, S.of(context)!.noTagsSetUp,
onAddNew: _openAddTagPage, onAddNew: _openAddTagPage,
), ),
], ],
@@ -245,9 +245,9 @@ class _LabelsPageState extends State<LabelsPage>
), ),
contentBuilder: (path) => Text(path.path), contentBuilder: (path) => Text(path.path),
emptyStateActionButtonLabel: emptyStateActionButtonLabel:
S.of(context).addNewStoragePath, S.of(context)!.addNewStoragePath,
emptyStateDescription: emptyStateDescription:
S.of(context).noStoragePathsSetUp, S.of(context)!.noStoragePathsSetUp,
onAddNew: _openAddStoragePathPage, onAddNew: _openAddStoragePathPage,
), ),
], ],

View File

@@ -3,7 +3,7 @@ import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:paperless_api/paperless_api.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/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) /// Form field allowing to select labels (i.e. correspondent, documentType)
@@ -79,7 +79,7 @@ class _LabelFormFieldState<T extends Label> extends State<LabelFormField<T>> {
noItemsFoundBuilder: (context) => Padding( noItemsFoundBuilder: (context) => Padding(
padding: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.symmetric(vertical: 8),
child: Text( child: Text(
S.of(context).noItemsFound, S.of(context)!.noItemsFound,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: style:
TextStyle(color: Theme.of(context).disabledColor, fontSize: 18.0), TextStyle(color: Theme.of(context).disabledColor, fontSize: 18.0),
@@ -97,7 +97,8 @@ class _LabelFormFieldState<T extends Label> extends State<LabelFormField<T>> {
), ),
itemBuilder: (context, suggestion) => ListTile( itemBuilder: (context, suggestion) => ListTile(
title: Text( title: Text(
widget.labelOptions[suggestion.id]?.name ?? S.of(context).notAssigned, widget.labelOptions[suggestion.id]?.name ??
S.of(context)!.notAssigned,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
@@ -141,7 +142,7 @@ class _LabelFormFieldState<T extends Label> extends State<LabelFormField<T>> {
), ),
selectionToTextTransformer: (suggestion) { selectionToTextTransformer: (suggestion) {
if (suggestion == const IdQueryParameter.notAssigned()) { if (suggestion == const IdQueryParameter.notAssigned()) {
return S.of(context).notAssigned; return S.of(context)!.notAssigned;
} }
return widget.labelOptions[suggestion.id]?.name ?? ""; return widget.labelOptions[suggestion.id]?.name ?? "";
}, },
@@ -194,11 +195,11 @@ class _LabelFormFieldState<T extends Label> extends State<LabelFormField<T>> {
String _getLocalizedHint(BuildContext context) { String _getLocalizedHint(BuildContext context) {
if (T == Correspondent) { if (T == Correspondent) {
return S.of(context).startTyping; return S.of(context)!.startTyping;
} else if (T == DocumentType) { } else if (T == DocumentType) {
return S.of(context).startTyping; return S.of(context)!.startTyping;
} else { } else {
return S.of(context).filterTags; return S.of(context)!.filterTags;
} }
} }
} }

View File

@@ -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/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/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/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'; import 'package:paperless_mobile/routes/document_details_route.dart';
class LinkedDocumentsPage extends StatefulWidget { class LinkedDocumentsPage extends StatefulWidget {
@@ -24,7 +25,7 @@ class _LinkedDocumentsPageState extends State<LinkedDocumentsPage>
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).linkedDocuments), title: Text(S.of(context)!.linkedDocuments),
actions: [ actions: [
BlocBuilder<LinkedDocumentsCubit, LinkedDocumentsState>( BlocBuilder<LinkedDocumentsCubit, LinkedDocumentsState>(
builder: (context, state) { builder: (context, state) {

View File

@@ -5,7 +5,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/login/model/client_certificate.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:paperless_mobile/constants.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
@@ -40,7 +41,7 @@ class _ClientCertificateFormFieldState
} }
assert(_selectedFile != null); assert(_selectedFile != null);
if (_selectedFile?.path.split(".").last != 'pfx') { if (_selectedFile?.path.split(".").last != 'pfx') {
return S.of(context).invalidCertificateFormat; return S.of(context)!.invalidCertificateFormat;
} }
return null; return null;
}, },
@@ -50,8 +51,8 @@ class _ClientCertificateFormFieldState
return Theme( return Theme(
data: theme, data: theme,
child: ExpansionTile( child: ExpansionTile(
title: Text(S.of(context).clientcertificate), title: Text(S.of(context)!.clientcertificate),
subtitle: Text(S.of(context).configureMutualTLSAuthentication), subtitle: Text(S.of(context)!.configureMutualTLSAuthentication),
children: [ children: [
InputDecorator( InputDecorator(
decoration: InputDecoration( decoration: InputDecoration(
@@ -67,7 +68,7 @@ class _ClientCertificateFormFieldState
children: [ children: [
ElevatedButton( ElevatedButton(
onPressed: () => _onSelectFile(field), onPressed: () => _onSelectFile(field),
child: Text(S.of(context).select), child: Text(S.of(context)!.select),
), ),
_buildSelectedFileText(field).paddedOnly(left: 8), _buildSelectedFileText(field).paddedOnly(left: 8),
], ],
@@ -85,7 +86,7 @@ class _ClientCertificateFormFieldState
// ListTile( // ListTile(
// leading: ElevatedButton( // leading: ElevatedButton(
// onPressed: () => _onSelectFile(field), // onPressed: () => _onSelectFile(field),
// child: Text(S.of(context).select), // child: Text(S.of(context)!.select),
// ), // ),
// title: _buildSelectedFileText(field), // title: _buildSelectedFileText(field),
// trailing: AbsorbPointer( // trailing: AbsorbPointer(
@@ -108,7 +109,7 @@ class _ClientCertificateFormFieldState
onChanged: (value) => field.didChange( onChanged: (value) => field.didChange(
field.value?.copyWith(passphrase: value), field.value?.copyWith(passphrase: value),
), ),
label: S.of(context).passphrase, label: S.of(context)!.passphrase,
).padded(), ).padded(),
] else ] else
...[] ...[]
@@ -143,7 +144,7 @@ class _ClientCertificateFormFieldState
if (field.value == null) { if (field.value == null) {
assert(_selectedFile == null); assert(_selectedFile == null);
return Text( return Text(
S.of(context).selectFile, S.of(context)!.selectFile,
style: Theme.of(context).textTheme.labelMedium?.apply( style: Theme.of(context).textTheme.labelMedium?.apply(
color: Theme.of(context).hintColor, color: Theme.of(context).hintColor,
), ),

View File

@@ -3,7 +3,7 @@ import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:form_builder_validators/form_builder_validators.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 { class ServerAddressFormField extends StatefulWidget {
static const String fkServerAddress = "serverAddress"; static const String fkServerAddress = "serverAddress";
@@ -44,16 +44,16 @@ class _ServerAddressFormFieldState extends State<ServerAddressFormField> {
autovalidateMode: AutovalidateMode.onUserInteraction, autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([ validator: FormBuilderValidators.compose([
FormBuilderValidators.required( FormBuilderValidators.required(
errorText: S.of(context).serverAddressMustNotBeEmpty, errorText: S.of(context)!.serverAddressMustNotBeEmpty,
), ),
FormBuilderValidators.match( FormBuilderValidators.match(
r"https?://.*", r"https?://.*",
errorText: S.of(context).serverAddressMustIncludeAScheme, errorText: S.of(context)!.serverAddressMustIncludeAScheme,
) )
]), ]),
decoration: InputDecoration( decoration: InputDecoration(
hintText: "http://192.168.1.50:8000", hintText: "http://192.168.1.50:8000",
labelText: S.of(context).serverAddress, labelText: S.of(context)!.serverAddress,
suffixIcon: _canClear suffixIcon: _canClear
? IconButton( ? IconButton(
icon: const Icon(Icons.clear), icon: const Icon(Icons.clear),

View File

@@ -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/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/login/model/user_credentials.model.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/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 { class UserCredentialsFormField extends StatefulWidget {
static const fkCredentials = 'credentials'; static const fkCredentials = 'credentials';
@@ -37,22 +37,22 @@ class _UserCredentialsFormFieldState extends State<UserCredentialsFormField> {
UserCredentials(username: username), UserCredentials(username: username),
), ),
validator: FormBuilderValidators.required( validator: FormBuilderValidators.required(
errorText: S.of(context).usernameMustNotBeEmpty, errorText: S.of(context)!.usernameMustNotBeEmpty,
), ),
autofillHints: const [AutofillHints.username], autofillHints: const [AutofillHints.username],
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).username), label: Text(S.of(context)!.username),
), ),
), ),
ObscuredInputTextFormField( ObscuredInputTextFormField(
key: const ValueKey('login-password'), key: const ValueKey('login-password'),
label: S.of(context).password, label: S.of(context)!.password,
onChanged: (password) => field.didChange( onChanged: (password) => field.didChange(
field.value?.copyWith(password: password) ?? field.value?.copyWith(password: password) ??
UserCredentials(password: password), UserCredentials(password: password),
), ),
validator: FormBuilderValidators.required( validator: FormBuilderValidators.required(
errorText: S.of(context).passwordMustNotBeEmpty, errorText: S.of(context)!.passwordMustNotBeEmpty,
), ),
), ),
].map((child) => child.padded()).toList(), ].map((child) => child.padded()).toList(),
@@ -73,11 +73,11 @@ class _UserCredentialsFormFieldState extends State<UserCredentialsFormField> {
FocusScope.of(context).requestFocus(_focusNodes[fkPassword]); FocusScope.of(context).requestFocus(_focusNodes[fkPassword]);
}, },
validator: FormBuilderValidators.required( validator: FormBuilderValidators.required(
errorText: S.of(context).usernameMustNotBeEmpty, errorText: S.of(context)!.usernameMustNotBeEmpty,
), ),
autofillHints: const [AutofillHints.username], autofillHints: const [AutofillHints.username],
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).username, labelText: S.of(context)!.username,
), ),
).padded(), ).padded(),
FormBuilderTextField( FormBuilderTextField(
@@ -88,11 +88,11 @@ class _UserCredentialsFormFieldState extends State<UserCredentialsFormField> {
}, },
autofillHints: const [AutofillHints.password], autofillHints: const [AutofillHints.password],
validator: FormBuilderValidators.required( validator: FormBuilderValidators.required(
errorText: S.of(context).passwordMustNotBeEmpty, errorText: S.of(context)!.passwordMustNotBeEmpty,
), ),
obscureText: true, obscureText: true,
decoration: InputDecoration( decoration: InputDecoration(
labelText: S.of(context).password, labelText: S.of(context)!.password,
), ),
).padded(), ).padded(),
], ],

View File

@@ -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/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/client_certificate_form_field.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/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'; import 'package:provider/provider.dart';
class ServerConnectionPage extends StatefulWidget { class ServerConnectionPage extends StatefulWidget {
@@ -32,7 +33,7 @@ class _ServerConnectionPageState extends State<ServerConnectionPage> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
toolbarHeight: kToolbarHeight - 4, toolbarHeight: kToolbarHeight - 4,
title: Text(S.of(context).connectToPaperless), title: Text(S.of(context)!.connectToPaperless),
bottom: PreferredSize( bottom: PreferredSize(
child: _isCheckingConnection child: _isCheckingConnection
? const LinearProgressIndicator() ? const LinearProgressIndicator()
@@ -65,7 +66,7 @@ class _ServerConnectionPageState extends State<ServerConnectionPage> {
onPressed: _updateReachability, onPressed: _updateReachability,
), ),
FilledButton( FilledButton(
child: Text(S.of(context).continueLabel), child: Text(S.of(context)!.continueLabel),
onPressed: _reachabilityStatus == ReachabilityStatus.reachable onPressed: _reachabilityStatus == ReachabilityStatus.reachable
? widget.onContinue ? widget.onContinue
: null, : null,
@@ -108,37 +109,37 @@ class _ServerConnectionPageState extends State<ServerConnectionPage> {
case ReachabilityStatus.reachable: case ReachabilityStatus.reachable:
return _buildIconText( return _buildIconText(
Icons.done, Icons.done,
S.of(context).connectionSuccessfulylEstablished, S.of(context)!.connectionSuccessfulylEstablished,
Colors.green, Colors.green,
); );
case ReachabilityStatus.notReachable: case ReachabilityStatus.notReachable:
return _buildIconText( return _buildIconText(
Icons.close, Icons.close,
S.of(context).couldNotEstablishConnectionToTheServer, S.of(context)!.couldNotEstablishConnectionToTheServer,
errorColor, errorColor,
); );
case ReachabilityStatus.unknownHost: case ReachabilityStatus.unknownHost:
return _buildIconText( return _buildIconText(
Icons.close, Icons.close,
S.of(context).hostCouldNotBeResolved, S.of(context)!.hostCouldNotBeResolved,
errorColor, errorColor,
); );
case ReachabilityStatus.missingClientCertificate: case ReachabilityStatus.missingClientCertificate:
return _buildIconText( return _buildIconText(
Icons.close, Icons.close,
S.of(context).loginPageReachabilityMissingClientCertificateText, S.of(context)!.loginPageReachabilityMissingClientCertificateText,
errorColor, errorColor,
); );
case ReachabilityStatus.invalidClientCertificateConfiguration: case ReachabilityStatus.invalidClientCertificateConfiguration:
return _buildIconText( return _buildIconText(
Icons.close, Icons.close,
S.of(context).incorrectOrMissingCertificatePassphrase, S.of(context)!.incorrectOrMissingCertificatePassphrase,
errorColor, errorColor,
); );
case ReachabilityStatus.connectionTimeout: case ReachabilityStatus.connectionTimeout:
return _buildIconText( return _buildIconText(
Icons.close, Icons.close,
S.of(context).connectionTimedOut, S.of(context)!.connectionTimedOut,
errorColor, errorColor,
); );
} }

View File

@@ -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/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/server_address_form_field.dart';
import 'package:paperless_mobile/features/login/view/widgets/form_fields/user_credentials_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 { class ServerLoginPage extends StatefulWidget {
final Future<void> Function() onDone; final Future<void> Function() onDone;
@@ -29,7 +29,7 @@ class _ServerLoginPageState extends State<ServerLoginPage> {
''; '';
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).loginPageSignInTitle), title: Text(S.of(context)!.loginPageSignInTitle),
bottom: _isLoginLoading bottom: _isLoginLoading
? const PreferredSize( ? const PreferredSize(
preferredSize: Size.fromHeight(4.0), preferredSize: Size.fromHeight(4.0),
@@ -39,7 +39,7 @@ class _ServerLoginPageState extends State<ServerLoginPage> {
), ),
body: ListView( body: ListView(
children: [ children: [
Text(S.of(context).signInToServer(serverAddress)).padded(), Text(S.of(context)!.signInToServer(serverAddress)).padded(),
const UserCredentialsFormField(), const UserCredentialsFormField(),
], ],
), ),
@@ -53,7 +53,7 @@ class _ServerLoginPageState extends State<ServerLoginPage> {
await widget.onDone(); await widget.onDone();
setState(() => _isLoginLoading = false); setState(() => _isLoginLoading = false);
}, },
child: Text(S.of(context).signIn), child: Text(S.of(context)!.signIn),
) )
], ],
), ),

View File

@@ -4,7 +4,7 @@ import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.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/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 { class AddSavedViewPage extends StatefulWidget {
final DocumentFilter currentFilter; final DocumentFilter currentFilter;
@@ -25,12 +25,12 @@ class _AddSavedViewPageState extends State<AddSavedViewPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).newView), title: Text(S.of(context)!.newView),
), ),
floatingActionButton: FloatingActionButton.extended( floatingActionButton: FloatingActionButton.extended(
icon: const Icon(Icons.add), icon: const Icon(Icons.add),
onPressed: () => _onCreate(context), onPressed: () => _onCreate(context),
label: Text(S.of(context).create), label: Text(S.of(context)!.create),
), ),
body: Padding( body: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
@@ -46,18 +46,18 @@ class _AddSavedViewPageState extends State<AddSavedViewPage> {
name: _AddSavedViewPageState.fkName, name: _AddSavedViewPageState.fkName,
validator: FormBuilderValidators.required(), validator: FormBuilderValidators.required(),
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).name), label: Text(S.of(context)!.name),
), ),
), ),
FormBuilderCheckbox( FormBuilderCheckbox(
name: _AddSavedViewPageState.fkShowOnDashboard, name: _AddSavedViewPageState.fkShowOnDashboard,
initialValue: false, initialValue: false,
title: Text(S.of(context).showOnDashboard), title: Text(S.of(context)!.showOnDashboard),
), ),
FormBuilderCheckbox( FormBuilderCheckbox(
name: _AddSavedViewPageState.fkShowInSidebar, name: _AddSavedViewPageState.fkShowInSidebar,
initialValue: false, initialValue: false,
title: Text(S.of(context).showInSidebar), title: Text(S.of(context)!.showInSidebar),
), ),
], ],
), ),
@@ -94,18 +94,18 @@ class _AddSavedViewPageState extends State<AddSavedViewPage> {
name: fkName, name: fkName,
validator: FormBuilderValidators.required(), validator: FormBuilderValidators.required(),
decoration: InputDecoration( decoration: InputDecoration(
label: Text(S.of(context).name), label: Text(S.of(context)!.name),
), ),
), ),
FormBuilderCheckbox( FormBuilderCheckbox(
name: fkShowOnDashboard, name: fkShowOnDashboard,
initialValue: false, initialValue: false,
title: Text(S.of(context).showOnDashboard), title: Text(S.of(context)!.showOnDashboard),
), ),
FormBuilderCheckbox( FormBuilderCheckbox(
name: fkShowInSidebar, name: fkShowInSidebar,
initialValue: false, initialValue: false,
title: Text(S.of(context).showInSidebar), title: Text(S.of(context)!.showInSidebar),
), ),
], ],
), ),

View File

@@ -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/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/cubit/saved_view_details_cubit.dart';
import 'package:paperless_mobile/features/saved_view_details/view/saved_view_details_page.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 { class SavedViewList extends StatelessWidget {
const SavedViewList({super.key}); const SavedViewList({super.key});
@@ -21,7 +21,7 @@ class SavedViewList extends StatelessWidget {
return SliverToBoxAdapter( return SliverToBoxAdapter(
child: HintCard( child: HintCard(
hintText: hintText:
S.of(context).createViewsToQuicklyFilterYourDocuments, S.of(context)!.createViewsToQuicklyFilterYourDocuments,
), ),
); );
} }
@@ -33,7 +33,7 @@ class SavedViewList extends StatelessWidget {
enabled: connectivity.isConnected, enabled: connectivity.isConnected,
title: Text(view.name), title: Text(view.name),
subtitle: Text( subtitle: Text(
S.of(context).nFiltersSet(view.filterRules.length), S.of(context)!.nFiltersSet(view.filterRules.length),
), ),
onTap: () { onTap: () {
Navigator.of(context).push( Navigator.of(context).push(

View File

@@ -5,7 +5,7 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:paperless_mobile/features/login/services/authentication_service.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/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_cubit.g.dart';
part 'application_settings_state.dart'; part 'application_settings_state.dart';

View File

@@ -44,7 +44,7 @@ class ApplicationSettingsState {
static String get _defaultPreferredLocaleSubtag { static String get _defaultPreferredLocaleSubtag {
String preferredLocale = Platform.localeName.split("_").first; String preferredLocale = Platform.localeName.split("_").first;
if (!S.delegate.supportedLocales if (!S.supportedLocales
.any((locale) => locale.languageCode == preferredLocale)) { .any((locale) => locale.languageCode == preferredLocale)) {
preferredLocale = 'en'; preferredLocale = 'en';
} }

View File

@@ -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/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/login/cubit/authentication_cubit.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/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'; import 'package:paperless_mobile/helpers/message_helpers.dart';
class AccountSettingsDialog extends StatelessWidget { class AccountSettingsDialog extends StatelessWidget {
@@ -24,7 +25,7 @@ class AccountSettingsDialog extends StatelessWidget {
title: Row( title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(S.of(context).account), Text(S.of(context)!.account),
const CloseButton(), const CloseButton(),
], ],
), ),
@@ -49,7 +50,7 @@ class AccountSettingsDialog extends StatelessWidget {
ListTile( ListTile(
dense: true, dense: true,
leading: const Icon(Icons.person_add_rounded), leading: const Icon(Icons.person_add_rounded),
title: Text(S.of(context).addAnotherAccount), title: Text(S.of(context)!.addAnotherAccount),
onTap: () {}, onTap: () {},
), ),
const Divider(), const Divider(),
@@ -60,7 +61,7 @@ class AccountSettingsDialog extends StatelessWidget {
), ),
), ),
child: Text( child: Text(
S.of(context).disconnect, S.of(context)!.disconnect,
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.onError, color: Theme.of(context).colorScheme.onError,
), ),

View File

@@ -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/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/language_selection_setting.dart';
import 'package:paperless_mobile/features/settings/view/widgets/theme_mode_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'; import 'package:paperless_mobile/constants.dart';
class ApplicationSettingsPage extends StatelessWidget { class ApplicationSettingsPage extends StatelessWidget {
@@ -15,7 +16,7 @@ class ApplicationSettingsPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).applicationSettings), title: Text(S.of(context)!.applicationSettings),
), ),
body: ListView( body: ListView(
children: const [ children: const [

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/view/widgets/biometric_authentication_setting.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 { class SecuritySettingsPage extends StatelessWidget {
const SecuritySettingsPage({super.key}); const SecuritySettingsPage({super.key});
@@ -8,7 +8,7 @@ class SecuritySettingsPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: Text(S.of(context).security)), appBar: AppBar(title: Text(S.of(context)!.security)),
body: ListView( body: ListView(
children: const [ children: const [
BiometricAuthenticationSetting(), BiometricAuthenticationSetting(),

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/view/widgets/clear_storage_settings.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 { class StorageSettingsPage extends StatelessWidget {
const StorageSettingsPage({super.key}); const StorageSettingsPage({super.key});
@@ -9,7 +9,7 @@ class StorageSettingsPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).storage), title: Text(S.of(context)!.storage),
), ),
body: ListView( body: ListView(
children: const [ children: const [

View File

@@ -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/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/application_settings_page.dart';
import 'package:paperless_mobile/features/settings/view/pages/security_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 { class SettingsPage extends StatelessWidget {
const SettingsPage({super.key}); const SettingsPage({super.key});
@@ -14,7 +14,7 @@ class SettingsPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).settings), title: Text(S.of(context)!.settings),
), ),
bottomNavigationBar: BlocBuilder<PaperlessServerInformationCubit, bottomNavigationBar: BlocBuilder<PaperlessServerInformationCubit,
PaperlessServerInformationState>( PaperlessServerInformationState>(
@@ -22,13 +22,13 @@ class SettingsPage extends StatelessWidget {
final info = state.information!; final info = state.information!;
return ListTile( return ListTile(
title: Text( title: Text(
S.of(context).loggedInAs(info.username ?? 'unknown') + S.of(context)!.loggedInAs(info.username ?? 'unknown') +
"@${info.host}", "@${info.host}",
style: Theme.of(context).textTheme.labelSmall, style: Theme.of(context).textTheme.labelSmall,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
subtitle: Text( subtitle: Text(
S.of(context).paperlessServerVersion + S.of(context)!.paperlessServerVersion +
' ' + ' ' +
info.version.toString() + info.version.toString() +
' (API v${info.apiVersion})', ' (API v${info.apiVersion})',
@@ -42,21 +42,21 @@ class SettingsPage extends StatelessWidget {
children: [ children: [
ListTile( ListTile(
// leading: const Icon(Icons.style_outlined), // leading: const Icon(Icons.style_outlined),
title: Text(S.of(context).applicationSettings), title: Text(S.of(context)!.applicationSettings),
subtitle: Text(S.of(context).languageAndVisualAppearance), subtitle: Text(S.of(context)!.languageAndVisualAppearance),
onTap: () => _goto(const ApplicationSettingsPage(), context), onTap: () => _goto(const ApplicationSettingsPage(), context),
), ),
ListTile( ListTile(
// leading: const Icon(Icons.security_outlined), // leading: const Icon(Icons.security_outlined),
title: Text(S.of(context).security), title: Text(S.of(context)!.security),
subtitle: Text(S.of(context).biometricAuthentication), subtitle: Text(S.of(context)!.biometricAuthentication),
onTap: () => _goto(const SecuritySettingsPage(), context), onTap: () => _goto(const SecuritySettingsPage(), context),
), ),
// ListTile( // ListTile(
// // leading: const Icon(Icons.storage_outlined), // // leading: const Icon(Icons.storage_outlined),
// title: Text(S.of(context).storage), // title: Text(S.of(context)!.storage),
// subtitle: // subtitle:
// Text(S.of(context).mangeFilesAndStorageSpace), // Text(S.of(context)!.mangeFilesAndStorageSpace),
// onTap: () => _goto(const StorageSettingsPage(), context), // onTap: () => _goto(const StorageSettingsPage(), context),
// ), // ),
], ],

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_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';
class BiometricAuthenticationSetting extends StatelessWidget { class BiometricAuthenticationSetting extends StatelessWidget {
const BiometricAuthenticationSetting({super.key}); const BiometricAuthenticationSetting({super.key});
@@ -12,11 +12,11 @@ class BiometricAuthenticationSetting extends StatelessWidget {
builder: (context, settings) { builder: (context, settings) {
return SwitchListTile( return SwitchListTile(
value: settings.isLocalAuthenticationEnabled, value: settings.isLocalAuthenticationEnabled,
title: Text(S.of(context).biometricAuthentication), title: Text(S.of(context)!.biometricAuthentication),
subtitle: Text(S.of(context).authenticateOnAppStart), subtitle: Text(S.of(context)!.authenticateOnAppStart),
onChanged: (val) async { onChanged: (val) async {
final String localizedReason = final String localizedReason =
S.of(context).authenticateToToggleBiometricAuthentication( S.of(context)!.authenticateToToggleBiometricAuthentication(
val ? 'enable' : 'disable', val ? 'enable' : 'disable',
); );
await context await context

View File

@@ -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/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/model/color_scheme_option.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/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 { class ColorSchemeOptionSetting extends StatelessWidget {
const ColorSchemeOptionSetting({super.key}); const ColorSchemeOptionSetting({super.key});
@@ -18,7 +18,7 @@ class ColorSchemeOptionSetting extends StatelessWidget {
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>( return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
builder: (context, settings) { builder: (context, settings) {
return ListTile( return ListTile(
title: Text(S.of(context).colors), title: Text(S.of(context)!.colors),
subtitle: Text( subtitle: Text(
translateColorSchemeOption( translateColorSchemeOption(
context, context,
@@ -28,8 +28,8 @@ class ColorSchemeOptionSetting extends StatelessWidget {
onTap: () => showDialog( onTap: () => showDialog(
context: context, context: context,
builder: (_) => RadioSettingsDialog<ColorSchemeOption>( builder: (_) => RadioSettingsDialog<ColorSchemeOption>(
titleText: S.of(context).colors, titleText: S.of(context)!.colors,
descriptionText: S.of(context).colorSchemeHint, descriptionText: S.of(context)!.colorSchemeHint,
options: [ options: [
RadioOption( RadioOption(
value: ColorSchemeOption.classic, value: ColorSchemeOption.classic,
@@ -46,7 +46,7 @@ class ColorSchemeOptionSetting extends StatelessWidget {
], ],
footer: _isBelowAndroid12() footer: _isBelowAndroid12()
? HintCard( ? HintCard(
hintText: S.of(context).colorSchemeNotSupportedWarning, hintText: S.of(context)!.colorSchemeNotSupportedWarning,
hintIcon: Icons.warning_amber, hintIcon: Icons.warning_amber,
) )
: null, : null,

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.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 { class LanguageSelectionSetting extends StatefulWidget {
const LanguageSelectionSetting({super.key}); const LanguageSelectionSetting({super.key});
@@ -25,7 +25,7 @@ class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>( return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
builder: (context, settings) { builder: (context, settings) {
return ListTile( return ListTile(
title: Text(S.of(context).language), title: Text(S.of(context)!.language),
subtitle: Text(_languageOptions[settings.preferredLocaleSubtag]!), subtitle: Text(_languageOptions[settings.preferredLocaleSubtag]!),
onTap: () => showDialog<String>( onTap: () => showDialog<String>(
context: context, context: context,
@@ -33,7 +33,7 @@ class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
footer: const Text( footer: const Text(
"* Work in progress, not fully translated yet. Some words may be displayed in English!", "* 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: [ options: [
RadioOption( RadioOption(
value: 'en', value: 'en',

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_mobile/generated/l10n.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class RadioSettingsDialog<T> extends StatefulWidget { class RadioSettingsDialog<T> extends StatefulWidget {
final List<RadioOption<T>> options; final List<RadioOption<T>> options;
@@ -41,11 +41,11 @@ class _RadioSettingsDialogState<T> extends State<RadioSettingsDialog<T>> {
widget.confirmButton ?? widget.confirmButton ??
TextButton( TextButton(
onPressed: () => Navigator.pop(context), onPressed: () => Navigator.pop(context),
child: Text(S.of(context).cancel)), child: Text(S.of(context)!.cancel)),
widget.confirmButton ?? widget.confirmButton ??
TextButton( TextButton(
onPressed: () => Navigator.pop(context, _groupValue), 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, title: widget.titleText != null ? Text(widget.titleText!) : null,
content: Column( content: Column(

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.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 { class ThemeModeSetting extends StatelessWidget {
const ThemeModeSetting({super.key}); const ThemeModeSetting({super.key});
@@ -12,13 +12,13 @@ class ThemeModeSetting extends StatelessWidget {
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>( return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
builder: (context, settings) { builder: (context, settings) {
return ListTile( return ListTile(
title: Text(S.of(context).appearance), title: Text(S.of(context)!.appearance),
subtitle: Text(_mapThemeModeToLocalizedString( subtitle: Text(_mapThemeModeToLocalizedString(
settings.preferredThemeMode, context)), settings.preferredThemeMode, context)),
onTap: () => showDialog<ThemeMode>( onTap: () => showDialog<ThemeMode>(
context: context, context: context,
builder: (_) => RadioSettingsDialog<ThemeMode>( builder: (_) => RadioSettingsDialog<ThemeMode>(
titleText: S.of(context).appearance, titleText: S.of(context)!.appearance,
initialValue: context initialValue: context
.read<ApplicationSettingsCubit>() .read<ApplicationSettingsCubit>()
.state .state
@@ -26,15 +26,15 @@ class ThemeModeSetting extends StatelessWidget {
options: [ options: [
RadioOption( RadioOption(
value: ThemeMode.system, value: ThemeMode.system,
label: S.of(context).systemTheme, label: S.of(context)!.systemTheme,
), ),
RadioOption( RadioOption(
value: ThemeMode.light, value: ThemeMode.light,
label: S.of(context).lightTheme, label: S.of(context)!.lightTheme,
), ),
RadioOption( RadioOption(
value: ThemeMode.dark, 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) { String _mapThemeModeToLocalizedString(ThemeMode theme, BuildContext context) {
switch (theme) { switch (theme) {
case ThemeMode.system: case ThemeMode.system:
return S.of(context).system; return S.of(context)!.system;
case ThemeMode.light: case ThemeMode.light:
return S.of(context).light; return S.of(context)!.light;
case ThemeMode.dark: case ThemeMode.dark:
return S.of(context).dark; return S.of(context)!.dark;
} }
} }
} }

View File

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/service/github_issue_service.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/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 { class SnackBarActionConfig {
final String label; final String label;
@@ -68,7 +68,7 @@ void showGenericError(
context, context,
error.toString(), error.toString(),
action: SnackBarActionConfig( action: SnackBarActionConfig(
label: S.of(context).report, label: S.of(context)!.report,
onPressed: () => GithubIssueService.createIssueFromError( onPressed: () => GithubIssueService.createIssueFromError(
context, context,
stackTrace: stackTrace, stackTrace: stackTrace,

View File

@@ -1,5 +1,4 @@
{ {
"@@locale": "cs",
"developedBy": "Vyvíjí {name}", "developedBy": "Vyvíjí {name}",
"@developedBy": { "@developedBy": {
"placeholders": { "placeholders": {
@@ -11,29 +10,51 @@
"account": "Účet", "account": "Účet",
"@account": {}, "@account": {},
"addCorrespondent": "Nový korespondent", "addCorrespondent": "Nový korespondent",
"@addCorrespondent": {}, "@addCorrespondent": {
"description": "Title when adding a new correspondent"
},
"addDocumentType": "Nový typ dokumentu", "addDocumentType": "Nový typ dokumentu",
"@addDocumentType": {}, "@addDocumentType": {
"description": "Title when adding a new document type"
},
"addStoragePath": "Nová cesta úložiště", "addStoragePath": "Nová cesta úložiště",
"@addStoragePath": {}, "@addStoragePath": {
"description": "Title when adding a new storage path"
},
"addTag": "Nový tag", "addTag": "Nový tag",
"@addTag": {}, "@addTag": {
"description": "Title when adding a new tag"
},
"aboutThisApp": "O aplikaci", "aboutThisApp": "O aplikaci",
"@aboutThisApp": {}, "@aboutThisApp": {
"loggedInAs": "Přihlášeno jako ", "description": "Label for about this app tile displayed in the drawer"
"@loggedInAs": {}, },
"loggedInAs": "Přihlášeno jako {name}",
"@loggedInAs": {
"placeholders": {
"name": {}
}
},
"disconnect": "Odpojit", "disconnect": "Odpojit",
"@disconnect": {}, "@disconnect": {
"description": "Logout button label"
},
"reportABug": "Nahlásit chybu", "reportABug": "Nahlásit chybu",
"@reportABug": {}, "@reportABug": {},
"settings": "Nastavení", "settings": "Nastavení",
"@settings": {}, "@settings": {},
"authenticateOnAppStart": "Přihlášení při spuštění aplikace", "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": "Zapnout biometrické ověření",
"@biometricAuthentication": {}, "@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": "{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": {}, "@authenticateToToggleBiometricAuthentication": {
"placeholders": {
"mode": {}
}
},
"documents": "Dokumenty", "documents": "Dokumenty",
"@documents": {}, "@documents": {},
"inbox": "Inbox", "inbox": "Inbox",
@@ -42,10 +63,6 @@
"@labels": {}, "@labels": {},
"scanner": "Skener", "scanner": "Skener",
"@scanner": {}, "@scanner": {},
"classic": "Klasicky",
"@classic": {},
"dynamic": "Dynamicky",
"@dynamic": {},
"startTyping": "Začni psát...", "startTyping": "Začni psát...",
"@startTyping": {}, "@startTyping": {},
"doYouReallyWantToDeleteThisView": "Opravdu chceš tento náhled smazat?", "doYouReallyWantToDeleteThisView": "Opravdu chceš tento náhled smazat?",
@@ -64,14 +81,20 @@
"@createdAt": {}, "@createdAt": {},
"documentSuccessfullyDeleted": "Dokument byl úspěšně smazán.", "documentSuccessfullyDeleted": "Dokument byl úspěšně smazán.",
"@documentSuccessfullyDeleted": {}, "@documentSuccessfullyDeleted": {},
"AssignAsn": "Přiřadit", "assignAsn": "Assign ASN",
"@AssignAsn": {}, "@assignAsn": {},
"deleteDocumentTooltip": "Smazat", "deleteDocumentTooltip": "Smazat",
"@deleteDocumentTooltip": {}, "@deleteDocumentTooltip": {
"description": "Tooltip shown for the delete button on details page"
},
"downloadDocumentTooltip": "Stáhnout", "downloadDocumentTooltip": "Stáhnout",
"@downloadDocumentTooltip": {}, "@downloadDocumentTooltip": {
"description": "Tooltip shown for the download button on details page"
},
"editDocumentTooltip": "Upravit", "editDocumentTooltip": "Upravit",
"@editDocumentTooltip": {}, "@editDocumentTooltip": {
"description": "Tooltip shown for the edit button on details page"
},
"loadFullContent": "Načíst celý obsah", "loadFullContent": "Načíst celý obsah",
"@loadFullContent": {}, "@loadFullContent": {},
"noAppToDisplayPDFFilesFound": "Aplikace pro otevírání PDF souborů nenalezena.", "noAppToDisplayPDFFilesFound": "Aplikace pro otevírání PDF souborů nenalezena.",
@@ -81,25 +104,41 @@
"couldNotOpenFilePermissionDenied": "Soubor nelze otevřít: přístup zamítnut.", "couldNotOpenFilePermissionDenied": "Soubor nelze otevřít: přístup zamítnut.",
"@couldNotOpenFilePermissionDenied": {}, "@couldNotOpenFilePermissionDenied": {},
"previewTooltip": "Náhled", "previewTooltip": "Náhled",
"@previewTooltip": {}, "@previewTooltip": {
"description": "Tooltip shown for the preview button on details page"
},
"shareTooltip": "Sdílet", "shareTooltip": "Sdílet",
"@shareTooltip": {}, "@shareTooltip": {
"description": "Tooltip shown for the share button on details page"
},
"similarDocuments": "Podobné dokumenty", "similarDocuments": "Podobné dokumenty",
"@similarDocuments": {}, "@similarDocuments": {
"description": "Label shown in the tabbar on details page"
},
"content": "Obsah", "content": "Obsah",
"@content": {}, "@content": {
"description": "Label shown in the tabbar on details page"
},
"metaData": "Metadata", "metaData": "Metadata",
"@metaData": {}, "@metaData": {
"description": "Label shown in the tabbar on details page"
},
"overview": "Přehled", "overview": "Přehled",
"@overview": {}, "@overview": {
"description": "Label shown in the tabbar on details page"
},
"documentType": "Typ dokumentu", "documentType": "Typ dokumentu",
"@documentType": {}, "@documentType": {},
"archivedPdf": "Archived (pdf)", "archivedPdf": "Archived (pdf)",
"@archivedPdf": {}, "@archivedPdf": {
"description": "Option to chose when downloading a document"
},
"chooseFiletype": "Choose filetype", "chooseFiletype": "Choose filetype",
"@chooseFiletype": {}, "@chooseFiletype": {},
"original": "Original", "original": "Original",
"@original": {}, "@original": {
"description": "Option to chose when downloading a document"
},
"documentSuccessfullyDownloaded": "Dokument úspěšně stažen.", "documentSuccessfullyDownloaded": "Dokument úspěšně stažen.",
"@documentSuccessfullyDownloaded": {}, "@documentSuccessfullyDownloaded": {},
"suggestions": "Návrhy:", "suggestions": "Návrhy:",
@@ -119,7 +158,9 @@
"reset": "Zrušit", "reset": "Zrušit",
"@reset": {}, "@reset": {},
"filterDocuments": "Filtrovat dokumenty", "filterDocuments": "Filtrovat dokumenty",
"@filterDocuments": {}, "@filterDocuments": {
"description": "Title of the document filter"
},
"originalMD5Checksum": "MD5 součet originálu", "originalMD5Checksum": "MD5 součet originálu",
"@originalMD5Checksum": {}, "@originalMD5Checksum": {},
"mediaFilename": "Jméno souboru média", "mediaFilename": "Jméno souboru média",
@@ -131,23 +172,33 @@
"modifiedAt": "Pozměněno", "modifiedAt": "Pozměněno",
"@modifiedAt": {}, "@modifiedAt": {},
"preview": "Náhled", "preview": "Náhled",
"@preview": {}, "@preview": {
"description": "Title of the document preview page"
},
"scanADocument": "Oskenovat dokument", "scanADocument": "Oskenovat dokument",
"@scanADocument": {}, "@scanADocument": {},
"noDocumentsScannedYet": "Zatím nebyly naskenovány žádné dokumenty.", "noDocumentsScannedYet": "Zatím nebyly naskenovány žádné dokumenty.",
"@noDocumentsScannedYet": {}, "@noDocumentsScannedYet": {},
"or": "nebo", "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": "Smazat všechny skeny",
"@deleteAllScans": {}, "@deleteAllScans": {},
"uploadADocumentFromThisDevice": "Nahrát jeden dokument z tohoto zařízení", "uploadADocumentFromThisDevice": "Nahrát jeden dokument z tohoto zařízení",
"@uploadADocumentFromThisDevice": {}, "@uploadADocumentFromThisDevice": {
"description": "Button label on scanner page"
},
"noMatchesFound": "Žádné shody.", "noMatchesFound": "Žádné shody.",
"@noMatchesFound": {}, "@noMatchesFound": {
"description": "Displayed when no documents were found in the document search."
},
"removeFromSearchHistory": "Odstranit z historie vyhledávání?", "removeFromSearchHistory": "Odstranit z historie vyhledávání?",
"@removeFromSearchHistory": {}, "@removeFromSearchHistory": {},
"results": "Výsledky", "results": "Výsledky",
"@results": {}, "@results": {
"description": "Label displayed above search results in document search."
},
"searchDocuments": "Prohledat dokumenty", "searchDocuments": "Prohledat dokumenty",
"@searchDocuments": {}, "@searchDocuments": {},
"resetFilter": "Zrušit", "resetFilter": "Zrušit",
@@ -176,10 +227,19 @@
"@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {},
"confirmDeletion": "Potvrdit smazání", "confirmDeletion": "Potvrdit smazání",
"@confirmDeletion": {}, "@confirmDeletion": {},
"areYouSureYouWantToDeleteTheFollowingDocuments": "Jste si jisti že chcete smazat následující dokumenty?", "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": {}, "@areYouSureYouWantToDeleteTheFollowingDocuments": {
"placeholders": {
"count": {}
}
},
"countSelected": "{count} vybrány", "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": "Cesta k úložišti",
"@storagePath": {}, "@storagePath": {},
"prepareDocument": "Připravit dokument", "prepareDocument": "Připravit dokument",
@@ -271,7 +331,9 @@
"absolute": "Absolutní", "absolute": "Absolutní",
"@absolute": {}, "@absolute": {},
"hintYouCanAlsoSpecifyRelativeValues": "Tip: Kromě konkrétního data lze také specifikovat relativní časovou odchylku k aktuálnímu datu.", "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": "Počet",
"@amount": {}, "@amount": {},
"relative": "Relativní", "relative": "Relativní",
@@ -358,10 +420,10 @@
"@upload": {}, "@upload": {},
"youreOffline": "Jste offline.", "youreOffline": "Jste offline.",
"@youreOffline": {}, "@youreOffline": {},
"assignASN": "Přiřadit ASČ",
"@assignASN": {},
"deleteDocument": "Smazat dokument", "deleteDocument": "Smazat dokument",
"@deleteDocument": {}, "@deleteDocument": {
"description": "Used as an action label on each inbox item"
},
"removeDocumentFromInbox": "Dokument odstraněn z inboxu.", "removeDocumentFromInbox": "Dokument odstraněn z inboxu.",
"@removeDocumentFromInbox": {}, "@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?", "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": "Vrátit",
"@undo": {}, "@undo": {},
"nUnseen": "{count} neshlédnuté", "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": "Tip: Potáhnutím doleva označit dokument jako shlédnutý a odstranit všechny inbox tagy.",
"@swipeLeftToMarkADocumentAsSeen": {}, "@swipeLeftToMarkADocumentAsSeen": {},
"yesterday": "Včera", "yesterday": "Včera",
@@ -514,8 +580,8 @@
"@done": {}, "@done": {},
"next": "Další", "next": "Další",
"@next": {}, "@next": {},
"receiveSharedFilePermissionDeniedMessage": "Přístup k obdrženému souboru zamítnut. Než budeš sdílet, zkus nejdříve otevřít aplikaci.", "couldNotAccessReceivedFile": "Could not access the received file. Please try to open the app before sharing.",
"@receiveSharedFilePermissionDeniedMessage": {}, "@couldNotAccessReceivedFile": {},
"newView": "Nový náhled", "newView": "Nový náhled",
"@newView": {}, "@newView": {},
"createsASavedViewBasedOnTheCurrentFilterCriteria": "Vytvoří nový náhled na základě aktuálních pravidel filtru.", "createsASavedViewBasedOnTheCurrentFilterCriteria": "Vytvoří nový náhled na základě aktuálních pravidel filtru.",
@@ -607,5 +673,9 @@
"list": "List", "list": "List",
"@list": {}, "@list": {},
"remove": "Remove", "remove": "Remove",
"removeQueryFromSearchHistory": "Remove query from search history?" "removeQueryFromSearchHistory": "Remove query from search history?",
"dynamicColorScheme": "Dynamicky",
"@dynamicColorScheme": {},
"classicColorScheme": "Klasicky",
"@classicColorScheme": {}
} }

View File

@@ -1,5 +1,4 @@
{ {
"@@locale": "de",
"developedBy": "Entwickelt von {name}", "developedBy": "Entwickelt von {name}",
"@developedBy": { "@developedBy": {
"placeholders": { "placeholders": {
@@ -11,28 +10,46 @@
"account": "Account", "account": "Account",
"@account": {}, "@account": {},
"addCorrespondent": "Neuer Korrespondent", "addCorrespondent": "Neuer Korrespondent",
"@addCorrespondent": {}, "@addCorrespondent": {
"description": "Title when adding a new correspondent"
},
"addDocumentType": "Neuer Dokumenttyp", "addDocumentType": "Neuer Dokumenttyp",
"@addDocumentType": {}, "@addDocumentType": {
"description": "Title when adding a new document type"
},
"addStoragePath": "Neuer Speicherpfad", "addStoragePath": "Neuer Speicherpfad",
"@addStoragePath": {}, "@addStoragePath": {
"description": "Title when adding a new storage path"
},
"addTag": "Neuer Tag", "addTag": "Neuer Tag",
"@addTag": {}, "@addTag": {
"description": "Title when adding a new tag"
},
"aboutThisApp": "Über diese App", "aboutThisApp": "Über diese App",
"@aboutThisApp": {}, "@aboutThisApp": {
"loggedInAs": "Eingeloggt als ", "description": "Label for about this app tile displayed in the drawer"
"@loggedInAs": {}, },
"loggedInAs": "Eingeloggt als {name}",
"@loggedInAs": {
"placeholders": {
"name": {}
}
},
"disconnect": "Verbindung trennen", "disconnect": "Verbindung trennen",
"@disconnect": {}, "@disconnect": {
"description": "Logout button label"
},
"reportABug": "Einen Fehler melden", "reportABug": "Einen Fehler melden",
"@reportABug": {}, "@reportABug": {},
"settings": "Einstellungen", "settings": "Einstellungen",
"@settings": {}, "@settings": {},
"authenticateOnAppStart": "Authentifizierung beim Start der Anwendung", "authenticateOnAppStart": "Authentifizierung beim Start der Anwendung",
"@authenticateOnAppStart": {}, "@authenticateOnAppStart": {
"description": "Description of the biometric authentication settings tile"
},
"biometricAuthentication": "Biometrische Authentifizierung aktivieren", "biometricAuthentication": "Biometrische Authentifizierung aktivieren",
"@biometricAuthentication": {}, "@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": { "@authenticateToToggleBiometricAuthentication": {
"placeholders": { "placeholders": {
"mode": {} "mode": {}
@@ -46,10 +63,6 @@
"@labels": {}, "@labels": {},
"scanner": "Scanner", "scanner": "Scanner",
"@scanner": {}, "@scanner": {},
"classic": "Klassisch",
"@classic": {},
"dynamic": "Dynamisch",
"@dynamic": {},
"startTyping": "Beginne zu tippen...", "startTyping": "Beginne zu tippen...",
"@startTyping": {}, "@startTyping": {},
"doYouReallyWantToDeleteThisView": "Möchtest Du diese Ansicht wirklich löschen?", "doYouReallyWantToDeleteThisView": "Möchtest Du diese Ansicht wirklich löschen?",
@@ -68,14 +81,20 @@
"@createdAt": {}, "@createdAt": {},
"documentSuccessfullyDeleted": "Das Dokument wurde erfolgreich gelöscht.", "documentSuccessfullyDeleted": "Das Dokument wurde erfolgreich gelöscht.",
"@documentSuccessfullyDeleted": {}, "@documentSuccessfullyDeleted": {},
"AssignAsn": "Zuweisen", "assignAsn": "ASN zuweisen",
"@AssignAsn": {}, "@assignAsn": {},
"deleteDocumentTooltip": "Löschen", "deleteDocumentTooltip": "Löschen",
"@deleteDocumentTooltip": {}, "@deleteDocumentTooltip": {
"description": "Tooltip shown for the delete button on details page"
},
"downloadDocumentTooltip": "Herunterladen", "downloadDocumentTooltip": "Herunterladen",
"@downloadDocumentTooltip": {}, "@downloadDocumentTooltip": {
"description": "Tooltip shown for the download button on details page"
},
"editDocumentTooltip": "Bearbeiten", "editDocumentTooltip": "Bearbeiten",
"@editDocumentTooltip": {}, "@editDocumentTooltip": {
"description": "Tooltip shown for the edit button on details page"
},
"loadFullContent": "Lade gesamten Inhalt", "loadFullContent": "Lade gesamten Inhalt",
"@loadFullContent": {}, "@loadFullContent": {},
"noAppToDisplayPDFFilesFound": "Es wurde keine App zum Anzeigen von PDF Dateien gefunden!", "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": "Datei konnte nicht geöffnet werden: Zugriff verweigert.",
"@couldNotOpenFilePermissionDenied": {}, "@couldNotOpenFilePermissionDenied": {},
"previewTooltip": "Vorschau", "previewTooltip": "Vorschau",
"@previewTooltip": {}, "@previewTooltip": {
"description": "Tooltip shown for the preview button on details page"
},
"shareTooltip": "Teilen", "shareTooltip": "Teilen",
"@shareTooltip": {}, "@shareTooltip": {
"description": "Tooltip shown for the share button on details page"
},
"similarDocuments": "Similar Documents", "similarDocuments": "Similar Documents",
"@similarDocuments": {}, "@similarDocuments": {
"description": "Label shown in the tabbar on details page"
},
"content": "Inhalt", "content": "Inhalt",
"@content": {}, "@content": {
"description": "Label shown in the tabbar on details page"
},
"metaData": "Metadaten", "metaData": "Metadaten",
"@metaData": {}, "@metaData": {
"description": "Label shown in the tabbar on details page"
},
"overview": "Übersicht", "overview": "Übersicht",
"@overview": {}, "@overview": {
"description": "Label shown in the tabbar on details page"
},
"documentType": "Dokumenttyp", "documentType": "Dokumenttyp",
"@documentType": {}, "@documentType": {},
"archivedPdf": "Archiviert (pdf)", "archivedPdf": "Archiviert (pdf)",
"@archivedPdf": {}, "@archivedPdf": {
"description": "Option to chose when downloading a document"
},
"chooseFiletype": "Wähle Dateityp", "chooseFiletype": "Wähle Dateityp",
"@chooseFiletype": {}, "@chooseFiletype": {},
"original": "Original", "original": "Original",
"@original": {}, "@original": {
"description": "Option to chose when downloading a document"
},
"documentSuccessfullyDownloaded": "Dokument erfolgreich heruntergeladen.", "documentSuccessfullyDownloaded": "Dokument erfolgreich heruntergeladen.",
"@documentSuccessfullyDownloaded": {}, "@documentSuccessfullyDownloaded": {},
"suggestions": "Vorschläge: ", "suggestions": "Vorschläge: ",
@@ -123,7 +158,9 @@
"reset": "Zurücksetzen", "reset": "Zurücksetzen",
"@reset": {}, "@reset": {},
"filterDocuments": "Dokumente filtern", "filterDocuments": "Dokumente filtern",
"@filterDocuments": {}, "@filterDocuments": {
"description": "Title of the document filter"
},
"originalMD5Checksum": "MD5-Prüfsumme Original", "originalMD5Checksum": "MD5-Prüfsumme Original",
"@originalMD5Checksum": {}, "@originalMD5Checksum": {},
"mediaFilename": "Media-Dateiname", "mediaFilename": "Media-Dateiname",
@@ -135,23 +172,33 @@
"modifiedAt": "Geändert am", "modifiedAt": "Geändert am",
"@modifiedAt": {}, "@modifiedAt": {},
"preview": "Vorschau", "preview": "Vorschau",
"@preview": {}, "@preview": {
"description": "Title of the document preview page"
},
"scanADocument": "Scanne ein Dokument", "scanADocument": "Scanne ein Dokument",
"@scanADocument": {}, "@scanADocument": {},
"noDocumentsScannedYet": "Es wurden noch keine Dokumente gescannt.", "noDocumentsScannedYet": "Es wurden noch keine Dokumente gescannt.",
"@noDocumentsScannedYet": {}, "@noDocumentsScannedYet": {},
"or": "oder", "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": "Alle scans löschen",
"@deleteAllScans": {}, "@deleteAllScans": {},
"uploadADocumentFromThisDevice": "Lade ein Dokument von diesem Gerät hoch", "uploadADocumentFromThisDevice": "Lade ein Dokument von diesem Gerät hoch",
"@uploadADocumentFromThisDevice": {}, "@uploadADocumentFromThisDevice": {
"description": "Button label on scanner page"
},
"noMatchesFound": "Keine Treffer.", "noMatchesFound": "Keine Treffer.",
"@noMatchesFound": {}, "@noMatchesFound": {
"description": "Displayed when no documents were found in the document search."
},
"removeFromSearchHistory": "Aus dem Suchverlauf entfernen?", "removeFromSearchHistory": "Aus dem Suchverlauf entfernen?",
"@removeFromSearchHistory": {}, "@removeFromSearchHistory": {},
"results": "Ergebnisse", "results": "Ergebnisse",
"@results": {}, "@results": {
"description": "Label displayed above search results in document search."
},
"searchDocuments": "Durchsuche Dokumente", "searchDocuments": "Durchsuche Dokumente",
"@searchDocuments": {}, "@searchDocuments": {},
"resetFilter": "Filter zurücksetzen", "resetFilter": "Filter zurücksetzen",
@@ -180,10 +227,19 @@
"@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {},
"confirmDeletion": "Löschen bestätigen", "confirmDeletion": "Löschen bestätigen",
"@confirmDeletion": {}, "@confirmDeletion": {},
"areYouSureYouWantToDeleteTheFollowingDocuments": "Bist Du sicher, dass Du folgende Dokumente löschen möchtest?", "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": {}, "@areYouSureYouWantToDeleteTheFollowingDocuments": {
"placeholders": {
"count": {}
}
},
"countSelected": "{count} ausgewählt", "countSelected": "{count} ausgewählt",
"@countSelected": {}, "@countSelected": {
"description": "Displayed in the appbar when at least one document is selected.",
"placeholders": {
"count": {}
}
},
"storagePath": "Speicherpfad", "storagePath": "Speicherpfad",
"@storagePath": {}, "@storagePath": {},
"prepareDocument": "Dokument vorbereiten", "prepareDocument": "Dokument vorbereiten",
@@ -275,7 +331,9 @@
"absolute": "Absolut", "absolute": "Absolut",
"@absolute": {}, "@absolute": {},
"hintYouCanAlsoSpecifyRelativeValues": "Hinweis: Neben konkreten Daten kannst du den Zeitraum auch über eine relative Zeitspanne einschränken.", "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": "Anzahl",
"@amount": {}, "@amount": {},
"relative": "Relativ", "relative": "Relativ",
@@ -362,10 +420,10 @@
"@upload": {}, "@upload": {},
"youreOffline": "Du bist offline.", "youreOffline": "Du bist offline.",
"@youreOffline": {}, "@youreOffline": {},
"assignASN": "ASN zuweisen",
"@assignASN": {},
"deleteDocument": "Dokument löschen", "deleteDocument": "Dokument löschen",
"@deleteDocument": {}, "@deleteDocument": {
"description": "Used as an action label on each inbox item"
},
"removeDocumentFromInbox": "Dokument aus Posteingang entfernt.", "removeDocumentFromInbox": "Dokument aus Posteingang entfernt.",
"@removeDocumentFromInbox": {}, "@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?", "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": "Undo",
"@undo": {}, "@undo": {},
"nUnseen": "{count} ungesehen", "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": "Tipp: Wische nach links um ein Dokument als gesehen zu markieren und alle Posteingangs-Tags von diesem Dokument zu entfernen.",
"@swipeLeftToMarkADocumentAsSeen": {}, "@swipeLeftToMarkADocumentAsSeen": {},
"yesterday": "Gestern", "yesterday": "Gestern",
@@ -611,5 +673,9 @@
"list": "Liste", "list": "Liste",
"@list": {}, "@list": {},
"remove": "Remove", "remove": "Remove",
"removeQueryFromSearchHistory": "Remove query from search history?" "removeQueryFromSearchHistory": "Remove query from search history?",
"dynamicColorScheme": "Dynamisch",
"@dynamicColorScheme": {},
"classicColorScheme": "Klassisch",
"@classicColorScheme": {}
} }

View File

@@ -1,5 +1,4 @@
{ {
"@@locale": "en",
"developedBy": "Developed by {name}", "developedBy": "Developed by {name}",
"@developedBy": { "@developedBy": {
"placeholders": { "placeholders": {
@@ -50,7 +49,7 @@
}, },
"biometricAuthentication": "Biometric authentication", "biometricAuthentication": "Biometric authentication",
"@biometricAuthentication": {}, "@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": { "@authenticateToToggleBiometricAuthentication": {
"placeholders": { "placeholders": {
"mode": {} "mode": {}
@@ -64,10 +63,6 @@
"@labels": {}, "@labels": {},
"scanner": "Scanner", "scanner": "Scanner",
"@scanner": {}, "@scanner": {},
"classic": "Classic",
"@classic": {},
"dynamic": "Dynamic",
"@dynamic": {},
"startTyping": "Start typing...", "startTyping": "Start typing...",
"@startTyping": {}, "@startTyping": {},
"doYouReallyWantToDeleteThisView": "Do you really want to delete this view?", "doYouReallyWantToDeleteThisView": "Do you really want to delete this view?",
@@ -86,8 +81,8 @@
"@createdAt": {}, "@createdAt": {},
"documentSuccessfullyDeleted": "Document successfully deleted.", "documentSuccessfullyDeleted": "Document successfully deleted.",
"@documentSuccessfullyDeleted": {}, "@documentSuccessfullyDeleted": {},
"AssignAsn": "Assign ASN", "assignAsn": "Assign ASN",
"@AssignAsn": {}, "@assignAsn": {},
"deleteDocumentTooltip": "Delete", "deleteDocumentTooltip": "Delete",
"@deleteDocumentTooltip": { "@deleteDocumentTooltip": {
"description": "Tooltip shown for the delete button on details page" "description": "Tooltip shown for the delete button on details page"
@@ -425,8 +420,6 @@
"@upload": {}, "@upload": {},
"youreOffline": "You're offline.", "youreOffline": "You're offline.",
"@youreOffline": {}, "@youreOffline": {},
"assignASN": "Assign ASN",
"@assignASN": {},
"deleteDocument": "Delete document", "deleteDocument": "Delete document",
"@deleteDocument": { "@deleteDocument": {
"description": "Used as an action label on each inbox item" "description": "Used as an action label on each inbox item"
@@ -680,5 +673,9 @@
"list": "List", "list": "List",
"@list": {}, "@list": {},
"remove": "Remove", "remove": "Remove",
"removeQueryFromSearchHistory": "Remove query from search history?" "removeQueryFromSearchHistory": "Remove query from search history?",
"dynamicColorScheme": "Dynamic",
"@dynamicColorScheme": {},
"classicColorScheme": "Classic",
"@classicColorScheme": {}
} }

681
lib/l10n/intl_fr.arb Normal file
View File

@@ -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": {}
}

View File

@@ -1,5 +1,4 @@
{ {
"@@locale": "pl",
"developedBy": "Developed by {name}", "developedBy": "Developed by {name}",
"@developedBy": { "@developedBy": {
"placeholders": { "placeholders": {
@@ -11,28 +10,46 @@
"account": "Account", "account": "Account",
"@account": {}, "@account": {},
"addCorrespondent": "New Correspondent", "addCorrespondent": "New Correspondent",
"@addCorrespondent": {}, "@addCorrespondent": {
"description": "Title when adding a new correspondent"
},
"addDocumentType": "Nowy rodzaj dokumentu", "addDocumentType": "Nowy rodzaj dokumentu",
"@addDocumentType": {}, "@addDocumentType": {
"description": "Title when adding a new document type"
},
"addStoragePath": "New Storage Path", "addStoragePath": "New Storage Path",
"@addStoragePath": {}, "@addStoragePath": {
"description": "Title when adding a new storage path"
},
"addTag": "Nowy tag", "addTag": "Nowy tag",
"@addTag": {}, "@addTag": {
"description": "Title when adding a new tag"
},
"aboutThisApp": "O aplikacji", "aboutThisApp": "O aplikacji",
"@aboutThisApp": {}, "@aboutThisApp": {
"loggedInAs": "Zalogowano jako", "description": "Label for about this app tile displayed in the drawer"
"@loggedInAs": {}, },
"loggedInAs": "Zalogowano jako {name}",
"@loggedInAs": {
"placeholders": {
"name": {}
}
},
"disconnect": "Disconnect", "disconnect": "Disconnect",
"@disconnect": {}, "@disconnect": {
"description": "Logout button label"
},
"reportABug": "Report a Bug", "reportABug": "Report a Bug",
"@reportABug": {}, "@reportABug": {},
"settings": "Ustawienia", "settings": "Ustawienia",
"@settings": {}, "@settings": {},
"authenticateOnAppStart": "Authenticate on app start", "authenticateOnAppStart": "Authenticate on app start",
"@authenticateOnAppStart": {}, "@authenticateOnAppStart": {
"description": "Description of the biometric authentication settings tile"
},
"biometricAuthentication": "Biometric authentication", "biometricAuthentication": "Biometric authentication",
"@biometricAuthentication": {}, "@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": { "@authenticateToToggleBiometricAuthentication": {
"placeholders": { "placeholders": {
"mode": {} "mode": {}
@@ -46,10 +63,6 @@
"@labels": {}, "@labels": {},
"scanner": "Scanner", "scanner": "Scanner",
"@scanner": {}, "@scanner": {},
"classic": "Classic",
"@classic": {},
"dynamic": "Dynamic",
"@dynamic": {},
"startTyping": "Zacznij pisać...", "startTyping": "Zacznij pisać...",
"@startTyping": {}, "@startTyping": {},
"doYouReallyWantToDeleteThisView": "Do you really want to delete this view?", "doYouReallyWantToDeleteThisView": "Do you really want to delete this view?",
@@ -68,14 +81,20 @@
"@createdAt": {}, "@createdAt": {},
"documentSuccessfullyDeleted": "Dokument pomyślnie usunięty.", "documentSuccessfullyDeleted": "Dokument pomyślnie usunięty.",
"@documentSuccessfullyDeleted": {}, "@documentSuccessfullyDeleted": {},
"AssignAsn": "Assign", "assignAsn": "Assign ASN",
"@AssignAsn": {}, "@assignAsn": {},
"deleteDocumentTooltip": "Usuń", "deleteDocumentTooltip": "Usuń",
"@deleteDocumentTooltip": {}, "@deleteDocumentTooltip": {
"description": "Tooltip shown for the delete button on details page"
},
"downloadDocumentTooltip": "Pobierz", "downloadDocumentTooltip": "Pobierz",
"@downloadDocumentTooltip": {}, "@downloadDocumentTooltip": {
"description": "Tooltip shown for the download button on details page"
},
"editDocumentTooltip": "Edytuj", "editDocumentTooltip": "Edytuj",
"@editDocumentTooltip": {}, "@editDocumentTooltip": {
"description": "Tooltip shown for the edit button on details page"
},
"loadFullContent": "Load full content", "loadFullContent": "Load full content",
"@loadFullContent": {}, "@loadFullContent": {},
"noAppToDisplayPDFFilesFound": "Nie znaleziono aplikacji do wyświetlania plików PDF", "noAppToDisplayPDFFilesFound": "Nie znaleziono aplikacji do wyświetlania plików PDF",
@@ -85,25 +104,41 @@
"couldNotOpenFilePermissionDenied": "Nie można otworzyć pliku: ", "couldNotOpenFilePermissionDenied": "Nie można otworzyć pliku: ",
"@couldNotOpenFilePermissionDenied": {}, "@couldNotOpenFilePermissionDenied": {},
"previewTooltip": "Podgląd", "previewTooltip": "Podgląd",
"@previewTooltip": {}, "@previewTooltip": {
"description": "Tooltip shown for the preview button on details page"
},
"shareTooltip": "Udostępnij", "shareTooltip": "Udostępnij",
"@shareTooltip": {}, "@shareTooltip": {
"description": "Tooltip shown for the share button on details page"
},
"similarDocuments": "Podobne Dokumenty", "similarDocuments": "Podobne Dokumenty",
"@similarDocuments": {}, "@similarDocuments": {
"description": "Label shown in the tabbar on details page"
},
"content": "Treść", "content": "Treść",
"@content": {}, "@content": {
"description": "Label shown in the tabbar on details page"
},
"metaData": "Meta dane", "metaData": "Meta dane",
"@metaData": {}, "@metaData": {
"description": "Label shown in the tabbar on details page"
},
"overview": "Przegląd", "overview": "Przegląd",
"@overview": {}, "@overview": {
"description": "Label shown in the tabbar on details page"
},
"documentType": "Rodzaj dokumentu", "documentType": "Rodzaj dokumentu",
"@documentType": {}, "@documentType": {},
"archivedPdf": "Archived (pdf)", "archivedPdf": "Archived (pdf)",
"@archivedPdf": {}, "@archivedPdf": {
"description": "Option to chose when downloading a document"
},
"chooseFiletype": "Choose filetype", "chooseFiletype": "Choose filetype",
"@chooseFiletype": {}, "@chooseFiletype": {},
"original": "Original", "original": "Original",
"@original": {}, "@original": {
"description": "Option to chose when downloading a document"
},
"documentSuccessfullyDownloaded": "Document successfully downloaded.", "documentSuccessfullyDownloaded": "Document successfully downloaded.",
"@documentSuccessfullyDownloaded": {}, "@documentSuccessfullyDownloaded": {},
"suggestions": "Suggestions: ", "suggestions": "Suggestions: ",
@@ -123,7 +158,9 @@
"reset": "Reset", "reset": "Reset",
"@reset": {}, "@reset": {},
"filterDocuments": "Filter Documents", "filterDocuments": "Filter Documents",
"@filterDocuments": {}, "@filterDocuments": {
"description": "Title of the document filter"
},
"originalMD5Checksum": "Original MD5-Checksum", "originalMD5Checksum": "Original MD5-Checksum",
"@originalMD5Checksum": {}, "@originalMD5Checksum": {},
"mediaFilename": "Media Filename", "mediaFilename": "Media Filename",
@@ -135,23 +172,33 @@
"modifiedAt": "Modified at", "modifiedAt": "Modified at",
"@modifiedAt": {}, "@modifiedAt": {},
"preview": "Podgląd", "preview": "Podgląd",
"@preview": {}, "@preview": {
"description": "Title of the document preview page"
},
"scanADocument": "Zeskanuj dokument", "scanADocument": "Zeskanuj dokument",
"@scanADocument": {}, "@scanADocument": {},
"noDocumentsScannedYet": "No documents scanned yet.", "noDocumentsScannedYet": "No documents scanned yet.",
"@noDocumentsScannedYet": {}, "@noDocumentsScannedYet": {},
"or": "lub", "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": "Delete all scans",
"@deleteAllScans": {}, "@deleteAllScans": {},
"uploadADocumentFromThisDevice": "Upload a document from this device", "uploadADocumentFromThisDevice": "Upload a document from this device",
"@uploadADocumentFromThisDevice": {}, "@uploadADocumentFromThisDevice": {
"description": "Button label on scanner page"
},
"noMatchesFound": "No matches found.", "noMatchesFound": "No matches found.",
"@noMatchesFound": {}, "@noMatchesFound": {
"description": "Displayed when no documents were found in the document search."
},
"removeFromSearchHistory": "Usunąć z historii wyszukiwania?", "removeFromSearchHistory": "Usunąć z historii wyszukiwania?",
"@removeFromSearchHistory": {}, "@removeFromSearchHistory": {},
"results": "Wyniki", "results": "Wyniki",
"@results": {}, "@results": {
"description": "Label displayed above search results in document search."
},
"searchDocuments": "Search documents", "searchDocuments": "Search documents",
"@searchDocuments": {}, "@searchDocuments": {},
"resetFilter": "Reset filter", "resetFilter": "Reset filter",
@@ -180,10 +227,19 @@
"@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {},
"confirmDeletion": "Potwierdź usunięcie", "confirmDeletion": "Potwierdź usunięcie",
"@confirmDeletion": {}, "@confirmDeletion": {},
"areYouSureYouWantToDeleteTheFollowingDocuments": "Are you sure you want to delete the following documents?", "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": {}, "@areYouSureYouWantToDeleteTheFollowingDocuments": {
"placeholders": {
"count": {}
}
},
"countSelected": "{count} selected", "countSelected": "{count} selected",
"@countSelected": {}, "@countSelected": {
"description": "Displayed in the appbar when at least one document is selected.",
"placeholders": {
"count": {}
}
},
"storagePath": "Storage Path", "storagePath": "Storage Path",
"@storagePath": {}, "@storagePath": {},
"prepareDocument": "Prepare document", "prepareDocument": "Prepare document",
@@ -275,7 +331,9 @@
"absolute": "Absolute", "absolute": "Absolute",
"@absolute": {}, "@absolute": {},
"hintYouCanAlsoSpecifyRelativeValues": "Hint: Apart from concrete dates, you can also specify a time range relative to the current date.", "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": "Amount",
"@amount": {}, "@amount": {},
"relative": "Relative", "relative": "Relative",
@@ -362,10 +420,10 @@
"@upload": {}, "@upload": {},
"youreOffline": "Jesteście w trybie offline.", "youreOffline": "Jesteście w trybie offline.",
"@youreOffline": {}, "@youreOffline": {},
"assignASN": "Assign ASN",
"@assignASN": {},
"deleteDocument": "Delete document", "deleteDocument": "Delete document",
"@deleteDocument": {}, "@deleteDocument": {
"description": "Used as an action label on each inbox item"
},
"removeDocumentFromInbox": "Dokument usunięty ze skrzynki odbiorczej", "removeDocumentFromInbox": "Dokument usunięty ze skrzynki odbiorczej",
"@removeDocumentFromInbox": {}, "@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": "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": "Cofnij",
"@undo": {}, "@undo": {},
"nUnseen": "{count} unseen", "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": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.",
"@swipeLeftToMarkADocumentAsSeen": {}, "@swipeLeftToMarkADocumentAsSeen": {},
"yesterday": "Wczoraj", "yesterday": "Wczoraj",
@@ -611,5 +673,9 @@
"list": "List", "list": "List",
"@list": {}, "@list": {},
"remove": "Remove", "remove": "Remove",
"removeQueryFromSearchHistory": "Remove query from search history?" "removeQueryFromSearchHistory": "Remove query from search history?",
"dynamicColorScheme": "Dynamic",
"@dynamicColorScheme": {},
"classicColorScheme": "Classic",
"@classicColorScheme": {}
} }

View File

@@ -1,5 +1,4 @@
{ {
"@@locale": "tr",
"developedBy": "Developed by {name}", "developedBy": "Developed by {name}",
"@developedBy": { "@developedBy": {
"placeholders": { "placeholders": {
@@ -11,35 +10,51 @@
"account": "Account", "account": "Account",
"@account": {}, "@account": {},
"addCorrespondent": "Yeni ek yazar", "addCorrespondent": "Yeni ek yazar",
"@addCorrespondent": {}, "@addCorrespondent": {
"description": "Title when adding a new correspondent"
},
"addDocumentType": "Yeni Belge Türü", "addDocumentType": "Yeni Belge Türü",
"@addDocumentType": {}, "@addDocumentType": {
"description": "Title when adding a new document type"
},
"addStoragePath": "Yeni Depolama Yolu", "addStoragePath": "Yeni Depolama Yolu",
"@addStoragePath": {}, "@addStoragePath": {
"description": "Title when adding a new storage path"
},
"addTag": "Yeni Etiket", "addTag": "Yeni Etiket",
"@addTag": {}, "@addTag": {
"description": "Title when adding a new tag"
},
"aboutThisApp": "Bu uygulama hakkında", "aboutThisApp": "Bu uygulama hakkında",
"@aboutThisApp": {}, "@aboutThisApp": {
"loggedInAs": "Olarak giriş yapıldı", "description": "Label for about this app tile displayed in the drawer"
"@loggedInAs": {}, },
"loggedInAs": "Olarak giriş yapıldı {name}",
"@loggedInAs": {
"placeholders": {
"name": {}
}
},
"disconnect": "Bağlantıyı kes", "disconnect": "Bağlantıyı kes",
"@disconnect": {}, "@disconnect": {
"description": "Logout button label"
},
"reportABug": "Hata Bildir", "reportABug": "Hata Bildir",
"@reportABug": {}, "@reportABug": {},
"settings": "Ayarlar", "settings": "Ayarlar",
"@settings": {}, "@settings": {},
"authenticateOnAppStart": "Uygulama başlangıcında kimlik doğrulaması yapın", "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": "Biyometrik kimlik doğrulama",
"@biometricAuthentication": {}, "@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": { "@authenticateToToggleBiometricAuthentication": {
"placeholders": { "placeholders": {
"mode": {} "mode": {}
} }
}, },
"authenticateToEnableBiometricAuthentication": "",
"@authenticateToEnableBiometricAuthentication": {},
"documents": "Dökümanlar", "documents": "Dökümanlar",
"@documents": {}, "@documents": {},
"inbox": "Gelen Kutusu", "inbox": "Gelen Kutusu",
@@ -48,10 +63,6 @@
"@labels": {}, "@labels": {},
"scanner": "Tarayıcı", "scanner": "Tarayıcı",
"@scanner": {}, "@scanner": {},
"classic": "Classic",
"@classic": {},
"dynamic": "Dynamic",
"@dynamic": {},
"startTyping": "Yazmaya başlayın...", "startTyping": "Yazmaya başlayın...",
"@startTyping": {}, "@startTyping": {},
"doYouReallyWantToDeleteThisView": "Bu görünümü gerçekten silmek istiyor musunuz?", "doYouReallyWantToDeleteThisView": "Bu görünümü gerçekten silmek istiyor musunuz?",
@@ -70,14 +81,20 @@
"@createdAt": {}, "@createdAt": {},
"documentSuccessfullyDeleted": "Doküman başarıyla silindi.", "documentSuccessfullyDeleted": "Doküman başarıyla silindi.",
"@documentSuccessfullyDeleted": {}, "@documentSuccessfullyDeleted": {},
"AssignAsn": "Ata", "assignAsn": "Assign ASN",
"@AssignAsn": {}, "@assignAsn": {},
"deleteDocumentTooltip": "Delete", "deleteDocumentTooltip": "Delete",
"@deleteDocumentTooltip": {}, "@deleteDocumentTooltip": {
"description": "Tooltip shown for the delete button on details page"
},
"downloadDocumentTooltip": "Download", "downloadDocumentTooltip": "Download",
"@downloadDocumentTooltip": {}, "@downloadDocumentTooltip": {
"description": "Tooltip shown for the download button on details page"
},
"editDocumentTooltip": "Edit", "editDocumentTooltip": "Edit",
"@editDocumentTooltip": {}, "@editDocumentTooltip": {
"description": "Tooltip shown for the edit button on details page"
},
"loadFullContent": "Tüm içeriği yükle", "loadFullContent": "Tüm içeriği yükle",
"@loadFullContent": {}, "@loadFullContent": {},
"noAppToDisplayPDFFilesFound": "No app to display PDF files found!", "noAppToDisplayPDFFilesFound": "No app to display PDF files found!",
@@ -87,25 +104,41 @@
"couldNotOpenFilePermissionDenied": "Could not open file: Permission denied.", "couldNotOpenFilePermissionDenied": "Could not open file: Permission denied.",
"@couldNotOpenFilePermissionDenied": {}, "@couldNotOpenFilePermissionDenied": {},
"previewTooltip": "Preview", "previewTooltip": "Preview",
"@previewTooltip": {}, "@previewTooltip": {
"description": "Tooltip shown for the preview button on details page"
},
"shareTooltip": "Share", "shareTooltip": "Share",
"@shareTooltip": {}, "@shareTooltip": {
"description": "Tooltip shown for the share button on details page"
},
"similarDocuments": "Benzer Belgeler", "similarDocuments": "Benzer Belgeler",
"@similarDocuments": {}, "@similarDocuments": {
"description": "Label shown in the tabbar on details page"
},
"content": "İçerik", "content": "İçerik",
"@content": {}, "@content": {
"description": "Label shown in the tabbar on details page"
},
"metaData": "Meta Veri", "metaData": "Meta Veri",
"@metaData": {}, "@metaData": {
"description": "Label shown in the tabbar on details page"
},
"overview": "Genel bakış", "overview": "Genel bakış",
"@overview": {}, "@overview": {
"description": "Label shown in the tabbar on details page"
},
"documentType": "Döküman tipi", "documentType": "Döküman tipi",
"@documentType": {}, "@documentType": {},
"archivedPdf": "Archived (pdf)", "archivedPdf": "Archived (pdf)",
"@archivedPdf": {}, "@archivedPdf": {
"description": "Option to chose when downloading a document"
},
"chooseFiletype": "Choose filetype", "chooseFiletype": "Choose filetype",
"@chooseFiletype": {}, "@chooseFiletype": {},
"original": "Original", "original": "Original",
"@original": {}, "@original": {
"description": "Option to chose when downloading a document"
},
"documentSuccessfullyDownloaded": "Döküman başarıyla indirildi.", "documentSuccessfullyDownloaded": "Döküman başarıyla indirildi.",
"@documentSuccessfullyDownloaded": {}, "@documentSuccessfullyDownloaded": {},
"suggestions": "Öneriler:", "suggestions": "Öneriler:",
@@ -125,7 +158,9 @@
"reset": "Sıfırla", "reset": "Sıfırla",
"@reset": {}, "@reset": {},
"filterDocuments": "Dökümanları Filtrele", "filterDocuments": "Dökümanları Filtrele",
"@filterDocuments": {}, "@filterDocuments": {
"description": "Title of the document filter"
},
"originalMD5Checksum": "Orijinal MD5-Sağlaması", "originalMD5Checksum": "Orijinal MD5-Sağlaması",
"@originalMD5Checksum": {}, "@originalMD5Checksum": {},
"mediaFilename": "Medya Dosya Adı", "mediaFilename": "Medya Dosya Adı",
@@ -137,23 +172,33 @@
"modifiedAt": "Modified at", "modifiedAt": "Modified at",
"@modifiedAt": {}, "@modifiedAt": {},
"preview": "Ön izleme", "preview": "Ön izleme",
"@preview": {}, "@preview": {
"description": "Title of the document preview page"
},
"scanADocument": "Belge tarat", "scanADocument": "Belge tarat",
"@scanADocument": {}, "@scanADocument": {},
"noDocumentsScannedYet": "Henüz taranan belge yok.", "noDocumentsScannedYet": "Henüz taranan belge yok.",
"@noDocumentsScannedYet": {}, "@noDocumentsScannedYet": {},
"or": "yada", "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": "Tüm tarananları sil",
"@deleteAllScans": {}, "@deleteAllScans": {},
"uploadADocumentFromThisDevice": "Bu cihazdan bir döküman yükleyin", "uploadADocumentFromThisDevice": "Bu cihazdan bir döküman yükleyin",
"@uploadADocumentFromThisDevice": {}, "@uploadADocumentFromThisDevice": {
"description": "Button label on scanner page"
},
"noMatchesFound": "No matches found.", "noMatchesFound": "No matches found.",
"@noMatchesFound": {}, "@noMatchesFound": {
"description": "Displayed when no documents were found in the document search."
},
"removeFromSearchHistory": "Remove from search history?", "removeFromSearchHistory": "Remove from search history?",
"@removeFromSearchHistory": {}, "@removeFromSearchHistory": {},
"results": "Results", "results": "Results",
"@results": {}, "@results": {
"description": "Label displayed above search results in document search."
},
"searchDocuments": "Search documents", "searchDocuments": "Search documents",
"@searchDocuments": {}, "@searchDocuments": {},
"resetFilter": "Filtreyi sıfırla", "resetFilter": "Filtreyi sıfırla",
@@ -182,10 +227,19 @@
"@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {},
"confirmDeletion": "Silmeyi onayla", "confirmDeletion": "Silmeyi onayla",
"@confirmDeletion": {}, "@confirmDeletion": {},
"areYouSureYouWantToDeleteTheFollowingDocuments": "Aşağıdaki belgeleri silmek istediğinizden emin misiniz?", "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Aşağıdaki belgeyi silmek istediğinizden emin misiniz?} other{Aşağıdaki belgeleri silmek istediğinizden emin misiniz?}}",
"@areYouSureYouWantToDeleteTheFollowingDocuments": {}, "@areYouSureYouWantToDeleteTheFollowingDocuments": {
"placeholders": {
"count": {}
}
},
"countSelected": "{count} seçilmiş", "countSelected": "{count} seçilmiş",
"@countSelected": {}, "@countSelected": {
"description": "Displayed in the appbar when at least one document is selected.",
"placeholders": {
"count": {}
}
},
"storagePath": "Depolama Yolu", "storagePath": "Depolama Yolu",
"@storagePath": {}, "@storagePath": {},
"prepareDocument": "Belge hazırla", "prepareDocument": "Belge hazırla",
@@ -277,7 +331,9 @@
"absolute": "Mutlak", "absolute": "Mutlak",
"@absolute": {}, "@absolute": {},
"hintYouCanAlsoSpecifyRelativeValues": "İpucu: Somut tarihlerin yanı sıra, geçerli tarihe göre bir zaman aralığı da belirleyebilirsiniz.", "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": "Miktar",
"@amount": {}, "@amount": {},
"relative": "Bağıl", "relative": "Bağıl",
@@ -364,10 +420,10 @@
"@upload": {}, "@upload": {},
"youreOffline": "Çevrimdışısınız.", "youreOffline": "Çevrimdışısınız.",
"@youreOffline": {}, "@youreOffline": {},
"assignASN": "Assign ASN",
"@assignASN": {},
"deleteDocument": "Delete document", "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": "Döküman gelen kutusundan kaldırıldı.",
"@removeDocumentFromInbox": {}, "@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?", "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": "Geri al",
"@undo": {}, "@undo": {},
"nUnseen": "{count} görüntülenmemiş", "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": "İ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": {}, "@swipeLeftToMarkADocumentAsSeen": {},
"yesterday": "Dün", "yesterday": "Dün",
@@ -613,5 +673,9 @@
"list": "List", "list": "List",
"@list": {}, "@list": {},
"remove": "Remove", "remove": "Remove",
"removeQueryFromSearchHistory": "Remove query from search history?" "removeQueryFromSearchHistory": "Remove query from search history?",
"dynamicColorScheme": "Dynamic",
"@dynamicColorScheme": {},
"classicColorScheme": "Classic",
"@classicColorScheme": {}
} }

View File

@@ -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/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/sharing/share_intent_queue.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/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/routes/document_details_route.dart';
import 'package:paperless_mobile/theme.dart'; import 'package:paperless_mobile/theme.dart';
import 'package:paperless_mobile/constants.dart'; import 'package:paperless_mobile/constants.dart';
@@ -232,7 +232,7 @@ class _PaperlessMobileEntrypointState extends State<PaperlessMobileEntrypoint> {
preferredColorScheme: settings.preferredColorSchemeOption, preferredColorScheme: settings.preferredColorSchemeOption,
), ),
themeMode: settings.preferredThemeMode, themeMode: settings.preferredThemeMode,
supportedLocales: S.delegate.supportedLocales, supportedLocales: S.supportedLocales,
locale: Locale.fromSubtags( locale: Locale.fromSubtags(
languageCode: settings.preferredLocaleSubtag, languageCode: settings.preferredLocaleSubtag,
), ),

View File

@@ -61,7 +61,6 @@ dependencies:
font_awesome_flutter: ^10.1.0 font_awesome_flutter: ^10.1.0
local_auth: ^2.1.2 local_auth: ^2.1.2
connectivity_plus: ^3.0.3 connectivity_plus: ^3.0.3
flutter_native_splash: ^2.2.11 flutter_native_splash: ^2.2.11
share_plus: ^6.2.0 share_plus: ^6.2.0
introduction_screen: ^3.0.2 introduction_screen: ^3.0.2
@@ -148,12 +147,7 @@ flutter:
# #
# For details regarding fonts from package dependencies, # For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages # 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: flutter_native_splash:
image: assets/logos/paperless_logo_green.png image: assets/logos/paperless_logo_green.png