From 1dc7d22d3ad0d5aa8ddc0d2d4198b44d28e2d057 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Tue, 30 May 2023 01:19:27 +0200 Subject: [PATCH] feat: Add new translations, add list of existing accounts to login page --- crowdin.yml | 5 +- .../view/dialogs/select_file_type_dialog.dart | 4 +- .../view/pages/document_details_page.dart | 2 +- .../view/document_search_bar.dart | 5 +- .../login/cubit/authentication_cubit.dart | 10 +- lib/features/login/view/login_page.dart | 47 ++ .../settings/view/manage_accounts_page.dart | 180 +++---- lib/features/settings/view/settings_page.dart | 4 +- .../settings/view/widgets/user_avatar.dart | 4 +- .../view/widgets/user_account_list_tile.dart | 41 ++ lib/l10n/intl_ca.arb | 44 +- lib/l10n/intl_cs.arb | 32 ++ lib/l10n/intl_de.arb | 32 ++ lib/l10n/intl_en.arb | 32 ++ lib/l10n/intl_fr.arb | 98 ++-- lib/l10n/intl_pl.arb | 470 ++++++++++-------- lib/l10n/intl_ru.arb | 32 ++ lib/l10n/intl_tr.arb | 32 ++ lib/main.dart | 1 + 19 files changed, 694 insertions(+), 381 deletions(-) create mode 100644 lib/features/users/view/widgets/user_account_list_tile.dart diff --git a/crowdin.yml b/crowdin.yml index 004844c..d086c08 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -4,7 +4,4 @@ files: [ "translation" : "/lib/l10n/intl_%two_letters_code%.arb", "type" : "arb", } -] -# Add your credentials here -"project_id": "568557" -"api_token_env": "CROWDIN_PAPERLESS_MOBILE_API_TOKEN" \ No newline at end of file +] \ No newline at end of file diff --git a/lib/features/document_details/view/dialogs/select_file_type_dialog.dart b/lib/features/document_details/view/dialogs/select_file_type_dialog.dart index bf56325..1c9bccb 100644 --- a/lib/features/document_details/view/dialogs/select_file_type_dialog.dart +++ b/lib/features/document_details/view/dialogs/select_file_type_dialog.dart @@ -47,9 +47,9 @@ class _SelectFileTypeDialogState extends State { value: _rememberSelection, onChanged: (value) => setState(() => _rememberSelection = value ?? false), title: Text( - "Remember my decision", + S.of(context)!.rememberDecision, style: Theme.of(context).textTheme.labelMedium, - ), //TODO: INTL + ), ), ], ), diff --git a/lib/features/document_details/view/pages/document_details_page.dart b/lib/features/document_details/view/pages/document_details_page.dart index 15333a9..9e38841 100644 --- a/lib/features/document_details/view/pages/document_details_page.dart +++ b/lib/features/document_details/view/pages/document_details_page.dart @@ -316,7 +316,7 @@ class _DocumentDetailsPageState extends State { ).paddedOnly(right: 4.0), DocumentShareButton(document: state.document), IconButton( - tooltip: "Print", //TODO: INTL + tooltip: S.of(context)!.print, //TODO: INTL onPressed: () => context.read().printDocument(), icon: const Icon(Icons.print), ), diff --git a/lib/features/document_search/view/document_search_bar.dart b/lib/features/document_search/view/document_search_bar.dart index bf6f674..0771c1f 100644 --- a/lib/features/document_search/view/document_search_bar.dart +++ b/lib/features/document_search/view/document_search_bar.dart @@ -115,10 +115,7 @@ class _DocumentSearchBarState extends State { valueListenable: Hive.box(HiveBoxes.localUserAccount).listenable(), builder: (context, box, _) { final account = box.get(settings.currentLoggedInUser!)!; - return UserAvatar( - userId: settings.currentLoggedInUser!, - account: account, - ); + return UserAvatar(account: account); }, ); }, diff --git a/lib/features/login/cubit/authentication_cubit.dart b/lib/features/login/cubit/authentication_cubit.dart index 2438689..3d9d77a 100644 --- a/lib/features/login/cubit/authentication_cubit.dart +++ b/lib/features/login/cubit/authentication_cubit.dart @@ -140,20 +140,14 @@ class AuthenticationCubit extends Cubit { } Future removeAccount(String userId) async { - final globalSettings = Hive.box(HiveBoxes.globalSettings).getValue()!; final userAccountBox = Hive.box(HiveBoxes.localUserAccount); final userAppStateBox = Hive.box(HiveBoxes.localUserAppState); - final currentUser = globalSettings.currentLoggedInUser; await userAccountBox.delete(userId); await userAppStateBox.delete(userId); - await withEncryptedBox(HiveBoxes.localUserCredentials, (box) { + await withEncryptedBox(HiveBoxes.localUserCredentials, (box) { box.delete(userId); }); - - if (currentUser == userId) { - return logout(); - } } /// @@ -209,10 +203,10 @@ class AuthenticationCubit extends Cubit { Future logout() async { await _resetExternalState(); final globalSettings = Hive.box(HiveBoxes.globalSettings).getValue()!; + emit(const AuthenticationState.unauthenticated()); globalSettings ..currentLoggedInUser = null ..save(); - emit(const AuthenticationState.unauthenticated()); } Future _resetExternalState() async { diff --git a/lib/features/login/view/login_page.dart b/lib/features/login/view/login_page.dart index 29e710c..3e63b36 100644 --- a/lib/features/login/view/login_page.dart +++ b/lib/features/login/view/login_page.dart @@ -1,5 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:hive_flutter/adapters.dart'; +import 'package:paperless_mobile/core/config/hive/hive_config.dart'; +import 'package:paperless_mobile/core/database/tables/local_user_account.dart'; +import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart'; import 'package:paperless_mobile/features/login/model/client_certificate.dart'; import 'package:paperless_mobile/features/login/model/client_certificate_form_model.dart'; import 'package:paperless_mobile/features/login/model/login_form_credentials.dart'; @@ -7,6 +12,8 @@ import 'package:paperless_mobile/features/login/view/widgets/form_fields/client_ import 'package:paperless_mobile/features/login/view/widgets/form_fields/server_address_form_field.dart'; import 'package:paperless_mobile/features/login/view/widgets/form_fields/user_credentials_form_field.dart'; import 'package:paperless_mobile/features/login/view/widgets/login_pages/server_connection_page.dart'; +import 'package:paperless_mobile/features/users/view/widgets/user_account_list_tile.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'widgets/login_pages/server_login_page.dart'; import 'widgets/never_scrollable_scroll_behavior.dart'; @@ -23,11 +30,14 @@ class LoginPage extends StatefulWidget { final String submitText; final String titleString; + final bool showLocalAccounts; + const LoginPage({ Key? key, required this.onSubmit, required this.submitText, required this.titleString, + this.showLocalAccounts = false, }) : super(key: key); @override @@ -41,6 +51,7 @@ class _LoginPageState extends State { @override Widget build(BuildContext context) { + final localAccounts = Hive.box(HiveBoxes.localUserAccount); return Scaffold( resizeToAvoidBottomInset: false, body: FormBuilder( @@ -49,6 +60,42 @@ class _LoginPageState extends State { controller: _pageController, scrollBehavior: NeverScrollableScrollBehavior(), children: [ + if (widget.showLocalAccounts && localAccounts.isNotEmpty) + Scaffold( + appBar: AppBar( + title: Text(S.of(context)!.logInToExistingAccount), + ), + bottomNavigationBar: BottomAppBar( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + FilledButton( + child: Text(S.of(context)!.goToLogin), + onPressed: () { + _pageController.nextPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + }, + ), + ], + ), + ), + body: ListView.builder( + itemBuilder: (context, index) { + final account = localAccounts.values.elementAt(index); + return Card( + child: UserAccountListTile( + account: account, + onTap: () { + context.read().switchAccount(account.id); + }, + ), + ); + }, + itemCount: localAccounts.length, + ), + ), ServerConnectionPage( titleString: widget.titleString, formBuilderKey: _formKey, diff --git a/lib/features/settings/view/manage_accounts_page.dart b/lib/features/settings/view/manage_accounts_page.dart index d4fdac0..b430d7d 100644 --- a/lib/features/settings/view/manage_accounts_page.dart +++ b/lib/features/settings/view/manage_accounts_page.dart @@ -12,6 +12,7 @@ import 'package:paperless_mobile/features/settings/view/dialogs/switch_account_d import 'package:paperless_mobile/features/settings/view/pages/switching_accounts_page.dart'; import 'package:paperless_mobile/features/settings/view/widgets/global_settings_builder.dart'; import 'package:paperless_mobile/features/settings/view/widgets/user_avatar.dart'; +import 'package:paperless_mobile/features/users/view/widgets/user_account_list_tile.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'package:provider/provider.dart'; @@ -22,6 +23,11 @@ class ManageAccountsPage extends StatelessWidget { Widget build(BuildContext context) { return GlobalSettingsBuilder( builder: (context, globalSettings) { + // This is one of the few places where the currentLoggedInUser can be null + // (exactly after loggin out as the current user to be precise). + if (globalSettings.currentLoggedInUser == null) { + return SizedBox.shrink(); + } return ValueListenableBuilder( valueListenable: Hive.box(HiveBoxes.localUserAccount).listenable(), builder: (context, box, _) { @@ -46,16 +52,78 @@ class ManageAccountsPage extends StatelessWidget { borderRadius: BorderRadius.circular(24), ), children: [ - _buildAccountTile(context, globalSettings.currentLoggedInUser!, - box.get(globalSettings.currentLoggedInUser!)!, globalSettings), + Card( + child: UserAccountListTile( + account: box.get(globalSettings.currentLoggedInUser!)!, + trailing: PopupMenuButton( + icon: const Icon(Icons.more_vert), + itemBuilder: (context) => [ + PopupMenuItem( + child: ListTile( + title: Text(S.of(context)!.logout), + leading: const Icon( + Icons.person_remove, + color: Colors.red, + ), + ), + value: 0, + ), + ], + onSelected: (value) async { + if (value == 0) { + await context + .read() + .removeAccount(globalSettings.currentLoggedInUser!); + Navigator.of(context).pop(); + context.read().logout(); + } + }, + ), + ), + ), Column( children: [ for (int index = 0; index < otherAccounts.length; index++) - _buildAccountTile( - context, - otherAccounts[index], - box.get(otherAccounts[index])!, - globalSettings, + UserAccountListTile( + account: box.get(otherAccounts[index])!, + trailing: PopupMenuButton( + icon: const Icon(Icons.more_vert), + itemBuilder: (context) { + return [ + PopupMenuItem( + child: ListTile( + title: Text(S.of(context)!.switchAccount), + leading: const Icon(Icons.switch_account_rounded), + ), + value: 0, + ), + PopupMenuItem( + child: ListTile( + title: Text(S.of(context)!.remove), + leading: const Icon( + Icons.person_remove, + color: Colors.red, + ), + ), + value: 1, + ) + ]; + }, + onSelected: (value) async { + if (value == 0) { + // Switch + _onSwitchAccount( + context, + globalSettings.currentLoggedInUser!, + otherAccounts[index], + ); + } else if (value == 1) { + await context + .read() + .removeAccount(otherAccounts[index]); + } + }, + ), ), ], ), @@ -68,9 +136,9 @@ class ManageAccountsPage extends StatelessWidget { }, ), if (context.watch().hasMultiUserSupport) - const ListTile( - leading: Icon(Icons.admin_panel_settings), - title: Text("Manage permissions"), //TODO: INTL + ListTile( + leading: const Icon(Icons.admin_panel_settings), + title: Text(S.of(context)!.managePermissions), ), ], ); @@ -80,93 +148,6 @@ class ManageAccountsPage extends StatelessWidget { ); } - Widget _buildAccountTile( - BuildContext context, - String userId, - LocalUserAccount account, - GlobalSettings settings, - ) { - final isLoggedIn = userId == settings.currentLoggedInUser; - final theme = Theme.of(context); - final child = SizedBox( - width: double.maxFinite, - child: ListTile( - title: Text(account.paperlessUser.username), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (account.paperlessUser.fullName != null) Text(account.paperlessUser.fullName!), - Text( - account.serverUrl.replaceFirst(RegExp(r'https://?'), ''), - style: TextStyle(color: theme.colorScheme.primary), - ), - ], - ), - isThreeLine: account.paperlessUser.fullName != null, - leading: UserAvatar( - account: account, - userId: userId, - ), - trailing: PopupMenuButton( - icon: const Icon(Icons.more_vert), - itemBuilder: (context) { - return [ - if (!isLoggedIn) - PopupMenuItem( - child: ListTile( - title: Text(S.of(context)!.switchAccount), - leading: const Icon(Icons.switch_account_rounded), - ), - value: 0, - ), - if (!isLoggedIn) - PopupMenuItem( - child: ListTile( - title: Text(S.of(context)!.remove), - leading: const Icon( - Icons.person_remove, - color: Colors.red, - ), - ), - value: 1, - ) - else - PopupMenuItem( - child: ListTile( - title: Text(S.of(context)!.logout), - leading: const Icon( - Icons.person_remove, - color: Colors.red, - ), - ), - value: 1, - ), - ]; - }, - onSelected: (value) async { - if (value == 0) { - // Switch - _onSwitchAccount(context, settings.currentLoggedInUser!, userId); - } else if (value == 1) { - // Remove - final shouldPop = userId == settings.currentLoggedInUser; - await context.read().removeAccount(userId); - if (shouldPop) { - Navigator.pop(context); - } - } - }, - ), - ), - ); - if (isLoggedIn) { - return Card( - child: child, - ); - } - return child; - } - Future _onAddAccount(BuildContext context, String currentUser) async { final userId = await Navigator.push( context, @@ -202,9 +183,10 @@ class ManageAccountsPage extends StatelessWidget { } } - _onSwitchAccount(BuildContext context, String currentUser, String newUser) async { + void _onSwitchAccount(BuildContext context, String currentUser, String newUser) async { if (currentUser == newUser) return; + Navigator.of(context).pop(); - context.read().switchAccount(newUser); + await context.read().switchAccount(newUser); } } diff --git a/lib/features/settings/view/settings_page.dart b/lib/features/settings/view/settings_page.dart index 22a3cd3..c255578 100644 --- a/lib/features/settings/view/settings_page.dart +++ b/lib/features/settings/view/settings_page.dart @@ -30,7 +30,7 @@ class SettingsPage extends StatelessWidget { builder: (context, snapshot) { if (snapshot.hasError) { return Text( - "Something went wrong while retrieving server data.", //TODO: INTL + S.of(context)!.errorRetrievingServerVersion, style: Theme.of(context) .textTheme .labelSmall @@ -40,7 +40,7 @@ class SettingsPage extends StatelessWidget { } if (!snapshot.hasData) { return Text( - "Loading server information...", //TODO: INTL + S.of(context)!.resolvingServerVersion, style: Theme.of(context).textTheme.labelSmall, textAlign: TextAlign.center, ); diff --git a/lib/features/settings/view/widgets/user_avatar.dart b/lib/features/settings/view/widgets/user_avatar.dart index 41be64a..47cee3f 100644 --- a/lib/features/settings/view/widgets/user_avatar.dart +++ b/lib/features/settings/view/widgets/user_avatar.dart @@ -2,18 +2,16 @@ import 'package:flutter/material.dart'; import 'package:paperless_mobile/core/database/tables/local_user_account.dart'; class UserAvatar extends StatelessWidget { - final String userId; final LocalUserAccount account; const UserAvatar({ super.key, - required this.userId, required this.account, }); @override Widget build(BuildContext context) { - final backgroundColor = Colors.primaries[userId.hashCode % Colors.primaries.length]; + final backgroundColor = Colors.primaries[account.id.hashCode % Colors.primaries.length]; final foregroundColor = backgroundColor.computeLuminance() > 0.5 ? Colors.black : Colors.white; return CircleAvatar( child: Text((account.paperlessUser.fullName ?? account.paperlessUser.username) diff --git a/lib/features/users/view/widgets/user_account_list_tile.dart b/lib/features/users/view/widgets/user_account_list_tile.dart new file mode 100644 index 0000000..a107b2a --- /dev/null +++ b/lib/features/users/view/widgets/user_account_list_tile.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:paperless_mobile/core/database/tables/local_user_account.dart'; +import 'package:paperless_mobile/features/settings/view/widgets/user_avatar.dart'; + +class UserAccountListTile extends StatelessWidget { + final LocalUserAccount account; + + final Widget? trailing; + final VoidCallback? onTap; + const UserAccountListTile({ + super.key, + required this.account, + this.trailing, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return SizedBox( + width: double.maxFinite, + child: ListTile( + onTap: onTap, + title: Text(account.paperlessUser.username), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (account.paperlessUser.fullName != null) Text(account.paperlessUser.fullName!), + Text( + account.serverUrl.replaceFirst(RegExp(r'https://?'), ''), + style: TextStyle(color: theme.colorScheme.primary), + ), + ], + ), + isThreeLine: account.paperlessUser.fullName != null, + leading: UserAvatar(account: account), + trailing: trailing, + ), + ); + } +} diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index d320268..489f9e1 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -762,22 +762,54 @@ "@switchToNewAccount": { "description": "Content of the dialog shown after adding an account, asking the user whether to switch to the newly added account or not." }, - "sourceCode": "Source Code", - "findTheSourceCodeOn": "Find the source code on", + "sourceCode": "Codi Font", + "findTheSourceCodeOn": "Troba el codi font a", "@findTheSourceCodeOn": { "description": "Text before link to Paperless Mobile GitHub" }, - "rememberDecision": "Remember my decision", - "defaultDownloadFileType": "Default Download File Type", + "rememberDecision": "Recorda la selecció", + "defaultDownloadFileType": "Tipus de Fitxer a descarregar per defecte", "@defaultDownloadFileType": { "description": "Label indicating the default filetype to download (one of archived, original and always ask)" }, - "defaultShareFileType": "Default Share File Type", + "defaultShareFileType": "Tipus compartició de fitxer per defecte", "@defaultShareFileType": { "description": "Label indicating the default filetype to share (one of archived, original and always ask)" }, - "alwaysAsk": "Always ask", + "alwaysAsk": "Pregunta sempre", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index 7e0f9c4..d115c5b 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -779,5 +779,37 @@ "alwaysAsk": "Always ask", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 66cb563..7ff7eb1 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -779,5 +779,37 @@ "alwaysAsk": "Immer fragen", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Deaktiviere automatische Zuweisung", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "Keine", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Mit bestehendem Account anmelden", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Drucken", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Berechtigungen verwalten", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "Beim Laden der Server-Version ist ein Fehler aufgetreten.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Lade Server-Version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Gehe zur Anmeldung", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 8984f3b..dbf767f 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -779,5 +779,37 @@ "alwaysAsk": "Always ask", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 1ae2fdb..54d7ccc 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -678,106 +678,138 @@ "@dynamicColorScheme": {}, "classicColorScheme": "Classique", "@classicColorScheme": {}, - "notificationDownloadComplete": "Download complete", + "notificationDownloadComplete": "Téléchargement terminé", "@notificationDownloadComplete": { "description": "Notification title when a download has been completed." }, - "notificationDownloadingDocument": "Downloading document", + "notificationDownloadingDocument": "Téléchargement du document", "@notificationDownloadingDocument": { "description": "Notification title shown when a document download is pending" }, - "archiveSerialNumberUpdated": "Archive Serial Number updated.", + "archiveSerialNumberUpdated": "Numéro de série de l’archive mis à jour.", "@archiveSerialNumberUpdated": { "description": "Message shown when the ASN has been updated." }, - "donateCoffee": "Buy me a coffee", + "donateCoffee": "Soutenez-moi", "@donateCoffee": { "description": "Label displayed in the app drawer" }, - "thisFieldIsRequired": "This field is required!", + "thisFieldIsRequired": "Ce champ est obligatoire !", "@thisFieldIsRequired": { "description": "Message shown below the form field when a required field has not been filled out." }, - "confirm": "Confirm", - "confirmAction": "Confirm action", + "confirm": "Confirmer", + "confirmAction": "Confirmer l’action", "@confirmAction": { "description": "Typically used as a title to confirm a previously selected action" }, - "areYouSureYouWantToContinue": "Are you sure you want to continue?", - "bulkEditTagsAddMessage": "{count, plural, one{This operation will add the tags {tags} to the selected document.} other{This operation will add the tags {tags} to {count} selected documents.}}", + "areYouSureYouWantToContinue": "Etes-vous sûr(e) de vouloir continuer?", + "bulkEditTagsAddMessage": "{count, plural, one{Cette opération va ajouter les balises {tags} au document sélectionné} other{Cette opération va ajouter les balises {tags} à {count} documents sélectionnés!}}", "@bulkEditTagsAddMessage": { "description": "Message of the confirmation dialog when bulk adding tags." }, - "bulkEditTagsRemoveMessage": "{count, plural, one{This operation will remove the tags {tags} from the selected document.} other{This operation will remove the tags {tags} from {count} selected documents.}}", + "bulkEditTagsRemoveMessage": "{count, plural, one{Cette opération supprimera les balises {tags} du document sélectionné.} other{Cette opération supprimera les balises {tags} de {count} documents sélectionnés!}}", "@bulkEditTagsRemoveMessage": { "description": "Message of the confirmation dialog when bulk removing tags." }, - "bulkEditTagsModifyMessage": "{count, plural, one{This operation will add the tags {addTags} and remove the tags {removeTags} from the selected document.} other{This operation will add the tags {addTags} and remove the tags {removeTags} from {count} selected documents.}}", + "bulkEditTagsModifyMessage": "{count, plural, one{Cette opération va ajouter les balises {addTags} et supprimer les balises {removeTags} du document sélectionné} other{Cette opération va ajouter les balises {addTags} et supprimer les balises {removeTags} de {count} documents sélectionnés.}}", "@bulkEditTagsModifyMessage": { "description": "Message of the confirmation dialog when both adding and removing tags." }, - "bulkEditCorrespondentAssignMessage": "{count, plural, one{This operation will assign the correspondent {correspondent} to the selected document.} other{This operation will assign the correspondent {correspondent} to {count} selected documents.}}", - "bulkEditDocumentTypeAssignMessage": "{count, plural, one{This operation will assign the document type {docType} to the selected document.} other{This operation will assign the documentType {docType} to {count} selected documents.}}", - "bulkEditStoragePathAssignMessage": "{count, plural, one{This operation will assign the storage path {path} to the selected document.} other{This operation will assign the storage path {path} to {count} selected documents.}}", - "bulkEditCorrespondentRemoveMessage": "{count, plural, one{This operation will remove the correspondent from the selected document.} other{This operation will remove the correspondent from {count} selected documents.}}", - "bulkEditDocumentTypeRemoveMessage": "{count, plural, one{This operation will remove the document type from the selected document.} other{This operation will remove the document type from {count} selected documents.}}", - "bulkEditStoragePathRemoveMessage": "{count, plural, one{This operation will remove the storage path from the selected document.} other{This operation will remove the storage path from {count} selected documents.}}", - "anyTag": "Any", + "bulkEditCorrespondentAssignMessage": "{count, plural, one{Cette opération assignera le correspondant {correspondent} au document sélectionné} other{Cette opération va assigner le correspondant {correspondent} à {count} documents sélectionnés!}}", + "bulkEditDocumentTypeAssignMessage": "{count, plural, one{Cette opération assignera le type de document {docType} au document sélectionné.} other{Cette opération va assigner le documentType {docType} à {count} documents sélectionnés.}}", + "bulkEditStoragePathAssignMessage": "{count, plural, one{Cette opération assignera le chemin de stockage {path} au document sélectionné.} other{Cette opération va assigner le chemin de stockage {path} à {count} documents sélectionnés.}}", + "bulkEditCorrespondentRemoveMessage": "{count, plural, one{Cette opération va supprimer le correspondant du document sélectionné.} other{Cette opération va supprimer le correspondant de {count} documents sélectionnés.}}", + "bulkEditDocumentTypeRemoveMessage": "{count, plural, one{Cette opération va supprimer le type de document du document sélectionné.} other{Cette opération va supprimer le type de document de {count} documents sélectionnés.}}", + "bulkEditStoragePathRemoveMessage": "{count, plural, one{Cette opération supprimera le chemin de stockage du document sélectionné.} other{Cette opération supprimera le chemin de stockage de {count} documents sélectionnés.}}", + "anyTag": "Tous", "@anyTag": { "description": "Label shown when any tag should be filtered" }, - "allTags": "All", + "allTags": "Tous", "@allTags": { "description": "Label shown when a document has to be assigned to all selected tags" }, - "switchingAccountsPleaseWait": "Switching accounts. Please wait...", + "switchingAccountsPleaseWait": "Changement de compte. Veuillez patienter...", "@switchingAccountsPleaseWait": { "description": "Message shown while switching accounts is in progress." }, - "testConnection": "Test connection", + "testConnection": "Vérifier la connexion", "@testConnection": { "description": "Button label shown on login page. Allows user to test whether the server is reachable or not." }, - "accounts": "Accounts", + "accounts": "Comptes", "@accounts": { "description": "Title of the account management dialog" }, - "addAccount": "Add account", + "addAccount": "Ajouter un compte", "@addAccount": { "description": "Label of add account action" }, - "switchAccount": "Switch", + "switchAccount": "Basculer", "@switchAccount": { "description": "Label for switch account action" }, - "logout": "Logout", + "logout": "Déconnexion", "@logout": { "description": "Generic Logout label" }, - "switchAccountTitle": "Switch account", + "switchAccountTitle": "Changer de compte", "@switchAccountTitle": { "description": "Title of the dialog shown after adding an account, asking the user whether to switch to the newly added account or not." }, - "switchToNewAccount": "Do you want to switch to the new account? You can switch back at any time.", + "switchToNewAccount": "Voulez-vous basculer vers le nouveau compte ? Vous pouvez revenir à tout moment.", "@switchToNewAccount": { "description": "Content of the dialog shown after adding an account, asking the user whether to switch to the newly added account or not." }, - "sourceCode": "Source Code", - "findTheSourceCodeOn": "Find the source code on", + "sourceCode": "Code source", + "findTheSourceCodeOn": "Trouvez le code source sur", "@findTheSourceCodeOn": { "description": "Text before link to Paperless Mobile GitHub" }, - "rememberDecision": "Remember my decision", - "defaultDownloadFileType": "Default Download File Type", + "rememberDecision": "Se souvenir de mon choix", + "defaultDownloadFileType": "Type de fichier par défaut", "@defaultDownloadFileType": { "description": "Label indicating the default filetype to download (one of archived, original and always ask)" }, - "defaultShareFileType": "Default Share File Type", + "defaultShareFileType": "Type de fichier par défaut de partage", "@defaultShareFileType": { "description": "Label indicating the default filetype to share (one of archived, original and always ask)" }, - "alwaysAsk": "Always ask", + "alwaysAsk": "Toujours demander", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index a51ceac..a717555 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -9,7 +9,7 @@ "@addAnotherAccount": {}, "account": "Konto", "@account": {}, - "addCorrespondent": "New Correspondent", + "addCorrespondent": "Dodaj korespondenta", "@addCorrespondent": { "description": "Title when adding a new correspondent" }, @@ -17,7 +17,7 @@ "@addDocumentType": { "description": "Title when adding a new document type" }, - "addStoragePath": "New Storage Path", + "addStoragePath": "Dodaj ścieżkę zapisu", "@addStoragePath": { "description": "Title when adding a new storage path" }, @@ -43,13 +43,13 @@ "@reportABug": {}, "settings": "Ustawienia", "@settings": {}, - "authenticateOnAppStart": "Authenticate on app start", + "authenticateOnAppStart": "Uwierzytelnij przy starcie aplikacji", "@authenticateOnAppStart": { "description": "Description of the biometric authentication settings tile" }, - "biometricAuthentication": "Biometric authentication", + "biometricAuthentication": "Uwierzytelnianie biometryczne", "@biometricAuthentication": {}, - "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Authenticate to enable biometric authentication} disable{Authenticate to disable biometric authentication} other{}}", + "authenticateToToggleBiometricAuthentication": "{mode, select, enable{Uwierzytelnij, aby włączyć uwierzytelnianie biometryczne} disable{Uwierzytelnij, aby wyłączyć uwierzytelnianie biometryczne} other{}}", "@authenticateToToggleBiometricAuthentication": { "placeholders": { "mode": {} @@ -59,29 +59,29 @@ "@documents": {}, "inbox": "Skrzynka odbiorcza", "@inbox": {}, - "labels": "Labels", + "labels": "Etykiety", "@labels": {}, - "scanner": "Scanner", + "scanner": "Skaner", "@scanner": {}, "startTyping": "Zacznij pisać...", "@startTyping": {}, - "doYouReallyWantToDeleteThisView": "Do you really want to delete this view?", + "doYouReallyWantToDeleteThisView": "Czy na pewno chcesz usunąć ten widok?", "@doYouReallyWantToDeleteThisView": {}, "deleteView": "Usuń widok ", "@deleteView": {}, - "addedAt": "Added at", + "addedAt": "Dodano", "@addedAt": {}, "archiveSerialNumber": "Numer Seryjny Archiwum", "@archiveSerialNumber": {}, "asn": "ASN", "@asn": {}, - "correspondent": "Correspondent", + "correspondent": "Korespondent", "@correspondent": {}, - "createdAt": "Created at", + "createdAt": "Utworzono", "@createdAt": {}, "documentSuccessfullyDeleted": "Dokument pomyślnie usunięty.", "@documentSuccessfullyDeleted": {}, - "assignAsn": "Assign ASN", + "assignAsn": "Przypisz ASN", "@assignAsn": {}, "deleteDocumentTooltip": "Usuń", "@deleteDocumentTooltip": { @@ -95,7 +95,7 @@ "@editDocumentTooltip": { "description": "Tooltip shown for the edit button on details page" }, - "loadFullContent": "Load full content", + "loadFullContent": "Załaduj pełną treść", "@loadFullContent": {}, "noAppToDisplayPDFFilesFound": "Nie znaleziono aplikacji do wyświetlania plików PDF", "@noAppToDisplayPDFFilesFound": {}, @@ -129,17 +129,17 @@ }, "documentType": "Rodzaj dokumentu", "@documentType": {}, - "archivedPdf": "Archived (pdf)", + "archivedPdf": "Zarchiwizowany (pdf)", "@archivedPdf": { "description": "Option to chose when downloading a document" }, - "chooseFiletype": "Choose filetype", + "chooseFiletype": "Wybierz typ pliku", "@chooseFiletype": {}, - "original": "Original", + "original": "Oryginał", "@original": { "description": "Option to chose when downloading a document" }, - "documentSuccessfullyDownloaded": "Document successfully downloaded.", + "documentSuccessfullyDownloaded": "Pobieranie dokumentu udane.", "@documentSuccessfullyDownloaded": {}, "suggestions": "Sugestie: ", "@suggestions": {}, @@ -149,7 +149,7 @@ "@advanced": {}, "apply": "Zastosuj", "@apply": {}, - "extended": "Extended", + "extended": "Rozszerz", "@extended": {}, "titleAndContent": "Tytuł i treść", "@titleAndContent": {}, @@ -157,19 +157,19 @@ "@title": {}, "reset": "Zresetuj", "@reset": {}, - "filterDocuments": "Filter Documents", + "filterDocuments": "Filtrowanie dokumentów", "@filterDocuments": { "description": "Title of the document filter" }, - "originalMD5Checksum": "Original MD5-Checksum", + "originalMD5Checksum": "MD5-Checksum (suma kontrolna) oryginału", "@originalMD5Checksum": {}, "mediaFilename": "Nazwa pliku", "@mediaFilename": {}, - "originalFileSize": "Original File Size", + "originalFileSize": "Rozmiar oryginalnego pliku", "@originalFileSize": {}, - "originalMIMEType": "Original MIME-Type", + "originalMIMEType": "MIME-Type oryginału", "@originalMIMEType": {}, - "modifiedAt": "Modified at", + "modifiedAt": "Zmodyfikowano", "@modifiedAt": {}, "preview": "Podgląd", "@preview": { @@ -177,7 +177,7 @@ }, "scanADocument": "Zeskanuj dokument", "@scanADocument": {}, - "noDocumentsScannedYet": "No documents scanned yet.", + "noDocumentsScannedYet": "Brak zeskanowanych dokumentów.", "@noDocumentsScannedYet": {}, "or": "lub", "@or": { @@ -185,11 +185,11 @@ }, "deleteAllScans": "Usuń wszystkie skany", "@deleteAllScans": {}, - "uploadADocumentFromThisDevice": "Upload a document from this device", + "uploadADocumentFromThisDevice": "Prześlij dokument z tego urządzenia", "@uploadADocumentFromThisDevice": { "description": "Button label on scanner page" }, - "noMatchesFound": "No matches found.", + "noMatchesFound": "Nie znaleziono pasujących elementów.", "@noMatchesFound": { "description": "Displayed when no documents were found in the document search." }, @@ -199,50 +199,50 @@ "@results": { "description": "Label displayed above search results in document search." }, - "searchDocuments": "Search documents", + "searchDocuments": "Szukaj dokumentów", "@searchDocuments": {}, "resetFilter": "Zresetuj filtr", "@resetFilter": {}, - "lastMonth": "Last Month", + "lastMonth": "Ostatni Miesiąc", "@lastMonth": {}, - "last7Days": "Last 7 Days", + "last7Days": "Ostatnie 7 dni", "@last7Days": {}, - "last3Months": "Last 3 Months", + "last3Months": "Ostatnie 3 miesiące", "@last3Months": {}, - "lastYear": "Last Year", + "lastYear": "Ostatni rok", "@lastYear": {}, "search": "Szukaj", "@search": {}, "documentsSuccessfullyDeleted": "Dokument pomyślnie usunięty.", "@documentsSuccessfullyDeleted": {}, - "thereSeemsToBeNothingHere": "There seems to be nothing here...", + "thereSeemsToBeNothingHere": "Wygląda na to, że nic tu nie ma...", "@thereSeemsToBeNothingHere": {}, "oops": "Ups.", "@oops": {}, - "newDocumentAvailable": "New document available!", + "newDocumentAvailable": "Nowy dokument dostępny!", "@newDocumentAvailable": {}, "orderBy": "Sortuj według", "@orderBy": {}, - "thisActionIsIrreversibleDoYouWishToProceedAnyway": "This action is irreversible. Do you wish to proceed anyway?", + "thisActionIsIrreversibleDoYouWishToProceedAnyway": "Ta czynność jest nieodwracalna. Czy mimo to chcesz kontynuować?", "@thisActionIsIrreversibleDoYouWishToProceedAnyway": {}, "confirmDeletion": "Potwierdź usunięcie", "@confirmDeletion": {}, - "areYouSureYouWantToDeleteTheFollowingDocuments": "{count, plural, one{Are you sure you want to delete the following document?} other{Are you sure you want to delete the following documents?}}", + "areYouSureYouWantToDeleteTheFollowingDocuments": "{count,plural, one{Czy na pewno chcesz usunąć ten plik?} few {Czy na pewno chcesz usunąć {count} pliki?} other {Czy na pewno chcesz usunąć {count} plików?}}", "@areYouSureYouWantToDeleteTheFollowingDocuments": { "placeholders": { "count": {} } }, - "countSelected": "{count} selected", + "countSelected": "Wybrano {count}", "@countSelected": { "description": "Displayed in the appbar when at least one document is selected.", "placeholders": { "count": {} } }, - "storagePath": "Storage Path", + "storagePath": "Ścieżka zapisu", "@storagePath": {}, - "prepareDocument": "Prepare document", + "prepareDocument": "Przygotuj dokument", "@prepareDocument": {}, "tags": "Tagi", "@tags": {}, @@ -250,97 +250,97 @@ "@documentSuccessfullyUpdated": {}, "fileName": "Nazwa Pliku", "@fileName": {}, - "synchronizeTitleAndFilename": "Synchronize title and filename", + "synchronizeTitleAndFilename": "Synchronizuj tytuł i nazwę pliku", "@synchronizeTitleAndFilename": {}, "reload": "Odśwież", "@reload": {}, "documentSuccessfullyUploadedProcessing": "Dokument pomyślnie przesłany, przetwarzam...", "@documentSuccessfullyUploadedProcessing": {}, - "deleteLabelWarningText": "This label contains references to other documents. By deleting this label, all references will be removed. Continue?", + "deleteLabelWarningText": "Ta etykieta zawiera odniesienia do innych dokumentów. Usuwając tę etykietę, wszystkie odniesienia zostaną usunięte. Kontynuować?", "@deleteLabelWarningText": {}, - "couldNotAcknowledgeTasks": "Could not acknowledge tasks.", + "couldNotAcknowledgeTasks": "Nie udało się potwierdzić zadań.", "@couldNotAcknowledgeTasks": {}, - "authenticationFailedPleaseTryAgain": "Authentication failed, please try again.", + "authenticationFailedPleaseTryAgain": "Uwierzytelnienie nie powiodło się, spróbuj ponownie.", "@authenticationFailedPleaseTryAgain": {}, - "anErrorOccurredWhileTryingToAutocompleteYourQuery": "An error ocurred while trying to autocomplete your query.", + "anErrorOccurredWhileTryingToAutocompleteYourQuery": "Wystąpił błąd podczas próby automatycznego uzupełniania zapytania.", "@anErrorOccurredWhileTryingToAutocompleteYourQuery": {}, - "biometricAuthenticationFailed": "Biometric authentication failed.", + "biometricAuthenticationFailed": "Uwierzytelnianie biometryczne nie powiodło się.", "@biometricAuthenticationFailed": {}, - "biometricAuthenticationNotSupported": "Biometric authentication not supported on this device.", + "biometricAuthenticationNotSupported": "Uwierzytelnianie biometryczne nie jest obsługiwane na tym urządzeniu.", "@biometricAuthenticationNotSupported": {}, - "couldNotBulkEditDocuments": "Could not bulk edit documents.", + "couldNotBulkEditDocuments": "Nie udało się edytować wielu dokumentów.", "@couldNotBulkEditDocuments": {}, - "couldNotCreateCorrespondent": "Could not create correspondent, please try again.", + "couldNotCreateCorrespondent": "Nie udało się utworzyć korespondenta, spróbuj ponownie.", "@couldNotCreateCorrespondent": {}, - "couldNotLoadCorrespondents": "Could not load correspondents.", + "couldNotLoadCorrespondents": "Nie udało się załadować korespondentów.", "@couldNotLoadCorrespondents": {}, - "couldNotCreateSavedView": "Could not create saved view, please try again.", + "couldNotCreateSavedView": "Nie udało się utworzyć zapisanego widoku, spróbuj ponownie.", "@couldNotCreateSavedView": {}, - "couldNotDeleteSavedView": "Could not delete saved view, please try again", + "couldNotDeleteSavedView": "Nie udało się usunąć zapisanego widoku, spróbuj ponownie", "@couldNotDeleteSavedView": {}, - "youAreCurrentlyOffline": "You are currently offline. Please make sure you are connected to the internet.", + "youAreCurrentlyOffline": "Jesteś obecnie w trybie offline. Upewnij się, że jesteś połączony z Internetem.", "@youAreCurrentlyOffline": {}, - "couldNotAssignArchiveSerialNumber": "Could not assign archive serial number.", + "couldNotAssignArchiveSerialNumber": "Nie udało się przypisać numeru seryjnego archiwum (ASN).", "@couldNotAssignArchiveSerialNumber": {}, - "couldNotDeleteDocument": "Could not delete document, please try again.", + "couldNotDeleteDocument": "Nie udało się usunąć dokumentu, spróbuj ponownie.", "@couldNotDeleteDocument": {}, - "couldNotLoadDocuments": "Could not load documents, please try again.", + "couldNotLoadDocuments": "Nie udało się załadować dokumentów, spróbuj ponownie.", "@couldNotLoadDocuments": {}, - "couldNotLoadDocumentPreview": "Could not load document preview.", + "couldNotLoadDocumentPreview": "Nie udało się załadować podglądu dokumentu.", "@couldNotLoadDocumentPreview": {}, - "couldNotCreateDocument": "Could not create document, please try again.", + "couldNotCreateDocument": "Nie udało się utworzyć dokumentu, spróbuj ponownie.", "@couldNotCreateDocument": {}, - "couldNotLoadDocumentTypes": "Could not load document types, please try again.", + "couldNotLoadDocumentTypes": "Nie udało się załadować typów dokumentów, spróbuj ponownie.", "@couldNotLoadDocumentTypes": {}, - "couldNotUpdateDocument": "Could not update document, please try again.", + "couldNotUpdateDocument": "Nie udało się zmodyfikować dokumentu, spróbuj ponownie.", "@couldNotUpdateDocument": {}, - "couldNotUploadDocument": "Could not upload document, please try again.", + "couldNotUploadDocument": "Nie udało się przesłać dokumentu, spróbuj ponownie.", "@couldNotUploadDocument": {}, - "invalidCertificateOrMissingPassphrase": "Invalid certificate or missing passphrase, please try again", + "invalidCertificateOrMissingPassphrase": "Certyfikat jest nieprawidłowy lub brakuje hasła, spróbuj ponownie", "@invalidCertificateOrMissingPassphrase": {}, - "couldNotLoadSavedViews": "Could not load saved views.", + "couldNotLoadSavedViews": "Nie udało się załadować zapisanych widoków.", "@couldNotLoadSavedViews": {}, - "aClientCertificateWasExpectedButNotSent": "A client certificate was expected but not sent. Please provide a valid client certificate.", + "aClientCertificateWasExpectedButNotSent": "Nie otrzymano oczekiwanego certyfikatu klienta. Proszę podać prawidłowy certyfikat.", "@aClientCertificateWasExpectedButNotSent": {}, - "userIsNotAuthenticated": "User is not authenticated.", + "userIsNotAuthenticated": "Użytkownik nie jest uwierzytelniony.", "@userIsNotAuthenticated": {}, - "requestTimedOut": "The request to the server timed out.", + "requestTimedOut": "Przekroczono limit czasu żądania do serwera.", "@requestTimedOut": {}, - "anErrorOccurredRemovingTheScans": "An error occurred removing the scans.", + "anErrorOccurredRemovingTheScans": "Wystąpił błąd podczas usuwania skanów.", "@anErrorOccurredRemovingTheScans": {}, - "couldNotReachYourPaperlessServer": "Could not reach your Paperless server, is it up and running?", + "couldNotReachYourPaperlessServer": "Nie można połączyć się z Twoim serwerem Paperless, czy jest on uruchomiony i dostępny?", "@couldNotReachYourPaperlessServer": {}, - "couldNotLoadSimilarDocuments": "Could not load similar documents.", + "couldNotLoadSimilarDocuments": "Nie udało się wczytać podobnych dokumentów.", "@couldNotLoadSimilarDocuments": {}, - "couldNotCreateStoragePath": "Could not create storage path, please try again.", + "couldNotCreateStoragePath": "Nie udało się utworzyć ścieżki zapisu, spróbuj ponownie.", "@couldNotCreateStoragePath": {}, - "couldNotLoadStoragePaths": "Could not load storage paths.", + "couldNotLoadStoragePaths": "Nie udało się załadować ścieżek zapisu.", "@couldNotLoadStoragePaths": {}, - "couldNotLoadSuggestions": "Could not load suggestions.", + "couldNotLoadSuggestions": "Nie udało się załadować sugestii.", "@couldNotLoadSuggestions": {}, - "couldNotCreateTag": "Could not create tag, please try again.", + "couldNotCreateTag": "Nie udało się utworzyć taga, spróbuj ponownie.", "@couldNotCreateTag": {}, - "couldNotLoadTags": "Could not load tags.", + "couldNotLoadTags": "Nie udało się załadować tagów.", "@couldNotLoadTags": {}, - "anUnknownErrorOccurred": "An unknown error occurred.", + "anUnknownErrorOccurred": "Wystąpił nieznany błąd.", "@anUnknownErrorOccurred": {}, - "fileFormatNotSupported": "This file format is not supported.", + "fileFormatNotSupported": "Ten format pliku nie jest obsługiwany.", "@fileFormatNotSupported": {}, - "report": "REPORT", + "report": "ZGŁOSZENIE", "@report": {}, - "absolute": "Absolute", + "absolute": "Bezwzględna", "@absolute": {}, - "hintYouCanAlsoSpecifyRelativeValues": "Hint: Apart from concrete dates, you can also specify a time range relative to the current date.", + "hintYouCanAlsoSpecifyRelativeValues": "Wskazówka: Poza konkretnymi datami, możesz również określić zakres czasowy w stosunku do bieżącej daty.", "@hintYouCanAlsoSpecifyRelativeValues": { "description": "Displayed in the extended date range picker" }, - "amount": "Amount", + "amount": "Ilość", "@amount": {}, - "relative": "Relative", + "relative": "Względna", "@relative": {}, - "last": "Last", + "last": "Ostatnie", "@last": {}, - "timeUnit": "Time unit", + "timeUnit": "Jednostka czasu", "@timeUnit": {}, "selectDateRange": "Wybierz zakres dat", "@selectDateRange": {}, @@ -348,167 +348,167 @@ "@after": {}, "before": "Przed", "@before": {}, - "days": "{count, plural, zero{days} one{day} other{days}}", + "days": "{count, plural, one{dzień} other{dni}}", "@days": { "placeholders": { "count": {} } }, - "lastNDays": "{count, plural, zero{} one{Yesterday} other{Last {count} days}}", + "lastNDays": "{count, plural, one{Wczoraj} other{Ostatnie {count} dni}}", "@lastNDays": { "placeholders": { "count": {} } }, - "lastNMonths": "{count, plural, zero{} one{Last month} other{Last {count} months}}", + "lastNMonths": "{count, plural, one{Ostatni miesiąc} other{Ostatnie {count} miesiące}}", "@lastNMonths": { "placeholders": { "count": {} } }, - "lastNWeeks": "{count, plural, zero{} one{Last week} other{Last {count} weeks}}", + "lastNWeeks": "{count, plural, one{Ostatni tydzień} other{Ostatnie {count} tygodnie}}", "@lastNWeeks": { "placeholders": { "count": {} } }, - "lastNYears": "{count, plural, zero{} one{Last year} other{Last {count} years}}", + "lastNYears": "{count, plural, one {Ostatni rok} few {Ostatnie {count} lata} many {Ostatnie {count} lat} other {Ostatnie {count} lat}}", "@lastNYears": { "placeholders": { "count": {} } }, - "months": "{count, plural, zero{} one{month} other{months}}", + "months": "{count, plural, one{Miesiąc} other{Miesiące}}", "@months": { "placeholders": { "count": {} } }, - "weeks": "{count, plural, zero{} one{week} other{weeks}}", + "weeks": "{count, plural, one{tydzień} few {tygodnie} many {tygodnie} other{tygodnie}}", "@weeks": { "placeholders": { "count": {} } }, - "years": "{count, plural, zero{} one{year} other{years}}", + "years": "{count, plural, one{rok} few {lat} many {lat} other{lat}}", "@years": { "placeholders": { "count": {} } }, - "gotIt": "Got it!", + "gotIt": "OK!", "@gotIt": {}, - "cancel": "Cancel", + "cancel": "Anuluj", "@cancel": {}, - "close": "Close", + "close": "Zamknij", "@close": {}, - "create": "Create", + "create": "Dodaj", "@create": {}, - "delete": "Delete", + "delete": "Usuń", "@delete": {}, - "edit": "Edit", + "edit": "Edytuj", "@edit": {}, "ok": "Ok", "@ok": {}, - "save": "Save", + "save": "Zapisz", "@save": {}, - "select": "Select", + "select": "Wybierz", "@select": {}, "saveChanges": "Zapisz zmiany", "@saveChanges": {}, - "upload": "Upload", + "upload": "Wyślij", "@upload": {}, "youreOffline": "Jesteście w trybie offline.", "@youreOffline": {}, - "deleteDocument": "Delete document", + "deleteDocument": "Usuń dokument", "@deleteDocument": { "description": "Used as an action label on each inbox item" }, "removeDocumentFromInbox": "Dokument usunięty ze skrzynki odbiorczej", "@removeDocumentFromInbox": {}, - "areYouSureYouWantToMarkAllDocumentsAsSeen": "Are you sure you want to mark all documents as seen? This will perform a bulk edit operation removing all inbox tags from the documents. This action is not reversible! Are you sure you want to continue?", + "areYouSureYouWantToMarkAllDocumentsAsSeen": "Czy na pewno chcesz oznaczyć wszystkie dokumenty jako przeczytane? Spowoduje to edycję wszystkich dokumentów, usuwając znaczniki skrzynki odbiorczej. Ta akcja nie jest odwracalna! Czy na pewno chcesz kontynuować?", "@areYouSureYouWantToMarkAllDocumentsAsSeen": {}, - "markAllAsSeen": "Mark all as seen?", + "markAllAsSeen": "Oznaczyć wszystkie jako przeczytane?", "@markAllAsSeen": {}, - "allSeen": "All seen", + "allSeen": "Wszystkie dokumenty zostały przeczytane", "@allSeen": {}, - "markAsSeen": "Mark as seen", + "markAsSeen": "Oznacz jako przeczytane", "@markAsSeen": {}, "refresh": "Odświerz", "@refresh": {}, - "youDoNotHaveUnseenDocuments": "You do not have unseen documents.", + "youDoNotHaveUnseenDocuments": "Nie masz nieprzeczytanych dokumentów.", "@youDoNotHaveUnseenDocuments": {}, - "quickAction": "Quick Action", + "quickAction": "Szybka akcja", "@quickAction": {}, - "suggestionSuccessfullyApplied": "Suggestion successfully applied.", + "suggestionSuccessfullyApplied": "Pomyślnie zastosowano sugestię.", "@suggestionSuccessfullyApplied": {}, "today": "Dzisiaj", "@today": {}, "undo": "Cofnij", "@undo": {}, - "nUnseen": "{count} unseen", + "nUnseen": "{count} nieprzeczytane", "@nUnseen": { "placeholders": { "count": {} } }, - "swipeLeftToMarkADocumentAsSeen": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.", + "swipeLeftToMarkADocumentAsSeen": "Wskazówka: Przesuń palcem w lewo, aby oznaczyć dokument jako przeczytany i usunąć wszystkie znaczniki skrzynki odbiorczej z dokumentu.", "@swipeLeftToMarkADocumentAsSeen": {}, "yesterday": "Wczoraj", "@yesterday": {}, - "anyAssigned": "Any assigned", + "anyAssigned": "Przypisano etykietę", "@anyAssigned": {}, - "noItemsFound": "No items found!", + "noItemsFound": "Nie znaleziono żadnych rekordów!", "@noItemsFound": {}, - "caseIrrelevant": "Case Irrelevant", + "caseIrrelevant": "Nie rozróżniaj wielkich i małych liter", "@caseIrrelevant": {}, - "matchingAlgorithm": "Matching Algorithm", + "matchingAlgorithm": "Algorytm dopasowania", "@matchingAlgorithm": {}, - "match": "Match", + "match": "Dopasowanie", "@match": {}, "name": "Nazwa", "@name": {}, - "notAssigned": "Not assigned", + "notAssigned": "Nie przypisano", "@notAssigned": {}, - "addNewCorrespondent": "Add new correspondent", + "addNewCorrespondent": "Dodaj nowego korespondenta", "@addNewCorrespondent": {}, - "noCorrespondentsSetUp": "You don't seem to have any correspondents set up.", + "noCorrespondentsSetUp": "Nie masz żadnych ustawionych korespondentów.", "@noCorrespondentsSetUp": {}, - "correspondents": "Correspondents", + "correspondents": "Korespondenci", "@correspondents": {}, "addNewDocumentType": "Dodaj nowy rodzaj dokumentu", "@addNewDocumentType": {}, - "noDocumentTypesSetUp": "You don't seem to have any document types set up.", + "noDocumentTypesSetUp": "Nie masz skonfigurowanych typów dokumentów.", "@noDocumentTypesSetUp": {}, "documentTypes": "Rodzaje dokumentów", "@documentTypes": {}, - "addNewStoragePath": "Add new storage path", + "addNewStoragePath": "Dodaj nową ścieżkę zapisu", "@addNewStoragePath": {}, - "noStoragePathsSetUp": "You don't seem to have any storage paths set up.", + "noStoragePathsSetUp": "Wygląda na to, że nie masz ustawionych ścieżek zapisu.", "@noStoragePathsSetUp": {}, - "storagePaths": "Storage Paths", + "storagePaths": "Ścieżki zapisu", "@storagePaths": {}, - "addNewTag": "Add new tag", + "addNewTag": "Dodaj nowy tag", "@addNewTag": {}, - "noTagsSetUp": "You don't seem to have any tags set up.", + "noTagsSetUp": "Wygląda na to, że nie masz skonfigurowanych tagów.", "@noTagsSetUp": {}, - "linkedDocuments": "Linked Documents", + "linkedDocuments": "Powiązane dokumenty", "@linkedDocuments": {}, - "advancedSettings": "Advanced Settings", + "advancedSettings": "Ustawienia zaawansowane", "@advancedSettings": {}, - "passphrase": "Passphrase", + "passphrase": "Hasło", "@passphrase": {}, - "configureMutualTLSAuthentication": "Configure Mutual TLS Authentication", + "configureMutualTLSAuthentication": "Skonfiguruj wzajemne uwierzytelnianie TLS", "@configureMutualTLSAuthentication": {}, - "invalidCertificateFormat": "Invalid certificate format, only .pfx is allowed", + "invalidCertificateFormat": "Nieprawidłowy format certyfikatu, dozwolony jest tylko .pfx", "@invalidCertificateFormat": {}, - "clientcertificate": "Client Certificate", + "clientcertificate": "Certyfikat klienta", "@clientcertificate": {}, - "selectFile": "Select file...", + "selectFile": "Wybierz plik...", "@selectFile": {}, "continueLabel": "Kontynuuj", "@continueLabel": {}, - "incorrectOrMissingCertificatePassphrase": "Incorrect or missing certificate passphrase.", + "incorrectOrMissingCertificatePassphrase": "Błędne lub brakujące hasło certyfikatu.", "@incorrectOrMissingCertificatePassphrase": {}, "connect": "Polącz", "@connect": {}, @@ -516,97 +516,97 @@ "@password": {}, "passwordMustNotBeEmpty": "Hasło nie może być puste.", "@passwordMustNotBeEmpty": {}, - "connectionTimedOut": "Connection timed out.", + "connectionTimedOut": "Upłynął czas połączenia.", "@connectionTimedOut": {}, - "loginPageReachabilityMissingClientCertificateText": "A client certificate was expected but not sent. Please provide a certificate.", + "loginPageReachabilityMissingClientCertificateText": "Nie otrzymano oczekiwanego certyfikatu klienta. Proszę podać prawidłowy certyfikat.", "@loginPageReachabilityMissingClientCertificateText": {}, - "couldNotEstablishConnectionToTheServer": "Could not establish a connection to the server.", + "couldNotEstablishConnectionToTheServer": "Nie udało się nawiązać połączenia z serwerem.", "@couldNotEstablishConnectionToTheServer": {}, - "connectionSuccessfulylEstablished": "Connection successfully established.", + "connectionSuccessfulylEstablished": "Połączenie zostało ustanowione pomyślnie.", "@connectionSuccessfulylEstablished": {}, - "hostCouldNotBeResolved": "Host could not be resolved. Please check the server address and your internet connection. ", + "hostCouldNotBeResolved": "Nie udało się ustalić hosta. Sprawdź adres serwera i połączenie z Internetem. ", "@hostCouldNotBeResolved": {}, "serverAddress": "Adres serwera", "@serverAddress": {}, - "invalidAddress": "Invalid address.", + "invalidAddress": "Nieprawidłowy adres.", "@invalidAddress": {}, - "serverAddressMustIncludeAScheme": "Server address must include a scheme.", + "serverAddressMustIncludeAScheme": "Adres serwera musi zawierać schemat.", "@serverAddressMustIncludeAScheme": {}, - "serverAddressMustNotBeEmpty": "Server address must not be empty.", + "serverAddressMustNotBeEmpty": "Adres serwera nie może być pusty.", "@serverAddressMustNotBeEmpty": {}, - "signIn": "Sign In", + "signIn": "Zaloguj się", "@signIn": {}, - "loginPageSignInTitle": "Sign In", + "loginPageSignInTitle": "Zaloguj się", "@loginPageSignInTitle": {}, - "signInToServer": "Sign in to {serverAddress}", + "signInToServer": "Zaloguj się do {serverAddress}", "@signInToServer": { "placeholders": { "serverAddress": {} } }, - "connectToPaperless": "Connect to Paperless", + "connectToPaperless": "Połącz z Paperless", "@connectToPaperless": {}, - "username": "Username", + "username": "Nazwa użytkownika", "@username": {}, - "usernameMustNotBeEmpty": "Username must not be empty.", + "usernameMustNotBeEmpty": "Nazwa użytkownika nie może być pusta.", "@usernameMustNotBeEmpty": {}, - "documentContainsAllOfTheseWords": "Document contains all of these words", + "documentContainsAllOfTheseWords": "Dokument zawiera wszystkie poniższe słowa", "@documentContainsAllOfTheseWords": {}, - "all": "All", + "all": "Wszystkie", "@all": {}, - "documentContainsAnyOfTheseWords": "Document contains any of these words", + "documentContainsAnyOfTheseWords": "Dokument zawiera którekolwiek z poniższych słów", "@documentContainsAnyOfTheseWords": {}, - "any": "Any", + "any": "Dowolny", "@any": {}, - "learnMatchingAutomatically": "Learn matching automatically", + "learnMatchingAutomatically": "Ucz się automatycznie dopasowywania", "@learnMatchingAutomatically": {}, "auto": "Auto", "@auto": {}, - "documentContainsThisString": "Document contains this string", + "documentContainsThisString": "Dokładne: Dokument zawiera ten ciąg znaków", "@documentContainsThisString": {}, - "exact": "Exact", + "exact": "Dokładne", "@exact": {}, - "documentContainsAWordSimilarToThisWord": "Document contains a word similar to this word", + "documentContainsAWordSimilarToThisWord": "Dokument zawiera słowo podobne do tego słowa", "@documentContainsAWordSimilarToThisWord": {}, - "fuzzy": "Fuzzy", + "fuzzy": "Przybliżone (Fuzzy)", "@fuzzy": {}, - "documentMatchesThisRegularExpression": "Document matches this regular expression", + "documentMatchesThisRegularExpression": "Dokument pasuje do wyrażenia regularnego", "@documentMatchesThisRegularExpression": {}, - "regularExpression": "Regular Expression", + "regularExpression": "Wyrażenie regularne", "@regularExpression": {}, "anInternetConnectionCouldNotBeEstablished": "Nie można było nawiązać połączenia internetowego.", "@anInternetConnectionCouldNotBeEstablished": {}, - "done": "Done", + "done": "Wykonano", "@done": {}, "next": "Następne", "@next": {}, - "couldNotAccessReceivedFile": "Could not access the received file. Please try to open the app before sharing.", + "couldNotAccessReceivedFile": "Nie można uzyskać dostępu do otrzymanego pliku. Spróbuj otworzyć aplikację przed udostępnieniem.", "@couldNotAccessReceivedFile": {}, - "newView": "New View", + "newView": "Nowy widok", "@newView": {}, - "createsASavedViewBasedOnTheCurrentFilterCriteria": "Creates a new view based on the current filter criteria.", + "createsASavedViewBasedOnTheCurrentFilterCriteria": "Tworzy nowy widok oparty na aktualnych kryteriach filtrowania.", "@createsASavedViewBasedOnTheCurrentFilterCriteria": {}, - "createViewsToQuicklyFilterYourDocuments": "Create views to quickly filter your documents.", + "createViewsToQuicklyFilterYourDocuments": "Utwórz widoki aby szybko filtrować dokumenty.", "@createViewsToQuicklyFilterYourDocuments": {}, - "nFiltersSet": "{count, plural, zero{{count} filters set} one{{count} filter set} other{{count} filters set}}", + "nFiltersSet": "{count, plural, one{{count} filtr ustawiony} few {{count} filtry ustawione} many {{count} filtry ustawione} other{{count} filtry ustawione}}", "@nFiltersSet": { "placeholders": { "count": {} } }, - "showInSidebar": "Show in sidebar", + "showInSidebar": "Pokaż w panelu bocznym", "@showInSidebar": {}, - "showOnDashboard": "Show on dashboard", + "showOnDashboard": "Pokaż na pulpicie", "@showOnDashboard": {}, - "views": "Views", + "views": "Widoki", "@views": {}, - "clearAll": "Clear all", + "clearAll": "Wyczyść wszystko", "@clearAll": {}, "scan": "Skanuj", "@scan": {}, - "previewScan": "Preview", + "previewScan": "Podgląd", "@previewScan": {}, - "scrollToTop": "Scroll to top", + "scrollToTop": "Przewiń do góry", "@scrollToTop": {}, "paperlessServerVersion": "Wersja serwera Paperless", "@paperlessServerVersion": {}, @@ -622,9 +622,9 @@ "@languageAndVisualAppearance": {}, "applicationSettings": "Aplikacja", "@applicationSettings": {}, - "colorSchemeHint": "Choose between a classic color scheme inspired by a traditional Paperless green or use the dynamic color scheme based on your system theme.", + "colorSchemeHint": "Wybierz między klasycznym schematem kolorów zainspirowanym tradycyjnym zielonym Paperless, lub użyj dynamicznego schematu kolorów na podstawie motywu systemu.", "@colorSchemeHint": {}, - "colorSchemeNotSupportedWarning": "Dynamic theming is only supported for devices running Android 12 and above. Selecting the 'Dynamic' option might not have any effect depending on your OS implementation.", + "colorSchemeNotSupportedWarning": "Dynamiczny motyw jest obsługiwany tylko dla urządzeń z systemem Android 12 i nowszym. Wybór opcji 'Dynamiczny' może nie mieć żadnego wpływu w zależności od implementacji systemu operacyjnego.", "@colorSchemeNotSupportedWarning": {}, "colors": "Kolory", "@colors": {}, @@ -632,9 +632,9 @@ "@language": {}, "security": "Zabezpieczenia", "@security": {}, - "mangeFilesAndStorageSpace": "Manage files and storage space", + "mangeFilesAndStorageSpace": "Zarządzaj plikami i przestrzenią dyskową", "@mangeFilesAndStorageSpace": {}, - "storage": "Storage", + "storage": "Pamięć", "@storage": {}, "dark": "Ciemny", "@dark": {}, @@ -642,9 +642,9 @@ "@light": {}, "system": "System", "@system": {}, - "ascending": "Ascending", + "ascending": "Rosnąco", "@ascending": {}, - "descending": "Descending", + "descending": "Malejąco", "@descending": {}, "storagePathDay": "dzień", "@storagePathDay": {}, @@ -654,130 +654,162 @@ "@storagePathYear": {}, "color": "Kolor", "@color": {}, - "filterTags": "Filter tags...", + "filterTags": "Filtruj tagi...", "@filterTags": {}, "inboxTag": "Tag skrzynki odbiorczej", "@inboxTag": {}, - "uploadInferValuesHint": "If you specify values for these fields, your paperless instance will not automatically derive a value. If you want these values to be automatically populated by your server, leave the fields blank.", + "uploadInferValuesHint": "Jeśli określisz wartości dla tych pól, Twoja instancja Paperless nie będzie automatycznie ustalać ich wartości. Jeśli chcesz, aby te wartości były automatycznie wypełniane przez serwer, pozostaw puste pola.", "@uploadInferValuesHint": {}, - "useTheConfiguredBiometricFactorToAuthenticate": "Use the configured biometric factor to authenticate and unlock your documents.", + "useTheConfiguredBiometricFactorToAuthenticate": "Użyj skonfigurowanego czynnika biometrycznego, aby uwierzytelnić i odblokować dokumenty.", "@useTheConfiguredBiometricFactorToAuthenticate": {}, - "verifyYourIdentity": "Verify your identity", + "verifyYourIdentity": "Zweryfikuj swoją tożsamość", "@verifyYourIdentity": {}, - "verifyIdentity": "Verify Identity", + "verifyIdentity": "Zweryfikuj tożsamość", "@verifyIdentity": {}, - "detailed": "Detailed", + "detailed": "Widok szczegółowy", "@detailed": {}, - "grid": "Grid", + "grid": "Siatka", "@grid": {}, - "list": "List", + "list": "Lista", "@list": {}, - "remove": "Remove", - "removeQueryFromSearchHistory": "Remove query from search history?", - "dynamicColorScheme": "Dynamic", + "remove": "Usuń", + "removeQueryFromSearchHistory": "Usunąć zapytanie z historii wyszukiwania?", + "dynamicColorScheme": "Dynamiczny", "@dynamicColorScheme": {}, - "classicColorScheme": "Classic", + "classicColorScheme": "Klasyczny", "@classicColorScheme": {}, - "notificationDownloadComplete": "Download complete", + "notificationDownloadComplete": "Pobieranie ukończone", "@notificationDownloadComplete": { "description": "Notification title when a download has been completed." }, - "notificationDownloadingDocument": "Downloading document", + "notificationDownloadingDocument": "Pobieranie dokumentu", "@notificationDownloadingDocument": { "description": "Notification title shown when a document download is pending" }, - "archiveSerialNumberUpdated": "Archive Serial Number updated.", + "archiveSerialNumberUpdated": "Numer ASN zmodyfikowany.", "@archiveSerialNumberUpdated": { "description": "Message shown when the ASN has been updated." }, - "donateCoffee": "Buy me a coffee", + "donateCoffee": "Kup mi kawę", "@donateCoffee": { "description": "Label displayed in the app drawer" }, - "thisFieldIsRequired": "This field is required!", + "thisFieldIsRequired": "To pole jest wymagane!", "@thisFieldIsRequired": { "description": "Message shown below the form field when a required field has not been filled out." }, - "confirm": "Confirm", - "confirmAction": "Confirm action", + "confirm": "Potwierdź", + "confirmAction": "Zatwierdź akcje", "@confirmAction": { "description": "Typically used as a title to confirm a previously selected action" }, - "areYouSureYouWantToContinue": "Are you sure you want to continue?", - "bulkEditTagsAddMessage": "{count, plural, one{This operation will add the tags {tags} to the selected document.} other{This operation will add the tags {tags} to {count} selected documents.}}", + "areYouSureYouWantToContinue": "Czy na pewno chcesz kontynuować?", + "bulkEditTagsAddMessage": "{count, plural, one{Ta operacja doda tagi {tags} do wybranego dokumentu} few {Ta operacja doda tagi {tags} do {count} wybranych dokumentów} many {Ta operacja doda tagi {tags} do {count} wybranych dokumentów} other{Ta operacja doda tagi {tags} do {count} wybranych dokumentów}}", "@bulkEditTagsAddMessage": { "description": "Message of the confirmation dialog when bulk adding tags." }, - "bulkEditTagsRemoveMessage": "{count, plural, one{This operation will remove the tags {tags} from the selected document.} other{This operation will remove the tags {tags} from {count} selected documents.}}", + "bulkEditTagsRemoveMessage": "{count, plural, one{Ta operacja usunie tagi {tags} z wybranego dokumentu.} other{Ta operacja usunie tagi {tags} z {count} wybranych dokumentów.}}", "@bulkEditTagsRemoveMessage": { "description": "Message of the confirmation dialog when bulk removing tags." }, - "bulkEditTagsModifyMessage": "{count, plural, one{This operation will add the tags {addTags} and remove the tags {removeTags} from the selected document.} other{This operation will add the tags {addTags} and remove the tags {removeTags} from {count} selected documents.}}", + "bulkEditTagsModifyMessage": "{count, plural, one{Ta operacja doda znaczniki {addTags} i usunie znaczniki {removeTags} z wybranego dokumentu.} other{Ta operacja doda tagi {addTags} i usunie tagi {removeTags} z {count} wybranych dokumentów.}}", "@bulkEditTagsModifyMessage": { "description": "Message of the confirmation dialog when both adding and removing tags." }, - "bulkEditCorrespondentAssignMessage": "{count, plural, one{This operation will assign the correspondent {correspondent} to the selected document.} other{This operation will assign the correspondent {correspondent} to {count} selected documents.}}", - "bulkEditDocumentTypeAssignMessage": "{count, plural, one{This operation will assign the document type {docType} to the selected document.} other{This operation will assign the documentType {docType} to {count} selected documents.}}", - "bulkEditStoragePathAssignMessage": "{count, plural, one{This operation will assign the storage path {path} to the selected document.} other{This operation will assign the storage path {path} to {count} selected documents.}}", - "bulkEditCorrespondentRemoveMessage": "{count, plural, one{This operation will remove the correspondent from the selected document.} other{This operation will remove the correspondent from {count} selected documents.}}", - "bulkEditDocumentTypeRemoveMessage": "{count, plural, one{This operation will remove the document type from the selected document.} other{This operation will remove the document type from {count} selected documents.}}", - "bulkEditStoragePathRemoveMessage": "{count, plural, one{This operation will remove the storage path from the selected document.} other{This operation will remove the storage path from {count} selected documents.}}", - "anyTag": "Any", + "bulkEditCorrespondentAssignMessage": "{count, plural, one{Ta operacja przypisze korespondenta {correspondent} do wybranego dokumentu.} other{Ta operacja przypisze korespondenta {correspondent} do {count} wybranych dokumentów}}", + "bulkEditDocumentTypeAssignMessage": "{count, plural, one{Ta operacja przypisze typ dokumentu {docType} do wybranego dokumentu.} other{Ta operacja przypisze typ dokumentu {docType} do {count} wybranych dokumentów}}", + "bulkEditStoragePathAssignMessage": "{count, plural, one{Ta operacja przypisze ścieżkę zapisu {path} do wybranego dokumentu.} other{Ta operacja przypisze ścieżkę zapisu {path} do {count} wybranych dokumentów}}", + "bulkEditCorrespondentRemoveMessage": "{count, plural, one{Ta operacja usunie korespondenta z wybranego dokumentu.} other{Ta operacja usunie korespondenta z {count} wybranych dokumentów}}", + "bulkEditDocumentTypeRemoveMessage": "{count, plural, one{Ta operacja usunie typ dokumentu z wybranego dokumentu.} other{Ta operacja usunie typ dokumentu z {count} wybranych dokumentów.}}", + "bulkEditStoragePathRemoveMessage": "{count, plural, one{Ta operacja usunie tagi z wybranego dokumentu.} other{Ta operacja usunie tagi z {count} wybranych dokumentów.}}", + "anyTag": "Dowolny", "@anyTag": { "description": "Label shown when any tag should be filtered" }, - "allTags": "All", + "allTags": "Wszystkie", "@allTags": { "description": "Label shown when a document has to be assigned to all selected tags" }, - "switchingAccountsPleaseWait": "Switching accounts. Please wait...", + "switchingAccountsPleaseWait": "Przełączanie kont. Proszę czekać...", "@switchingAccountsPleaseWait": { "description": "Message shown while switching accounts is in progress." }, - "testConnection": "Test connection", + "testConnection": "Test połączenia", "@testConnection": { "description": "Button label shown on login page. Allows user to test whether the server is reachable or not." }, - "accounts": "Accounts", + "accounts": "Konta", "@accounts": { "description": "Title of the account management dialog" }, - "addAccount": "Add account", + "addAccount": "Dodaj konto", "@addAccount": { "description": "Label of add account action" }, - "switchAccount": "Switch", + "switchAccount": "Przełącz", "@switchAccount": { "description": "Label for switch account action" }, - "logout": "Logout", + "logout": "Wyloguj się", "@logout": { "description": "Generic Logout label" }, - "switchAccountTitle": "Switch account", + "switchAccountTitle": "Zmień konto", "@switchAccountTitle": { "description": "Title of the dialog shown after adding an account, asking the user whether to switch to the newly added account or not." }, - "switchToNewAccount": "Do you want to switch to the new account? You can switch back at any time.", + "switchToNewAccount": "Czy chcesz przełączyć się na nowe konto? Możesz przełączyć się w dowolnym momencie.", "@switchToNewAccount": { "description": "Content of the dialog shown after adding an account, asking the user whether to switch to the newly added account or not." }, - "sourceCode": "Source Code", - "findTheSourceCodeOn": "Find the source code on", + "sourceCode": "Kod źródłowy", + "findTheSourceCodeOn": "Znajdź kod źródłowy na", "@findTheSourceCodeOn": { "description": "Text before link to Paperless Mobile GitHub" }, - "rememberDecision": "Remember my decision", - "defaultDownloadFileType": "Default Download File Type", + "rememberDecision": "Zapamiętaj mój wybór", + "defaultDownloadFileType": "Domyślny typ pliku do pobrania", "@defaultDownloadFileType": { "description": "Label indicating the default filetype to download (one of archived, original and always ask)" }, - "defaultShareFileType": "Default Share File Type", + "defaultShareFileType": "Domyślny typ udostępnianego pliku", "@defaultShareFileType": { "description": "Label indicating the default filetype to share (one of archived, original and always ask)" }, - "alwaysAsk": "Always ask", + "alwaysAsk": "Zawsze pytaj", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index b1a5366..b96d8ba 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -779,5 +779,37 @@ "alwaysAsk": "Always ask", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb index 2946b9f..e3f25a8 100644 --- a/lib/l10n/intl_tr.arb +++ b/lib/l10n/intl_tr.arb @@ -779,5 +779,37 @@ "alwaysAsk": "Always ask", "@alwaysAsk": { "description": "Option to choose when the app should always ask the user which filetype to use" + }, + "disableMatching": "Do not tag documents automatically", + "@disableMatching": { + "description": "One of the options for automatic tagging of documents" + }, + "none": "None", + "@none": { + "description": "One of available enum values of matching algorithm for tags" + }, + "logInToExistingAccount": "Log in to existing account", + "@logInToExistingAccount": { + "description": "Title shown on login page if at least one user is already known to the app." + }, + "print": "Print", + "@print": { + "description": "Tooltip for print button" + }, + "managePermissions": "Manage permissions", + "@managePermissions": { + "description": "Button which leads user to manage permissions page" + }, + "errorRetrievingServerVersion": "An error occurred trying to resolve the server version.", + "@errorRetrievingServerVersion": { + "description": "Message shown at the bottom of the settings page when the remote server version could not be resolved." + }, + "resolvingServerVersion": "Resolving server version...", + "@resolvingServerVersion": { + "description": "Message shown while the app is loading the remote server version." + }, + "goToLogin": "Go to login", + "@goToLogin": { + "description": "Label of the button shown on the login page to skip logging in to existing accounts and navigate user to login page" } } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index afcb42a..e6399eb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -278,6 +278,7 @@ class _AuthenticationWrapperState extends State { titleString: S.of(context)!.connectToPaperless, submitText: S.of(context)!.signIn, onSubmit: _onLogin, + showLocalAccounts: true, ), requriresLocalAuthentication: () => const VerifyIdentityPage(), authenticated: (localUserId, apiVersion) => HomeRoute(