Finished inbox, fixed reverse sort order, bloc refactorings

This commit is contained in:
Anton Stubenbord
2022-11-30 01:24:28 +01:00
parent 50190f035e
commit b1db2a1209
27 changed files with 1144 additions and 632 deletions

View File

@@ -23,7 +23,6 @@ linter:
# producing the lint. # producing the lint.
rules: rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule # avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at # Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options # https://dart.dev/guides/language/analysis-options

View File

@@ -0,0 +1,11 @@
import 'dart:developer';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
class BlocChangesObserver extends BlocObserver {
@override
void onChange(BlocBase bloc, Change change) {
super.onChange(bloc, change);
}
}

View File

@@ -171,7 +171,6 @@ class TimeoutClient implements BaseClient {
// try to parse contained error message, otherwise return response // try to parse contained error message, otherwise return response
final JSON json = jsonDecode(utf8.decode(response.bodyBytes)); final JSON json = jsonDecode(utf8.decode(response.bodyBytes));
final PaperlessValidationErrors errorMessages = {}; final PaperlessValidationErrors errorMessages = {};
//TODO: This could be simplified, look at error message format of paperless-ngx
for (final entry in json.entries) { for (final entry in json.entries) {
if (entry.value is List) { if (entry.value is List) {
errorMessages.putIfAbsent( errorMessages.putIfAbsent(

View File

@@ -12,7 +12,7 @@ class FileService {
) async { ) async {
final dir = await documentsDirectory; final dir = await documentsDirectory;
if (dir == null) { if (dir == null) {
throw ErrorMessage.unknown(); //TODO: better handling throw const ErrorMessage.unknown(); //TODO: better handling
} }
File file = File("${dir.path}/$filename"); File file = File("${dir.path}/$filename");
return file..writeAsBytes(bytes); return file..writeAsBytes(bytes);

View File

@@ -1,8 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:paperless_mobile/core/model/github_error_report.model.dart'; import 'package:paperless_mobile/core/model/github_error_report.model.dart';
import 'package:paperless_mobile/core/widgets/error_report_page.dart'; import 'package:paperless_mobile/core/widgets/error_report_page.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';

View File

@@ -4,12 +4,18 @@ import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart'; import 'package:shimmer/shimmer.dart';
class DocumentsListLoadingWidget extends StatelessWidget { class DocumentsListLoadingWidget extends StatelessWidget {
final List<Widget> above;
final List<Widget> below;
static const tags = [" ", " ", " "]; static const tags = [" ", " ", " "];
static const titleLengths = <double>[double.infinity, 150.0, 200.0]; static const titleLengths = <double>[double.infinity, 150.0, 200.0];
static const correspondentLengths = <double>[200.0, 300.0, 150.0]; static const correspondentLengths = <double>[200.0, 300.0, 150.0];
static const fontSize = 16.0; static const fontSize = 16.0;
const DocumentsListLoadingWidget({super.key}); const DocumentsListLoadingWidget({
super.key,
this.above = const [],
this.below = const [],
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -27,58 +33,67 @@ class DocumentsListLoadingWidget extends StatelessWidget {
highlightColor: Theme.of(context).brightness == Brightness.light highlightColor: Theme.of(context).brightness == Brightness.light
? Colors.grey[100]! ? Colors.grey[100]!
: Colors.grey[600]!, : Colors.grey[600]!,
child: ListView.builder( child: Column(
physics: const NeverScrollableScrollPhysics(), children: [
itemBuilder: (context, index) { ...above,
final r = Random(index); Expanded(
final tagCount = r.nextInt(tags.length + 1); child: ListView.builder(
final correspondentLength = correspondentLengths[ physics: const NeverScrollableScrollPhysics(),
r.nextInt(correspondentLengths.length - 1)]; itemBuilder: (context, index) {
final titleLength = final r = Random(index);
titleLengths[r.nextInt(titleLengths.length - 1)]; final tagCount = r.nextInt(tags.length + 1);
return ListTile( final correspondentLength = correspondentLengths[
isThreeLine: true, r.nextInt(correspondentLengths.length - 1)];
leading: ClipRRect( final titleLength =
borderRadius: BorderRadius.circular(8), titleLengths[r.nextInt(titleLengths.length - 1)];
child: Container( return ListTile(
color: Colors.white, isThreeLine: true,
height: 50, leading: ClipRRect(
width: 35, borderRadius: BorderRadius.circular(8),
), child: Container(
), color: Colors.white,
title: Container( height: 50,
padding: const EdgeInsets.symmetric(vertical: 2.0), width: 35,
width: correspondentLength,
height: fontSize,
color: Colors.white,
),
subtitle: Padding(
padding: const EdgeInsets.symmetric(vertical: 2.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Container(
padding: const EdgeInsets.symmetric(vertical: 2.0),
height: fontSize,
width: titleLength,
color: Colors.white,
),
Wrap(
spacing: 2.0,
children: List.generate(
tagCount,
(index) => InputChip(
label: Text(tags[r.nextInt(tags.length)]),
),
), ),
), ),
], title: Container(
), padding: const EdgeInsets.symmetric(vertical: 2.0),
width: correspondentLength,
height: fontSize,
color: Colors.white,
),
subtitle: Padding(
padding: const EdgeInsets.symmetric(vertical: 2.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Container(
padding:
const EdgeInsets.symmetric(vertical: 2.0),
height: fontSize,
width: titleLength,
color: Colors.white,
),
Wrap(
spacing: 2.0,
children: List.generate(
tagCount,
(index) => InputChip(
label: Text(tags[r.nextInt(tags.length)]),
),
),
),
],
),
),
);
},
itemCount: 25,
), ),
); ),
}, ...below,
itemCount: 25, ],
), ),
), ),
), ),

View File

@@ -1,9 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.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:paperless_mobile/core/model/github_error_report.model.dart'; import 'package:paperless_mobile/core/model/github_error_report.model.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart';
@@ -18,8 +15,8 @@ class ErrorReportPage extends StatefulWidget {
class _ErrorReportPageState extends State<ErrorReportPage> { class _ErrorReportPageState extends State<ErrorReportPage> {
final GlobalKey<FormBuilderState> _formKey = GlobalKey(); final GlobalKey<FormBuilderState> _formKey = GlobalKey();
static const String shortDescriptionKey = "shortDescription"; static const String shortDescriptionKey = 'shortDescription';
static const String longDescriptionKey = "longDescription"; static const String longDescriptionKey = 'longDescription';
bool _stackTraceCopied = false; bool _stackTraceCopied = false;
@override @override
@@ -27,11 +24,11 @@ class _ErrorReportPageState extends State<ErrorReportPage> {
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: true, resizeToAvoidBottomInset: true,
appBar: AppBar( appBar: AppBar(
title: Text("Report error"), title: const Text('Report error'),
actions: [ actions: [
TextButton( TextButton(
onPressed: _onSubmit, onPressed: _onSubmit,
child: Text("Submit"), child: const Text('Submit'),
), ),
], ],
), ),
@@ -40,31 +37,31 @@ class _ErrorReportPageState extends State<ErrorReportPage> {
child: ListView( child: ListView(
children: [ children: [
Text( Text(
"""Oops, an error has occurred! '''Oops, an error has occurred!
In order to improve the app and prevent messages like these, it is greatly appreciated if you report this error with a description of what happened and the actions leading up to this window. In order to improve the app and prevent messages like these, it is greatly appreciated if you report this error with a description of what happened and the actions leading up to this window.
Please fill the fields below and create a new issue in GitHub. Thanks! Please fill the fields below and create a new issue in GitHub. Thanks!
Note: If you have the GitHub Android app installed, the descriptions will not be taken into account! Skip these here and fill them in the GitHub issues form after submitting this report.""", Note: If you have the GitHub Android app installed, the descriptions will not be taken into account! Skip these here and fill them in the GitHub issues form after submitting this report.''',
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
).padded(), ).padded(),
Text( Text(
"Description", 'Description',
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
).padded(), ).padded(),
FormBuilderTextField( FormBuilderTextField(
name: shortDescriptionKey, name: shortDescriptionKey,
decoration: const InputDecoration( decoration: const InputDecoration(
label: Text("Short Description"), label: Text('Short Description'),
hintText: hintText:
"Please provide a brief description of what went wrong."), 'Please provide a brief description of what went wrong.'),
).padded(), ).padded(),
FormBuilderTextField( FormBuilderTextField(
name: shortDescriptionKey, name: shortDescriptionKey,
maxLines: null, maxLines: null,
keyboardType: TextInputType.multiline, keyboardType: TextInputType.multiline,
decoration: const InputDecoration( decoration: const InputDecoration(
label: Text("Detailled Description"), label: Text('Detailled Description'),
hintText: hintText:
"Please describe the exact actions taken that caused this error. Provide as much details as possible.", 'Please describe the exact actions taken that caused this error. Provide as much details as possible.',
), ),
).padded(), ).padded(),
if (widget.stackTrace != null) ...[ if (widget.stackTrace != null) ...[
@@ -72,19 +69,19 @@ Note: If you have the GitHub Android app installed, the descriptions will not be
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
"Stack Trace", 'Stack Trace',
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
).padded( ).padded(
const EdgeInsets.only(top: 8.0, left: 8.0, right: 8.0)), const EdgeInsets.only(top: 8.0, left: 8.0, right: 8.0)),
TextButton.icon( TextButton.icon(
label: const Text("Copy"), label: const Text('Copy'),
icon: const Icon(Icons.copy), icon: const Icon(Icons.copy),
onPressed: _copyStackTrace, onPressed: _copyStackTrace,
), ),
], ],
), ),
Text( Text(
"Since stack traces cannot be attached to the GitHub issue url, please copy the content of the stackTrace and paste it in the issue description. This will greatly increase the chance of quickly resolving the issue!", 'Since stack traces cannot be attached to the GitHub issue url, please copy the content of the stackTrace and paste it in the issue description. This will greatly increase the chance of quickly resolving the issue!',
style: Theme.of(context).textTheme.caption, style: Theme.of(context).textTheme.caption,
).padded(), ).padded(),
Text( Text(
@@ -107,7 +104,7 @@ Note: If you have the GitHub Android app installed, the descriptions will not be
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
const SnackBar( const SnackBar(
content: Text( content: Text(
"Stack trace copied to clipboard.", 'Stack trace copied to clipboard.',
), ),
duration: Duration(seconds: 2), duration: Duration(seconds: 2),
), ),
@@ -123,25 +120,25 @@ Note: If you have the GitHub Android app installed, the descriptions will not be
final continueSubmission = await showDialog<bool>( final continueSubmission = await showDialog<bool>(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: const Text("Continue without stack trace?"), title: const Text('Continue without stack trace?'),
content: const Text( content: const Text(
"It seems you have not yet copied the stack trace. The stack trace provides valuable insights into where an error came from and how it could be fixed. Are you sure you want to continue without providing the stack trace?", 'It seems you have not yet copied the stack trace. The stack trace provides valuable insights into where an error came from and how it could be fixed. Are you sure you want to continue without providing the stack trace?',
), ),
actionsAlignment: MainAxisAlignment.end, actionsAlignment: MainAxisAlignment.end,
actions: [ actions: [
TextButton( TextButton(
child: const Text("Yes, continue"), child: const Text('Yes, continue'),
onPressed: () => Navigator.pop(context, true), onPressed: () => Navigator.pop(context, true),
), ),
TextButton( TextButton(
child: const Text("No, copy stack trace"), child: const Text('No, copy stack trace'),
onPressed: () { onPressed: () {
_copyStackTrace(); _copyStackTrace();
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
), ),
TextButton( TextButton(
child: const Text("Cancel"), child: const Text('Cancel'),
onPressed: () => Navigator.pop(context, false), onPressed: () => Navigator.pop(context, false),
), ),
], ],

View File

@@ -22,3 +22,17 @@ extension DuplicateCheckable<T> on Iterable<T> {
return toSet().length != length; return toSet().length != length;
} }
} }
extension DateHelpers on DateTime {
bool get isToday {
final now = DateTime.now();
return now.day == day && now.month == month && now.year == year;
}
bool get isYesterday {
final yesterday = DateTime.now().subtract(const Duration(days: 1));
return yesterday.day == day &&
yesterday.month == month &&
yesterday.year == year;
}
}

View File

@@ -17,6 +17,7 @@ class ApplicationIntroSlideshow extends StatefulWidget {
_ApplicationIntroSlideshowState(); _ApplicationIntroSlideshowState();
} }
//TODO: INTL ALL
class _ApplicationIntroSlideshowState extends State<ApplicationIntroSlideshow> { class _ApplicationIntroSlideshowState extends State<ApplicationIntroSlideshow> {
AssetImage secureImage = AssetImages.secureDocuments.image; AssetImage secureImage = AssetImages.secureDocuments.image;
AssetImage successImage = AssetImages.success.image; AssetImage successImage = AssetImages.success.image;

View File

@@ -1,6 +1,5 @@
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:injectable/injectable.dart';
import 'package:paperless_mobile/features/documents/model/document.model.dart'; import 'package:paperless_mobile/features/documents/model/document.model.dart';
import 'package:paperless_mobile/features/documents/repository/document_repository.dart'; import 'package:paperless_mobile/features/documents/repository/document_repository.dart';

View File

@@ -58,7 +58,6 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
print("Returning document...");
Navigator.of(context) Navigator.of(context)
.pop(BlocProvider.of<DocumentDetailsCubit>(context).state.document); .pop(BlocProvider.of<DocumentDetailsCubit>(context).state.document);
return Future.value(false); return Future.value(false);

View File

@@ -79,8 +79,10 @@ class DocumentsCubit extends Cubit<DocumentsState> {
} }
final newFilter = state.filter.copyWith(page: state.filter.page + 1); final newFilter = state.filter.copyWith(page: state.filter.page + 1);
final result = await documentRepository.find(newFilter); final result = await documentRepository.find(newFilter);
emit(DocumentsState( emit(
isLoaded: true, value: [...state.value, result], filter: newFilter)); DocumentsState(
isLoaded: true, value: [...state.value, result], filter: newFilter),
);
} }
/// ///

View File

@@ -5,18 +5,18 @@ import 'package:paperless_mobile/core/type/types.dart';
class DocumentModel extends Equatable { class DocumentModel extends Equatable {
static const idKey = 'id'; static const idKey = 'id';
static const titleKey = "title"; static const titleKey = 'title';
static const contentKey = "content"; static const contentKey = 'content';
static const archivedFileNameKey = "archived_file_name"; static const archivedFileNameKey = 'archived_file_name';
static const asnKey = "archive_serial_number"; static const asnKey = 'archive_serial_number';
static const createdKey = "created"; static const createdKey = 'created';
static const modifiedKey = "modified"; static const modifiedKey = 'modified';
static const addedKey = "added"; static const addedKey = 'added';
static const correspondentKey = "correspondent"; static const correspondentKey = 'correspondent';
static const originalFileNameKey = 'original_file_name'; static const originalFileNameKey = 'original_file_name';
static const documentTypeKey = "document_type"; static const documentTypeKey = 'document_type';
static const tagsKey = "tags"; static const tagsKey = 'tags';
static const storagePathKey = "storage_path"; static const storagePathKey = 'storage_path';
final int id; final int id;
final String title; final String title;
@@ -121,7 +121,7 @@ class DocumentModel extends Equatable {
List<Object?> get props => [ List<Object?> get props => [
id, id,
title, title,
content, content.hashCode,
tags, tags,
documentType, documentType,
storagePath, storagePath,

View File

@@ -18,6 +18,7 @@ class OnlyNotAssignedTagsQuery extends TagsQuery {
class AnyAssignedTagsQuery extends TagsQuery { class AnyAssignedTagsQuery extends TagsQuery {
final Iterable<int> tagIds; final Iterable<int> tagIds;
const AnyAssignedTagsQuery({ const AnyAssignedTagsQuery({
this.tagIds = const [], this.tagIds = const [],
}); });

View File

@@ -37,26 +37,21 @@ class DocumentsPage extends StatefulWidget {
} }
class _DocumentsPageState extends State<DocumentsPage> { class _DocumentsPageState extends State<DocumentsPage> {
final PagingController<int, DocumentModel> _pagingController = final _pagingController = PagingController<int, DocumentModel>(
PagingController<int, DocumentModel>(
firstPageKey: 1, firstPageKey: 1,
); );
final PanelController _filterPanelController = PanelController(); final _filterPanelController = PanelController();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_initDocuments();
_pagingController.addPageRequestListener(_loadNewPage);
}
Future<void> _initDocuments() async {
try { try {
BlocProvider.of<DocumentsCubit>(context).load(); BlocProvider.of<DocumentsCubit>(context).load();
} on ErrorMessage catch (error, stackTrace) { } on ErrorMessage catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace); showErrorMessage(context, error, stackTrace);
} }
_pagingController.addPageRequestListener(_loadNewPage);
} }
@override @override
@@ -120,7 +115,10 @@ class _DocumentsPageState extends State<DocumentsPage> {
return Scaffold( return Scaffold(
drawer: BlocProvider.value( drawer: BlocProvider.value(
value: BlocProvider.of<AuthenticationCubit>(context), value: BlocProvider.of<AuthenticationCubit>(context),
child: const InfoDrawer(), child: InfoDrawer(
afterInboxClosed: () =>
BlocProvider.of<DocumentsCubit>(context).reload(),
),
), ),
resizeToAvoidBottomInset: true, resizeToAvoidBottomInset: true,
body: SlidingUpPanel( body: SlidingUpPanel(

View File

@@ -1,33 +1,30 @@
import 'package:badges/badges.dart';
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/core/model/paperless_statistics_state.dart';
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart'; import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
import 'package:paperless_mobile/core/model/error_message.dart'; import 'package:paperless_mobile/core/model/error_message.dart';
import 'package:paperless_mobile/core/model/paperless_server_information.dart'; import 'package:paperless_mobile/core/model/paperless_server_information.dart';
import 'package:paperless_mobile/core/model/paperless_statistics.dart';
import 'package:paperless_mobile/core/service/paperless_statistics_service.dart';
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
import 'package:paperless_mobile/features/inbox/view/pages/inbox_page.dart';
import 'package:paperless_mobile/features/settings/bloc/application_settings_cubit.dart';
import 'package:paperless_mobile/di_initializer.dart'; import 'package:paperless_mobile/di_initializer.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
import 'package:paperless_mobile/features/inbox/view/pages/inbox_page.dart';
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart'; import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart'; import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart'; import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
import 'package:paperless_mobile/features/settings/view/settings_page.dart';
import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart'; import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart';
import 'package:paperless_mobile/features/scan/bloc/document_scanner_cubit.dart'; import 'package:paperless_mobile/features/scan/bloc/document_scanner_cubit.dart';
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart'; import 'package:paperless_mobile/features/settings/bloc/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/view/settings_page.dart';
import 'package:paperless_mobile/generated/l10n.dart'; import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/util.dart'; import 'package:paperless_mobile/util.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';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
class InfoDrawer extends StatelessWidget { class InfoDrawer extends StatelessWidget {
const InfoDrawer({Key? key}) : super(key: key); final VoidCallback? afterInboxClosed;
const InfoDrawer({Key? key, this.afterInboxClosed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ClipRRect( return ClipRRect(
@@ -52,7 +49,7 @@ class InfoDrawer extends StatelessWidget {
Row( Row(
children: [ children: [
Image.asset( Image.asset(
"assets/logos/paperless_logo_white.png", 'assets/logos/paperless_logo_white.png',
height: 32, height: 32,
width: 32, width: 32,
color: Theme.of(context).colorScheme.onPrimaryContainer, color: Theme.of(context).colorScheme.onPrimaryContainer,
@@ -124,7 +121,7 @@ class InfoDrawer extends StatelessWidget {
leading: const Icon(Icons.inbox), leading: const Icon(Icons.inbox),
onTap: () => _onOpenInbox(context), onTap: () => _onOpenInbox(context),
), ),
Divider(), const Divider(),
ListTile( ListTile(
leading: const Icon(Icons.settings), leading: const Icon(Icons.settings),
title: Text( title: Text(
@@ -145,27 +142,27 @@ class InfoDrawer extends StatelessWidget {
title: Text(S.of(context).appDrawerReportBugLabel), title: Text(S.of(context).appDrawerReportBugLabel),
onTap: () { onTap: () {
launchUrlString( launchUrlString(
"https://github.com/astubenbord/paperless-mobile/issues/new"); 'https://github.com/astubenbord/paperless-mobile/issues/new');
}, },
), ),
const Divider(), const Divider(),
AboutListTile( AboutListTile(
icon: const Icon(Icons.info), icon: const Icon(Icons.info),
applicationIcon: const ImageIcon( applicationIcon: const ImageIcon(
AssetImage("assets/logos/paperless_logo_green.png")), AssetImage('assets/logos/paperless_logo_green.png')),
applicationName: "Paperless Mobile", applicationName: 'Paperless Mobile',
applicationVersion: applicationVersion:
kPackageInfo.version + "+" + kPackageInfo.buildNumber, kPackageInfo.version + '+' + kPackageInfo.buildNumber,
aboutBoxChildren: [ aboutBoxChildren: [
Text( Text(
'${S.of(context).aboutDialogDevelopedByText} Anton Stubenbord'), '${S.of(context).aboutDialogDevelopedByText} Anton Stubenbord'),
Link( Link(
uri: Uri.parse( uri: Uri.parse(
"https://github.com/astubenbord/paperless-mobile"), 'https://github.com/astubenbord/paperless-mobile'),
builder: (context, followLink) => GestureDetector( builder: (context, followLink) => GestureDetector(
onTap: followLink, onTap: followLink,
child: Text( child: Text(
"https://github.com/astubenbord/paperless-mobile", 'https://github.com/astubenbord/paperless-mobile',
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.tertiary), color: Theme.of(context).colorScheme.tertiary),
), ),
@@ -173,7 +170,7 @@ class InfoDrawer extends StatelessWidget {
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Text( Text(
"Credits", 'Credits',
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
_buildOnboardingImageCredits(), _buildOnboardingImageCredits(),
@@ -204,36 +201,38 @@ class InfoDrawer extends StatelessWidget {
); );
} }
Future<dynamic> _onOpenInbox(BuildContext context) { Future<void> _onOpenInbox(BuildContext context) async {
return Navigator.of(context).push( await Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (_) => GlobalStateBlocProvider( builder: (_) => GlobalStateBlocProvider(
additionalProviders: [ additionalProviders: [
BlocProvider<InboxCubit>.value( BlocProvider<InboxCubit>.value(
value: getIt<InboxCubit>()..initialize(), value: getIt<InboxCubit>()..loadInbox(),
), ),
], ],
child: const InboxPage(), child: const InboxPage(),
), ),
maintainState: false,
), ),
); );
afterInboxClosed?.call();
} }
Link _buildOnboardingImageCredits() { Link _buildOnboardingImageCredits() {
return Link( return Link(
uri: Uri.parse( uri: Uri.parse(
"https://www.freepik.com/free-vector/business-team-working-cogwheel-mechanism-together_8270974.htm#query=setting&position=4&from_view=author"), 'https://www.freepik.com/free-vector/business-team-working-cogwheel-mechanism-together_8270974.htm#query=setting&position=4&from_view=author'),
builder: (context, followLink) => Wrap( builder: (context, followLink) => Wrap(
children: [ children: [
const Text("Onboarding images by "), const Text('Onboarding images by '),
GestureDetector( GestureDetector(
onTap: followLink, onTap: followLink,
child: Text( child: Text(
"pch.vector", 'pch.vector',
style: TextStyle(color: Theme.of(context).colorScheme.tertiary), style: TextStyle(color: Theme.of(context).colorScheme.tertiary),
), ),
), ),
const Text(" on Freepik.") const Text(' on Freepik.')
], ],
), ),
); );

View File

@@ -21,9 +21,18 @@ class InboxCubit extends Cubit<InboxState> {
/// ///
/// Fetches inbox tag ids and loads the inbox items (documents). /// Fetches inbox tag ids and loads the inbox items (documents).
/// ///
Future<void> initialize() async { Future<void> loadInbox() async {
final inboxTags = await _labelRepository.getTags().then( final inboxTags = await _labelRepository.getTags().then(
(value) => value.where((t) => t.isInboxTag ?? false).map((t) => t.id!)); (tags) => tags.where((t) => t.isInboxTag ?? false).map((t) => t.id!),
);
if (inboxTags.isEmpty) {
// no inbox tags = no inbox items.
return emit(const InboxState(
isLoaded: true,
inboxItems: [],
inboxTags: [],
));
}
final inboxDocuments = await _documentRepository final inboxDocuments = await _documentRepository
.find(DocumentFilter( .find(DocumentFilter(
tags: AnyAssignedTagsQuery(tagIds: inboxTags), tags: AnyAssignedTagsQuery(tagIds: inboxTags),
@@ -38,33 +47,11 @@ class InboxCubit extends Cubit<InboxState> {
emit(newState); emit(newState);
} }
Future<void> reloadInbox() async {
if (!state.isLoaded) {
throw "State has not yet loaded. Ensure the state is loaded when calling this method!";
}
final inboxDocuments = await _documentRepository
.find(DocumentFilter(
tags: AnyAssignedTagsQuery(tagIds: state.inboxTags),
sortField: SortField.added,
))
.then((psr) => psr.results);
emit(
InboxState(
isLoaded: true,
inboxItems: inboxDocuments,
inboxTags: state.inboxTags,
),
);
}
/// ///
/// Updates the document with all inbox tags removed and removes the document /// Updates the document with all inbox tags removed and removes the document
/// from the currently loaded inbox documents. /// from the currently loaded inbox documents.
/// ///
Future<Iterable<int>> remove(DocumentModel document) async { Future<Iterable<int>> remove(DocumentModel document) async {
if (!state.isLoaded) {
throw "State has not loaded yet. Ensure the state is loaded when calling this method!";
}
final tagsToRemove = final tagsToRemove =
document.tags.toSet().intersection(state.inboxTags.toSet()); document.tags.toSet().intersection(state.inboxTags.toSet());

View File

@@ -1,15 +1,19 @@
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:intl/date_symbol_data_local.dart'; import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'package:paperless_mobile/core/model/error_message.dart'; import 'package:paperless_mobile/core/model/error_message.dart';
import 'package:paperless_mobile/core/widgets/documents_list_loading_widget.dart'; import 'package:paperless_mobile/core/widgets/documents_list_loading_widget.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/documents/model/document.model.dart'; import 'package:paperless_mobile/features/documents/model/document.model.dart';
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart'; import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
import 'package:paperless_mobile/features/inbox/bloc/state/inbox_state.dart'; import 'package:paperless_mobile/features/inbox/bloc/state/inbox_state.dart';
import 'package:paperless_mobile/features/inbox/view/widgets/document_inbox_item.dart'; import 'package:paperless_mobile/features/inbox/view/widgets/inbox_item.dart';
import 'package:paperless_mobile/features/inbox/view/widgets/inbox_empty_widget.dart';
import 'package:paperless_mobile/generated/l10n.dart'; import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/util.dart'; import 'package:paperless_mobile/util.dart';
import 'package:collection/collection.dart';
import 'package:paperless_mobile/extensions/dart_extensions.dart';
class InboxPage extends StatefulWidget { class InboxPage extends StatefulWidget {
const InboxPage({super.key}); const InboxPage({super.key});
@@ -30,7 +34,6 @@ class _InboxPageState extends State<InboxPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//TODO: Group by date (today, yseterday, etc.)
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).bottomNavInboxPageLabel), title: Text(S.of(context).bottomNavInboxPageLabel),
@@ -39,7 +42,7 @@ class _InboxPageState extends State<InboxPage> {
onPressed: () => Navigator.pop(context), onPressed: () => Navigator.pop(context),
), ),
bottom: PreferredSize( bottom: PreferredSize(
preferredSize: Size.fromHeight(14), preferredSize: const Size.fromHeight(14),
child: BlocBuilder<InboxCubit, InboxState>( child: BlocBuilder<InboxCubit, InboxState>(
builder: (context, state) { builder: (context, state) {
return Align( return Align(
@@ -49,7 +52,7 @@ class _InboxPageState extends State<InboxPage> {
child: ColoredBox( child: ColoredBox(
color: Theme.of(context).colorScheme.secondaryContainer, color: Theme.of(context).colorScheme.secondaryContainer,
child: Text( child: Text(
'${state.inboxItems.length} unseen', '${state.inboxItems.length} ${S.of(context).inboxPageUnseenText}',
textAlign: TextAlign.start, textAlign: TextAlign.start,
style: Theme.of(context).textTheme.caption, style: Theme.of(context).textTheme.caption,
).padded(const EdgeInsets.symmetric(horizontal: 4.0)), ).padded(const EdgeInsets.symmetric(horizontal: 4.0)),
@@ -62,8 +65,11 @@ class _InboxPageState extends State<InboxPage> {
), ),
floatingActionButton: BlocBuilder<InboxCubit, InboxState>( floatingActionButton: BlocBuilder<InboxCubit, InboxState>(
builder: (context, state) { builder: (context, state) {
if (!state.isLoaded || state.inboxItems.isEmpty) {
return const SizedBox.shrink();
}
return FloatingActionButton.extended( return FloatingActionButton.extended(
label: Text("Mark all as seen"), label: Text(S.of(context).inboxPageMarkAllAsSeenLabel),
icon: const Icon(Icons.done_all), icon: const Icon(Icons.done_all),
onPressed: state.isLoaded && state.inboxItems.isNotEmpty onPressed: state.isLoaded && state.inboxItems.isNotEmpty
? () => _onMarkAllAsSeen( ? () => _onMarkAllAsSeen(
@@ -81,51 +87,68 @@ class _InboxPageState extends State<InboxPage> {
} }
if (state.inboxItems.isEmpty) { if (state.inboxItems.isEmpty) {
return RefreshIndicator( return InboxEmptyWidget(
key: _emptyStateRefreshIndicatorKey, emptyStateRefreshIndicatorKey: _emptyStateRefreshIndicatorKey,
onRefresh: () =>
BlocProvider.of<InboxCubit>(context).reloadInbox(),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You do not have unseen documents.'),
TextButton(
onPressed: () =>
_emptyStateRefreshIndicatorKey.currentState?.show(),
child: Text('Refresh'),
),
],
),
),
); );
} }
// Build a list of slivers alternating between SliverToBoxAdapter
// (group header) and a SliverList (inbox items).
final List<Widget> slivers = _groupByDate(state.inboxItems)
.entries
.map(
(entry) => [
SliverToBoxAdapter(
child: Align(
alignment: Alignment.centerLeft,
child: ClipRRect(
borderRadius: BorderRadius.circular(32.0),
child: Text(
entry.key,
style: Theme.of(context).textTheme.caption,
textAlign: TextAlign.center,
).padded(),
),
).padded(const EdgeInsets.only(top: 8.0)),
),
SliverList(
delegate: SliverChildBuilderDelegate(
childCount: entry.value.length,
(context, index) => _buildListItem(
context,
entry.value[index],
),
),
),
],
)
.flattened
.toList();
return RefreshIndicator( return RefreshIndicator(
onRefresh: () => BlocProvider.of<InboxCubit>(context).reloadInbox(), onRefresh: () => BlocProvider.of<InboxCubit>(context).loadInbox(),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Text(
'Hint: Swipe left to mark a document as seen. This will remove all inbox tags from the document.', //TODO: INTL
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.caption,
).padded(
const EdgeInsets.only(
top: 4.0,
left: 8.0,
right: 8.0,
bottom: 8.0,
),
),
Expanded( Expanded(
child: ListView.builder( child: CustomScrollView(
itemCount: state.inboxItems.length, slivers: [
itemBuilder: (context, index) { SliverToBoxAdapter(
final doc = state.inboxItems.elementAt(index); child: Text(
return _buildListItem(context, doc); S.of(context).inboxPageUsageHintText,
}, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.caption,
).padded(
const EdgeInsets.only(
top: 8.0,
left: 8.0,
right: 8.0,
bottom: 8.0,
),
),
),
...slivers
],
), ),
), ),
], ],
@@ -147,7 +170,7 @@ class _InboxPageState extends State<InboxPage> {
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
).padded(), ).padded(),
Text( Text(
'Mark as seen', //TODO: INTL S.of(context).inboxPageMarkAsSeenText,
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
@@ -156,7 +179,7 @@ class _InboxPageState extends State<InboxPage> {
).padded(), ).padded(),
confirmDismiss: (_) => _onItemDismissed(doc), confirmDismiss: (_) => _onItemDismissed(doc),
key: UniqueKey(), key: UniqueKey(),
child: DocumentInboxItem(document: doc), child: InboxItem(document: doc),
); );
} }
@@ -167,9 +190,11 @@ 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('Confirm action'), title: Text(S
.of(context)
.inboxPageMarkAllAsSeenConfirmationDialogTitleText),
content: Text( content: Text(
'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.\nThis action is not reversible! Are you sure you want to continue?', S.of(context).inboxPageMarkAllAsSeenConfirmationDialogText,
), ),
actions: [ actions: [
TextButton( TextButton(
@@ -178,7 +203,10 @@ class _InboxPageState extends State<InboxPage> {
), ),
TextButton( TextButton(
onPressed: () => Navigator.of(context).pop(true), onPressed: () => Navigator.of(context).pop(true),
child: Text(S.of(context).genericActionOkLabel), child: Text(
S.of(context).genericActionOkLabel,
style: TextStyle(color: Theme.of(context).colorScheme.error),
),
), ),
], ],
), ),
@@ -195,9 +223,9 @@ class _InboxPageState extends State<InboxPage> {
await BlocProvider.of<InboxCubit>(context).remove(doc); await BlocProvider.of<InboxCubit>(context).remove(doc);
showSnackBar( showSnackBar(
context, context,
'Document removed from inbox.', //TODO: INTL S.of(context).inboxPageDocumentRemovedMessageText,
action: SnackBarAction( action: SnackBarAction(
label: 'UNDO', //TODO: INTL label: S.of(context).inboxPageUndoRemoveText,
onPressed: () => _onUndoMarkAsSeen(doc, removedTags), onPressed: () => _onUndoMarkAsSeen(doc, removedTags),
), ),
); );
@@ -225,4 +253,21 @@ class _InboxPageState extends State<InboxPage> {
showErrorMessage(context, error, stackTrace); showErrorMessage(context, error, stackTrace);
} }
} }
Map<String, List<DocumentModel>> _groupByDate(
Iterable<DocumentModel> documents,
) {
return groupBy<DocumentModel, String>(
documents,
(doc) {
if (doc.added.isToday) {
return S.of(context).inboxPageTodayText;
}
if (doc.added.isYesterday) {
return S.of(context).inboxPageYesterdayText;
}
return DateFormat.yMMMMd().format(doc.added);
},
);
}
} }

View File

@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
class InboxEmptyWidget extends StatelessWidget {
const InboxEmptyWidget({
Key? key,
required GlobalKey<RefreshIndicatorState> emptyStateRefreshIndicatorKey,
}) : _emptyStateRefreshIndicatorKey = emptyStateRefreshIndicatorKey,
super(key: key);
final GlobalKey<RefreshIndicatorState> _emptyStateRefreshIndicatorKey;
@override
Widget build(BuildContext context) {
return RefreshIndicator(
key: _emptyStateRefreshIndicatorKey,
onRefresh: () => BlocProvider.of<InboxCubit>(context).loadInbox(),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You do not have unseen documents.'),
TextButton(
onPressed: () =>
_emptyStateRefreshIndicatorKey.currentState?.show(),
child: Text('Refresh'),
),
],
),
),
);
}
}

View File

@@ -11,14 +11,16 @@ import 'package:paperless_mobile/features/documents/view/widgets/document_previe
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart'; import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.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';
class DocumentInboxItem extends StatelessWidget { class InboxItem extends StatelessWidget {
static const _a4AspectRatio = 1 / 1.4142;
final DocumentModel document; final DocumentModel document;
const DocumentInboxItem({ const InboxItem({
super.key, super.key,
required this.document, required this.document,
}); });
static const _a4AspectRatio = 1 / 1.4142;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ListTile( return ListTile(

View File

@@ -50,7 +50,7 @@ class _EditLabelPageState<T extends Label> extends State<EditLabelPage<T>> {
], ],
), ),
floatingActionButton: FloatingActionButton.extended( floatingActionButton: FloatingActionButton.extended(
icon: const Icon(Icons.add), icon: const Icon(Icons.update),
label: Text(S.of(context).genericActionUpdateLabel), label: Text(S.of(context).genericActionUpdateLabel),
onPressed: _onSubmit, onPressed: _onSubmit,
), ),

View File

@@ -1,201 +1,419 @@
{ {
"@@locale": "de", "@@locale": "de",
"documentTitlePropertyLabel": "Titel",
"documentCreatedPropertyLabel": "Ausgestellt am",
"documentAddedPropertyLabel": "Hinzugefügt am",
"documentModifiedPropertyLabel": "Geändert am",
"documentDocumentTypePropertyLabel": "Dokumenttyp",
"documentCorrespondentPropertyLabel": "Korrespondent",
"documentStoragePathPropertyLabel": "Speicherpfad",
"documentTagsPropertyLabel": "Tags",
"documentArchiveSerialNumberPropertyLongLabel": "Archiv-Seriennummer",
"documentArchiveSerialNumberPropertyShortLabel": "ASN",
"appTitleText": "Paperless Mobile",
"bottomNavDocumentsPageLabel": "Dokumente",
"bottomNavScannerPageLabel": "Scanner",
"bottomNavLabelsPageLabel": "Kennzeichnungen",
"documentsPageTitle": "Dokumente",
"documentsFilterPageTitle": "Dokumente Filtern",
"documentsFilterPageAdvancedLabel": "Erweitert",
"documentsFilterPageDateRangeLastSevenDaysLabel": "Letzte 7 Tage",
"documentsFilterPageDateRangeLastMonthLabel": "Letzter Monat",
"documentsFilterPageDateRangeLastThreeMonthsLabel": "Letzten 3 Monate",
"documentsFilterPageDateRangeLastYearLabel": "Letztes Jahr",
"documentsFilterPageApplyFilterLabel": "Anwenden",
"documentsFilterPageResetFilterLabel": "Zurücksetzen",
"documentsFilterPageQueryOptionsTitleLabel": "Titel",
"documentsFilterPageQueryOptionsTitleAndContentLabel": "Titel & Inhalt",
"documentsFilterPageQueryOptionsExtendedLabel": "Erweitert",
"documentsFilterPageQueryOptionsAsnLabel": "ASN",
"documentsFilterPageDateRangeFieldStartLabel": "Von",
"documentsFilterPageDateRangeFieldEndLabel": "Bis",
"genericActionOkLabel": "Ok",
"genericActionCancelLabel": "Abbrechen",
"genericActionDeleteLabel": "Löschen",
"genericActionEditLabel": "Bearbeiten",
"genericActionSaveLabel": "Speichern",
"genericActionSelectText": "Auswählen",
"genericActionCreateLabel": "Erstellen",
"genericActionUploadLabel": "Hochladen",
"genericActionUpdateLabel": "Aktualisieren",
"appDrawerSettingsLabel": "Einstellungen",
"appDrawerAboutLabel": "Über diese App",
"appDrawerAboutInfoLoadingText": "Lade Anwendungsinformationen...",
"appDrawerReportBugLabel": "Einen Fehler melden",
"appDrawerLogoutLabel": "Verbindung trennen",
"loginPageLoginButtonLabel": "Verbinden",
"loginPageTitle": "Mit Paperless verbinden",
"loginPageAdvancedLabel": "Erweiterte Einstellungen",
"loginPageServerUrlValidatorMessageText": "Server-Addresse darf nicht leer sein.",
"loginPageServerUrlFieldLabel": "Server-Adresse",
"loginPageUsernameValidatorMessageText": "Nutzername darf nicht leer sein.",
"loginPageUsernameLabel": "Nutzername",
"loginPagePasswordValidatorMessageText": "Passwort darf nicht leer sein.",
"loginPagePasswordFieldLabel": "Passwort",
"loginPageClientCertificatePassphraseLabel": "Passphrase",
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Falsche oder fehlende Zertifikatspassphrase.",
"documentDetailsPageTabOverviewLabel": "Übersicht",
"documentDetailsPageTabContentLabel": "Inhalt",
"documentDetailsPageTabMetaDataLabel": "Metadaten",
"documentsPageEmptyStateOopsText": "Ups.",
"documentsPageEmptyStateNothingHereText": "Es scheint nichts hier zu sein...",
"errorMessageUnknonwnError": "Ein unbekannter Fehler ist aufgetreten.",
"errorMessageAuthenticationFailed": "Authentifizierung fehlgeschlagen, bitte versuche es erneut.",
"errorMessageNotAuthenticated": "User is not authenticated.",
"errorMessageDocumentUploadFailed": "Dokument konnte nicht hochgeladen werden, bitte versuche es erneut.",
"errorMessageDocumentUpdateFailed": "Dokument konnte nicht aktualisiert werden, bitte versuche es erneut.",
"errorMessageDocumentDeleteFailed": "Dokument konnte nicht gelöscht werden, bitte versuche es erneut.",
"errorMessageDocumentPreviewFailed": "Vorschau konnte nicht geladen werden.",
"errorMessageDocumentAsnQueryFailed": "Archiv-Seriennummer konnte nicht zugewiesen werden.",
"errorMessageTagCreateFailed": "Tag konnte nicht erstellt werden, bitte versuche es erneut.",
"errorMessageTagLoadFailed": "Tags konnten nicht geladen werden.",
"errorMessageDocumentTypeCreateFailed": "Dokumenttyp konnte nicht erstellt werden, bitte versuche es erneut.",
"errorMessageDocumentTypeLoadFailed": "Dokumenttypen konnten nicht geladen werden, bitte versuche es erneut.",
"errorMessageCorrespondentCreateFailed": "Korrespondent konnte nicht erstellt werden, bitte versuche es erneut.",
"errorMessageCorrespondentLoadFailed": "Korrespondenten konnten nicht geladen werden.",
"errorMessageScanRemoveFailed": "Beim Löschen der Aufnahmen ist ein Fehler aufgetreten.",
"errorMessageInvalidClientCertificateConfiguration": "Ungültiges Zertifikat oder fehlende Passphrase, bitte versuche es erneut.",
"errorMessageDocumentLoadFailed": "Dokumente konnten nicht geladen werden, bitte versuche es erneut.",
"documentsPageSelectionBulkDeleteDialogTitle": "Löschen bestätigen",
"documentsPageSelectionBulkDeleteDialogWarningTextOne": "Sind Sie sicher, dass sie folgendes Dokument löschen wollen?",
"documentsPageSelectionBulkDeleteDialogWarningTextMany": "Sind Sie sicher, dass sie folgende Dokumente löschen wollen?",
"documentsPageSelectionBulkDeleteDialogContinueText": "Diese Aktion ist unwiderruflich. Möchten Sie trotzdem fortfahren?",
"documentPreviewPageTitle": "Vorschau",
"appSettingsBiometricAuthenticationLabel": "Biometrische Authentifizierung aktivieren",
"appSettingsEnableBiometricAuthenticationReasonText": "Authentifizieren, um die biometrische Authentifizierung zu aktivieren.",
"appSettingsDisableBiometricAuthenticationReasonText": "Authentifizieren, um die biometrische Authentifizierung zu deaktivieren.",
"errorMessageBulkActionFailed": "Es ist ein Fehler beim massenhaften bearbeiten der Dokumente aufgetreten.",
"errorMessageBiotmetricsNotSupported": "Biometrische Authentifizierung wird von diesem Gerät nicht unterstützt.",
"errorMessageBiometricAuthenticationFailed": "Biometrische Authentifizierung fehlgeschlagen.",
"errorMessageDeviceOffline": "Daten konnten nicht geladen werden: Eine Verbindung zum Internet konnte nicht hergestellt werden.",
"errorMessageServerUnreachable": "Es konnte keine Verbindung zu Deinem Paperless Server hergestellt werden, ist die Instanz in Betrieb?",
"aboutDialogDevelopedByText": "Entwickelt von", "aboutDialogDevelopedByText": "Entwickelt von",
"documentsPageBulkDeleteSuccessfulText": "Das massenhafte Löschen der Dokumente war erfolgreich.", "@aboutDialogDevelopedByText": {},
"documentDeleteSuccessMessage": "Das Dokument wurde erfolgreich gelöscht.",
"documentsSelectedText": "ausgewählt",
"labelsPageCorrespondentsTitleText": "Korrespondenten",
"labelsPageDocumentTypesTitleText": "Dokumenttypen",
"labelsPageTagsTitleText": "Tags",
"tagColorPropertyLabel": "Farbe",
"tagInboxTagPropertyLabel": "Posteingangs-Tag",
"documentScannerPageEmptyStateText": "Es wurden noch keine Dokumente gescannt.",
"documentScannerPageTitle": "Scanner",
"documentScannerPageResetButtonTooltipText": "Alle scans löschen",
"documentScannerPageUploadButtonTooltip": "Dokument hochladen",
"documentScannerPageAddScanButtonLabel": "Scanne ein Dokument",
"documentScannerPageOrText": "oder",
"documentScannerPageUploadFromThisDeviceButtonLabel": "Lade ein Dokument von diesem Gerät hoch",
"addTagPageTitle": "Neuer Tag",
"addCorrespondentPageTitle": "Neuer Korrespondent", "addCorrespondentPageTitle": "Neuer Korrespondent",
"@addCorrespondentPageTitle": {},
"addDocumentTypePageTitle": "Neuer Dokumenttyp", "addDocumentTypePageTitle": "Neuer Dokumenttyp",
"labelNamePropertyLabel": "Name", "@addDocumentTypePageTitle": {},
"labelMatchPropertyLabel": "Zuweisungsmuster",
"labelMatchingAlgorithmPropertyLabel": "Zuweisungsalgorithmus",
"labelIsInsensivitePropertyLabel": "Groß-/Kleinschreibung irrelevant",
"linkedDocumentsPageTitle": "Referenzierte Dokumente",
"documentsUploadPageTitle": "Dokument vorbereiten",
"documentUploadFileNameLabel": "Dateiname",
"documentUploadSuccessText": "Das Dokument wurde erfolgreich hochgeladen. Verarbeite...",
"documentUploadProcessingSuccessfulText": "Das Dokument wurde erfolgreich verarbeitet.",
"documentUploadProcessingSuccessfulReloadActionText": "Neu laden",
"labelNotAssignedText": "Nicht zugewiesen",
"correspondentFormFieldSearchHintText": "Beginne zu tippen...",
"documentTypeFormFieldSearchHintText": "Beginne zu tippen...",
"tagFormFieldSearchHintText": "Beginne zu tippen...",
"documentsPageOrderByLabel": "Sortiere nach",
"documentDetailsPageAssignAsnButtonLabel": "Zuweisen",
"documentMetaDataMediaFilenamePropertyLabel": "Media-Dateiname",
"documentMetaDataChecksumLabel": "MD5-Prüfsumme Original",
"documentMetaDataOriginalFileSizeLabel": "Dateigröße Original",
"documentMetaDataOriginalMimeTypeLabel": "MIME-Typ Original",
"loginPageClientCertificateSettingLabel": "Client Zertifikat",
"loginPageClientCertificateSettingDescriptionText": "Konfiguriere Mutual TLS Authentifizierung",
"loginPageClientCertificateSettingInvalidFileFormatValidationText": "Ungültiges Zertifikatsformat, nur .pfx ist erlaubt.",
"loginPageClientCertificateSettingSelectFileText": "Datei auswählen...",
"uploadPageAutomaticallInferredFieldsHintText": "Wenn Werte für diese Felder angegeben werden, wird Paperless nicht automatisch einen Wert zuweisen. Wenn diese Felder automatisch von Paperless erkannt werden sollen, sollten die Felder leer bleiben.",
"settingsPageLanguageSettingLabel": "Sprache",
"settingsPageApplicationSettingsLabel": "Anwendung",
"settingsPageSecuritySettingsLabel": "Sicherheit",
"settingsPageApplicationSettingsDescriptionText": "Sprache und Aussehen",
"settingsPageSecuritySettingsDescriptionText": "Biometrische Authentifizierung",
"settingsPageAppearanceSettingTitle": "Aussehen",
"settingsPageAppearanceSettingSystemThemeLabel": "Benutze Sytemeinstellung",
"settingsPageAppearanceSettingLightThemeLabel": "Heller Modus",
"settingsPageAppearanceSettingDarkThemeLabel": "Dunkler Modus",
"appSettingsBiometricAuthenticationDescriptionText": "Authentifizierung beim Start der Anwendung",
"settingsThemeModeSystemLabel": "System",
"settingsThemeModeLightLabel": "Hell",
"settingsThemeModeDarkLabel": "Dunkel",
"genericMessageOfflineText": "Du bist offline. Überprüfe deine Verbindung.",
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
"offlineWidgetText": "Es konte keine Verbindung zum Internet hergestellt werden.",
"labelsPageStoragePathTitleText": "Speicherpfade",
"addStoragePathPageTitle": "Neuer Speicherpfad", "addStoragePathPageTitle": "Neuer Speicherpfad",
"savedViewCreateNewLabel": "Neue Ansicht", "@addStoragePathPageTitle": {},
"savedViewNameLabel": "Name", "addTagPageTitle": "Neuer Tag",
"savedViewShowOnDashboardLabel": "Auf Startseite zeigen", "@addTagPageTitle": {},
"savedViewShowInSidebarLabel": "In Seitenleiste zeigen", "appDrawerAboutInfoLoadingText": "Lade Anwendungsinformationen...",
"savedViewsLabel": "Gespeicherte Ansichten", "@appDrawerAboutInfoLoadingText": {},
"savedViewsEmptyStateText": "Lege Ansichten an, um Dokumente schneller zu finden.", "appDrawerAboutLabel": "Über diese App",
"savedViewCreateTooltipText": "Erstellt eine neue Ansicht basierend auf den aktuellen Filterkriterien.", "@appDrawerAboutLabel": {},
"documentsFilterPageSearchLabel": "Suche",
"documentEditPageTitle": "Dokument Bearbeiten",
"storagePathParameterDayLabel": "Tag",
"storagePathParameterYearLabel": "Jahr",
"storagePathParameterMonthLabel": "Monat",
"errorMessageSimilarQueryError": "Ähnliche Dokumente konnten nicht geladen werden.",
"errorMessageAutocompleteQueryError": "Beim automatischen Vervollständigen ist ein Fehler aufgetreten.",
"errorMessageStoragePathLoadFailed": "Speicherpfade konnten nicht geladen werden.",
"errorMessageStoragePathCreateFailed": "Speicherpfad konnte nicht erstellt werden, bitte versuche es erneut.",
"errorMessageLoadSavedViewsError": "Gespeicherte Ansichten konnten nicht geladen werden.",
"errorMessageCreateSavedViewError": "Gespeicherte Ansicht konnte nicht erstellt werden, bitte versuche es erneut.",
"errorMessageDeleteSavedViewError": "Gespeicherte Ansicht konnte nicht geklöscht werden, bitte versuche es erneut.",
"errorMessageRequestTimedOut": "Bei der Anfrage an den Server kam es zu einer Zeitüberschreitung.",
"errorMessageUnsupportedFileFormat": "Das Dateiformat wird nicht unterstützt.",
"labelFormFieldNoItemsFoundText": "Keine Treffer gefunden!",
"onboardingDoneButtonLabel": "Fertig",
"onboardingNextButtonLabel": "Weiter",
"labelsPageCorrespondentEmptyStateAddNewLabel": "Erstelle neuen Korrespondenten",
"labelsPageCorrespondentEmptyStateDescriptionText": "Es wurden noch keine Korrespondenten angelegt.",
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Erstelle neuen Dokumenttypen",
"labelsPageDocumentTypeEmptyStateDescriptionText": "Es wurden noch keine Dokumenttypen angelegt.",
"labelsPageTagsEmptyStateAddNewLabel": "Erstelle neuen Tag",
"labelsPageTagsEmptyStateDescriptionText": "Es wurden noch keine Tags angelegt.",
"labelsPageStoragePathEmptyStateAddNewLabel": "Erstelle neuen Speicherpfad",
"labelsPageStoragePathEmptyStateDescriptionText": "Es wurden noch keine Speicherpfade angelegt.",
"referencedDocumentsReadOnlyHintText": "Dies ist eine schreibgeschützte Ansicht! Dokumente können nicht bearbeitet oder entfernt werden. Es werden maximal 100 referenzierte Dokumente geladen.",
"editLabelPageConfirmDeletionDialogTitle": "Löschen bestätigen",
"editLabelPageDeletionDialogText": "Dieser Kennzeichner wird von Dokumenten referenziert. Durch das Löschen dieses Kennzeichners werden alle Referenzen entfernt. Fortfahren?",
"settingsPageStorageSettingsLabel": "Speicher",
"settingsPageStorageSettingsDescriptionText": "Dateien und Speicherplatz verwalten",
"documentUpdateSuccessMessage": "Dokument erfolgreich aktualisiert.",
"errorMessageMissingClientCertificate": "Ein Client Zerfitikat wurde erwartet, aber nicht gesendet. Bitte konfiguriere ein gültiges Zertifikat.",
"serverInformationPaperlessVersionText": "Paperless Server-Version",
"errorReportLabel": "MELDEN",
"appDrawerHeaderLoggedInAsText": "Eingeloggt als ", "appDrawerHeaderLoggedInAsText": "Eingeloggt als ",
"labelAnyAssignedText": "Beliebig zugewiesen", "@appDrawerHeaderLoggedInAsText": {},
"appDrawerLogoutLabel": "Verbindung trennen",
"@appDrawerLogoutLabel": {},
"appDrawerReportBugLabel": "Einen Fehler melden",
"@appDrawerReportBugLabel": {},
"appDrawerSettingsLabel": "Einstellungen",
"@appDrawerSettingsLabel": {},
"appSettingsBiometricAuthenticationDescriptionText": "Authentifizierung beim Start der Anwendung",
"@appSettingsBiometricAuthenticationDescriptionText": {},
"appSettingsBiometricAuthenticationLabel": "Biometrische Authentifizierung aktivieren",
"@appSettingsBiometricAuthenticationLabel": {},
"appSettingsDisableBiometricAuthenticationReasonText": "Authentifizieren, um die biometrische Authentifizierung zu deaktivieren.",
"@appSettingsDisableBiometricAuthenticationReasonText": {},
"appSettingsEnableBiometricAuthenticationReasonText": "Authentifizieren, um die biometrische Authentifizierung zu aktivieren.",
"@appSettingsEnableBiometricAuthenticationReasonText": {},
"appTitleText": "Paperless Mobile",
"@appTitleText": {},
"bottomNavDocumentsPageLabel": "Dokumente",
"@bottomNavDocumentsPageLabel": {},
"bottomNavInboxPageLabel": "Posteingang",
"@bottomNavInboxPageLabel": {},
"bottomNavLabelsPageLabel": "Kennzeichnungen",
"@bottomNavLabelsPageLabel": {},
"bottomNavScannerPageLabel": "Scanner",
"@bottomNavScannerPageLabel": {},
"correspondentFormFieldSearchHintText": "Beginne zu tippen...",
"@correspondentFormFieldSearchHintText": {},
"deleteViewDialogContentText": "Möchtest Du diese Ansicht wirklich löschen?", "deleteViewDialogContentText": "Möchtest Du diese Ansicht wirklich löschen?",
"@deleteViewDialogContentText": {},
"deleteViewDialogTitleText": "Lösche Ansicht ", "deleteViewDialogTitleText": "Lösche Ansicht ",
"@deleteViewDialogTitleText": {},
"documentAddedPropertyLabel": "Hinzugefügt am",
"@documentAddedPropertyLabel": {},
"documentArchiveSerialNumberPropertyLongLabel": "Archiv-Seriennummer",
"@documentArchiveSerialNumberPropertyLongLabel": {},
"documentArchiveSerialNumberPropertyShortLabel": "ASN",
"@documentArchiveSerialNumberPropertyShortLabel": {},
"documentCorrespondentPropertyLabel": "Korrespondent",
"@documentCorrespondentPropertyLabel": {},
"documentCreatedPropertyLabel": "Ausgestellt am",
"@documentCreatedPropertyLabel": {},
"documentDeleteSuccessMessage": "Das Dokument wurde erfolgreich gelöscht.",
"@documentDeleteSuccessMessage": {},
"documentDetailsPageAssignAsnButtonLabel": "Zuweisen",
"@documentDetailsPageAssignAsnButtonLabel": {},
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
"@documentDetailsPageSimilarDocumentsLabel": {},
"documentDetailsPageTabContentLabel": "Inhalt",
"@documentDetailsPageTabContentLabel": {},
"documentDetailsPageTabMetaDataLabel": "Metadaten",
"@documentDetailsPageTabMetaDataLabel": {},
"documentDetailsPageTabOverviewLabel": "Übersicht",
"@documentDetailsPageTabOverviewLabel": {},
"documentDocumentTypePropertyLabel": "Dokumenttyp",
"@documentDocumentTypePropertyLabel": {},
"documentEditPageTitle": "Dokument Bearbeiten",
"@documentEditPageTitle": {},
"documentMetaDataChecksumLabel": "MD5-Prüfsumme Original",
"@documentMetaDataChecksumLabel": {},
"documentMetaDataMediaFilenamePropertyLabel": "Media-Dateiname",
"@documentMetaDataMediaFilenamePropertyLabel": {},
"documentMetaDataOriginalFileSizeLabel": "Dateigröße Original",
"@documentMetaDataOriginalFileSizeLabel": {},
"documentMetaDataOriginalMimeTypeLabel": "MIME-Typ Original",
"@documentMetaDataOriginalMimeTypeLabel": {},
"documentModifiedPropertyLabel": "Geändert am",
"@documentModifiedPropertyLabel": {},
"documentPreviewPageTitle": "Vorschau",
"@documentPreviewPageTitle": {},
"documentScannerPageAddScanButtonLabel": "Scanne ein Dokument",
"@documentScannerPageAddScanButtonLabel": {},
"documentScannerPageEmptyStateText": "Es wurden noch keine Dokumente gescannt.",
"@documentScannerPageEmptyStateText": {},
"documentScannerPageOrText": "oder",
"@documentScannerPageOrText": {},
"documentScannerPageResetButtonTooltipText": "Alle scans löschen",
"@documentScannerPageResetButtonTooltipText": {},
"documentScannerPageTitle": "Scanner",
"@documentScannerPageTitle": {},
"documentScannerPageUploadButtonTooltip": "Dokument hochladen",
"@documentScannerPageUploadButtonTooltip": {},
"documentScannerPageUploadFromThisDeviceButtonLabel": "Lade ein Dokument von diesem Gerät hoch",
"@documentScannerPageUploadFromThisDeviceButtonLabel": {},
"documentsFilterPageAdvancedLabel": "Erweitert",
"@documentsFilterPageAdvancedLabel": {},
"documentsFilterPageApplyFilterLabel": "Anwenden",
"@documentsFilterPageApplyFilterLabel": {},
"documentsFilterPageDateRangeFieldEndLabel": "Bis",
"@documentsFilterPageDateRangeFieldEndLabel": {},
"documentsFilterPageDateRangeFieldStartLabel": "Von",
"@documentsFilterPageDateRangeFieldStartLabel": {},
"documentsFilterPageDateRangeLastMonthLabel": "Letzter Monat",
"@documentsFilterPageDateRangeLastMonthLabel": {},
"documentsFilterPageDateRangeLastSevenDaysLabel": "Letzte 7 Tage",
"@documentsFilterPageDateRangeLastSevenDaysLabel": {},
"documentsFilterPageDateRangeLastThreeMonthsLabel": "Letzten 3 Monate",
"@documentsFilterPageDateRangeLastThreeMonthsLabel": {},
"documentsFilterPageDateRangeLastYearLabel": "Letztes Jahr",
"@documentsFilterPageDateRangeLastYearLabel": {},
"documentsFilterPageQueryOptionsAsnLabel": "ASN",
"@documentsFilterPageQueryOptionsAsnLabel": {},
"documentsFilterPageQueryOptionsExtendedLabel": "Erweitert",
"@documentsFilterPageQueryOptionsExtendedLabel": {},
"documentsFilterPageQueryOptionsTitleAndContentLabel": "Titel & Inhalt",
"@documentsFilterPageQueryOptionsTitleAndContentLabel": {},
"documentsFilterPageQueryOptionsTitleLabel": "Titel",
"@documentsFilterPageQueryOptionsTitleLabel": {},
"documentsFilterPageResetFilterLabel": "Zurücksetzen",
"@documentsFilterPageResetFilterLabel": {},
"documentsFilterPageSearchLabel": "Suche",
"@documentsFilterPageSearchLabel": {},
"documentsFilterPageTitle": "Dokumente Filtern",
"@documentsFilterPageTitle": {},
"documentsPageBulkDeleteSuccessfulText": "Das massenhafte Löschen der Dokumente war erfolgreich.",
"@documentsPageBulkDeleteSuccessfulText": {},
"documentsPageEmptyStateNothingHereText": "Es scheint nichts hier zu sein...",
"@documentsPageEmptyStateNothingHereText": {},
"documentsPageEmptyStateOopsText": "Ups.",
"@documentsPageEmptyStateOopsText": {},
"documentsPageOrderByLabel": "Sortiere nach",
"@documentsPageOrderByLabel": {},
"documentsPageSelectionBulkDeleteDialogContinueText": "Diese Aktion ist unwiderruflich. Möchten Sie trotzdem fortfahren?",
"@documentsPageSelectionBulkDeleteDialogContinueText": {},
"documentsPageSelectionBulkDeleteDialogTitle": "Löschen bestätigen",
"@documentsPageSelectionBulkDeleteDialogTitle": {},
"documentsPageSelectionBulkDeleteDialogWarningTextMany": "Sind Sie sicher, dass sie folgende Dokumente löschen wollen?",
"@documentsPageSelectionBulkDeleteDialogWarningTextMany": {},
"documentsPageSelectionBulkDeleteDialogWarningTextOne": "Sind Sie sicher, dass sie folgendes Dokument löschen wollen?",
"@documentsPageSelectionBulkDeleteDialogWarningTextOne": {},
"documentsPageTitle": "Dokumente",
"@documentsPageTitle": {},
"documentsSelectedText": "ausgewählt",
"@documentsSelectedText": {},
"documentStoragePathPropertyLabel": "Speicherpfad",
"@documentStoragePathPropertyLabel": {},
"documentsUploadPageTitle": "Dokument vorbereiten",
"@documentsUploadPageTitle": {},
"documentTagsPropertyLabel": "Tags",
"@documentTagsPropertyLabel": {},
"documentTitlePropertyLabel": "Titel",
"@documentTitlePropertyLabel": {},
"documentTypeFormFieldSearchHintText": "Beginne zu tippen...",
"@documentTypeFormFieldSearchHintText": {},
"documentUpdateSuccessMessage": "Dokument erfolgreich aktualisiert.",
"@documentUpdateSuccessMessage": {},
"documentUploadFileNameLabel": "Dateiname",
"@documentUploadFileNameLabel": {},
"documentUploadPageSynchronizeTitleAndFilenameLabel": "Synchronisiere Titel und Dateiname", "documentUploadPageSynchronizeTitleAndFilenameLabel": "Synchronisiere Titel und Dateiname",
"bottomNavInboxPageLabel": "Posteingang" "@documentUploadPageSynchronizeTitleAndFilenameLabel": {},
"documentUploadProcessingSuccessfulReloadActionText": "Neu laden",
"@documentUploadProcessingSuccessfulReloadActionText": {},
"documentUploadProcessingSuccessfulText": "Das Dokument wurde erfolgreich verarbeitet.",
"@documentUploadProcessingSuccessfulText": {},
"documentUploadSuccessText": "Das Dokument wurde erfolgreich hochgeladen. Verarbeite...",
"@documentUploadSuccessText": {},
"editLabelPageConfirmDeletionDialogTitle": "Löschen bestätigen",
"@editLabelPageConfirmDeletionDialogTitle": {},
"editLabelPageDeletionDialogText": "Dieser Kennzeichner wird von Dokumenten referenziert. Durch das Löschen dieses Kennzeichners werden alle Referenzen entfernt. Fortfahren?",
"@editLabelPageDeletionDialogText": {},
"errorMessageAuthenticationFailed": "Authentifizierung fehlgeschlagen, bitte versuche es erneut.",
"@errorMessageAuthenticationFailed": {},
"errorMessageAutocompleteQueryError": "Beim automatischen Vervollständigen ist ein Fehler aufgetreten.",
"@errorMessageAutocompleteQueryError": {},
"errorMessageBiometricAuthenticationFailed": "Biometrische Authentifizierung fehlgeschlagen.",
"@errorMessageBiometricAuthenticationFailed": {},
"errorMessageBiotmetricsNotSupported": "Biometrische Authentifizierung wird von diesem Gerät nicht unterstützt.",
"@errorMessageBiotmetricsNotSupported": {},
"errorMessageBulkActionFailed": "Es ist ein Fehler beim massenhaften bearbeiten der Dokumente aufgetreten.",
"@errorMessageBulkActionFailed": {},
"errorMessageCorrespondentCreateFailed": "Korrespondent konnte nicht erstellt werden, bitte versuche es erneut.",
"@errorMessageCorrespondentCreateFailed": {},
"errorMessageCorrespondentLoadFailed": "Korrespondenten konnten nicht geladen werden.",
"@errorMessageCorrespondentLoadFailed": {},
"errorMessageCreateSavedViewError": "Gespeicherte Ansicht konnte nicht erstellt werden, bitte versuche es erneut.",
"@errorMessageCreateSavedViewError": {},
"errorMessageDeleteSavedViewError": "Gespeicherte Ansicht konnte nicht geklöscht werden, bitte versuche es erneut.",
"@errorMessageDeleteSavedViewError": {},
"errorMessageDeviceOffline": "Daten konnten nicht geladen werden: Eine Verbindung zum Internet konnte nicht hergestellt werden.",
"@errorMessageDeviceOffline": {},
"errorMessageDocumentAsnQueryFailed": "Archiv-Seriennummer konnte nicht zugewiesen werden.",
"@errorMessageDocumentAsnQueryFailed": {},
"errorMessageDocumentDeleteFailed": "Dokument konnte nicht gelöscht werden, bitte versuche es erneut.",
"@errorMessageDocumentDeleteFailed": {},
"errorMessageDocumentLoadFailed": "Dokumente konnten nicht geladen werden, bitte versuche es erneut.",
"@errorMessageDocumentLoadFailed": {},
"errorMessageDocumentPreviewFailed": "Vorschau konnte nicht geladen werden.",
"@errorMessageDocumentPreviewFailed": {},
"errorMessageDocumentTypeCreateFailed": "Dokumenttyp konnte nicht erstellt werden, bitte versuche es erneut.",
"@errorMessageDocumentTypeCreateFailed": {},
"errorMessageDocumentTypeLoadFailed": "Dokumenttypen konnten nicht geladen werden, bitte versuche es erneut.",
"@errorMessageDocumentTypeLoadFailed": {},
"errorMessageDocumentUpdateFailed": "Dokument konnte nicht aktualisiert werden, bitte versuche es erneut.",
"@errorMessageDocumentUpdateFailed": {},
"errorMessageDocumentUploadFailed": "Dokument konnte nicht hochgeladen werden, bitte versuche es erneut.",
"@errorMessageDocumentUploadFailed": {},
"errorMessageInvalidClientCertificateConfiguration": "Ungültiges Zertifikat oder fehlende Passphrase, bitte versuche es erneut.",
"@errorMessageInvalidClientCertificateConfiguration": {},
"errorMessageLoadSavedViewsError": "Gespeicherte Ansichten konnten nicht geladen werden.",
"@errorMessageLoadSavedViewsError": {},
"errorMessageMissingClientCertificate": "Ein Client Zerfitikat wurde erwartet, aber nicht gesendet. Bitte konfiguriere ein gültiges Zertifikat.",
"@errorMessageMissingClientCertificate": {},
"errorMessageNotAuthenticated": "User is not authenticated.",
"@errorMessageNotAuthenticated": {},
"errorMessageRequestTimedOut": "Bei der Anfrage an den Server kam es zu einer Zeitüberschreitung.",
"@errorMessageRequestTimedOut": {},
"errorMessageScanRemoveFailed": "Beim Löschen der Aufnahmen ist ein Fehler aufgetreten.",
"@errorMessageScanRemoveFailed": {},
"errorMessageServerUnreachable": "Es konnte keine Verbindung zu Deinem Paperless Server hergestellt werden, ist die Instanz in Betrieb?",
"@errorMessageServerUnreachable": {},
"errorMessageSimilarQueryError": "Ähnliche Dokumente konnten nicht geladen werden.",
"@errorMessageSimilarQueryError": {},
"errorMessageStoragePathCreateFailed": "Speicherpfad konnte nicht erstellt werden, bitte versuche es erneut.",
"@errorMessageStoragePathCreateFailed": {},
"errorMessageStoragePathLoadFailed": "Speicherpfade konnten nicht geladen werden.",
"@errorMessageStoragePathLoadFailed": {},
"errorMessageTagCreateFailed": "Tag konnte nicht erstellt werden, bitte versuche es erneut.",
"@errorMessageTagCreateFailed": {},
"errorMessageTagLoadFailed": "Tags konnten nicht geladen werden.",
"@errorMessageTagLoadFailed": {},
"errorMessageUnknonwnError": "Ein unbekannter Fehler ist aufgetreten.",
"@errorMessageUnknonwnError": {},
"errorMessageUnsupportedFileFormat": "Das Dateiformat wird nicht unterstützt.",
"@errorMessageUnsupportedFileFormat": {},
"errorReportLabel": "MELDEN",
"@errorReportLabel": {},
"genericActionCancelLabel": "Abbrechen",
"@genericActionCancelLabel": {},
"genericActionCreateLabel": "Erstellen",
"@genericActionCreateLabel": {},
"genericActionDeleteLabel": "Löschen",
"@genericActionDeleteLabel": {},
"genericActionEditLabel": "Bearbeiten",
"@genericActionEditLabel": {},
"genericActionOkLabel": "Ok",
"@genericActionOkLabel": {},
"genericActionSaveLabel": "Speichern",
"@genericActionSaveLabel": {},
"genericActionSelectText": "Auswählen",
"@genericActionSelectText": {},
"genericActionUpdateLabel": "Aktualisieren",
"@genericActionUpdateLabel": {},
"genericActionUploadLabel": "Hochladen",
"@genericActionUploadLabel": {},
"genericMessageOfflineText": "Du bist offline. Überprüfe deine Verbindung.",
"@genericMessageOfflineText": {},
"inboxPageDocumentRemovedMessageText": "Dokument aus Posteingang entfernt.",
"@inboxPageDocumentRemovedMessageText": {},
"inboxPageMarkAllAsSeenConfirmationDialogText": "Sind Sie sicher, dass Sie alle Dokumente als gesehen markieren möchten? Dadurch wird eine Massenbearbeitung durchgeführt, bei der alle Posteingangs-Tags von den Dokumenten entfernt werden.\nDiese Aktion kann nicht rückgängig gemacht werden! Möchten Sie trotzdem fortfahren?",
"@inboxPageMarkAllAsSeenConfirmationDialogText": {},
"inboxPageMarkAllAsSeenConfirmationDialogTitleText": "Alle als gesehen markieren?",
"@inboxPageMarkAllAsSeenConfirmationDialogTitleText": {},
"inboxPageMarkAllAsSeenLabel": "Alle als gesehen markieren",
"@inboxPageMarkAllAsSeenLabel": {},
"inboxPageMarkAsSeenText": "Als gesehen markieren",
"@inboxPageMarkAsSeenText": {},
"inboxPageTodayText": "Heute",
"@inboxPageTodayText": {},
"inboxPageUndoRemoveText": "UNDO",
"@inboxPageUndoRemoveText": {},
"inboxPageUnseenText": "ungesehen",
"@inboxPageUnseenText": {},
"inboxPageUsageHintText": "Tipp: Wische nach links um ein Dokument als gesehen zu markieren und alle Posteingangs-Tags von diesem Dokument zu entfernen.",
"@inboxPageUsageHintText": {},
"inboxPageYesterdayText": "Gestern",
"@inboxPageYesterdayText": {},
"labelAnyAssignedText": "Beliebig zugewiesen",
"@labelAnyAssignedText": {},
"labelFormFieldNoItemsFoundText": "Keine Treffer gefunden!",
"@labelFormFieldNoItemsFoundText": {},
"labelIsInsensivitePropertyLabel": "Groß-/Kleinschreibung irrelevant",
"@labelIsInsensivitePropertyLabel": {},
"labelMatchingAlgorithmPropertyLabel": "Zuweisungsalgorithmus",
"@labelMatchingAlgorithmPropertyLabel": {},
"labelMatchPropertyLabel": "Zuweisungsmuster",
"@labelMatchPropertyLabel": {},
"labelNamePropertyLabel": "Name",
"@labelNamePropertyLabel": {},
"labelNotAssignedText": "Nicht zugewiesen",
"@labelNotAssignedText": {},
"labelsPageCorrespondentEmptyStateAddNewLabel": "Erstelle neuen Korrespondenten",
"@labelsPageCorrespondentEmptyStateAddNewLabel": {},
"labelsPageCorrespondentEmptyStateDescriptionText": "Es wurden noch keine Korrespondenten angelegt.",
"@labelsPageCorrespondentEmptyStateDescriptionText": {},
"labelsPageCorrespondentsTitleText": "Korrespondenten",
"@labelsPageCorrespondentsTitleText": {},
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Erstelle neuen Dokumenttypen",
"@labelsPageDocumentTypeEmptyStateAddNewLabel": {},
"labelsPageDocumentTypeEmptyStateDescriptionText": "Es wurden noch keine Dokumenttypen angelegt.",
"@labelsPageDocumentTypeEmptyStateDescriptionText": {},
"labelsPageDocumentTypesTitleText": "Dokumenttypen",
"@labelsPageDocumentTypesTitleText": {},
"labelsPageStoragePathEmptyStateAddNewLabel": "Erstelle neuen Speicherpfad",
"@labelsPageStoragePathEmptyStateAddNewLabel": {},
"labelsPageStoragePathEmptyStateDescriptionText": "Es wurden noch keine Speicherpfade angelegt.",
"@labelsPageStoragePathEmptyStateDescriptionText": {},
"labelsPageStoragePathTitleText": "Speicherpfade",
"@labelsPageStoragePathTitleText": {},
"labelsPageTagsEmptyStateAddNewLabel": "Erstelle neuen Tag",
"@labelsPageTagsEmptyStateAddNewLabel": {},
"labelsPageTagsEmptyStateDescriptionText": "Es wurden noch keine Tags angelegt.",
"@labelsPageTagsEmptyStateDescriptionText": {},
"labelsPageTagsTitleText": "Tags",
"@labelsPageTagsTitleText": {},
"linkedDocumentsPageTitle": "Referenzierte Dokumente",
"@linkedDocumentsPageTitle": {},
"loginPageAdvancedLabel": "Erweiterte Einstellungen",
"@loginPageAdvancedLabel": {},
"loginPageClientCertificatePassphraseLabel": "Passphrase",
"@loginPageClientCertificatePassphraseLabel": {},
"loginPageClientCertificateSettingDescriptionText": "Konfiguriere Mutual TLS Authentifizierung",
"@loginPageClientCertificateSettingDescriptionText": {},
"loginPageClientCertificateSettingInvalidFileFormatValidationText": "Ungültiges Zertifikatsformat, nur .pfx ist erlaubt.",
"@loginPageClientCertificateSettingInvalidFileFormatValidationText": {},
"loginPageClientCertificateSettingLabel": "Client Zertifikat",
"@loginPageClientCertificateSettingLabel": {},
"loginPageClientCertificateSettingSelectFileText": "Datei auswählen...",
"@loginPageClientCertificateSettingSelectFileText": {},
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Falsche oder fehlende Zertifikatspassphrase.",
"@loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": {},
"loginPageLoginButtonLabel": "Verbinden",
"@loginPageLoginButtonLabel": {},
"loginPagePasswordFieldLabel": "Passwort",
"@loginPagePasswordFieldLabel": {},
"loginPagePasswordValidatorMessageText": "Passwort darf nicht leer sein.",
"@loginPagePasswordValidatorMessageText": {},
"loginPageServerUrlFieldLabel": "Server-Adresse",
"@loginPageServerUrlFieldLabel": {},
"loginPageServerUrlValidatorMessageText": "Server-Addresse darf nicht leer sein.",
"@loginPageServerUrlValidatorMessageText": {},
"loginPageTitle": "Mit Paperless verbinden",
"@loginPageTitle": {},
"loginPageUsernameLabel": "Nutzername",
"@loginPageUsernameLabel": {},
"loginPageUsernameValidatorMessageText": "Nutzername darf nicht leer sein.",
"@loginPageUsernameValidatorMessageText": {},
"offlineWidgetText": "Es konte keine Verbindung zum Internet hergestellt werden.",
"@offlineWidgetText": {},
"onboardingDoneButtonLabel": "Fertig",
"@onboardingDoneButtonLabel": {},
"onboardingNextButtonLabel": "Weiter",
"@onboardingNextButtonLabel": {},
"referencedDocumentsReadOnlyHintText": "Dies ist eine schreibgeschützte Ansicht! Dokumente können nicht bearbeitet oder entfernt werden. Es werden maximal 100 referenzierte Dokumente geladen.",
"@referencedDocumentsReadOnlyHintText": {},
"savedViewCreateNewLabel": "Neue Ansicht",
"@savedViewCreateNewLabel": {},
"savedViewCreateTooltipText": "Erstellt eine neue Ansicht basierend auf den aktuellen Filterkriterien.",
"@savedViewCreateTooltipText": {},
"savedViewNameLabel": "Name",
"@savedViewNameLabel": {},
"savedViewsEmptyStateText": "Lege Ansichten an, um Dokumente schneller zu finden.",
"@savedViewsEmptyStateText": {},
"savedViewShowInSidebarLabel": "In Seitenleiste zeigen",
"@savedViewShowInSidebarLabel": {},
"savedViewShowOnDashboardLabel": "Auf Startseite zeigen",
"@savedViewShowOnDashboardLabel": {},
"savedViewsLabel": "Gespeicherte Ansichten",
"@savedViewsLabel": {},
"serverInformationPaperlessVersionText": "Paperless Server-Version",
"@serverInformationPaperlessVersionText": {},
"settingsPageAppearanceSettingDarkThemeLabel": "Dunkler Modus",
"@settingsPageAppearanceSettingDarkThemeLabel": {},
"settingsPageAppearanceSettingLightThemeLabel": "Heller Modus",
"@settingsPageAppearanceSettingLightThemeLabel": {},
"settingsPageAppearanceSettingSystemThemeLabel": "Benutze Sytemeinstellung",
"@settingsPageAppearanceSettingSystemThemeLabel": {},
"settingsPageAppearanceSettingTitle": "Aussehen",
"@settingsPageAppearanceSettingTitle": {},
"settingsPageApplicationSettingsDescriptionText": "Sprache und Aussehen",
"@settingsPageApplicationSettingsDescriptionText": {},
"settingsPageApplicationSettingsLabel": "Anwendung",
"@settingsPageApplicationSettingsLabel": {},
"settingsPageLanguageSettingLabel": "Sprache",
"@settingsPageLanguageSettingLabel": {},
"settingsPageSecuritySettingsDescriptionText": "Biometrische Authentifizierung",
"@settingsPageSecuritySettingsDescriptionText": {},
"settingsPageSecuritySettingsLabel": "Sicherheit",
"@settingsPageSecuritySettingsLabel": {},
"settingsPageStorageSettingsDescriptionText": "Dateien und Speicherplatz verwalten",
"@settingsPageStorageSettingsDescriptionText": {},
"settingsPageStorageSettingsLabel": "Speicher",
"@settingsPageStorageSettingsLabel": {},
"settingsThemeModeDarkLabel": "Dunkel",
"@settingsThemeModeDarkLabel": {},
"settingsThemeModeLightLabel": "Hell",
"@settingsThemeModeLightLabel": {},
"settingsThemeModeSystemLabel": "System",
"@settingsThemeModeSystemLabel": {},
"storagePathParameterDayLabel": "Tag",
"@storagePathParameterDayLabel": {},
"storagePathParameterMonthLabel": "Monat",
"@storagePathParameterMonthLabel": {},
"storagePathParameterYearLabel": "Jahr",
"@storagePathParameterYearLabel": {},
"tagColorPropertyLabel": "Farbe",
"@tagColorPropertyLabel": {},
"tagFormFieldSearchHintText": "Beginne zu tippen...",
"@tagFormFieldSearchHintText": {},
"tagInboxTagPropertyLabel": "Posteingangs-Tag",
"@tagInboxTagPropertyLabel": {},
"uploadPageAutomaticallInferredFieldsHintText": "Wenn Werte für diese Felder angegeben werden, wird Paperless nicht automatisch einen Wert zuweisen. Wenn diese Felder automatisch von Paperless erkannt werden sollen, sollten die Felder leer bleiben.",
"@uploadPageAutomaticallInferredFieldsHintText": {}
} }

View File

@@ -1,202 +1,419 @@
{ {
"@@locale": "en", "@@locale": "en",
"documentTitlePropertyLabel": "Title", "aboutDialogDevelopedByText": "Developed by",
"documentCreatedPropertyLabel": "Created At", "@aboutDialogDevelopedByText": {},
"documentAddedPropertyLabel": "Added At", "addCorrespondentPageTitle": "New Correspondent",
"documentModifiedPropertyLabel": "Modified At", "@addCorrespondentPageTitle": {},
"documentDocumentTypePropertyLabel": "Document Type", "addDocumentTypePageTitle": "New Document Type",
"documentCorrespondentPropertyLabel": "Correspondent", "@addDocumentTypePageTitle": {},
"documentStoragePathPropertyLabel": "Storage Path", "addStoragePathPageTitle": "New Storage Path",
"documentTagsPropertyLabel": "Tags", "@addStoragePathPageTitle": {},
"documentArchiveSerialNumberPropertyLongLabel": "Archive Serial Number", "addTagPageTitle": "New Tag",
"documentArchiveSerialNumberPropertyShortLabel": "ASN", "@addTagPageTitle": {},
"appTitleText": "Paperless Mobile", "appDrawerAboutInfoLoadingText": "Retrieving application information...",
"bottomNavDocumentsPageLabel": "Documents", "@appDrawerAboutInfoLoadingText": {},
"bottomNavScannerPageLabel": "Scanner", "appDrawerAboutLabel": "About this app",
"bottomNavLabelsPageLabel": "Labels", "@appDrawerAboutLabel": {},
"documentsPageTitle": "Documents", "appDrawerHeaderLoggedInAsText": "Logged in as ",
"documentsFilterPageTitle": "Filter Documents", "@appDrawerHeaderLoggedInAsText": {},
"documentsFilterPageAdvancedLabel": "Advanced", "appDrawerLogoutLabel": "Disconnect",
"documentsFilterPageDateRangeLastSevenDaysLabel": "Last 7 Days", "@appDrawerLogoutLabel": {},
"documentsFilterPageDateRangeLastMonthLabel": "Last Month", "appDrawerReportBugLabel": "Report a Bug",
"documentsFilterPageDateRangeLastThreeMonthsLabel": "Last 3 Months", "@appDrawerReportBugLabel": {},
"documentsFilterPageDateRangeLastYearLabel": "Last Year", "appDrawerSettingsLabel": "Settings",
"documentsFilterPageApplyFilterLabel": "Apply", "@appDrawerSettingsLabel": {},
"documentsFilterPageResetFilterLabel": "Reset", "appSettingsBiometricAuthenticationDescriptionText": "Authenticate on app start",
"documentsFilterPageQueryOptionsTitleLabel": "Title", "@appSettingsBiometricAuthenticationDescriptionText": {},
"documentsFilterPageQueryOptionsTitleAndContentLabel": "Title & Content", "appSettingsBiometricAuthenticationLabel": "Biometric authentication",
"documentsFilterPageQueryOptionsExtendedLabel": "Extended", "@appSettingsBiometricAuthenticationLabel": {},
"documentsFilterPageQueryOptionsAsnLabel": "ASN", "appSettingsDisableBiometricAuthenticationReasonText": "Authenticate to disable biometric authentication",
"documentsFilterPageDateRangeFieldStartLabel": "From", "@appSettingsDisableBiometricAuthenticationReasonText": {},
"documentsFilterPageDateRangeFieldEndLabel": "To", "appSettingsEnableBiometricAuthenticationReasonText": "Authenticate to enable biometric authentication",
"genericActionOkLabel": "Ok", "@appSettingsEnableBiometricAuthenticationReasonText": {},
"genericActionCancelLabel": "Cancel", "appTitleText": "Paperless Mobile",
"genericActionSelectText": "Select", "@appTitleText": {},
"genericActionDeleteLabel": "Delete", "bottomNavDocumentsPageLabel": "Documents",
"genericActionEditLabel": "Edit", "@bottomNavDocumentsPageLabel": {},
"genericActionSaveLabel": "Save", "bottomNavInboxPageLabel": "Inbox",
"genericActionCreateLabel": "Create", "@bottomNavInboxPageLabel": {},
"genericActionUploadLabel": "Upload", "bottomNavLabelsPageLabel": "Labels",
"genericActionUpdateLabel": "Update", "@bottomNavLabelsPageLabel": {},
"appDrawerSettingsLabel": "Settings", "bottomNavScannerPageLabel": "Scanner",
"appDrawerAboutLabel": "About this app", "@bottomNavScannerPageLabel": {},
"appDrawerAboutInfoLoadingText": "Retrieving application information...", "correspondentFormFieldSearchHintText": "Start typing...",
"appDrawerReportBugLabel": "Report a Bug", "@correspondentFormFieldSearchHintText": {},
"appDrawerLogoutLabel": "Disconnect", "deleteViewDialogContentText": "Do you really want to delete this view?",
"loginPageLoginButtonLabel": "Connect", "@deleteViewDialogContentText": {},
"loginPageTitle": "Connect to Paperless", "deleteViewDialogTitleText": "Delete view ",
"loginPageAdvancedLabel": "Advanced Settings", "@deleteViewDialogTitleText": {},
"loginPageServerUrlValidatorMessageText": "Server address must not be empty.", "documentAddedPropertyLabel": "Added At",
"loginPageServerUrlFieldLabel": "Server Address", "@documentAddedPropertyLabel": {},
"loginPageUsernameValidatorMessageText": "Username must not be empty.", "documentArchiveSerialNumberPropertyLongLabel": "Archive Serial Number",
"loginPageUsernameLabel": "Username", "@documentArchiveSerialNumberPropertyLongLabel": {},
"loginPagePasswordValidatorMessageText": "Password must not be empty.", "documentArchiveSerialNumberPropertyShortLabel": "ASN",
"loginPagePasswordFieldLabel": "Password", "@documentArchiveSerialNumberPropertyShortLabel": {},
"loginPageClientCertificatePassphraseLabel": "Passphrase", "documentCorrespondentPropertyLabel": "Correspondent",
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Incorrect or missing certificate passphrase.", "@documentCorrespondentPropertyLabel": {},
"documentDetailsPageTabOverviewLabel": "Overview", "documentCreatedPropertyLabel": "Created At",
"documentDetailsPageTabContentLabel": "Content", "@documentCreatedPropertyLabel": {},
"documentDetailsPageTabMetaDataLabel": "Meta Data", "documentDeleteSuccessMessage": "Document successfully deleted.",
"documentsPageEmptyStateOopsText": "Oops.", "@documentDeleteSuccessMessage": {},
"documentsPageEmptyStateNothingHereText": "There seems to be nothing here...", "documentDetailsPageAssignAsnButtonLabel": "Assign",
"errorMessageUnknonwnError": "An unknown error occurred.", "@documentDetailsPageAssignAsnButtonLabel": {},
"errorMessageAuthenticationFailed": "Authentication failed, please try again.", "documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
"errorMessageNotAuthenticated": "User is not authenticated.", "@documentDetailsPageSimilarDocumentsLabel": {},
"errorMessageDocumentUploadFailed": "Could not upload document, please try again.", "documentDetailsPageTabContentLabel": "Content",
"errorMessageDocumentUpdateFailed": "Could not update document, please try again.", "@documentDetailsPageTabContentLabel": {},
"errorMessageDocumentDeleteFailed": "Could not delete document, please try again.", "documentDetailsPageTabMetaDataLabel": "Meta Data",
"errorMessageDocumentPreviewFailed": "Could not load document preview.", "@documentDetailsPageTabMetaDataLabel": {},
"errorMessageDocumentAsnQueryFailed": "Could not assign archive serial number.", "documentDetailsPageTabOverviewLabel": "Overview",
"errorMessageTagCreateFailed": "Could not create tag, please try again.", "@documentDetailsPageTabOverviewLabel": {},
"errorMessageTagLoadFailed": "Could not load tags.", "documentDocumentTypePropertyLabel": "Document Type",
"errorMessageDocumentTypeCreateFailed": "Could not create document, please try again.", "@documentDocumentTypePropertyLabel": {},
"errorMessageDocumentTypeLoadFailed": "Could not load document types, please try again.", "documentEditPageTitle": "Edit Document",
"errorMessageCorrespondentCreateFailed": "Could not create correspondent, please try again.", "@documentEditPageTitle": {},
"errorMessageCorrespondentLoadFailed": "Could not load correspondents.", "documentMetaDataChecksumLabel": "Original MD5-Checksum",
"errorMessageScanRemoveFailed": "An error occurred removing the scans.", "@documentMetaDataChecksumLabel": {},
"errorMessageInvalidClientCertificateConfiguration": "Invalid certificate or missing passphrase, please try again", "documentMetaDataMediaFilenamePropertyLabel": "Media Filename",
"errorMessageDocumentLoadFailed": "Could not load documents, please try again.", "@documentMetaDataMediaFilenamePropertyLabel": {},
"documentsPageSelectionBulkDeleteDialogTitle": "Confirm deletion", "documentMetaDataOriginalFileSizeLabel": "Original File Size",
"documentsPageSelectionBulkDeleteDialogWarningTextOne": "Are you sure you want to delete the following document?", "@documentMetaDataOriginalFileSizeLabel": {},
"documentsPageSelectionBulkDeleteDialogWarningTextMany": "Are you sure you want to delete the following documents?", "documentMetaDataOriginalMimeTypeLabel": "Original MIME-Type",
"documentsPageSelectionBulkDeleteDialogContinueText": "This action is irreversible. Do you wish to proceed anyway?", "@documentMetaDataOriginalMimeTypeLabel": {},
"documentPreviewPageTitle": "Preview", "documentModifiedPropertyLabel": "Modified At",
"appSettingsEnableBiometricAuthenticationReasonText": "Authenticate to enable biometric authentication", "@documentModifiedPropertyLabel": {},
"appSettingsDisableBiometricAuthenticationReasonText": "Authenticate to disable biometric authentication", "documentPreviewPageTitle": "Preview",
"errorMessageBulkActionFailed": "Could not bulk edit documents.", "@documentPreviewPageTitle": {},
"errorMessageBiotmetricsNotSupported": "Biometric authentication not supported on this device.", "documentScannerPageAddScanButtonLabel": "Scan a document",
"errorMessageBiometricAuthenticationFailed": "Biometric authentication failed.", "@documentScannerPageAddScanButtonLabel": {},
"errorMessageDeviceOffline": "Could not fetch data: You are not connected to the internet.", "documentScannerPageEmptyStateText": "No documents scanned yet.",
"errorMessageServerUnreachable": "Could not reach your Paperless server, is it up and running?", "@documentScannerPageEmptyStateText": {},
"aboutDialogDevelopedByText": "Developed by", "documentScannerPageOrText": "or",
"documentsPageBulkDeleteSuccessfulText": "Documents successfully deleted.", "@documentScannerPageOrText": {},
"documentDeleteSuccessMessage": "Document successfully deleted.", "documentScannerPageResetButtonTooltipText": "Delete all scans",
"documentsSelectedText": "selected", "@documentScannerPageResetButtonTooltipText": {},
"labelsPageCorrespondentsTitleText": "Correspondents", "documentScannerPageTitle": "Scan",
"labelsPageDocumentTypesTitleText": "Document Types", "@documentScannerPageTitle": {},
"labelsPageTagsTitleText": "Tags", "documentScannerPageUploadButtonTooltip": "Upload to Paperless",
"tagColorPropertyLabel": "Color", "@documentScannerPageUploadButtonTooltip": {},
"tagInboxTagPropertyLabel": "Inbox-Tag", "documentScannerPageUploadFromThisDeviceButtonLabel": "Upload a document from this device",
"documentScannerPageEmptyStateText": "No documents scanned yet.", "@documentScannerPageUploadFromThisDeviceButtonLabel": {},
"documentScannerPageTitle": "Scan", "documentsFilterPageAdvancedLabel": "Advanced",
"documentScannerPageResetButtonTooltipText": "Delete all scans", "@documentsFilterPageAdvancedLabel": {},
"documentScannerPageUploadButtonTooltip": "Upload to Paperless", "documentsFilterPageApplyFilterLabel": "Apply",
"documentScannerPageAddScanButtonLabel": "Scan a document", "@documentsFilterPageApplyFilterLabel": {},
"documentScannerPageOrText": "or", "documentsFilterPageDateRangeFieldEndLabel": "To",
"documentScannerPageUploadFromThisDeviceButtonLabel": "Upload a document from this device", "@documentsFilterPageDateRangeFieldEndLabel": {},
"addTagPageTitle": "New Tag", "documentsFilterPageDateRangeFieldStartLabel": "From",
"addCorrespondentPageTitle": "New Correspondent", "@documentsFilterPageDateRangeFieldStartLabel": {},
"addDocumentTypePageTitle": "New Document Type", "documentsFilterPageDateRangeLastMonthLabel": "Last Month",
"labelNamePropertyLabel": "Name", "@documentsFilterPageDateRangeLastMonthLabel": {},
"labelMatchPropertyLabel": "Match", "documentsFilterPageDateRangeLastSevenDaysLabel": "Last 7 Days",
"labelMatchingAlgorithmPropertyLabel": "Matching Algorithm", "@documentsFilterPageDateRangeLastSevenDaysLabel": {},
"labelIsInsensivitePropertyLabel": "Case Irrelevant", "documentsFilterPageDateRangeLastThreeMonthsLabel": "Last 3 Months",
"linkedDocumentsPageTitle": "Linked Documents", "@documentsFilterPageDateRangeLastThreeMonthsLabel": {},
"documentsUploadPageTitle": "Prepare document", "documentsFilterPageDateRangeLastYearLabel": "Last Year",
"documentUploadFileNameLabel": "File Name", "@documentsFilterPageDateRangeLastYearLabel": {},
"documentUploadSuccessText": "Document successfully uploaded, processing...", "documentsFilterPageQueryOptionsAsnLabel": "ASN",
"documentUploadProcessingSuccessfulText": "Document successfully processed.", "@documentsFilterPageQueryOptionsAsnLabel": {},
"documentUploadProcessingSuccessfulReloadActionText": "Reload", "documentsFilterPageQueryOptionsExtendedLabel": "Extended",
"labelNotAssignedText": "Not assigned", "@documentsFilterPageQueryOptionsExtendedLabel": {},
"correspondentFormFieldSearchHintText": "Start typing...", "documentsFilterPageQueryOptionsTitleAndContentLabel": "Title & Content",
"documentTypeFormFieldSearchHintText": "Start typing...", "@documentsFilterPageQueryOptionsTitleAndContentLabel": {},
"tagFormFieldSearchHintText": "Filter tags...", "documentsFilterPageQueryOptionsTitleLabel": "Title",
"documentsPageOrderByLabel": "Order By", "@documentsFilterPageQueryOptionsTitleLabel": {},
"documentDetailsPageAssignAsnButtonLabel": "Assign", "documentsFilterPageResetFilterLabel": "Reset",
"documentMetaDataMediaFilenamePropertyLabel": "Media Filename", "@documentsFilterPageResetFilterLabel": {},
"documentMetaDataChecksumLabel": "Original MD5-Checksum", "documentsFilterPageSearchLabel": "Search",
"documentMetaDataOriginalFileSizeLabel": "Original File Size", "@documentsFilterPageSearchLabel": {},
"documentMetaDataOriginalMimeTypeLabel": "Original MIME-Type", "documentsFilterPageTitle": "Filter Documents",
"loginPageClientCertificateSettingLabel": "Client Certificate", "@documentsFilterPageTitle": {},
"loginPageClientCertificateSettingDescriptionText": "Configure Mutual TLS Authentication", "documentsPageBulkDeleteSuccessfulText": "Documents successfully deleted.",
"loginPageClientCertificateSettingInvalidFileFormatValidationText": "Invalid certificate format, only .pfx is allowed", "@documentsPageBulkDeleteSuccessfulText": {},
"loginPageClientCertificateSettingSelectFileText": "Select file...", "documentsPageEmptyStateNothingHereText": "There seems to be nothing here...",
"uploadPageAutomaticallInferredFieldsHintText": "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.", "@documentsPageEmptyStateNothingHereText": {},
"settingsPageLanguageSettingLabel": "Language", "documentsPageEmptyStateOopsText": "Oops.",
"settingsPageApplicationSettingsLabel": "Application", "@documentsPageEmptyStateOopsText": {},
"settingsPageSecuritySettingsLabel": "Security", "documentsPageOrderByLabel": "Order By",
"appSettingsBiometricAuthenticationLabel": "Biometric authentication", "@documentsPageOrderByLabel": {},
"settingsPageApplicationSettingsDescriptionText": "Language and visual appearance", "documentsPageSelectionBulkDeleteDialogContinueText": "This action is irreversible. Do you wish to proceed anyway?",
"settingsPageSecuritySettingsDescriptionText": "Biometric authentication", "@documentsPageSelectionBulkDeleteDialogContinueText": {},
"settingsPageAppearanceSettingTitle": "Appearance", "documentsPageSelectionBulkDeleteDialogTitle": "Confirm deletion",
"settingsPageAppearanceSettingDescriptionText": "Choose your light or dark theme preference", "@documentsPageSelectionBulkDeleteDialogTitle": {},
"settingsPageAppearanceSettingSystemThemeLabel": "Use system theme", "documentsPageSelectionBulkDeleteDialogWarningTextMany": "Are you sure you want to delete the following documents?",
"settingsPageAppearanceSettingLightThemeLabel": "Light Theme", "@documentsPageSelectionBulkDeleteDialogWarningTextMany": {},
"settingsPageAppearanceSettingDarkThemeLabel": "Dark Theme", "documentsPageSelectionBulkDeleteDialogWarningTextOne": "Are you sure you want to delete the following document?",
"appSettingsBiometricAuthenticationDescriptionText": "Authenticate on app start", "@documentsPageSelectionBulkDeleteDialogWarningTextOne": {},
"settingsThemeModeSystemLabel": "System", "documentsPageTitle": "Documents",
"settingsThemeModeLightLabel": "Light", "@documentsPageTitle": {},
"settingsThemeModeDarkLabel": "Dark", "documentsSelectedText": "selected",
"genericMessageOfflineText": "You're offline. Check your connection.", "@documentsSelectedText": {},
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents", "documentStoragePathPropertyLabel": "Storage Path",
"offlineWidgetText": "An internet connection could not be established.", "@documentStoragePathPropertyLabel": {},
"labelsPageStoragePathTitleText": "Storage Paths", "documentsUploadPageTitle": "Prepare document",
"addStoragePathPageTitle": "New Storage Path", "@documentsUploadPageTitle": {},
"savedViewCreateNewLabel": "New View", "documentTagsPropertyLabel": "Tags",
"savedViewNameLabel": "Name", "@documentTagsPropertyLabel": {},
"savedViewShowOnDashboardLabel": "Show on dashboard", "documentTitlePropertyLabel": "Title",
"savedViewShowInSidebarLabel": "Show in sidebar", "@documentTitlePropertyLabel": {},
"savedViewsLabel": "Saved Views", "documentTypeFormFieldSearchHintText": "Start typing...",
"savedViewsEmptyStateText": "Create views to quickly filter your documents.", "@documentTypeFormFieldSearchHintText": {},
"savedViewCreateTooltipText": "Creates a new view based on the current filter criteria.", "documentUpdateSuccessMessage": "Document successfully updated.",
"documentsFilterPageSearchLabel": "Search", "@documentUpdateSuccessMessage": {},
"documentEditPageTitle": "Edit Document", "documentUploadFileNameLabel": "File Name",
"storagePathParameterDayLabel": "day", "@documentUploadFileNameLabel": {},
"storagePathParameterYearLabel": "year", "documentUploadPageSynchronizeTitleAndFilenameLabel": "Synchronize title and filename",
"storagePathParameterMonthLabel": "month", "@documentUploadPageSynchronizeTitleAndFilenameLabel": {},
"errorMessageSimilarQueryError": "Could not load similar documents.", "documentUploadProcessingSuccessfulReloadActionText": "Reload",
"errorMessageAutocompleteQueryError": "An error ocurred while trying to autocomplete your query.", "@documentUploadProcessingSuccessfulReloadActionText": {},
"errorMessageStoragePathLoadFailed": "Could not load storage paths.", "documentUploadProcessingSuccessfulText": "Document successfully processed.",
"errorMessageStoragePathCreateFailed": "Could not create storage path, please try again.", "@documentUploadProcessingSuccessfulText": {},
"errorMessageLoadSavedViewsError": "Could not load saved views.", "documentUploadSuccessText": "Document successfully uploaded, processing...",
"errorMessageCreateSavedViewError": "Could not create saved view, please try again.", "@documentUploadSuccessText": {},
"errorMessageDeleteSavedViewError": "Could not delete saved view, please try again", "editLabelPageConfirmDeletionDialogTitle": "Confirm deletion",
"errorMessageRequestTimedOut": "The request to the server timed out.", "@editLabelPageConfirmDeletionDialogTitle": {},
"errorMessageUnsupportedFileFormat": "This file format is not supported.", "editLabelPageDeletionDialogText": "This label contains references to other documents. By deleting this label, all references will be removed. Continue?",
"labelFormFieldNoItemsFoundText": "No items found!", "@editLabelPageDeletionDialogText": {},
"onboardingDoneButtonLabel": "Done", "errorMessageAuthenticationFailed": "Authentication failed, please try again.",
"onboardingNextButtonLabel": "Next", "@errorMessageAuthenticationFailed": {},
"labelsPageCorrespondentEmptyStateAddNewLabel": "Add new correspondent", "errorMessageAutocompleteQueryError": "An error ocurred while trying to autocomplete your query.",
"labelsPageCorrespondentEmptyStateDescriptionText": "You don't seem to have any correspondents set up.", "@errorMessageAutocompleteQueryError": {},
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Add new document type", "errorMessageBiometricAuthenticationFailed": "Biometric authentication failed.",
"labelsPageDocumentTypeEmptyStateDescriptionText": "You don't seem to have any document types set up.", "@errorMessageBiometricAuthenticationFailed": {},
"labelsPageTagsEmptyStateAddNewLabel": "Add new tag", "errorMessageBiotmetricsNotSupported": "Biometric authentication not supported on this device.",
"labelsPageTagsEmptyStateDescriptionText": "You don't seem to have any tags set up.", "@errorMessageBiotmetricsNotSupported": {},
"labelsPageStoragePathEmptyStateAddNewLabel": "Add new storage path", "errorMessageBulkActionFailed": "Could not bulk edit documents.",
"labelsPageStoragePathEmptyStateDescriptionText": "You don't seem to have any storage paths set up.", "@errorMessageBulkActionFailed": {},
"referencedDocumentsReadOnlyHintText": "This is a read-only view! You cannot edit or remove documents. A maximum of 100 referenced documents will be loaded.", "errorMessageCorrespondentCreateFailed": "Could not create correspondent, please try again.",
"editLabelPageConfirmDeletionDialogTitle": "Confirm deletion", "@errorMessageCorrespondentCreateFailed": {},
"editLabelPageDeletionDialogText": "This label contains references to other documents. By deleting this label, all references will be removed. Continue?", "errorMessageCorrespondentLoadFailed": "Could not load correspondents.",
"settingsPageStorageSettingsLabel": "Storage", "@errorMessageCorrespondentLoadFailed": {},
"settingsPageStorageSettingsDescriptionText": "Manage files and storage space", "errorMessageCreateSavedViewError": "Could not create saved view, please try again.",
"documentUpdateSuccessMessage": "Document successfully updated.", "@errorMessageCreateSavedViewError": {},
"errorMessageMissingClientCertificate": "A client certificate was expected but not sent. Please provide a valid client certificate.", "errorMessageDeleteSavedViewError": "Could not delete saved view, please try again",
"serverInformationPaperlessVersionText": "Paperless server version", "@errorMessageDeleteSavedViewError": {},
"errorReportLabel": "REPORT", "errorMessageDeviceOffline": "Could not fetch data: You are not connected to the internet.",
"appDrawerHeaderLoggedInAsText": "Logged in as ", "@errorMessageDeviceOffline": {},
"labelAnyAssignedText": "Any assigned", "errorMessageDocumentAsnQueryFailed": "Could not assign archive serial number.",
"deleteViewDialogContentText": "Do you really want to delete this view?", "@errorMessageDocumentAsnQueryFailed": {},
"deleteViewDialogTitleText": "Delete view ", "errorMessageDocumentDeleteFailed": "Could not delete document, please try again.",
"documentUploadPageSynchronizeTitleAndFilenameLabel": "Synchronize title and filename", "@errorMessageDocumentDeleteFailed": {},
"bottomNavInboxPageLabel": "Inbox" "errorMessageDocumentLoadFailed": "Could not load documents, please try again.",
} "@errorMessageDocumentLoadFailed": {},
"errorMessageDocumentPreviewFailed": "Could not load document preview.",
"@errorMessageDocumentPreviewFailed": {},
"errorMessageDocumentTypeCreateFailed": "Could not create document, please try again.",
"@errorMessageDocumentTypeCreateFailed": {},
"errorMessageDocumentTypeLoadFailed": "Could not load document types, please try again.",
"@errorMessageDocumentTypeLoadFailed": {},
"errorMessageDocumentUpdateFailed": "Could not update document, please try again.",
"@errorMessageDocumentUpdateFailed": {},
"errorMessageDocumentUploadFailed": "Could not upload document, please try again.",
"@errorMessageDocumentUploadFailed": {},
"errorMessageInvalidClientCertificateConfiguration": "Invalid certificate or missing passphrase, please try again",
"@errorMessageInvalidClientCertificateConfiguration": {},
"errorMessageLoadSavedViewsError": "Could not load saved views.",
"@errorMessageLoadSavedViewsError": {},
"errorMessageMissingClientCertificate": "A client certificate was expected but not sent. Please provide a valid client certificate.",
"@errorMessageMissingClientCertificate": {},
"errorMessageNotAuthenticated": "User is not authenticated.",
"@errorMessageNotAuthenticated": {},
"errorMessageRequestTimedOut": "The request to the server timed out.",
"@errorMessageRequestTimedOut": {},
"errorMessageScanRemoveFailed": "An error occurred removing the scans.",
"@errorMessageScanRemoveFailed": {},
"errorMessageServerUnreachable": "Could not reach your Paperless server, is it up and running?",
"@errorMessageServerUnreachable": {},
"errorMessageSimilarQueryError": "Could not load similar documents.",
"@errorMessageSimilarQueryError": {},
"errorMessageStoragePathCreateFailed": "Could not create storage path, please try again.",
"@errorMessageStoragePathCreateFailed": {},
"errorMessageStoragePathLoadFailed": "Could not load storage paths.",
"@errorMessageStoragePathLoadFailed": {},
"errorMessageTagCreateFailed": "Could not create tag, please try again.",
"@errorMessageTagCreateFailed": {},
"errorMessageTagLoadFailed": "Could not load tags.",
"@errorMessageTagLoadFailed": {},
"errorMessageUnknonwnError": "An unknown error occurred.",
"@errorMessageUnknonwnError": {},
"errorMessageUnsupportedFileFormat": "This file format is not supported.",
"@errorMessageUnsupportedFileFormat": {},
"errorReportLabel": "REPORT",
"@errorReportLabel": {},
"genericActionCancelLabel": "Cancel",
"@genericActionCancelLabel": {},
"genericActionCreateLabel": "Create",
"@genericActionCreateLabel": {},
"genericActionDeleteLabel": "Delete",
"@genericActionDeleteLabel": {},
"genericActionEditLabel": "Edit",
"@genericActionEditLabel": {},
"genericActionOkLabel": "Ok",
"@genericActionOkLabel": {},
"genericActionSaveLabel": "Save",
"@genericActionSaveLabel": {},
"genericActionSelectText": "Select",
"@genericActionSelectText": {},
"genericActionUpdateLabel": "Update",
"@genericActionUpdateLabel": {},
"genericActionUploadLabel": "Upload",
"@genericActionUploadLabel": {},
"genericMessageOfflineText": "You're offline. Check your connection.",
"@genericMessageOfflineText": {},
"inboxPageDocumentRemovedMessageText": "Document removed from inbox.",
"@inboxPageDocumentRemovedMessageText": {},
"inboxPageMarkAllAsSeenConfirmationDialogText": "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.\nThis action is not reversible! Are you sure you want to continue?",
"@inboxPageMarkAllAsSeenConfirmationDialogText": {},
"inboxPageMarkAllAsSeenConfirmationDialogTitleText": "Mark all as seen?",
"@inboxPageMarkAllAsSeenConfirmationDialogTitleText": {},
"inboxPageMarkAllAsSeenLabel": "Mark all as seen",
"@inboxPageMarkAllAsSeenLabel": {},
"inboxPageMarkAsSeenText": "Mark as seen",
"@inboxPageMarkAsSeenText": {},
"inboxPageTodayText": "Today",
"@inboxPageTodayText": {},
"inboxPageUndoRemoveText": "UNDO",
"@inboxPageUndoRemoveText": {},
"inboxPageUnseenText": "unseen",
"@inboxPageUnseenText": {},
"inboxPageUsageHintText": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.",
"@inboxPageUsageHintText": {},
"inboxPageYesterdayText": "Yesterday",
"@inboxPageYesterdayText": {},
"labelAnyAssignedText": "Any assigned",
"@labelAnyAssignedText": {},
"labelFormFieldNoItemsFoundText": "No items found!",
"@labelFormFieldNoItemsFoundText": {},
"labelIsInsensivitePropertyLabel": "Case Irrelevant",
"@labelIsInsensivitePropertyLabel": {},
"labelMatchingAlgorithmPropertyLabel": "Matching Algorithm",
"@labelMatchingAlgorithmPropertyLabel": {},
"labelMatchPropertyLabel": "Match",
"@labelMatchPropertyLabel": {},
"labelNamePropertyLabel": "Name",
"@labelNamePropertyLabel": {},
"labelNotAssignedText": "Not assigned",
"@labelNotAssignedText": {},
"labelsPageCorrespondentEmptyStateAddNewLabel": "Add new correspondent",
"@labelsPageCorrespondentEmptyStateAddNewLabel": {},
"labelsPageCorrespondentEmptyStateDescriptionText": "You don't seem to have any correspondents set up.",
"@labelsPageCorrespondentEmptyStateDescriptionText": {},
"labelsPageCorrespondentsTitleText": "Correspondents",
"@labelsPageCorrespondentsTitleText": {},
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Add new document type",
"@labelsPageDocumentTypeEmptyStateAddNewLabel": {},
"labelsPageDocumentTypeEmptyStateDescriptionText": "You don't seem to have any document types set up.",
"@labelsPageDocumentTypeEmptyStateDescriptionText": {},
"labelsPageDocumentTypesTitleText": "Document Types",
"@labelsPageDocumentTypesTitleText": {},
"labelsPageStoragePathEmptyStateAddNewLabel": "Add new storage path",
"@labelsPageStoragePathEmptyStateAddNewLabel": {},
"labelsPageStoragePathEmptyStateDescriptionText": "You don't seem to have any storage paths set up.",
"@labelsPageStoragePathEmptyStateDescriptionText": {},
"labelsPageStoragePathTitleText": "Storage Paths",
"@labelsPageStoragePathTitleText": {},
"labelsPageTagsEmptyStateAddNewLabel": "Add new tag",
"@labelsPageTagsEmptyStateAddNewLabel": {},
"labelsPageTagsEmptyStateDescriptionText": "You don't seem to have any tags set up.",
"@labelsPageTagsEmptyStateDescriptionText": {},
"labelsPageTagsTitleText": "Tags",
"@labelsPageTagsTitleText": {},
"linkedDocumentsPageTitle": "Linked Documents",
"@linkedDocumentsPageTitle": {},
"loginPageAdvancedLabel": "Advanced Settings",
"@loginPageAdvancedLabel": {},
"loginPageClientCertificatePassphraseLabel": "Passphrase",
"@loginPageClientCertificatePassphraseLabel": {},
"loginPageClientCertificateSettingDescriptionText": "Configure Mutual TLS Authentication",
"@loginPageClientCertificateSettingDescriptionText": {},
"loginPageClientCertificateSettingInvalidFileFormatValidationText": "Invalid certificate format, only .pfx is allowed",
"@loginPageClientCertificateSettingInvalidFileFormatValidationText": {},
"loginPageClientCertificateSettingLabel": "Client Certificate",
"@loginPageClientCertificateSettingLabel": {},
"loginPageClientCertificateSettingSelectFileText": "Select file...",
"@loginPageClientCertificateSettingSelectFileText": {},
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Incorrect or missing certificate passphrase.",
"@loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": {},
"loginPageLoginButtonLabel": "Connect",
"@loginPageLoginButtonLabel": {},
"loginPagePasswordFieldLabel": "Password",
"@loginPagePasswordFieldLabel": {},
"loginPagePasswordValidatorMessageText": "Password must not be empty.",
"@loginPagePasswordValidatorMessageText": {},
"loginPageServerUrlFieldLabel": "Server Address",
"@loginPageServerUrlFieldLabel": {},
"loginPageServerUrlValidatorMessageText": "Server address must not be empty.",
"@loginPageServerUrlValidatorMessageText": {},
"loginPageTitle": "Connect to Paperless",
"@loginPageTitle": {},
"loginPageUsernameLabel": "Username",
"@loginPageUsernameLabel": {},
"loginPageUsernameValidatorMessageText": "Username must not be empty.",
"@loginPageUsernameValidatorMessageText": {},
"offlineWidgetText": "An internet connection could not be established.",
"@offlineWidgetText": {},
"onboardingDoneButtonLabel": "Done",
"@onboardingDoneButtonLabel": {},
"onboardingNextButtonLabel": "Next",
"@onboardingNextButtonLabel": {},
"referencedDocumentsReadOnlyHintText": "This is a read-only view! You cannot edit or remove documents. A maximum of 100 referenced documents will be loaded.",
"@referencedDocumentsReadOnlyHintText": {},
"savedViewCreateNewLabel": "New View",
"@savedViewCreateNewLabel": {},
"savedViewCreateTooltipText": "Creates a new view based on the current filter criteria.",
"@savedViewCreateTooltipText": {},
"savedViewNameLabel": "Name",
"@savedViewNameLabel": {},
"savedViewsEmptyStateText": "Create views to quickly filter your documents.",
"@savedViewsEmptyStateText": {},
"savedViewShowInSidebarLabel": "Show in sidebar",
"@savedViewShowInSidebarLabel": {},
"savedViewShowOnDashboardLabel": "Show on dashboard",
"@savedViewShowOnDashboardLabel": {},
"savedViewsLabel": "Saved Views",
"@savedViewsLabel": {},
"serverInformationPaperlessVersionText": "Paperless server version",
"@serverInformationPaperlessVersionText": {},
"settingsPageAppearanceSettingDarkThemeLabel": "Dark Theme",
"@settingsPageAppearanceSettingDarkThemeLabel": {},
"settingsPageAppearanceSettingLightThemeLabel": "Light Theme",
"@settingsPageAppearanceSettingLightThemeLabel": {},
"settingsPageAppearanceSettingSystemThemeLabel": "Use system theme",
"@settingsPageAppearanceSettingSystemThemeLabel": {},
"settingsPageAppearanceSettingTitle": "Appearance",
"@settingsPageAppearanceSettingTitle": {},
"settingsPageApplicationSettingsDescriptionText": "Language and visual appearance",
"@settingsPageApplicationSettingsDescriptionText": {},
"settingsPageApplicationSettingsLabel": "Application",
"@settingsPageApplicationSettingsLabel": {},
"settingsPageLanguageSettingLabel": "Language",
"@settingsPageLanguageSettingLabel": {},
"settingsPageSecuritySettingsDescriptionText": "Biometric authentication",
"@settingsPageSecuritySettingsDescriptionText": {},
"settingsPageSecuritySettingsLabel": "Security",
"@settingsPageSecuritySettingsLabel": {},
"settingsPageStorageSettingsDescriptionText": "Manage files and storage space",
"@settingsPageStorageSettingsDescriptionText": {},
"settingsPageStorageSettingsLabel": "Storage",
"@settingsPageStorageSettingsLabel": {},
"settingsThemeModeDarkLabel": "Dark",
"@settingsThemeModeDarkLabel": {},
"settingsThemeModeLightLabel": "Light",
"@settingsThemeModeLightLabel": {},
"settingsThemeModeSystemLabel": "System",
"@settingsThemeModeSystemLabel": {},
"storagePathParameterDayLabel": "day",
"@storagePathParameterDayLabel": {},
"storagePathParameterMonthLabel": "month",
"@storagePathParameterMonthLabel": {},
"storagePathParameterYearLabel": "year",
"@storagePathParameterYearLabel": {},
"tagColorPropertyLabel": "Color",
"@tagColorPropertyLabel": {},
"tagFormFieldSearchHintText": "Filter tags...",
"@tagFormFieldSearchHintText": {},
"tagInboxTagPropertyLabel": "Inbox-Tag",
"@tagInboxTagPropertyLabel": {},
"uploadPageAutomaticallInferredFieldsHintText": "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.",
"@uploadPageAutomaticallInferredFieldsHintText": {}
}

View File

@@ -11,6 +11,7 @@ import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:intl/intl_standalone.dart'; import 'package:intl/intl_standalone.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:paperless_mobile/core/bloc/bloc_changes_observer.dart';
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart'; import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart'; import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart'; import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
@@ -35,6 +36,7 @@ import 'package:paperless_mobile/util.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart';
void main() async { void main() async {
Bloc.observer = BlocChangesObserver();
final widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); final widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
Intl.systemLocale = await findSystemLocale(); Intl.systemLocale = await findSystemLocale();

View File

@@ -102,25 +102,6 @@ String? formatDateNullable(DateTime? date) {
return dateFormat.format(date); return dateFormat.format(date);
} }
Future<String> writeToFile(Uint8List data) async {
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
var filePath =
tempPath + '/file_01.tmp'; // file_01.tmp is dump file, can be anything
return (await File(filePath).writeAsBytes(data)).path;
}
void setKeyNullable(Map data, String key, dynamic value) {
if (value != null) {
data[key] = value is String ? value : json.encode(value);
}
}
String formatLocalDate(BuildContext context, DateTime dateTime) {
final tag = Localizations.maybeLocaleOf(context)?.toLanguageTag();
return DateFormat.yMMMd(tag).format(dateTime);
}
String extractFilenameFromPath(String path) { String extractFilenameFromPath(String path) {
return path.split(RegExp('[./]')).reversed.skip(1).first; return path.split(RegExp('[./]')).reversed.skip(1).first;
} }

View File

@@ -43,13 +43,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.9.0" version: "2.9.0"
badges:
dependency: "direct main"
description:
name: badges
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
barcode: barcode:
dependency: transitive dependency: transitive
description: description:
@@ -450,7 +443,7 @@ packages:
source: hosted source: hosted
version: "3.3.0" version: "3.3.0"
flutter_chips_input: flutter_chips_input:
dependency: "direct main" dependency: transitive
description: description:
name: flutter_chips_input name: flutter_chips_input
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"

View File

@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.1.0+5 version: 1.2.0+6
environment: environment:
sdk: ">=2.17.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"
@@ -64,11 +64,9 @@ dependencies:
ref: main ref: main
form_builder_validators: ^8.3.0 form_builder_validators: ^8.3.0
infinite_scroll_pagination: ^3.2.0 infinite_scroll_pagination: ^3.2.0
flutter_chips_input: ^2.0.0
sliding_up_panel: ^2.0.0+1 sliding_up_panel: ^2.0.0+1
package_info_plus: ^1.4.3+1 package_info_plus: ^1.4.3+1
font_awesome_flutter: ^10.1.0 font_awesome_flutter: ^10.1.0
badges: ^2.0.3
local_auth: ^2.1.2 local_auth: ^2.1.2
connectivity_plus: ^2.3.9 connectivity_plus: ^2.3.9
@@ -138,6 +136,7 @@ flutter:
# see https://flutter.dev/custom-fonts/#from-packages # see https://flutter.dev/custom-fonts/#from-packages
flutter_intl: flutter_intl:
enabled: true enabled: true
main_locale: en
localizely: localizely:
project_id: 84b4144d-a628-4ba6-a8d0-4f9917444057 project_id: 84b4144d-a628-4ba6-a8d0-4f9917444057