From 2fb7945f23246b392cd6c2a369694e2831b38a7c Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 09:44:55 +0200 Subject: [PATCH 01/31] Show React icon to hosted web users --- lib/constants.dart | 4 +- lib/redux/app/app_middleware.dart | 2 +- lib/redux/app/app_state.dart | 2 +- lib/redux/auth/auth_state.dart | 2 +- lib/ui/dashboard/dashboard_screen.dart | 62 ++++++++++++++------------ 5 files changed, 40 insertions(+), 32 deletions(-) diff --git a/lib/constants.dart b/lib/constants.dart index cb9f24e6aa1..63598100cfc 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -10,10 +10,12 @@ const String kMinServerVersion = '5.0.4'; const String kAppName = 'Invoice Ninja'; const String kSiteUrl = 'https://invoiceninja.com'; const String kAppProductionUrl = 'https://invoicing.co'; +const String kAppReactUrl = 'https://app.invoicing.co'; const String kAppStagingUrl = 'https://staging.invoicing.co'; const String kAppStagingNetUrl = 'https://invoiceninja.net'; const String kAppLargeTestUrl = 'https://testv5.invoicing.co'; -const String kAppDemoUrl = 'https://demo.invoiceninja.com'; +const String kFlutterDemoUrl = 'https://demo.invoiceninja.com'; +const String kReactDemoUrl = 'https://react.invoicing.co/demo'; const String kWhiteLabelUrl = 'https://app.invoiceninja.com/buy_now/?account_key=AsFmBAeLXF0IKf7tmi0eiyZfmWW9hxMT&product_id=3'; const String kPrivacyPolicyURL = 'https://www.invoiceninja.com/privacy-policy'; diff --git a/lib/redux/app/app_middleware.dart b/lib/redux/app/app_middleware.dart index 7c50ab757cf..80c4d045b67 100644 --- a/lib/redux/app/app_middleware.dart +++ b/lib/redux/app/app_middleware.dart @@ -271,7 +271,7 @@ Middleware _createLoadState( String? token; if (Config.DEMO_MODE || - cleanApiUrl(store.state.authState.url) == kAppDemoUrl) { + cleanApiUrl(store.state.authState.url) == kFlutterDemoUrl) { token = 'TOKEN'; } else { final SharedPreferences prefs = await SharedPreferences.getInstance(); diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 19803a0b860..8a5fc5ad623 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -833,7 +833,7 @@ abstract class AppState implements Built { bool get isSelfHosted => !isHosted; - bool get isDemo => cleanApiUrl(authState.url) == kAppDemoUrl; + bool get isDemo => cleanApiUrl(authState.url) == kFlutterDemoUrl; bool get isStaging => cleanApiUrl(authState.url) == kAppStagingUrl; diff --git a/lib/redux/auth/auth_state.dart b/lib/redux/auth/auth_state.dart index 51dc3e63a6c..177432c3914 100644 --- a/lib/redux/auth/auth_state.dart +++ b/lib/redux/auth/auth_state.dart @@ -47,7 +47,7 @@ abstract class AuthState implements Built { if ([ kAppProductionUrl, - kAppDemoUrl, + kFlutterDemoUrl, kAppStagingUrl, kAppStagingNetUrl, ].contains(cleanUrl)) { diff --git a/lib/ui/dashboard/dashboard_screen.dart b/lib/ui/dashboard/dashboard_screen.dart index 5d42d0b398b..7a212944266 100644 --- a/lib/ui/dashboard/dashboard_screen.dart +++ b/lib/ui/dashboard/dashboard_screen.dart @@ -259,40 +259,46 @@ class _DashboardScreenState extends State ), if (!kReleaseMode || (kIsWeb && - state.isSelfHosted && - state.userCompany.isAdmin && - !state.isDemo)) + (state.isHosted || + (state.isSelfHosted && state.userCompany.isAdmin)))) Padding( padding: const EdgeInsets.only(right: 10), child: IconButton( tooltip: localization!.enableReactApp, onPressed: () async { - confirmCallback( - context: context, - message: localization.enableReactApp, - callback: (_) { - final credentials = state.credentials; - final account = state.account - .rebuild((b) => b..setReactAsDefaultAP = true); - final url = '${credentials.url}/accounts/${account.id}'; - final data = serializers.serializeWith( - AccountEntity.serializer, account); - - store.dispatch(StartSaving()); - WebClient() - .put( - url, - credentials.token, - data: json.encode(data), - ) - .then((dynamic _) { - store.dispatch(StopSaving()); - WebUtils.reloadBrowser(); - }).catchError((Object error) { - store.dispatch(StopSaving()); - showErrorDialog(message: error as String?); + if (state.isDemo) { + launchUrl(Uri.parse(kReactDemoUrl)); + } else if (state.isHosted) { + launchUrl(Uri.parse(kAppReactUrl)); + } else { + confirmCallback( + context: context, + message: localization.enableReactApp, + callback: (_) { + final credentials = state.credentials; + final account = state.account + .rebuild((b) => b..setReactAsDefaultAP = true); + final url = + '${credentials.url}/accounts/${account.id}'; + final data = serializers.serializeWith( + AccountEntity.serializer, account); + + store.dispatch(StartSaving()); + WebClient() + .put( + url, + credentials.token, + data: json.encode(data), + ) + .then((dynamic _) { + store.dispatch(StopSaving()); + WebUtils.reloadBrowser(); + }).catchError((Object error) { + store.dispatch(StopSaving()); + showErrorDialog(message: error as String?); + }); }); - }); + } }, icon: Icon(MdiIcons.react), ), From 267fe9664486c293dc61eade1b7cb0a4912f438b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 10:35:44 +0200 Subject: [PATCH 02/31] Add CTA to Chrome task extension --- lib/constants.dart | 5 +++ lib/redux/app/app_actions.dart | 2 ++ lib/redux/ui/pref_reducer.dart | 8 +++++ lib/redux/ui/pref_state.dart | 6 +++- lib/redux/ui/pref_state.g.dart | 22 ++++++++++++ lib/ui/task/task_screen.dart | 66 ++++++++++++++++++++++++++++++---- lib/utils/i18n.dart | 15 ++++++++ lib/utils/platforms.dart | 7 ++++ 8 files changed, 123 insertions(+), 8 deletions(-) diff --git a/lib/constants.dart b/lib/constants.dart index 63598100cfc..5dca654516f 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -53,6 +53,11 @@ const String kFacebookUrl = 'https://www.facebook.com/invoiceninja'; const String kYouTubeUrl = 'https://www.youtube.com/channel/UCXAHcBvhW05PDtWYIq7WDFA/videos'; +const String kTaskExtensionUrl = + 'https://chromewebstore.google.com/detail/invoice-ninja-tasks/dlfcbfdpemfnjbjlladogijcchfmmaaf'; +const String kTaskExtensionYouTubeUrl = + 'https://www.youtube.com/watch?v=UL0OklMJTEA&ab_channel=InvoiceNinja'; + const String kAppleOAuthClientId = 'com.invoiceninja.client'; const String kAppleOAuthRedirectUrl = 'https://invoicing.co/auth/apple'; diff --git a/lib/redux/app/app_actions.dart b/lib/redux/app/app_actions.dart index b0ba340abb1..003cc0cb745 100644 --- a/lib/redux/app/app_actions.dart +++ b/lib/redux/app/app_actions.dart @@ -116,6 +116,8 @@ class DismissOneYearReviewAppPermanently implements PersistUI, PersistPrefs {} class DismissTwoYearReviewAppPermanently implements PersistUI, PersistPrefs {} +class DismissTaskExtensionBanner implements PersistUI, PersistPrefs {} + class ViewMainScreen { ViewMainScreen({this.addDelay = false}); diff --git a/lib/redux/ui/pref_reducer.dart b/lib/redux/ui/pref_reducer.dart index b2c43077c63..f3f0ef4b337 100644 --- a/lib/redux/ui/pref_reducer.dart +++ b/lib/redux/ui/pref_reducer.dart @@ -68,6 +68,8 @@ PrefState prefReducer( historySidebarReducer(state.historySidebarMode, action) ..hideDesktopWarning = hideDesktopWarningReducer(state.hideDesktopWarning, action) + ..hideTaskExtensionBanner = + hideTaskExtensionBannerReducer(state.hideTaskExtensionBanner, action) ..hideGatewayWarning = hideGatewayWarningReducer(state.hideGatewayWarning, action) ..hideReviewApp = hideReviewAppReducer(state.hideReviewApp, action) @@ -260,6 +262,12 @@ Reducer hideDesktopWarningReducer = combineReducers([ }), ]); +Reducer hideTaskExtensionBannerReducer = combineReducers([ + TypedReducer((filter, action) { + return true; + }), +]); + Reducer hideGatewayWarningReducer = combineReducers([ TypedReducer((filter, action) { return true; diff --git a/lib/redux/ui/pref_state.dart b/lib/redux/ui/pref_state.dart index 6bcf58845ad..c023b0ec09c 100644 --- a/lib/redux/ui/pref_state.dart +++ b/lib/redux/ui/pref_state.dart @@ -43,6 +43,7 @@ abstract class PrefState implements Built { hideReviewApp: false, hideOneYearReviewApp: false, hideTwoYearReviewApp: false, + hideTaskExtensionBanner: false, showKanban: false, showPdfPreview: true, showPdfPreviewSideBySide: false, @@ -170,6 +171,8 @@ abstract class PrefState implements Built { bool get hideTwoYearReviewApp; + bool get hideTaskExtensionBanner; + bool get editAfterSaving; bool get enableNativeBrowser; @@ -288,7 +291,8 @@ abstract class PrefState implements Built { ..colorTheme = kColorThemeLight ..darkColorTheme = kColorThemeDark ..enableDarkModeSystem = false - ..donwloadsFolder = ''; + ..donwloadsFolder = '' + ..hideTaskExtensionBanner = false; static Serializer get serializer => _$prefStateSerializer; } diff --git a/lib/redux/ui/pref_state.g.dart b/lib/redux/ui/pref_state.g.dart index 3af76cb841f..cdaf512b535 100644 --- a/lib/redux/ui/pref_state.g.dart +++ b/lib/redux/ui/pref_state.g.dart @@ -220,6 +220,9 @@ class _$PrefStateSerializer implements StructuredSerializer { 'hideTwoYearReviewApp', serializers.serialize(object.hideTwoYearReviewApp, specifiedType: const FullType(bool)), + 'hideTaskExtensionBanner', + serializers.serialize(object.hideTaskExtensionBanner, + specifiedType: const FullType(bool)), 'editAfterSaving', serializers.serialize(object.editAfterSaving, specifiedType: const FullType(bool)), @@ -402,6 +405,10 @@ class _$PrefStateSerializer implements StructuredSerializer { result.hideTwoYearReviewApp = serializers.deserialize(value, specifiedType: const FullType(bool))! as bool; break; + case 'hideTaskExtensionBanner': + result.hideTaskExtensionBanner = serializers.deserialize(value, + specifiedType: const FullType(bool))! as bool; + break; case 'editAfterSaving': result.editAfterSaving = serializers.deserialize(value, specifiedType: const FullType(bool))! as bool; @@ -742,6 +749,8 @@ class _$PrefState extends PrefState { @override final bool hideTwoYearReviewApp; @override + final bool hideTaskExtensionBanner; + @override final bool editAfterSaving; @override final bool enableNativeBrowser; @@ -792,6 +801,7 @@ class _$PrefState extends PrefState { required this.hideReviewApp, required this.hideOneYearReviewApp, required this.hideTwoYearReviewApp, + required this.hideTaskExtensionBanner, required this.editAfterSaving, required this.enableNativeBrowser, required this.textScaleFactor, @@ -865,6 +875,8 @@ class _$PrefState extends PrefState { hideOneYearReviewApp, r'PrefState', 'hideOneYearReviewApp'); BuiltValueNullFieldError.checkNotNull( hideTwoYearReviewApp, r'PrefState', 'hideTwoYearReviewApp'); + BuiltValueNullFieldError.checkNotNull( + hideTaskExtensionBanner, r'PrefState', 'hideTaskExtensionBanner'); BuiltValueNullFieldError.checkNotNull( editAfterSaving, r'PrefState', 'editAfterSaving'); BuiltValueNullFieldError.checkNotNull( @@ -924,6 +936,7 @@ class _$PrefState extends PrefState { hideReviewApp == other.hideReviewApp && hideOneYearReviewApp == other.hideOneYearReviewApp && hideTwoYearReviewApp == other.hideTwoYearReviewApp && + hideTaskExtensionBanner == other.hideTaskExtensionBanner && editAfterSaving == other.editAfterSaving && enableNativeBrowser == other.enableNativeBrowser && textScaleFactor == other.textScaleFactor && @@ -971,6 +984,7 @@ class _$PrefState extends PrefState { _$hash = $jc(_$hash, hideReviewApp.hashCode); _$hash = $jc(_$hash, hideOneYearReviewApp.hashCode); _$hash = $jc(_$hash, hideTwoYearReviewApp.hashCode); + _$hash = $jc(_$hash, hideTaskExtensionBanner.hashCode); _$hash = $jc(_$hash, editAfterSaving.hashCode); _$hash = $jc(_$hash, enableNativeBrowser.hashCode); _$hash = $jc(_$hash, textScaleFactor.hashCode); @@ -1018,6 +1032,7 @@ class _$PrefState extends PrefState { ..add('hideReviewApp', hideReviewApp) ..add('hideOneYearReviewApp', hideOneYearReviewApp) ..add('hideTwoYearReviewApp', hideTwoYearReviewApp) + ..add('hideTaskExtensionBanner', hideTaskExtensionBanner) ..add('editAfterSaving', editAfterSaving) ..add('enableNativeBrowser', enableNativeBrowser) ..add('textScaleFactor', textScaleFactor) @@ -1199,6 +1214,11 @@ class PrefStateBuilder implements Builder { set hideTwoYearReviewApp(bool? hideTwoYearReviewApp) => _$this._hideTwoYearReviewApp = hideTwoYearReviewApp; + bool? _hideTaskExtensionBanner; + bool? get hideTaskExtensionBanner => _$this._hideTaskExtensionBanner; + set hideTaskExtensionBanner(bool? hideTaskExtensionBanner) => + _$this._hideTaskExtensionBanner = hideTaskExtensionBanner; + bool? _editAfterSaving; bool? get editAfterSaving => _$this._editAfterSaving; set editAfterSaving(bool? editAfterSaving) => @@ -1272,6 +1292,7 @@ class PrefStateBuilder implements Builder { _hideReviewApp = $v.hideReviewApp; _hideOneYearReviewApp = $v.hideOneYearReviewApp; _hideTwoYearReviewApp = $v.hideTwoYearReviewApp; + _hideTaskExtensionBanner = $v.hideTaskExtensionBanner; _editAfterSaving = $v.editAfterSaving; _enableNativeBrowser = $v.enableNativeBrowser; _textScaleFactor = $v.textScaleFactor; @@ -1344,6 +1365,7 @@ class PrefStateBuilder implements Builder { hideReviewApp: BuiltValueNullFieldError.checkNotNull(hideReviewApp, r'PrefState', 'hideReviewApp'), hideOneYearReviewApp: BuiltValueNullFieldError.checkNotNull(hideOneYearReviewApp, r'PrefState', 'hideOneYearReviewApp'), hideTwoYearReviewApp: BuiltValueNullFieldError.checkNotNull(hideTwoYearReviewApp, r'PrefState', 'hideTwoYearReviewApp'), + hideTaskExtensionBanner: BuiltValueNullFieldError.checkNotNull(hideTaskExtensionBanner, r'PrefState', 'hideTaskExtensionBanner'), editAfterSaving: BuiltValueNullFieldError.checkNotNull(editAfterSaving, r'PrefState', 'editAfterSaving'), enableNativeBrowser: BuiltValueNullFieldError.checkNotNull(enableNativeBrowser, r'PrefState', 'enableNativeBrowser'), textScaleFactor: BuiltValueNullFieldError.checkNotNull(textScaleFactor, r'PrefState', 'textScaleFactor'), diff --git a/lib/ui/task/task_screen.dart b/lib/ui/task/task_screen.dart index 90fc22cc7d3..14b91ebcc33 100644 --- a/lib/ui/task/task_screen.dart +++ b/lib/ui/task/task_screen.dart @@ -1,9 +1,11 @@ // Flutter imports: +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart'; +import 'package:invoiceninja_flutter/ui/app/icon_text.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; // Project imports: @@ -23,6 +25,7 @@ import 'package:invoiceninja_flutter/ui/task/task_screen_vm.dart'; import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; +import 'package:url_launcher/url_launcher.dart'; class TaskScreen extends StatelessWidget { const TaskScreen({ @@ -40,18 +43,18 @@ class TaskScreen extends StatelessWidget { final state = store.state; final company = store.state.company; final userCompany = store.state.userCompany; - final localization = AppLocalization.of(context); + final localization = AppLocalization.of(context)!; final statuses = [ TaskStatusEntity().rebuild((b) => b ..id = kTaskStatusLogged - ..name = localization!.logged), + ..name = localization.logged), TaskStatusEntity().rebuild((b) => b ..id = kTaskStatusRunning - ..name = localization!.running), + ..name = localization.running), if (!state.prefState.showKanban) TaskStatusEntity().rebuild((b) => b ..id = kTaskStatusInvoiced - ..name = localization!.invoiced), + ..name = localization.invoiced), for (var statusId in memoizedSortedActiveTaskStatusIds( state.taskStatusState.list, state.taskStatusState.map)) TaskStatusEntity().rebuild((b) => b @@ -99,8 +102,57 @@ class TaskScreen extends StatelessWidget { }, ) ], - body: - state.prefState.showKanban ? KanbanViewBuilder() : TaskListBuilder(), + body: Column(children: [ + // TODO once Firefox is supported + if (!state.prefState.hideTaskExtensionBanner && + isDesktop(context) && + (!kIsWeb || isChrome())) + ColoredBox( + color: Colors.orange, + child: Row( + children: [ + SizedBox(width: 16), + Expanded( + child: IconText( + text: localization.taskExtensionBanner, + icon: Icons.info_outline, + ), + ), + TextButton( + onPressed: () { + launchUrl(Uri.parse(kTaskExtensionYouTubeUrl)); + }, + child: Text( + localization.watchVideo, + style: TextStyle(color: Colors.white), + ), + ), + TextButton( + onPressed: () { + launchUrl(Uri.parse(kTaskExtensionUrl)); + }, + child: Text( + localization.viewExtension, + style: TextStyle(color: Colors.white), + ), + ), + IconButton( + tooltip: localization.dismiss, + onPressed: () { + store.dispatch(DismissTaskExtensionBanner()); + }, + icon: Icon(Icons.clear), + ), + SizedBox(width: 12), + ], + ), + ), + Expanded( + child: state.prefState.showKanban + ? KanbanViewBuilder() + : TaskListBuilder(), + ), + ]), bottomNavigationBar: AppBottomBar( entityType: EntityType.task, iconButtons: [ @@ -166,7 +218,7 @@ class TaskScreen extends StatelessWidget { Icons.add, color: Colors.white, ), - tooltip: localization!.newTask, + tooltip: localization.newTask, ) : null, ); diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 5c0af8ea823..b6fda2f9d27 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -18,6 +18,9 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', 'reactivate_email': 'Reactivate Email', 'email_reactivated': 'Successfully reactivated email', 'template_help': 'Enable using the design as a template', @@ -109980,6 +109983,18 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]!['email_reactivated'] ?? _localizedValues['en']!['email_reactivated']!; + String get taskExtensionBanner => + _localizedValues[localeCode]!['task_extension_banner'] ?? + _localizedValues['en']!['task_extension_banner']!; + + String get watchVideo => + _localizedValues[localeCode]!['watch_video'] ?? + _localizedValues['en']!['watch_video']!; + + String get viewExtension => + _localizedValues[localeCode]!['view_extension'] ?? + _localizedValues['en']!['view_extension']!; + // STARTER: lang field - do not remove comment String lookup(String? key) { diff --git a/lib/utils/platforms.dart b/lib/utils/platforms.dart index 02e448b8c60..46fa467d344 100644 --- a/lib/utils/platforms.dart +++ b/lib/utils/platforms.dart @@ -191,6 +191,13 @@ String getPlatformName() { return 'Unknown'; } +bool isChrome() { + String userAgent = WebUtils.getHtmlValue('user-agent') ?? ''; + userAgent = userAgent.toLowerCase(); + + return userAgent.contains('chrome'); +} + String getNativePlatform() { String userAgent = WebUtils.getHtmlValue('user-agent') ?? ''; userAgent = userAgent.toLowerCase(); From 3c5c8dfc7ee5e80dddd3f5b8a2fb08c7da05319a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 13:28:39 +0200 Subject: [PATCH 03/31] Hide design pickers for now --- lib/ui/client/client_pdf.dart | 10 +++++++--- lib/ui/invoice/invoice_pdf.dart | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/ui/client/client_pdf.dart b/lib/ui/client/client_pdf.dart index c32a1c30190..8eaa3e08dc5 100644 --- a/lib/ui/client/client_pdf.dart +++ b/lib/ui/client/client_pdf.dart @@ -14,12 +14,10 @@ import 'package:http/http.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/main_app.dart'; -import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; -import 'package:invoiceninja_flutter/ui/app/forms/design_picker.dart'; import 'package:invoiceninja_flutter/ui/app/multiselect.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; import 'package:invoiceninja_flutter/utils/files.dart'; @@ -65,7 +63,7 @@ class _ClientPdfViewState extends State { convertDateTimeToSqlDate(DateTime.now().subtract(Duration(days: 365))); String? _endDate = convertDateTimeToSqlDate(); String _status = kStatementStatusAll; - String? _designId; + //String? _designId; @override void didChangeDependencies() { @@ -174,6 +172,7 @@ class _ClientPdfViewState extends State { final localization = AppLocalization.of(context)!; final client = widget.viewModel.client!; + /* final designPicker = Expanded( child: IgnorePointer( ignoring: _isLoading, @@ -191,6 +190,7 @@ class _ClientPdfViewState extends State { ), ), ); + */ final datePicker = Expanded( child: AppDropdownButton( @@ -418,11 +418,13 @@ class _ClientPdfViewState extends State { SizedBox(width: 16), statusPicker, SizedBox(width: 16), + /* if (hasDesignTemplatesForEntityType( state.designState.map, EntityType.client)) ...[ designPicker, SizedBox(width: 16), ], + */ sectionPicker, ], ) @@ -437,12 +439,14 @@ class _ClientPdfViewState extends State { ), Row( children: [ + /* if (hasDesignTemplatesForEntityType( state.designState.map, EntityType.client)) ...[ designPicker, SizedBox(width: 16), ], + */ sectionPicker, ], ), diff --git a/lib/ui/invoice/invoice_pdf.dart b/lib/ui/invoice/invoice_pdf.dart index a33cf2fe876..b168a15d034 100644 --- a/lib/ui/invoice/invoice_pdf.dart +++ b/lib/ui/invoice/invoice_pdf.dart @@ -10,9 +10,7 @@ import 'package:flutter_redux/flutter_redux.dart'; import 'package:http/http.dart' as http; import 'package:http/http.dart'; import 'package:invoiceninja_flutter/main_app.dart'; -import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; -import 'package:invoiceninja_flutter/ui/app/forms/design_picker.dart'; import 'package:invoiceninja_flutter/utils/files.dart'; import 'package:printing/printing.dart'; @@ -164,6 +162,7 @@ class _InvoicePdfViewState extends State { ), ); + /* final designPicker = _activityId != null || !hasDesignTemplatesForEntityType( state.designState.map, invoice.entityType!) @@ -188,6 +187,7 @@ class _InvoicePdfViewState extends State { ), ), ); + */ final deliveryNote = Flexible( child: CheckboxListTile( @@ -268,7 +268,7 @@ class _InvoicePdfViewState extends State { padding: const EdgeInsets.symmetric(vertical: 8), child: Row( children: [ - if (supportsDesignTemplates()) designPicker, + //if (supportsDesignTemplates()) designPicker, activityPicker, if (invoice.isInvoice && _activityId == null) deliveryNote, ], From 15416d5f3d54849b4e9d67d9b42ea3d7c25faa7b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 13:37:37 +0200 Subject: [PATCH 04/31] Add run_template action --- lib/data/models/models.dart | 5 +++++ lib/data/models/models.g.dart | 4 ++++ lib/utils/i18n.dart | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index d78a62d3d20..247b8cb379f 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -135,6 +135,7 @@ class EntityAction extends EnumClass { static const EntityAction setTaxCategory = _$setTaxCategory; static const EntityAction eInvoice = _$eInvoice; static const EntityAction unlink = _$unlink; + static const EntityAction runTemplate = _$runTemplate; @override String toString() { @@ -179,6 +180,10 @@ class EntityAction extends EnumClass { String toApiParam() { final value = toString(); + if (this == EntityAction.runTemplate) { + return 'template'; + } + if (this == EntityAction.sendEmail || this == EntityAction.bulkSendEmail) { return 'email'; } else if (this == EntityAction.cancelInvoice) { diff --git a/lib/data/models/models.g.dart b/lib/data/models/models.g.dart index b223f3adc87..553cca8d4ad 100644 --- a/lib/data/models/models.g.dart +++ b/lib/data/models/models.g.dart @@ -100,6 +100,7 @@ const EntityAction _$increasePrices = const EntityAction._('increasePrices'); const EntityAction _$setTaxCategory = const EntityAction._('setTaxCategory'); const EntityAction _$eInvoice = const EntityAction._('eInvoice'); const EntityAction _$unlink = const EntityAction._('unlink'); +const EntityAction _$runTemplate = const EntityAction._('runTemplate'); EntityAction _$valueOf(String name) { switch (name) { @@ -269,6 +270,8 @@ EntityAction _$valueOf(String name) { return _$eInvoice; case 'unlink': return _$unlink; + case 'runTemplate': + return _$runTemplate; default: throw new ArgumentError(name); } @@ -359,6 +362,7 @@ final BuiltSet _$values = _$setTaxCategory, _$eInvoice, _$unlink, + _$runTemplate, ]); Serializer _$entityActionSerializer = diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index b6fda2f9d27..53145775f50 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -18,6 +18,7 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'run_template': 'Run Template', 'task_extension_banner': 'Add the Chrome extension to manage your tasks', 'watch_video': 'Watch Video', 'view_extension': 'View Extension', @@ -109995,6 +109996,10 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]!['view_extension'] ?? _localizedValues['en']!['view_extension']!; + String get runTemplate => + _localizedValues[localeCode]!['run_template'] ?? + _localizedValues['en']!['run_template']!; + // STARTER: lang field - do not remove comment String lookup(String? key) { From 0269667785f8e6a1e6d28e4a5a2310ea6145df8c Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 13:45:07 +0200 Subject: [PATCH 05/31] Add run_template action --- lib/data/models/client_model.dart | 11 +++++++++++ lib/utils/icons.dart | 2 ++ 2 files changed, 13 insertions(+) diff --git a/lib/data/models/client_model.dart b/lib/data/models/client_model.dart index 17a4a8945c6..eb2b226dcfe 100644 --- a/lib/data/models/client_model.dart +++ b/lib/data/models/client_model.dart @@ -4,6 +4,7 @@ import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:collection/collection.dart'; import 'package:diacritic/diacritic.dart'; +import 'package:flutter_redux/flutter_redux.dart'; // Project imports: import 'package:invoiceninja_flutter/constants.dart'; @@ -12,7 +13,9 @@ import 'package:invoiceninja_flutter/data/models/group_model.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/system_log_model.dart'; import 'package:invoiceninja_flutter/data/models/tax_model.dart'; +import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; @@ -666,6 +669,14 @@ abstract class ClientEntity extends Object actions.add(EntityAction.documents); } + if (!isDeleted!) { + final store = StoreProvider.of(navigatorKey.currentContext!); + if (hasDesignTemplatesForEntityType( + store.state.designState.map, entityType)) { + actions.add(EntityAction.runTemplate); + } + } + if (!isDeleted! && !multiselect) { if (actions.isNotEmpty && actions.last != null) { actions.add(null); diff --git a/lib/utils/icons.dart b/lib/utils/icons.dart index 157f00e39b1..1e27a33818b 100644 --- a/lib/utils/icons.dart +++ b/lib/utils/icons.dart @@ -129,6 +129,8 @@ IconData? getEntityActionIcon(EntityAction? entityAction) { return MdiIcons.xml; case EntityAction.unlink: return MdiIcons.pipeDisconnected; + case EntityAction.runTemplate: + return MdiIcons.arrowRightBoldCircleOutline; default: return null; } From 81d3fed9b8f1dba68faaeb7aaf8e352f98442435 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 16:25:50 +0200 Subject: [PATCH 06/31] Add run_template action --- lib/redux/client/client_actions.dart | 9 ++++ lib/utils/dialogs.dart | 67 ++++++++++++++++++++++++++++ lib/utils/icons.dart | 2 +- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index 781b35e0b9d..6057f5002df 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -540,6 +540,15 @@ void handleClientAction(BuildContext? context, List clients, ), ); break; + case EntityAction.runTemplate: + showDialog( + context: context, + builder: (context) => RunTemplateDialog( + entityType: EntityType.client, + entities: clients, + ), + ); + break; default: print('## Error: action $action not handled in client_actions'); } diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 5bc4ef317bb..d56c15ee8fe 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -7,6 +7,7 @@ import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart'; +import 'package:invoiceninja_flutter/ui/app/forms/design_picker.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; @@ -606,3 +607,69 @@ void addToInvoiceDialog({ ); }); } + +class RunTemplateDialog extends StatefulWidget { + const RunTemplateDialog({ + super.key, + required this.entityType, + required this.entities, + }); + + final EntityType entityType; + final List entities; + + @override + State createState() => _RunTemplateDialogState(); +} + +class _RunTemplateDialogState extends State { + String _designId = ''; + + @override + Widget build(BuildContext context) { + final localization = AppLocalization.of(context)!; + + return AlertDialog( + title: Text(localization.runTemplate), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(localization.close.toUpperCase()), + ), + TextButton( + onPressed: () { + // + }, + child: Text(localization.start.toUpperCase()), + ), + ], + content: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + DesignPicker( + entityType: widget.entityType, + label: localization.template, + onSelected: (design) { + _designId = design?.id ?? ''; + }, + ), + SizedBox(height: 16), + Text( + localization.lookup(widget.entities.length == 1 + ? widget.entityType.snakeCase + : widget.entityType.plural), + style: Theme.of(context).textTheme.bodySmall, + ), + SizedBox(height: 8), + ...widget.entities + .map((entity) => Text(entity.listDisplayName)) + .toList(), + ], + ), + ), + ); + } +} diff --git a/lib/utils/icons.dart b/lib/utils/icons.dart index 1e27a33818b..b1feced21d7 100644 --- a/lib/utils/icons.dart +++ b/lib/utils/icons.dart @@ -130,7 +130,7 @@ IconData? getEntityActionIcon(EntityAction? entityAction) { case EntityAction.unlink: return MdiIcons.pipeDisconnected; case EntityAction.runTemplate: - return MdiIcons.arrowRightBoldCircleOutline; + return MdiIcons.arrowRightCircleOutline; default: return null; } From 328e2e5df556b28df202a47d7a9da0f7ae01cb86 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 16:31:30 +0200 Subject: [PATCH 07/31] Add run_template action --- lib/utils/dialogs.dart | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index d56c15ee8fe..48c89e57b05 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -624,6 +624,7 @@ class RunTemplateDialog extends StatefulWidget { class _RunTemplateDialogState extends State { String _designId = ''; + bool _sendEmail = false; @override Widget build(BuildContext context) { @@ -649,14 +650,6 @@ class _RunTemplateDialogState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - DesignPicker( - entityType: widget.entityType, - label: localization.template, - onSelected: (design) { - _designId = design?.id ?? ''; - }, - ), - SizedBox(height: 16), Text( localization.lookup(widget.entities.length == 1 ? widget.entityType.snakeCase @@ -667,6 +660,26 @@ class _RunTemplateDialogState extends State { ...widget.entities .map((entity) => Text(entity.listDisplayName)) .toList(), + SizedBox(height: 16), + DesignPicker( + entityType: widget.entityType, + label: localization.template, + onSelected: (design) { + _designId = design?.id ?? ''; + }, + ), + SizedBox(height: 16), + SwitchListTile( + value: _sendEmail, + title: Text( + localization.sendEmail, + ), + onChanged: (value) { + setState(() { + _sendEmail = value; + }); + }, + ), ], ), ), From 1731de53a8c42002706db962a9a55a135e59514b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Nov 2023 16:58:00 +0200 Subject: [PATCH 08/31] Add run_template action --- lib/utils/dialogs.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 48c89e57b05..28c1b50a1e4 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -660,10 +660,9 @@ class _RunTemplateDialogState extends State { ...widget.entities .map((entity) => Text(entity.listDisplayName)) .toList(), - SizedBox(height: 16), + SizedBox(height: 8), DesignPicker( entityType: widget.entityType, - label: localization.template, onSelected: (design) { _designId = design?.id ?? ''; }, From 15a0daf596dda724560b8fb26076974fd0955387 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 20 Nov 2023 16:51:52 +0200 Subject: [PATCH 09/31] Add run_template action --- lib/data/models/entities.dart | 14 ++++++++ .../repositories/bank_account_repository.dart | 6 ++-- lib/data/repositories/client_repository.dart | 12 +++---- .../company_gateway_repository.dart | 10 +++--- lib/data/repositories/credit_repository.dart | 8 ++--- lib/data/repositories/design_repository.dart | 8 ++--- .../repositories/document_repository.dart | 6 ++-- .../expense_category_repository.dart | 6 ++-- lib/data/repositories/expense_repository.dart | 8 ++--- lib/data/repositories/group_repository.dart | 8 ++--- lib/data/repositories/invoice_repository.dart | 8 ++--- lib/data/repositories/payment_repository.dart | 6 ++-- .../repositories/payment_term_repository.dart | 6 ++-- lib/data/repositories/product_repository.dart | 8 ++--- lib/data/repositories/project_repository.dart | 8 ++--- .../purchase_order_repository.dart | 8 ++--- lib/data/repositories/quote_repository.dart | 8 ++--- .../recurring_expense_repository.dart | 6 ++-- .../recurring_invoice_repository.dart | 6 ++-- .../repositories/schedule_repository.dart | 6 ++-- .../repositories/settings_repository.dart | 16 ++++----- .../static/static_repository.dart | 2 +- .../repositories/subscription_repository.dart | 6 ++-- lib/data/repositories/task_repository.dart | 10 +++--- .../repositories/task_status_repository.dart | 6 ++-- .../repositories/tax_rate_repository.dart | 8 ++--- lib/data/repositories/token_repository.dart | 6 ++-- .../repositories/transaction_repository.dart | 14 ++++---- .../transaction_rule_repository.dart | 6 ++-- lib/data/repositories/user_repository.dart | 12 +++---- lib/data/repositories/vendor_repository.dart | 8 ++--- lib/data/repositories/webhook_repository.dart | 6 ++-- lib/redux/app/app_state.dart | 6 ++-- lib/redux/credit/credit_actions.dart | 2 +- lib/redux/invoice/invoice_actions.dart | 2 +- .../purchase_order_actions.dart | 2 +- lib/redux/quote/quote_actions.dart | 2 +- lib/ui/app/document_grid.dart | 2 +- lib/ui/app/forms/app_dropdown_button.dart | 3 ++ lib/ui/app/forms/design_picker.dart | 3 ++ lib/ui/app/menu_drawer.dart | 10 +++--- lib/ui/settings/company_details.dart | 2 +- lib/ui/settings/invoice_design.dart | 2 +- lib/ui/settings/settings_list.dart | 2 +- lib/utils/dialogs.dart | 36 ++++++++++++++++--- 45 files changed, 189 insertions(+), 141 deletions(-) diff --git a/lib/data/models/entities.dart b/lib/data/models/entities.dart index 21569840f5b..4fc0e6f3e1c 100644 --- a/lib/data/models/entities.dart +++ b/lib/data/models/entities.dart @@ -244,6 +244,20 @@ class EntityType extends EnumClass { return snakeCase; } + String get pluralApiValue { + if (this == EntityType.transaction) { + return 'bank_transactions'; + } + + if (this == EntityType.expenseCategory) { + return 'expense_categories'; + } else if (this == EntityType.taskStatus) { + return 'task_statuses'; + } + + return snakeCase + 's'; + } + String get readableValue { if (this == EntityType.paymentLink) { return 'payment_link'; diff --git a/lib/data/repositories/bank_account_repository.dart b/lib/data/repositories/bank_account_repository.dart index 1be42152c7f..fa25c8e256d 100644 --- a/lib/data/repositories/bank_account_repository.dart +++ b/lib/data/repositories/bank_account_repository.dart @@ -26,7 +26,7 @@ class BankAccountRepository { } Future> loadList(Credentials credentials) async { - final String url = credentials.url! + '/bank_integrations?'; + final String url = credentials.url+ '/bank_integrations?'; final dynamic response = await webClient.get(url, credentials.token); final BankAccountListResponse bankAccountResponse = serializers @@ -41,7 +41,7 @@ class BankAccountRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/bank_integrations/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -60,7 +60,7 @@ class BankAccountRepository { if (bankAccount.isNew) { response = await webClient.post( - credentials.url! + '/bank_integrations', credentials.token, + credentials.url+ '/bank_integrations', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/bank_integrations/${bankAccount.id}'; diff --git a/lib/data/repositories/client_repository.dart b/lib/data/repositories/client_repository.dart index 36968386ff7..dc6aff3e111 100644 --- a/lib/data/repositories/client_repository.dart +++ b/lib/data/repositories/client_repository.dart @@ -41,7 +41,7 @@ class ClientRepository { Future> loadList( Credentials credentials, int page) async { final String url = - credentials.url! + '/clients?per_page=$kMaxRecordsPerPage&page=$page'; + credentials.url+ '/clients?per_page=$kMaxRecordsPerPage&page=$page'; final dynamic response = await webClient.get(url, credentials.token); @@ -60,7 +60,7 @@ class ClientRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/clients/bulk?per_page=$kMaxEntitiesPerBulkAction&include=gateway_tokens,activities,ledger,system_logs,documents'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -77,7 +77,7 @@ class ClientRepository { required String? password, required String? idToken, }) async { - final url = credentials.url! + '/clients/$clientId/purge'; + final url = credentials.url+ '/clients/$clientId/purge'; await webClient.post(url, credentials.token, password: password, idToken: idToken); @@ -93,7 +93,7 @@ class ClientRepository { required String? idToken, }) async { final url = - credentials.url! + '/clients/$mergeIntoClientId/$clientId/merge'; + credentials.url+ '/clients/$mergeIntoClientId/$clientId/merge'; final dynamic response = await webClient.post(url, credentials.token, password: password, idToken: idToken); @@ -112,12 +112,12 @@ class ClientRepository { if (client.isNew) { response = await webClient.post( - credentials.url! + + credentials.url+ '/clients?include=gateway_tokens,activities,ledger,system_logs,documents', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + + final url = credentials.url+ '/clients/${client.id}?include=gateway_tokens,activities,ledger,system_logs,documents'; response = await webClient.put(url, credentials.token, data: json.encode(data)); diff --git a/lib/data/repositories/company_gateway_repository.dart b/lib/data/repositories/company_gateway_repository.dart index 2267ea75844..8e5d70cafa9 100644 --- a/lib/data/repositories/company_gateway_repository.dart +++ b/lib/data/repositories/company_gateway_repository.dart @@ -35,7 +35,7 @@ class CompanyGatewayRepository { Future> loadList( Credentials credentials) async { - final url = credentials.url! + '/company_gateways'; + final url = credentials.url+ '/company_gateways'; final dynamic response = await webClient.get(url, credentials.token); @@ -51,7 +51,7 @@ class CompanyGatewayRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/company_gateways/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -64,7 +64,7 @@ class CompanyGatewayRepository { Future disconnect(Credentials credentials, String id, String? password, String? idToken) async { - final url = credentials.url! + '/stripe/disconnect/$id'; + final url = credentials.url+ '/stripe/disconnect/$id'; await webClient.post( url, credentials.token, @@ -81,10 +81,10 @@ class CompanyGatewayRepository { if (companyGateway.isNew) { response = await webClient.post( - credentials.url! + '/company_gateways', credentials.token, + credentials.url+ '/company_gateways', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/company_gateways/${companyGateway.id}'; + final url = credentials.url+ '/company_gateways/${companyGateway.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/credit_repository.dart b/lib/data/repositories/credit_repository.dart index e55bf5ec026..f88bed2593f 100644 --- a/lib/data/repositories/credit_repository.dart +++ b/lib/data/repositories/credit_repository.dart @@ -39,7 +39,7 @@ class CreditRepository { Future> loadList( Credentials credentials, int createdAt, bool filterDeleted) async { - String url = credentials.url! + '/credits?created_at=$createdAt'; + String url = credentials.url+ '/credits?created_at=$createdAt'; if (filterDeleted) { url += '&filter_deleted_clients=true'; @@ -62,7 +62,7 @@ class CreditRepository { } final url = - credentials.url! + '/credits/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/credits/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({ 'ids': ids, @@ -87,7 +87,7 @@ class CreditRepository { dynamic response; if (credit.isNew) { - url = credentials.url! + '/credits?include=activities.history'; + url = credentials.url+ '/credits?include=activities.history'; } else { url = '${credentials.url}/credits/${credit.id}?include=activities.history'; @@ -131,7 +131,7 @@ class CreditRepository { }; final dynamic response = await webClient.post( - credentials.url! + '/emails', credentials.token, + credentials.url+ '/emails', credentials.token, data: json.encode(data)); final InvoiceItemResponse invoiceResponse = diff --git a/lib/data/repositories/design_repository.dart b/lib/data/repositories/design_repository.dart index 5d39b0bf056..af1bb19b400 100644 --- a/lib/data/repositories/design_repository.dart +++ b/lib/data/repositories/design_repository.dart @@ -31,7 +31,7 @@ class DesignRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/designs?'; + final url = credentials.url+ '/designs?'; final dynamic response = await webClient.get(url, credentials.token); @@ -48,7 +48,7 @@ class DesignRepository { } final url = - credentials.url! + '/designs/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/designs/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -65,10 +65,10 @@ class DesignRepository { if (design.isNew) { response = await webClient.post( - credentials.url! + '/designs', credentials.token, + credentials.url+ '/designs', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/designs/${design.id}'; + final url = credentials.url+ '/designs/${design.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/document_repository.dart b/lib/data/repositories/document_repository.dart index e01bcf39353..c5531a4fe07 100644 --- a/lib/data/repositories/document_repository.dart +++ b/lib/data/repositories/document_repository.dart @@ -42,7 +42,7 @@ class DocumentRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/documents?'; + final url = credentials.url+ '/documents?'; final dynamic response = await webClient.get(url, credentials.token); @@ -57,7 +57,7 @@ class DocumentRepository { final data = serializers.serializeWith(DocumentEntity.serializer, document); dynamic response; - final url = credentials.url! + '/documents/${document.id}'; + final url = credentials.url+ '/documents/${document.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); @@ -74,7 +74,7 @@ class DocumentRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/documents/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); diff --git a/lib/data/repositories/expense_category_repository.dart b/lib/data/repositories/expense_category_repository.dart index 299cac73510..a012e35aab9 100644 --- a/lib/data/repositories/expense_category_repository.dart +++ b/lib/data/repositories/expense_category_repository.dart @@ -32,7 +32,7 @@ class ExpenseCategoryRepository { Future> loadList( Credentials credentials) async { - final String url = credentials.url! + '/expense_categories?'; + final String url = credentials.url+ '/expense_categories?'; final dynamic response = await webClient.get(url, credentials.token); final ExpenseCategoryListResponse expenseCategoryResponse = serializers @@ -47,7 +47,7 @@ class ExpenseCategoryRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/expense_categories/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -66,7 +66,7 @@ class ExpenseCategoryRepository { if (expenseCategory.isNew) { response = await webClient.post( - credentials.url! + '/expense_categories', credentials.token, + credentials.url+ '/expense_categories', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/expense_categories/${expenseCategory.id}'; diff --git a/lib/data/repositories/expense_repository.dart b/lib/data/repositories/expense_repository.dart index 9947af7aaa1..0790644d7d6 100644 --- a/lib/data/repositories/expense_repository.dart +++ b/lib/data/repositories/expense_repository.dart @@ -38,7 +38,7 @@ class ExpenseRepository { Future> loadList(Credentials credentials, int page, int createdAt, bool filterDeleted) async { - final url = credentials.url! + + final url = credentials.url+ '/expenses?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; /* Server is incorrect if client isn't set @@ -63,7 +63,7 @@ class ExpenseRepository { } final url = - credentials.url! + '/expenses/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/expenses/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -80,10 +80,10 @@ class ExpenseRepository { if (expense.isNew) { response = await webClient.post( - credentials.url! + '/expenses', credentials.token, + credentials.url+ '/expenses', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/expenses/${expense.id}'; + final url = credentials.url+ '/expenses/${expense.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/group_repository.dart b/lib/data/repositories/group_repository.dart index 0f91b9b1458..88a66103d63 100644 --- a/lib/data/repositories/group_repository.dart +++ b/lib/data/repositories/group_repository.dart @@ -33,7 +33,7 @@ class GroupRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/group_settings?'; + final url = credentials.url+ '/group_settings?'; final dynamic response = await webClient.get(url, credentials.token); @@ -49,7 +49,7 @@ class GroupRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/group_settings/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -67,10 +67,10 @@ class GroupRepository { if (group.isNew) { response = await webClient.post( - credentials.url! + '/group_settings', credentials.token, + credentials.url+ '/group_settings', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/group_settings/${group.id}'; + final url = credentials.url+ '/group_settings/${group.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/invoice_repository.dart b/lib/data/repositories/invoice_repository.dart index 04287ec4362..2f737b5387c 100644 --- a/lib/data/repositories/invoice_repository.dart +++ b/lib/data/repositories/invoice_repository.dart @@ -39,7 +39,7 @@ class InvoiceRepository { Future> loadList(Credentials credentials, int page, int createdAt, bool filterDeleted) async { - String url = credentials.url! + + String url = credentials.url+ '/invoices?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; if (filterDeleted) { @@ -63,7 +63,7 @@ class InvoiceRepository { } final url = - credentials.url! + '/invoices/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/invoices/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({ 'ids': ids, @@ -88,7 +88,7 @@ class InvoiceRepository { String url; if (invoice.isNew) { - url = credentials.url! + '/invoices?include=activities.history'; + url = credentials.url+ '/invoices?include=activities.history'; } else { url = '${credentials.url}/invoices/${invoice.id}?include=activities.history'; @@ -143,7 +143,7 @@ class InvoiceRepository { }; final dynamic response = await webClient.post( - credentials.url! + '/emails', credentials.token, + credentials.url+ '/emails', credentials.token, data: json.encode(data)); final InvoiceItemResponse invoiceResponse = diff --git a/lib/data/repositories/payment_repository.dart b/lib/data/repositories/payment_repository.dart index d6458292366..9461245af98 100644 --- a/lib/data/repositories/payment_repository.dart +++ b/lib/data/repositories/payment_repository.dart @@ -38,7 +38,7 @@ class PaymentRepository { Future> loadList(Credentials credentials, int page, int createdAt, bool filterDeleted) async { - String url = credentials.url! + + String url = credentials.url+ '/payments?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; if (filterDeleted) { @@ -61,7 +61,7 @@ class PaymentRepository { } final url = - credentials.url! + '/payments/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/payments/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -100,7 +100,7 @@ class PaymentRepository { final data = serializers.serializeWith(PaymentEntity.serializer, payment); dynamic response; - var url = credentials.url! + '/payments/refund?'; + var url = credentials.url+ '/payments/refund?'; if (payment.sendEmail == true) { url += '&email_receipt=true'; } diff --git a/lib/data/repositories/payment_term_repository.dart b/lib/data/repositories/payment_term_repository.dart index c4f155ca0a0..e3c8735524b 100644 --- a/lib/data/repositories/payment_term_repository.dart +++ b/lib/data/repositories/payment_term_repository.dart @@ -32,7 +32,7 @@ class PaymentTermRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/payment_terms?'; + final url = credentials.url+ '/payment_terms?'; final dynamic response = await webClient.get(url, credentials.token); @@ -48,7 +48,7 @@ class PaymentTermRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/payment_terms/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -67,7 +67,7 @@ class PaymentTermRepository { if (paymentTerm.isNew) { response = await webClient.post( - credentials.url! + '/payment_terms', credentials.token, + credentials.url+ '/payment_terms', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/payment_terms/${paymentTerm.id}'; diff --git a/lib/data/repositories/product_repository.dart b/lib/data/repositories/product_repository.dart index 2cf15185caf..f71fb7024d6 100644 --- a/lib/data/repositories/product_repository.dart +++ b/lib/data/repositories/product_repository.dart @@ -40,7 +40,7 @@ class ProductRepository { Future> loadList( Credentials credentials, int page) async { final url = - credentials.url! + '/products?per_page=$kMaxRecordsPerPage&page=$page'; + credentials.url+ '/products?per_page=$kMaxRecordsPerPage&page=$page'; final dynamic response = await webClient.get(url, credentials.token); @@ -62,7 +62,7 @@ class ProductRepository { } final url = - credentials.url! + '/products/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/products/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post( url, credentials.token, @@ -89,10 +89,10 @@ class ProductRepository { if (product.isNew) { response = await webClient.post( - credentials.url! + '/products', credentials.token, + credentials.url+ '/products', credentials.token, data: json.encode(data)); } else { - var url = credentials.url! + '/products/${product.id}'; + var url = credentials.url+ '/products/${product.id}'; if (changedStock) { url += '?update_in_stock_quantity=true'; } diff --git a/lib/data/repositories/project_repository.dart b/lib/data/repositories/project_repository.dart index 760cf4b8813..f037cbd040d 100644 --- a/lib/data/repositories/project_repository.dart +++ b/lib/data/repositories/project_repository.dart @@ -38,7 +38,7 @@ class ProjectRepository { Future> loadList( Credentials credentials, int createdAt, bool filterDeleted) async { - String url = credentials.url! + '/projects?created_at=$createdAt'; + String url = credentials.url+ '/projects?created_at=$createdAt'; if (filterDeleted) { url += '&filter_deleted_clients=true'; @@ -60,7 +60,7 @@ class ProjectRepository { } final url = - credentials.url! + '/projects/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/projects/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -77,10 +77,10 @@ class ProjectRepository { if (project.isNew) { response = await webClient.post( - credentials.url! + '/projects', credentials.token, + credentials.url+ '/projects', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/projects/${project.id}'; + final url = credentials.url+ '/projects/${project.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/purchase_order_repository.dart b/lib/data/repositories/purchase_order_repository.dart index 82e1d2ea340..3953ea1fdbd 100644 --- a/lib/data/repositories/purchase_order_repository.dart +++ b/lib/data/repositories/purchase_order_repository.dart @@ -33,7 +33,7 @@ class PurchaseOrderRepository { int createdAt, //bool filterDeleted, ) async { - final url = credentials.url! + + final url = credentials.url+ '/purchase_orders?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; /* @@ -57,7 +57,7 @@ class PurchaseOrderRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/purchase_orders/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({ @@ -87,7 +87,7 @@ class PurchaseOrderRepository { dynamic response; if (purchaseOrder.isNew) { - url = credentials.url! + '/purchase_orders?include=activities.history'; + url = credentials.url+ '/purchase_orders?include=activities.history'; } else { url = '${credentials.url}/purchase_orders/${purchaseOrder.id}?include=activities.history'; @@ -138,7 +138,7 @@ class PurchaseOrderRepository { }; final dynamic response = await webClient.post( - credentials.url! + '/emails', credentials.token, + credentials.url+ '/emails', credentials.token, data: json.encode(data)); final InvoiceItemResponse invoiceResponse = diff --git a/lib/data/repositories/quote_repository.dart b/lib/data/repositories/quote_repository.dart index db8b01c3e65..53c62814048 100644 --- a/lib/data/repositories/quote_repository.dart +++ b/lib/data/repositories/quote_repository.dart @@ -39,7 +39,7 @@ class QuoteRepository { Future> loadList(Credentials credentials, int page, int createdAt, bool filterDeleted) async { - String url = credentials.url! + + String url = credentials.url+ '/quotes?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; if (filterDeleted) { @@ -63,7 +63,7 @@ class QuoteRepository { } final url = - credentials.url! + '/quotes/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/quotes/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({ 'ids': ids, @@ -88,7 +88,7 @@ class QuoteRepository { dynamic response; if (quote.isNew) { - url = credentials.url! + '/quotes?include=activities.history'; + url = credentials.url+ '/quotes?include=activities.history'; } else { url = '${credentials.url}/quotes/${quote.id}?include=activities.history'; } @@ -140,7 +140,7 @@ class QuoteRepository { }; final dynamic response = await webClient.post( - credentials.url! + '/emails', credentials.token, + credentials.url+ '/emails', credentials.token, data: json.encode(data)); final InvoiceItemResponse invoiceResponse = diff --git a/lib/data/repositories/recurring_expense_repository.dart b/lib/data/repositories/recurring_expense_repository.dart index 774915cd054..44792a34d49 100644 --- a/lib/data/repositories/recurring_expense_repository.dart +++ b/lib/data/repositories/recurring_expense_repository.dart @@ -33,7 +33,7 @@ class RecurringExpenseRepository { } Future> loadList(Credentials credentials) async { - final String url = credentials.url! + '/recurring_expenses?'; + final String url = credentials.url+ '/recurring_expenses?'; final dynamic response = await webClient.get(url, credentials.token); final ExpenseListResponse recurringExpenseResponse = @@ -48,7 +48,7 @@ class RecurringExpenseRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/recurring_expenses/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -68,7 +68,7 @@ class RecurringExpenseRepository { String url; if (recurringExpense.isNew) { - url = credentials.url! + '/recurring_expenses?show_dates=true'; + url = credentials.url+ '/recurring_expenses?show_dates=true'; } else { url = '${credentials.url}/recurring_expenses/${recurringExpense.id}?show_dates=true'; diff --git a/lib/data/repositories/recurring_invoice_repository.dart b/lib/data/repositories/recurring_invoice_repository.dart index 509c498da18..110249f261e 100644 --- a/lib/data/repositories/recurring_invoice_repository.dart +++ b/lib/data/repositories/recurring_invoice_repository.dart @@ -34,7 +34,7 @@ class RecurringInvoiceRepository { Future> loadList( Credentials credentials, int page, bool filterDeleted) async { - String url = credentials.url! + + String url = credentials.url+ '/recurring_invoices?per_page=$kMaxRecordsPerPage&page=$page'; if (filterDeleted) { @@ -56,7 +56,7 @@ class RecurringInvoiceRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/recurring_invoices/bulk?per_page=$kMaxEntitiesPerBulkAction'; final params = {'ids': ids, 'action': action.toApiParam()}; if (data != null) { @@ -83,7 +83,7 @@ class RecurringInvoiceRepository { String url; if (recurringInvoice.isNew) { - url = credentials.url! + + url = credentials.url+ '/recurring_invoices?include=activities,history&show_dates=true'; } else { url = diff --git a/lib/data/repositories/schedule_repository.dart b/lib/data/repositories/schedule_repository.dart index 2a5265ef312..1c7e7847b31 100644 --- a/lib/data/repositories/schedule_repository.dart +++ b/lib/data/repositories/schedule_repository.dart @@ -26,7 +26,7 @@ class ScheduleRepository { } Future> loadList(Credentials credentials) async { - final String url = credentials.url! + '/task_schedulers?'; + final String url = credentials.url+ '/task_schedulers?'; final dynamic response = await webClient.get(url, credentials.token); final ScheduleListResponse scheduleResponse = @@ -41,7 +41,7 @@ class ScheduleRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/task_schedulers/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -59,7 +59,7 @@ class ScheduleRepository { if (schedule.isNew) { response = await webClient.post( - credentials.url! + '/task_schedulers', credentials.token, + credentials.url+ '/task_schedulers', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/task_schedulers/${schedule.id}'; diff --git a/lib/data/repositories/settings_repository.dart b/lib/data/repositories/settings_repository.dart index 2a30cc86618..eba8ea1f320 100644 --- a/lib/data/repositories/settings_repository.dart +++ b/lib/data/repositories/settings_repository.dart @@ -24,7 +24,7 @@ class SettingsRepository { final data = serializers.serializeWith(CompanyEntity.serializer, company); dynamic response; - final url = credentials.url! + '/companies/${company.id}'; + final url = credentials.url+ '/companies/${company.id}'; response = await webClient.put( url, credentials.token, @@ -41,7 +41,7 @@ class SettingsRepository { CompanyEntity company, MultipartFile eInvoiceCertificate) async { dynamic response; - final url = credentials.url! + '/companies/${company.id}'; + final url = credentials.url+ '/companies/${company.id}'; final fields = { '_method': 'put', }; @@ -68,7 +68,7 @@ class SettingsRepository { final data = serializers.serializeWith(UserEntity.serializer, user); dynamic response; - final url = credentials.url! + '/users/${user.id}?include=company_user'; + final url = credentials.url+ '/users/${user.id}?include=company_user'; response = await webClient.put( url, credentials.token, @@ -92,7 +92,7 @@ class SettingsRepository { ) async { dynamic response; - final url = credentials.url! + '/connected_account?include=company_user'; + final url = credentials.url+ '/connected_account?include=company_user'; response = await webClient.post( url, credentials.token, @@ -120,7 +120,7 @@ class SettingsRepository { ) async { dynamic response; - final url = credentials.url! + + final url = credentials.url+ '/users/${user.id}/disconnect_oauth?include=company_user'; response = await webClient.post( url, @@ -143,7 +143,7 @@ class SettingsRepository { ) async { dynamic response; - final url = credentials.url! + + final url = credentials.url+ '/users/$userId/disconnect_mailer?include=company_user'; response = await webClient.post( url, @@ -166,7 +166,7 @@ class SettingsRepository { dynamic response; final url = - credentials.url! + '/connected_account/gmail?include=company_user'; + credentials.url+ '/connected_account/gmail?include=company_user'; response = await webClient.post( url, credentials.token, @@ -191,7 +191,7 @@ class SettingsRepository { final data = serializers.serializeWith(UserEntity.serializer, user); dynamic response; - final url = credentials.url! + '/company_users/${user.id}'; + final url = credentials.url+ '/company_users/${user.id}'; response = await webClient.put( url, credentials.token, diff --git a/lib/data/repositories/static/static_repository.dart b/lib/data/repositories/static/static_repository.dart index 3fca32403ba..4133a346ce4 100644 --- a/lib/data/repositories/static/static_repository.dart +++ b/lib/data/repositories/static/static_repository.dart @@ -18,7 +18,7 @@ class StaticRepository { Future loadList(Credentials credentials) async { final dynamic response = - await webClient.get(credentials.url! + '/static', credentials.token); + await webClient.get(credentials.url+ '/static', credentials.token); final StaticDataItemResponse staticDataResponse = serializers .deserializeWith(StaticDataItemResponse.serializer, response)!; diff --git a/lib/data/repositories/subscription_repository.dart b/lib/data/repositories/subscription_repository.dart index afddf076b3e..20741bfb688 100644 --- a/lib/data/repositories/subscription_repository.dart +++ b/lib/data/repositories/subscription_repository.dart @@ -32,7 +32,7 @@ class SubscriptionRepository { Future> loadList( Credentials credentials) async { - final String url = credentials.url! + '/subscriptions?'; + final String url = credentials.url+ '/subscriptions?'; final dynamic response = await webClient.get(url, credentials.token); final SubscriptionListResponse subscriptionResponse = serializers @@ -47,7 +47,7 @@ class SubscriptionRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/subscriptions/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -66,7 +66,7 @@ class SubscriptionRepository { if (subscription.isNew) { response = await webClient.post( - credentials.url! + '/subscriptions', credentials.token, + credentials.url+ '/subscriptions', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/subscriptions/${subscription.id}'; diff --git a/lib/data/repositories/task_repository.dart b/lib/data/repositories/task_repository.dart index b9a06663a25..9ba235462c6 100644 --- a/lib/data/repositories/task_repository.dart +++ b/lib/data/repositories/task_repository.dart @@ -37,7 +37,7 @@ class TaskRepository { Future> loadList(Credentials credentials, int page, int createdAt, bool filterDeleted) async { - final url = credentials.url! + + final url = credentials.url+ '/tasks?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; /* Server is incorrect if client isn't set @@ -62,7 +62,7 @@ class TaskRepository { } final url = - credentials.url! + '/tasks/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/tasks/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -74,7 +74,7 @@ class TaskRepository { Future sortTasks(Credentials credentials, List? statusIds, Map>? taskIds) async { - final url = credentials.url! + '/tasks/sort'; + final url = credentials.url+ '/tasks/sort'; await webClient.post(url, credentials.token, data: json.encode({'status_ids': statusIds, 'task_ids': taskIds})); @@ -90,9 +90,9 @@ class TaskRepository { String url; if (task.isNew) { - url = credentials.url! + '/tasks?'; + url = credentials.url+ '/tasks?'; } else { - url = credentials.url! + '/tasks/${task.id}?'; + url = credentials.url+ '/tasks/${task.id}?'; } if ([ diff --git a/lib/data/repositories/task_status_repository.dart b/lib/data/repositories/task_status_repository.dart index 8ef8f08dd53..34195bcc4d2 100644 --- a/lib/data/repositories/task_status_repository.dart +++ b/lib/data/repositories/task_status_repository.dart @@ -31,7 +31,7 @@ class TaskStatusRepository { } Future> loadList(Credentials credentials) async { - final String url = credentials.url! + '/task_statuses?'; + final String url = credentials.url+ '/task_statuses?'; final dynamic response = await webClient.get(url, credentials.token); final TaskStatusListResponse taskStatusResponse = serializers @@ -46,7 +46,7 @@ class TaskStatusRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/task_statuses/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -65,7 +65,7 @@ class TaskStatusRepository { if (taskStatus.isNew) { response = await webClient.post( - credentials.url! + '/task_statuses', credentials.token, + credentials.url+ '/task_statuses', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/task_statuses/${taskStatus.id}'; diff --git a/lib/data/repositories/tax_rate_repository.dart b/lib/data/repositories/tax_rate_repository.dart index 3a911f234b2..b7c1a342e2d 100644 --- a/lib/data/repositories/tax_rate_repository.dart +++ b/lib/data/repositories/tax_rate_repository.dart @@ -31,7 +31,7 @@ class TaxRateRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/tax_rates?'; + final url = credentials.url+ '/tax_rates?'; final dynamic response = await webClient.get(url, credentials.token); @@ -47,7 +47,7 @@ class TaxRateRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/tax_rates/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -65,10 +65,10 @@ class TaxRateRepository { if (taxRate.isNew) { response = await webClient.post( - credentials.url! + '/tax_rates', credentials.token, + credentials.url+ '/tax_rates', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/tax_rates/${taxRate.id}'; + final url = credentials.url+ '/tax_rates/${taxRate.id}'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/token_repository.dart b/lib/data/repositories/token_repository.dart index 4712ab399ea..d7c0e0b7bd2 100644 --- a/lib/data/repositories/token_repository.dart +++ b/lib/data/repositories/token_repository.dart @@ -31,7 +31,7 @@ class TokenRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/tokens?'; + final url = credentials.url+ '/tokens?'; final dynamic response = await webClient.get(url, credentials.token); @@ -48,7 +48,7 @@ class TokenRepository { } final url = - credentials.url! + '/tokens/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/tokens/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -69,7 +69,7 @@ class TokenRepository { if (token.isNew) { response = await webClient.post( - credentials.url! + '/tokens', + credentials.url+ '/tokens', credentials.token, data: json.encode(data), password: password, diff --git a/lib/data/repositories/transaction_repository.dart b/lib/data/repositories/transaction_repository.dart index a34831f2453..da4ba7ba0ef 100644 --- a/lib/data/repositories/transaction_repository.dart +++ b/lib/data/repositories/transaction_repository.dart @@ -27,7 +27,7 @@ class TransactionRepository { Future> loadList( Credentials credentials, int page, int createdAt) async { - final String url = credentials.url! + + final String url = credentials.url+ '/bank_transactions?per_page=$kMaxRecordsPerPage&page=$page&created_at=$createdAt'; final dynamic response = await webClient.get(url, credentials.token); @@ -43,7 +43,7 @@ class TransactionRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/bank_transactions/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -56,7 +56,7 @@ class TransactionRepository { Future convertToPayment(Credentials credentials, String? transactionId, List invoiceIds) async { - final url = credentials.url! + '/bank_transactions/match'; + final url = credentials.url+ '/bank_transactions/match'; final dynamic response = await webClient.post( url, credentials.token, @@ -84,7 +84,7 @@ class TransactionRepository { String vendorId, String categoryId, ) async { - final url = credentials.url! + '/bank_transactions/match'; + final url = credentials.url+ '/bank_transactions/match'; final dynamic response = await webClient.post( url, credentials.token, @@ -109,7 +109,7 @@ class TransactionRepository { Future linkToPayment( Credentials credentials, String? transactionId, String paymentId) async { - final url = credentials.url! + '/bank_transactions/match'; + final url = credentials.url+ '/bank_transactions/match'; final dynamic response = await webClient.post( url, credentials.token, @@ -133,7 +133,7 @@ class TransactionRepository { Future linkToExpense( Credentials credentials, String? transactionId, String expenseId) async { - final url = credentials.url! + '/bank_transactions/match'; + final url = credentials.url+ '/bank_transactions/match'; final dynamic response = await webClient.post( url, credentials.token, @@ -163,7 +163,7 @@ class TransactionRepository { if (transaction.isNew) { response = await webClient.post( - credentials.url! + '/bank_transactions', credentials.token, + credentials.url+ '/bank_transactions', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/bank_transactions/${transaction.id}'; diff --git a/lib/data/repositories/transaction_rule_repository.dart b/lib/data/repositories/transaction_rule_repository.dart index fa9736b79c7..76f75d340c4 100644 --- a/lib/data/repositories/transaction_rule_repository.dart +++ b/lib/data/repositories/transaction_rule_repository.dart @@ -28,7 +28,7 @@ class TransactionRuleRepository { Future> loadList( Credentials credentials) async { - final String url = credentials.url! + '/bnak_transaction_rules?'; + final String url = credentials.url+ '/bnak_transaction_rules?'; final dynamic response = await webClient.get(url, credentials.token); final TransactionRuleListResponse transactionRuleResponse = serializers @@ -43,7 +43,7 @@ class TransactionRuleRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/bank_transaction_rules/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -62,7 +62,7 @@ class TransactionRuleRepository { if (transactionRule.isNew) { response = await webClient.post( - credentials.url! + '/bank_transaction_rules', credentials.token, + credentials.url+ '/bank_transaction_rules', credentials.token, data: json.encode(data)); } else { final url = diff --git a/lib/data/repositories/user_repository.dart b/lib/data/repositories/user_repository.dart index c10ea0622dc..a6418e1131c 100644 --- a/lib/data/repositories/user_repository.dart +++ b/lib/data/repositories/user_repository.dart @@ -31,7 +31,7 @@ class UserRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/users?include=company_user'; + final url = credentials.url+ '/users?include=company_user'; final dynamic response = await webClient.get(url, credentials.token); @@ -52,7 +52,7 @@ class UserRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/users/bulk?per_page=$kMaxEntitiesPerBulkAction&include=company_user'; final dynamic response = await webClient.post( url, @@ -74,7 +74,7 @@ class UserRepository { String? password, String? idToken, ) async { - final url = credentials.url! + '/users/$userId/detach_from_company'; + final url = credentials.url+ '/users/$userId/detach_from_company'; final dynamic response = await webClient.delete( url, credentials.token, @@ -94,7 +94,7 @@ class UserRepository { String? password, String? idToken, ) async { - final url = credentials.url! + '/users/$userId/invite'; + final url = credentials.url+ '/users/$userId/invite'; final dynamic response = await webClient.post( url, credentials.token, @@ -124,14 +124,14 @@ class UserRepository { if (user.isNew) { response = await webClient.post( - credentials.url! + '/users?include=company_user', + credentials.url+ '/users?include=company_user', credentials.token, data: json.encode(data), password: password, idToken: idToken, ); } else { - final url = credentials.url! + '/users/${user.id}?include=company_user'; + final url = credentials.url+ '/users/${user.id}?include=company_user'; response = await webClient.put( url, credentials.token, diff --git a/lib/data/repositories/vendor_repository.dart b/lib/data/repositories/vendor_repository.dart index d4f2c7e6452..503592e7b58 100644 --- a/lib/data/repositories/vendor_repository.dart +++ b/lib/data/repositories/vendor_repository.dart @@ -40,7 +40,7 @@ class VendorRepository { Future> loadList( Credentials credentials, int page) async { final String url = - credentials.url! + '/vendors?per_page=$kMaxRecordsPerPage&page=$page'; + credentials.url+ '/vendors?per_page=$kMaxRecordsPerPage&page=$page'; final dynamic response = await webClient.get(url, credentials.token); @@ -57,7 +57,7 @@ class VendorRepository { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } - final url = credentials.url! + + final url = credentials.url+ '/vendors/bulk?per_page=$kMaxEntitiesPerBulkAction&include=activities'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -75,10 +75,10 @@ class VendorRepository { if (vendor.isNew) { response = await webClient.post( - credentials.url! + '/vendors?include=activities', credentials.token, + credentials.url+ '/vendors?include=activities', credentials.token, data: json.encode(data)); } else { - final url = credentials.url! + '/vendors/${vendor.id}?include=activities'; + final url = credentials.url+ '/vendors/${vendor.id}?include=activities'; response = await webClient.put(url, credentials.token, data: json.encode(data)); } diff --git a/lib/data/repositories/webhook_repository.dart b/lib/data/repositories/webhook_repository.dart index 2167754f084..64f41170231 100644 --- a/lib/data/repositories/webhook_repository.dart +++ b/lib/data/repositories/webhook_repository.dart @@ -31,7 +31,7 @@ class WebhookRepository { } Future> loadList(Credentials credentials) async { - final url = credentials.url! + '/webhooks?'; + final url = credentials.url+ '/webhooks?'; final dynamic response = await webClient.get(url, credentials.token); @@ -48,7 +48,7 @@ class WebhookRepository { } final url = - credentials.url! + '/webhooks/bulk?per_page=$kMaxEntitiesPerBulkAction'; + credentials.url+ '/webhooks/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, data: json.encode({'ids': ids, 'action': action.toApiParam()})); @@ -65,7 +65,7 @@ class WebhookRepository { if (webhook.isNew) { response = await webClient.post( - credentials.url! + '/webhooks', credentials.token, + credentials.url+ '/webhooks', credentials.token, data: json.encode(data)); } else { final url = '${credentials.url}/webhooks/${webhook.id}'; diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 8a5fc5ad623..160868dd8b2 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -1028,10 +1028,10 @@ abstract class AppState implements Built { } class Credentials { - const Credentials({this.url, this.token}); + const Credentials({required this.url, required this.token}); - final String? url; - final String? token; + final String url; + final String token; } class SelectionState { diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index 83d1b459959..21bd57a864f 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -694,7 +694,7 @@ Future handleCreditAction(BuildContext context, List credits, break; case EntityAction.bulkPrint: store.dispatch(StartSaving()); - final url = state.credentials.url! + '/credits/bulk'; + final url = state.credentials.url+ '/credits/bulk'; final data = json.encode( {'ids': creditIds, 'action': EntityAction.bulkPrint.toApiParam()}); final http.Response? response = await WebClient() diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 6f0f2b96929..76451057226 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -850,7 +850,7 @@ void handleInvoiceAction(BuildContext? context, List invoices, break; case EntityAction.bulkPrint: store.dispatch(StartSaving()); - final url = state.credentials.url! + '/invoices/bulk'; + final url = state.credentials.url+ '/invoices/bulk'; final data = json.encode( {'ids': invoiceIds, 'action': EntityAction.bulkPrint.toApiParam()}); final http.Response? response = await WebClient() diff --git a/lib/redux/purchase_order/purchase_order_actions.dart b/lib/redux/purchase_order/purchase_order_actions.dart index f5a4dddb4ff..39799ea2b5c 100644 --- a/lib/redux/purchase_order/purchase_order_actions.dart +++ b/lib/redux/purchase_order/purchase_order_actions.dart @@ -632,7 +632,7 @@ void handlePurchaseOrderAction(BuildContext? context, break; case EntityAction.bulkPrint: store.dispatch(StartSaving()); - final url = state.credentials.url! + '/purchase_orders/bulk'; + final url = state.credentials.url+ '/purchase_orders/bulk'; final data = json.encode({ 'ids': purchaseOrderIds, 'action': EntityAction.bulkPrint.toApiParam() diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index 27c814ed18e..60ecf01eac8 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -747,7 +747,7 @@ Future handleQuoteAction( break; case EntityAction.bulkPrint: store.dispatch(StartSaving()); - final url = state.credentials.url! + '/quotes/bulk'; + final url = state.credentials.url+ '/quotes/bulk'; final data = json.encode( {'ids': quoteIds, 'action': EntityAction.bulkPrint.toApiParam()}); final http.Response? response = await WebClient() diff --git a/lib/ui/app/document_grid.dart b/lib/ui/app/document_grid.dart index 568fc1b6cc3..2acd58969ca 100644 --- a/lib/ui/app/document_grid.dart +++ b/lib/ui/app/document_grid.dart @@ -460,7 +460,7 @@ class DocumentPreview extends StatelessWidget { imageUrl: '${cleanApiUrl(state.credentials.url)}/documents/${document.hash}', imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, - httpHeaders: {'X-API-TOKEN': state.credentials.token!}, + httpHeaders: {'X-API-TOKEN': state.credentials.token}, placeholder: (context, url) => Container( height: height, child: Center( diff --git a/lib/ui/app/forms/app_dropdown_button.dart b/lib/ui/app/forms/app_dropdown_button.dart index ebb0d762314..f246f5e3428 100644 --- a/lib/ui/app/forms/app_dropdown_button.dart +++ b/lib/ui/app/forms/app_dropdown_button.dart @@ -13,6 +13,7 @@ class AppDropdownButton extends StatelessWidget { this.blankValue = '', this.blankLabel, this.enabled = true, + this.autofocus = false, }) : super(key: key); final String? labelText; @@ -21,6 +22,7 @@ class AppDropdownButton extends StatelessWidget { final List> items; final bool showBlank; final bool enabled; + final bool autofocus; final dynamic blankValue; final String? blankLabel; final DropdownButtonBuilder? selectedItemBuilder; @@ -40,6 +42,7 @@ class AppDropdownButton extends StatelessWidget { : InputDecoration.collapsed(hintText: ''), value: checkedValue == blankValue ? null : checkedValue, isExpanded: true, + autofocus: autofocus, isDense: labelText != null, onChanged: enabled ? onChanged : null, selectedItemBuilder: selectedItemBuilder, diff --git a/lib/ui/app/forms/design_picker.dart b/lib/ui/app/forms/design_picker.dart index 2cef4032c7c..eba36f1c407 100644 --- a/lib/ui/app/forms/design_picker.dart +++ b/lib/ui/app/forms/design_picker.dart @@ -18,12 +18,14 @@ class DesignPicker extends StatelessWidget { this.initialValue, this.showBlank = false, this.entityType, + this.autofocus = false, }); final Function(DesignEntity?) onSelected; final String? label; final String? initialValue; final bool showBlank; + final bool autofocus; final EntityType? entityType; @override @@ -34,6 +36,7 @@ class DesignPicker extends StatelessWidget { final designState = state.designState; return AppDropdownButton( + autofocus: autofocus, showBlank: showBlank, value: initialValue, onChanged: (dynamic value) => onSelected(designState.map[value]), diff --git a/lib/ui/app/menu_drawer.dart b/lib/ui/app/menu_drawer.dart index ba390c01a4b..9f54ab91925 100644 --- a/lib/ui/app/menu_drawer.dart +++ b/lib/ui/app/menu_drawer.dart @@ -88,7 +88,7 @@ class _MenuDrawerState extends State { // Fix for CORS error using 'object' subdomain return CachedImage( width: MenuDrawer.LOGO_WIDTH, - url: state.credentials.url! + '/companies/' + company.id + '/logo', + url: state.credentials.url+ '/companies/' + company.id + '/logo', apiToken: state.userCompanyStates .firstWhere((userCompanyState) => userCompanyState.company.id == company.id) @@ -347,7 +347,7 @@ class _MenuDrawerState extends State { mainAxisSize: MainAxisSize.max, children: [ // Hide options while refreshing data - state.credentials.token!.isEmpty + state.credentials.token.isEmpty ? Expanded(child: SizedBox()) : Container( padding: @@ -358,7 +358,7 @@ class _MenuDrawerState extends State { child: state.isMenuCollapsed ? _collapsedCompanySelector : _expandedCompanySelector), - state.credentials.token!.isEmpty + state.credentials.token.isEmpty ? SizedBox() : Theme( data: state.prefState.enableDarkMode || @@ -1069,7 +1069,7 @@ class SidebarFooter extends StatelessWidget { ), ]), ) - else if (state.credentials.token!.isEmpty) + else if (state.credentials.token.isEmpty) IconButton( tooltip: prefState.enableTooltips ? localization!.error : '', icon: Icon( @@ -1680,7 +1680,7 @@ class _ContactUsDialogState extends State { setState(() => _isSaving = true); WebClient() - .post(state.credentials.url! + '/support/messages/send', + .post(state.credentials.url+ '/support/messages/send', state.credentials.token, data: json.encode({ 'message': _message, diff --git a/lib/ui/settings/company_details.dart b/lib/ui/settings/company_details.dart index a976afe1483..a22a9ac11fb 100644 --- a/lib/ui/settings/company_details.dart +++ b/lib/ui/settings/company_details.dart @@ -576,7 +576,7 @@ class _CompanyDetailsState extends State child: (state.isHosted && kIsWeb) ? CachedImage( width: double.infinity, - url: state.credentials.url! + + url: state.credentials.url+ '/companies/' + company.id + '/logo', diff --git a/lib/ui/settings/invoice_design.dart b/lib/ui/settings/invoice_design.dart index 84491515db0..f89e2545ac0 100644 --- a/lib/ui/settings/invoice_design.dart +++ b/lib/ui/settings/invoice_design.dart @@ -1336,7 +1336,7 @@ class _PdfPreviewState extends State<_PdfPreview> { void _loadPdf() async { final state = widget.state!; final settingsUIState = state.settingsUIState; - final url = state.credentials.url! + '/live_design'; + final url = state.credentials.url+ '/live_design'; final request = PdfPreviewRequest( entityType: widget.entityType.apiValue, diff --git a/lib/ui/settings/settings_list.dart b/lib/ui/settings/settings_list.dart index b88c5364e9a..475c0ecfeb7 100644 --- a/lib/ui/settings/settings_list.dart +++ b/lib/ui/settings/settings_list.dart @@ -54,7 +54,7 @@ class _SettingsListState extends State { final settingsUIState = state.uiState.settingsUIState; final showAll = settingsUIState.entityType == EntityType.company; - if (state.credentials.token!.isEmpty) { + if (state.credentials.token.isEmpty) { return SizedBox(); } diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 28c1b50a1e4..afaeb2089c3 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -1,9 +1,12 @@ // Flutter imports: +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/data/web_client.dart'; import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart'; @@ -628,6 +631,8 @@ class _RunTemplateDialogState extends State { @override Widget build(BuildContext context) { + final store = StoreProvider.of(context); + final state = store.state; final localization = AppLocalization.of(context)!; return AlertDialog( @@ -640,9 +645,29 @@ class _RunTemplateDialogState extends State { child: Text(localization.close.toUpperCase()), ), TextButton( - onPressed: () { - // - }, + onPressed: _designId.isEmpty + ? null + : () { + final credentials = state.credentials; + final url = + '${credentials.url}/${widget.entityType.pluralApiValue}/bulk'; + final data = { + 'ids': widget.entities.map((entity) => entity.id).toList(), + 'entity': widget.entityType.apiValue, + 'template_id': _designId, + 'send_email': _sendEmail, + 'action': EntityAction.runTemplate.toApiParam(), + }; + + print('## DATA: $data'); + WebClient() + .post(url, credentials.token, data: jsonEncode(data)) + .then((response) { + print('## RESPONSE: $response'); + }).catchError((error) { + print('## ERROR: $error'); + }); + }, child: Text(localization.start.toUpperCase()), ), ], @@ -662,9 +687,12 @@ class _RunTemplateDialogState extends State { .toList(), SizedBox(height: 8), DesignPicker( + autofocus: true, entityType: widget.entityType, onSelected: (design) { - _designId = design?.id ?? ''; + setState(() { + _designId = design?.id ?? ''; + }); }, ), SizedBox(height: 16), From 0ab3eb837b06381ff88630e1162fe604562dfa83 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 20 Nov 2023 16:57:16 +0200 Subject: [PATCH 10/31] Add run_template action --- lib/data/models/invoice_model.dart | 8 ++++++++ lib/redux/invoice/invoice_actions.dart | 12 +++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index b8e2f42464d..6d9403d4270 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -16,6 +16,7 @@ import 'package:invoiceninja_flutter/data/models/tax_model.dart'; import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_selectors.dart'; +import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/money.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; @@ -1051,6 +1052,13 @@ abstract class InvoiceEntity extends Object } } + if (!isDeleted!) { + if (hasDesignTemplatesForEntityType( + store.state.designState.map, entityType!)) { + actions.add(EntityAction.runTemplate); + } + } + if (userCompany.canEditEntity(this) && !isCancelledOrReversed) { if (!isSent && !isRecurring) { actions.add(EntityAction.markSent); diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 76451057226..dd38f0f341f 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -10,6 +10,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:http/http.dart'; import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/client/client_selectors.dart'; import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; @@ -850,7 +851,7 @@ void handleInvoiceAction(BuildContext? context, List invoices, break; case EntityAction.bulkPrint: store.dispatch(StartSaving()); - final url = state.credentials.url+ '/invoices/bulk'; + final url = state.credentials.url + '/invoices/bulk'; final data = json.encode( {'ids': invoiceIds, 'action': EntityAction.bulkPrint.toApiParam()}); final http.Response? response = await WebClient() @@ -858,6 +859,15 @@ void handleInvoiceAction(BuildContext? context, List invoices, store.dispatch(StopSaving()); await Printing.layoutPdf(onLayout: (_) => response!.bodyBytes); break; + case EntityAction.runTemplate: + showDialog( + context: navigatorKey.currentContext!, + builder: (context) => RunTemplateDialog( + entityType: EntityType.invoice, + entities: invoices, + ), + ); + break; case EntityAction.more: showEntityActionsDialog( entities: [invoice], From 1dbcce5c284b3ab3a4283ab0bd0a20d2913dcd4e Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 20 Nov 2023 17:16:24 +0200 Subject: [PATCH 11/31] Add run_template action --- lib/data/web_client.dart | 2 +- lib/ui/settings/invoice_design.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/data/web_client.dart b/lib/data/web_client.dart index 56a6f2e8b79..06eb723829c 100644 --- a/lib/data/web_client.dart +++ b/lib/data/web_client.dart @@ -241,7 +241,7 @@ void _checkResponse(String url, http.Response response) { */ if (!kReleaseMode) { - print('Response: ${formatSize(response.body.length)}'); + print('Response: ${formatSize(response.bodyBytes.length)}'); if (Config.DEBUG_REQUESTS) { printWrapped('${response.statusCode} ${response.body}'); print('Headers: ${response.headers}'); diff --git a/lib/ui/settings/invoice_design.dart b/lib/ui/settings/invoice_design.dart index f89e2545ac0..c25d4497271 100644 --- a/lib/ui/settings/invoice_design.dart +++ b/lib/ui/settings/invoice_design.dart @@ -1336,7 +1336,7 @@ class _PdfPreviewState extends State<_PdfPreview> { void _loadPdf() async { final state = widget.state!; final settingsUIState = state.settingsUIState; - final url = state.credentials.url+ '/live_design'; + final url = state.credentials.url + '/live_design'; final request = PdfPreviewRequest( entityType: widget.entityType.apiValue, From 774cc158b12f75c25f480121b50c81c5c19d98cb Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 21 Nov 2023 12:58:29 +0200 Subject: [PATCH 12/31] Update lang file --- lib/utils/i18n.dart | 8379 ++++++++++++++++++++++++------------------- 1 file changed, 4660 insertions(+), 3719 deletions(-) diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 53145775f50..b20bf58bc4b 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -2602,6 +2602,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'sq': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Hera e fundit që është lidhur', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Përsëristshme', @@ -5174,85 +5200,109 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'ar': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'تشغيل القالب', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'آخر تسجيل دخول', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'الاتصال بالعميل', + 'expense_status_4': 'غير مدفوعة الأجر', + 'expense_status_5': 'مدفوع', 'recurring': 'يتكرر', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', - 'public': 'Public', - 'private': 'Private', - 'image': 'Image', - 'other': 'Other', + 'ملاحظة: تتطلب هذه الميزة مفتاح Zip-Tax API للبحث عن ضريبة المبيعات الأمريكية حسب العنوان', + 'cache_data': 'بيانات ذاكرة التخزين المؤقت', + 'unknown': 'مجهول', + 'webhook_failure': 'فشل خطاف الويب', + 'email_opened': 'تم فتح البريد الإلكتروني', + 'email_delivered': 'تم تسليم البريد الإلكتروني', + 'log': 'سجل', + 'individual': 'فردي', + 'partnership': 'شراكة', + 'trust': 'يثق', + 'charity': 'صدقة', + 'government': 'حكومة', + 'classification': 'تصنيف', + 'click_or_drop_files_here': 'انقر أو أسقط الملفات هنا', + 'public': 'عام', + 'private': 'خاص', + 'image': 'صورة', + 'other': 'آخر', 'hash': 'تجزئة', - 'linked_to': 'Linked To', - 'file_saved_in_path': 'The file has been saved in :path', - 'unlinked_transactions': 'Successfully unlinked :count transactions', - 'unlinked_transaction': 'Successfully unlinked transaction', + 'linked_to': 'مرتبط ب', + 'file_saved_in_path': 'تم حفظ الملف في :path', + 'unlinked_transactions': 'تم إلغاء ربط معاملات :count بنجاح', + 'unlinked_transaction': 'تم إلغاء ربط المعاملة بنجاح', 'unlink': 'فك الارتباط', 'view_dashboard_permission': - 'Allow user to access the dashboard, data is limited to available permissions', - 'is_tax_exempt': 'Tax Exempt', - 'district': 'District', - 'region': 'Region', - 'county': 'County', - 'tax_details': 'Tax Details', + 'السماح للمستخدم بالوصول إلى لوحة المعلومات، تقتصر البيانات على الأذونات المتاحة', + 'is_tax_exempt': 'معفاة من الضرائب', + 'district': 'يصرف', + 'region': 'منطقة', + 'county': 'مقاطعة', + 'tax_details': 'التفاصيل الضريبية', 'activity_10_online': - ':contact entered payment :payment for invoice :invoice for :client', + ':contact تم إدخال الدفعة :payment للفاتورة :invoice لـ :client', 'activity_10_manual': - ':user entered payment :payment for invoice :invoice for :client', - 'default_payment_type': 'Default Payment Type', - 'admin_initiated_payments': 'Admin Initiated Payments', + ':user الدفعة المدخلة :payment للفاتورة :invoice لـ :client', + 'default_payment_type': 'نوع الدفع الافتراضي', + 'admin_initiated_payments': 'بدأ المشرف المدفوعات', 'admin_initiated_payments_help': - 'Support entering a payment in the admin portal without an invoice', - 'use_mobile_to_manage_plan': - 'Use your phone subscription settings to manage your plan', - 'show_task_billable': 'Show Task Billable', - 'credit_item': 'Credit Item', - 'files': 'Files', - 'camera': 'Camera', - 'gallery': 'Gallery', - 'email_count_invoices': 'Email :count invoices', - 'project_location': 'Project Location', - 'invoice_task_item_description': 'Invoice Task Item Description', - 'invoice_task_item_description_help': - 'Add the item description to the invoice line items', - 'next_send_time': 'Next Send Time', - 'uploaded_certificate': 'Successfully uploaded certificate', - 'certificate_set': 'Certificate set', - 'certificate_not_set': 'Certificate not set', - 'passphrase_set': 'Passphrase set', - 'passphrase_not_set': 'Passphrase not set', - 'upload_certificate': 'Upload Certificate', - 'certificate_passphrase': 'Certificate Passphrase', - 'rename': 'Rename', - 'renamed_document': 'Successfully renamed document', - 'e_invoice': 'E-Invoice', - 'light_dark_mode': 'Light/Dark Mode', - 'activities': 'Activities', - 'routing_id': 'Routing ID', - 'enable_e_invoice': 'Enable E-Invoice', - 'e_invoice_type': 'E-Invoice Type', - 'reduced_tax': 'Reduced Tax', - 'override_tax': 'Override Tax', - 'zero_rated': 'Zero Rated', - 'reverse_tax': 'Reverse Tax', - 'updated_tax_category': 'Successfully updated the tax category', - 'updated_tax_categories': 'Successfully updated the tax categories', - 'set_tax_category': 'Set Tax Category', - 'payment_manual': 'Payment Manual', + 'دعم إدخال دفعة في بوابة الإدارة بدون فاتورة', + 'use_mobile_to_manage_plan': 'استخدم إعدادات اشتراك هاتفك لإدارة خطتك', + 'show_task_billable': 'إظهار المهمة القابلة للفوترة', + 'credit_item': 'عنصر الائتمان', + 'files': 'ملفات', + 'camera': 'آلة تصوير', + 'gallery': 'صالة عرض', + 'email_count_invoices': 'إرسال الفواتير عبر البريد الإلكتروني :count', + 'project_location': 'موقع المشروع', + 'invoice_task_item_description': 'وصف عنصر مهمة الفاتورة', + 'invoice_task_item_description_help': 'اضافة وصف الصنف إلى بنود الفاتورة', + 'next_send_time': 'وقت الإرسال التالي', + 'uploaded_certificate': 'تم تحميل الشهادة بنجاح', + 'certificate_set': 'مجموعة الشهادات', + 'certificate_not_set': 'لم يتم تعيين الشهادة', + 'passphrase_set': 'مجموعة عبارة المرور', + 'passphrase_not_set': 'لم يتم تعيين عبارة المرور', + 'upload_certificate': 'تحميل الشهادة', + 'certificate_passphrase': 'عبارة مرور الشهادة', + 'rename': 'إعادة تسمية', + 'renamed_document': 'تمت إعادة تسمية المستند بنجاح', + 'e_invoice': 'الفاتورة الإلكترونية', + 'light_dark_mode': 'وضع الضوء/الظلام', + 'activities': 'أنشطة', + 'routing_id': 'معرف التوجيه', + 'enable_e_invoice': 'تفعيل الفاتورة الإلكترونية', + 'e_invoice_type': 'نوع الفاتورة الإلكترونية', + 'reduced_tax': 'تخفيض الضرائب', + 'override_tax': 'تجاوز الضريبة', + 'zero_rated': 'تصنيف صفر', + 'reverse_tax': 'عكس الضريبة', + 'updated_tax_category': 'تم تحديث فئة الضريبة بنجاح', + 'updated_tax_categories': 'تم تحديث فئات الضرائب بنجاح', + 'set_tax_category': 'تعيين فئة الضريبة', + 'payment_manual': 'دليل الدفع', 'tax_category': 'فئة الضريبة', 'physical_goods': 'البضائع المادية', 'digital_products': 'المنتجات الرقمية', @@ -5315,7 +5365,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'all_clients': 'كل العملاء', 'show_aging_table': 'عرض جدول التقادم', 'show_payments_table': 'إظهار جدول المدفوعات', - 'only_clients_with_invoices': 'Only Clients with Invoices', + 'only_clients_with_invoices': 'فقط العملاء الذين لديهم فواتير', 'email_statement': 'بيان البريد الإلكتروني', 'once': 'مرة واحدة', 'schedule': 'جدول', @@ -5698,7 +5748,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'set_default_design': 'تعيين التصميم الافتراضي', 'add_gateway': 'إضافة بوابة', 'add_gateway_help_message': - 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', + 'اضافة بوابة دفع (مثل Stripe أو WePay أو PayPal) لقبول الدفع عبر الإنترنت', 'left': 'غادر', 'right': 'يمين', 'center': 'مركز', @@ -5869,7 +5919,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'created_recurring_expense': 'تم إنشاء حساب متكرر بنجاح', 'updated_recurring_expense': 'تم تحديث المصاريف المتكررة بنجاح', 'archived_recurring_expense': 'تمت أرشفة المصاريف المتكررة بنجاح', - 'deleted_recurring_expense': 'Successfully deleted recurring expense', + 'deleted_recurring_expense': 'تم حذف النفقات المتكررة بنجاح', 'removed_recurring_expense': 'تمت إزالة المصاريف المتكررة بنجاح', 'restored_recurring_expense': 'تمت استعادة النفقات المتكررة بنجاح', 'search_recurring_expense': 'البحث عن المصاريف المتكررة', @@ -5878,7 +5928,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'include_drafts': 'قم بتضمين المسودات', 'include_drafts_help': 'تضمين مسودة السجلات في التقارير', 'is_invoiced': 'مفوتر', - 'change_plan': 'Manage Plan', + 'change_plan': 'إدارة الخطة', 'persist_data': 'استمرارية البيانات', 'customer_count': 'عدد العملاء', 'verify_customers': 'تحقق من العملاء', @@ -6316,9 +6366,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'الحد الأدنى لمبلغ الدفع', 'profit': 'ربح', 'line_item': 'خط سلعة', - 'allow_over_payment': 'السماح بدفع أكثر من اللازم', + 'allow_over_payment': 'السماح بالدفع الزائد', 'allow_over_payment_help': 'دعم دفع مبلغ إضافي لقبول الإكراميات', - 'allow_under_payment': 'السماح تحت السداد', + 'allow_under_payment': 'السماح بالدفع الناقص', 'allow_under_payment_help': 'دعم دفع الحد الأدنى من مبلغ الإيداع / الجزئي', 'test_mode': 'الوضع التجريبي', @@ -6768,7 +6818,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent': 'ضبط نسبة الرسوم', 'adjust_fee_percent_help': 'ضبط النسبة المئوية لحساب الرسوم', 'configure_settings': 'تكوين الإعدادات', - 'support_forum': 'Support Forums', + 'support_forum': 'منتديات الدعم', 'about': 'عن', 'documentation': 'توثيق', 'contact_us': 'اتصل بنا', @@ -7147,7 +7197,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'download': 'تحميل', 'requires_an_enterprise_plan': 'يتطلب خطة مشروع', 'take_picture': 'التقط صورة', - 'upload_files': 'Upload Files', + 'upload_files': 'تحميل الملفات', 'document': 'وثيقة', 'documents': 'المستندات', 'new_document': 'مستند جديد', @@ -7269,7 +7319,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'last_month': 'الشهر الماضي', 'this_year': 'هذا العام', 'last_year': 'العام الماضي', - 'all_time': 'All Time', + 'all_time': 'كل الوقت', 'custom': 'مخصص', 'clone_to_invoice': 'استنساخ إلى الفاتورة', 'clone_to_quote': 'استنساخ للاقتباس', @@ -7414,7 +7464,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'pdf': 'بي دي إف', 'due_date': 'تاريخ الاستحقاق', 'partial_due_date': 'تاريخ الاستحقاق الجزئي', - 'paid_date': 'Paid Date', + 'paid_date': 'تاريخ المدفوعة', 'status': 'الحالة', 'invoice_status_id': 'حالة الفاتورة', 'quote_status': 'حالة الاقتباس', @@ -7447,9 +7497,11 @@ mixin LocalizationsProvider on LocaleCodeAware { 'paid': 'مدفوع', 'mark_sent': 'مارك المرسلة', 'marked_invoice_as_sent': 'نجح وضع علامة على الفاتورة على أنها مرسلة', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', + 'marked_invoice_as_paid': + 'تم وضع علامة على الفاتورة على أنها مدفوعة بنجاح', 'marked_invoices_as_sent': 'نجح وضع علامة على الفواتير على أنها مرسلة', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoices_as_paid': + 'تم وضع علامة على الفواتير على أنها مدفوعة بنجاح', 'done': 'تم', 'please_enter_a_client_or_contact_name': 'الرجاء إدخال اسم العميل أو جهة الاتصال', @@ -7543,7 +7595,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_8': ':user الفاتورة المؤرشفة :invoice', 'activity_9': ':user الفاتورة المحذوفة :invoice', 'activity_10': - ':user entered payment :payment for :payment_amount on invoice :invoice for :client', + ':user الدفعة المدخلة :payment لـ :payment _المبلغ الموجود في الفاتورة :invoice لـ :client', 'activity_11': ':user الدفع المحدث :payment', 'activity_12': ':user الدفع المؤرشف :payment', 'activity_13': ':user الدفعة المحذوفة :payment', @@ -7619,8 +7671,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'all': 'الجميع', 'select': 'اختيار', 'long_press_multiselect': 'اضغط مطولاً على التحديد المتعدد', - 'custom_value1': 'Custom Value 1', - 'custom_value2': 'Custom Value 2', + 'custom_value1': 'القيمة المخصصة 1', + 'custom_value2': 'القيمة المخصصة 2', 'custom_value3': 'القيمة المخصصة 3', 'custom_value4': 'القيمة المخصصة 4', 'email_style_custom': 'نمط البريد الإلكتروني المخصص', @@ -7715,6 +7767,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'تحميل موضوع اللون', }, 'bg': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Последно влизане', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Периодично', @@ -10295,165 +10373,177 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'zh_TW': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': '運行模板', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': '上次登入', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': '客戶聯繫', + 'expense_status_4': '未付', + 'expense_status_5': '有薪資的', 'recurring': '週期性', - 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', - 'public': 'Public', - 'private': 'Private', - 'image': 'Image', - 'other': 'Other', - 'hash': 'Hash', - 'linked_to': 'Linked To', - 'file_saved_in_path': 'The file has been saved in :path', - 'unlinked_transactions': 'Successfully unlinked :count transactions', - 'unlinked_transaction': 'Successfully unlinked transaction', + 'ziptax_help': '注意:此功能需要 Zip-Tax API 金鑰才能按地址查找美國銷售稅', + 'cache_data': '快取數據', + 'unknown': '未知', + 'webhook_failure': 'Webhook 失敗', + 'email_opened': '電子郵件已開啟', + 'email_delivered': '電子郵件已送達', + 'log': '紀錄', + 'individual': '個人', + 'partnership': '合夥', + 'trust': '相信', + 'charity': '慈善機構', + 'government': '政府', + 'classification': '分類', + 'click_or_drop_files_here': '點擊或將檔案拖放到此處', + 'public': '民眾', + 'private': '私人的', + 'image': '影像', + 'other': '其他', + 'hash': '哈希值', + 'linked_to': '連結到', + 'file_saved_in_path': '文件已保存在 :path 中', + 'unlinked_transactions': '已成功取消連結:count事務', + 'unlinked_transaction': '成功取消關聯交易', 'unlink': '取消連結', - 'view_dashboard_permission': - 'Allow user to access the dashboard, data is limited to available permissions', - 'is_tax_exempt': 'Tax Exempt', - 'district': 'District', - 'region': 'Region', - 'county': 'County', - 'tax_details': 'Tax Details', - 'activity_10_online': - ':contact entered payment :payment for invoice :invoice for :client', - 'activity_10_manual': - ':user entered payment :payment for invoice :invoice for :client', - 'default_payment_type': 'Default Payment Type', - 'admin_initiated_payments': 'Admin Initiated Payments', - 'admin_initiated_payments_help': - 'Support entering a payment in the admin portal without an invoice', - 'use_mobile_to_manage_plan': - 'Use your phone subscription settings to manage your plan', - 'show_task_billable': 'Show Task Billable', - 'credit_item': 'Credit Item', - 'files': 'Files', - 'camera': 'Camera', - 'gallery': 'Gallery', - 'email_count_invoices': 'Email :count invoices', - 'project_location': 'Project Location', - 'invoice_task_item_description': 'Invoice Task Item Description', - 'invoice_task_item_description_help': - 'Add the item description to the invoice line items', - 'next_send_time': 'Next Send Time', - 'uploaded_certificate': 'Successfully uploaded certificate', - 'certificate_set': 'Certificate set', - 'certificate_not_set': 'Certificate not set', - 'passphrase_set': 'Passphrase set', - 'passphrase_not_set': 'Passphrase not set', - 'upload_certificate': 'Upload Certificate', - 'certificate_passphrase': 'Certificate Passphrase', - 'rename': 'Rename', - 'renamed_document': 'Successfully renamed document', - 'e_invoice': 'E-Invoice', - 'light_dark_mode': 'Light/Dark Mode', - 'activities': 'Activities', - 'routing_id': 'Routing ID', - 'enable_e_invoice': 'Enable E-Invoice', - 'e_invoice_type': 'E-Invoice Type', - 'reduced_tax': 'Reduced Tax', - 'override_tax': 'Override Tax', - 'zero_rated': 'Zero Rated', - 'reverse_tax': 'Reverse Tax', - 'updated_tax_category': 'Successfully updated the tax category', - 'updated_tax_categories': 'Successfully updated the tax categories', - 'set_tax_category': 'Set Tax Category', - 'payment_manual': 'Payment Manual', - 'tax_category': 'Tax Category', - 'physical_goods': 'Physical Goods', - 'digital_products': 'Digital Products', - 'services': 'Services', - 'shipping': 'Shipping', - 'tax_exempt': 'Tax Exempt', - 'reduced_rate': 'Reduced Rate', - 'tax_all': 'Tax All', - 'tax_selected': 'Tax Selected', - 'version': 'version', - 'seller_subregion': 'Seller Subregion', - 'calculate_taxes': 'Calculate Taxes', - 'calculate_taxes_help': - 'Automatically calculate taxes when saving invoices', + 'view_dashboard_permission': '允許使用者存取儀表板,資料僅限於可用權限', + 'is_tax_exempt': '免稅', + 'district': '區', + 'region': '地區', + 'county': '縣', + 'tax_details': '稅務詳情', + 'activity_10_online': ':contact為:client的發票:payment輸入付款:invoice', + 'activity_10_manual': ':user輸入了發票:payment的付款:invoice的:client', + 'default_payment_type': '預設付款類型', + 'admin_initiated_payments': '管理員發起付款', + 'admin_initiated_payments_help': '支援在管理入口網站中輸入付款而無需發票', + 'use_mobile_to_manage_plan': '使用您的手機訂閱設定來管理您的計劃', + 'show_task_billable': '顯示可計費任務', + 'credit_item': '信用項目', + 'files': '文件', + 'camera': '相機', + 'gallery': '畫廊', + 'email_count_invoices': '透過電子郵件發送:count發票', + 'project_location': '專案地點', + 'invoice_task_item_description': '發票任務項目說明', + 'invoice_task_item_description_help': '將項目描述新增至發票行項目', + 'next_send_time': '下次發送時間', + 'uploaded_certificate': '憑證上傳成功', + 'certificate_set': '憑證套', + 'certificate_not_set': '證書未設定', + 'passphrase_set': '密碼短語集', + 'passphrase_not_set': '未設定密碼', + 'upload_certificate': '上傳證書', + 'certificate_passphrase': '證書密碼', + 'rename': '改名', + 'renamed_document': '文檔重命名成功', + 'e_invoice': '電子發票', + 'light_dark_mode': '明/暗模式', + 'activities': '活動', + 'routing_id': '路由ID', + 'enable_e_invoice': '啟用電子發票', + 'e_invoice_type': '電子發票類型', + 'reduced_tax': '減稅', + 'override_tax': '覆蓋稅', + 'zero_rated': '零評級', + 'reverse_tax': '反向稅', + 'updated_tax_category': '已成功更新稅種', + 'updated_tax_categories': '已成功更新稅種', + 'set_tax_category': '設定稅種', + 'payment_manual': '付款手冊', + 'tax_category': '稅種', + 'physical_goods': '實體商品', + 'digital_products': '數位產品', + 'services': '服務', + 'shipping': '船運', + 'tax_exempt': '免稅', + 'reduced_rate': '降低費率', + 'tax_all': '全部徵稅', + 'tax_selected': '已選擇稅', + 'version': '版本', + 'seller_subregion': '賣家分區', + 'calculate_taxes': '計算稅金', + 'calculate_taxes_help': '儲存發票時自動計算稅費', 'admin': '管理者', 'owner': '擁有者', - 'link_expenses': 'Link Expenses', - 'converted_client_balance': 'Converted Client Balance', - 'converted_payment_balance': 'Converted Payment Balance', - 'total_hours': 'Total Hours', - 'date_picker_hint': 'Use +days to set the date in the future', - 'browser_pdf_viewer': 'Use Browser PDF Viewer', - 'browser_pdf_viewer_help': - 'Warning: Prevents interacting with app over the PDF', - 'increase_prices': 'Increase Prices', - 'update_prices': 'Update Prices', - 'incresed_prices': 'Successfully queued prices to be increased', - 'updated_prices': 'Successfully queued prices to be updated', - 'bacs': 'BACS Direct Debit', - 'api_token': 'API Token', - 'api_key': 'API Key', - 'endpoint': 'Endpoint', + 'link_expenses': '連結費用', + 'converted_client_balance': '轉換後的客戶餘額', + 'converted_payment_balance': '轉換後的付款餘額', + 'total_hours': '全部小時數', + 'date_picker_hint': '使用 +days 設定未來的日期', + 'browser_pdf_viewer': '使用瀏覽器 PDF 檢視器', + 'browser_pdf_viewer_help': '警告:阻止透過 PDF 與應用程式交互', + 'increase_prices': '提高價格', + 'update_prices': '更新價格', + 'incresed_prices': '成功排隊等待漲價', + 'updated_prices': '已成功排隊等待更新價格', + 'bacs': 'BACS 直接借記', + 'api_token': 'API令牌', + 'api_key': 'API金鑰', + 'endpoint': '端點', 'billable': '可結帳的', - 'not_billable': 'Not Billable', - 'allow_billable_task_items': 'Allow Billable Task Items', - 'allow_billable_task_items_help': - 'Enable configuring which task items are billed', - 'show_task_item_description': 'Show Task Item Description', - 'show_task_item_description_help': - 'Enable specifying task item descriptions', - 'email_record': 'Email Record', - 'invoice_product_columns': 'Invoice Product Columns', - 'quote_product_columns': 'Quote Product Columns', - 'minimum_payment_amount': 'Minimum Payment Amount', - 'client_initiated_payments': 'Client Initiated Payments', - 'client_initiated_payments_help': - 'Support making a payment in the client portal without an invoice', - 'share_invoice_quote_columns': 'Share Invoice/Quote Columns', - 'cc_email': 'CC Email', - 'payment_balance': 'Payment Balance', - 'view_report_permission': - 'Allow user to access the reports, data is limited to available permissions', - 'activity_138': 'Payment :payment was emailed to :client', - 'one_time_products': 'One-Time Products', - 'optional_one_time_products': 'Optional One-Time Products', - 'required': 'Required', - 'hidden': 'Hidden', - 'payment_links': 'Payment Links', + 'not_billable': '不可計費', + 'allow_billable_task_items': '允許計費任務項目', + 'allow_billable_task_items_help': '啟用配置對哪些任務項目進行計費', + 'show_task_item_description': '顯示任務項目描述', + 'show_task_item_description_help': '啟用指定任務項目描述', + 'email_record': '郵件記錄', + 'invoice_product_columns': '發票產品欄', + 'quote_product_columns': '報價產品欄', + 'minimum_payment_amount': '最低付款金額', + 'client_initiated_payments': '客戶發起的付款', + 'client_initiated_payments_help': '支援在客戶入口網站中進行無發票付款', + 'share_invoice_quote_columns': '共享發票/報價欄', + 'cc_email': '副本電子郵件', + 'payment_balance': '付款餘額', + 'view_report_permission': '允許使用者存取報告,數據僅限於可用權限', + 'activity_138': '付款:payment已透過電子郵件發送至:client', + 'one_time_products': '一次性產品', + 'optional_one_time_products': '可選的一次性產品', + 'required': '必需的', + 'hidden': '隱', + 'payment_links': '付款連結', 'action': '動作', - 'upgrade_to_paid_plan_to_schedule': - 'Upgrade to a paid plan to create schedules', - 'next_run': 'Next Run', - 'all_clients': 'All Clients', - 'show_aging_table': 'Show Aging Table', - 'show_payments_table': 'Show Payments Table', - 'only_clients_with_invoices': 'Only Clients with Invoices', - 'email_statement': 'Email Statement', - 'once': 'Once', + 'upgrade_to_paid_plan_to_schedule': '升級到付費計劃以創建時間表', + 'next_run': '下次運行', + 'all_clients': '所有客戶', + 'show_aging_table': '顯示老化表', + 'show_payments_table': '顯示付款表', + 'only_clients_with_invoices': '僅限有發票的客戶', + 'email_statement': '電子郵件聲明', + 'once': '一次', 'schedule': '時間表', - 'schedules': 'Schedules', - 'new_schedule': 'New Schedule', - 'edit_schedule': 'Edit Schedule', - 'created_schedule': 'Successfully created schedule', - 'updated_schedule': 'Successfully updated schedule', - 'archived_schedule': 'Successfully archived schedule', - 'deleted_schedule': 'Successfully deleted schedule', - 'removed_schedule': 'Successfully removed schedule', - 'restored_schedule': 'Successfully restored schedule', - 'search_schedule': 'Search Schedule', - 'search_schedules': 'Search Schedules', + 'schedules': '時間表', + 'new_schedule': '新時間表', + 'edit_schedule': '編輯日程', + 'created_schedule': '已成功建立時間表', + 'updated_schedule': '已成功更新時間表', + 'archived_schedule': '已成功存檔時間表', + 'deleted_schedule': '已成功刪除行程', + 'removed_schedule': '已成功刪除行程', + 'restored_schedule': '已成功復原行程', + 'search_schedule': '搜尋時間表', + 'search_schedules': '搜尋時間表', 'archive_payment': '歸檔付款資料', 'archive_invoice': '歸檔發票資料', 'archive_quote': '歸檔報價單', @@ -10473,526 +10563,483 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archive_vendor': '歸檔供應商', 'restore_vendor': '復原供應商', 'create_product': '加入產品', - 'update_product': 'Update Product', + 'update_product': '更新產品', 'delete_product': '刪除貸款資料', 'restore_product': '復原產品資料', 'archive_product': '歸檔產品資料', - 'create_purchase_order': 'Create Purchase Order', - 'update_purchase_order': 'Update Purchase Order', - 'delete_purchase_order': 'Delete Purchase Order', - 'restore_purchase_order': 'Restore Purchase Order', - 'archive_purchase_order': 'Archive Purchase Order', - 'sent_invoice': 'Sent Invoice', - 'sent_quote': 'Sent Quote', - 'sent_credit': 'Sent Credit', - 'sent_purchase_order': 'Sent Purchase Order', - 'image_url': 'Image URL', - 'max_quantity': 'Max Quantity', - 'test_url': 'Test URL', - 'auto_bill_help_off': 'Option is not shown', - 'auto_bill_help_optin': 'Option is shown but not selected', - 'auto_bill_help_optout': 'Option is shown and selected', - 'auto_bill_help_always': 'Option is not shown', + 'create_purchase_order': '建立採購訂單', + 'update_purchase_order': '更新採購訂單', + 'delete_purchase_order': '刪除採購訂單', + 'restore_purchase_order': '恢復採購訂單', + 'archive_purchase_order': '存檔採購訂單', + 'sent_invoice': '已發送發票', + 'sent_quote': '已發送報價', + 'sent_credit': '發送信用證', + 'sent_purchase_order': '發送採購訂單', + 'image_url': '圖片網址', + 'max_quantity': '最大數量', + 'test_url': '測試網址', + 'auto_bill_help_off': '選項未顯示', + 'auto_bill_help_optin': '顯示選項但未選擇', + 'auto_bill_help_optout': '顯示並選擇選項', + 'auto_bill_help_always': '選項未顯示', 'payment_methods': '付款方式', - 'view_all': 'View All', - 'edit_all': 'Edit All', - 'accept_purchase_order_number': 'Accept Purchase Order Number', - 'accept_purchase_order_number_help': - 'Enable clients to provide a PO number when approving a quote', - 'from_email': 'From Email', - 'show_preview': 'Show Preview', - 'show_paid_stamp': 'Show Paid Stamp', - 'show_shipping_address': 'Show Shipping Address', - 'no_documents_to_download': - 'There are no documents in the selected records to download', - 'pixels': 'Pixels', - 'logo_size': 'Logo Size', - 'postal_city': 'Postal/City', - 'failed': 'Failed', - 'client_contacts': 'Client Contacts', - 'sync_from': 'Sync From', - 'inventory_threshold': 'Inventory Threshold', + 'view_all': '看全部', + 'edit_all': '全部編輯', + 'accept_purchase_order_number': '接受採購訂單編號', + 'accept_purchase_order_number_help': '使客戶能夠在批准報價時提供採購訂單編號', + 'from_email': '來自電子郵件', + 'show_preview': '顯示預覽', + 'show_paid_stamp': '顯示付費郵票', + 'show_shipping_address': '顯示送貨地址', + 'no_documents_to_download': '所選記錄中沒有可供下載的文檔', + 'pixels': '像素', + 'logo_size': '標誌尺寸', + 'postal_city': '郵政/城市', + 'failed': '失敗的', + 'client_contacts': '客戶聯絡方式', + 'sync_from': '同步自', + 'inventory_threshold': '庫存閾值', 'hour': '時', - 'emailed_statement': 'Successfully queued statement to be sent', - 'show_email_footer': 'Show Email Footer', - 'invoice_task_hours': 'Invoice Task Hours', - 'invoice_task_hours_help': 'Add the hours to the invoice line items', - 'auto_bill_standard_invoices': 'Auto Bill Standard Invoices', - 'auto_bill_recurring_invoices': 'Auto Bill Recurring Invoices', - 'email_alignment': 'Email Alignment', - 'pdf_preview_location': 'PDF Preview Location', - 'mailgun': 'Mailgun', - 'postmark': 'Postmark', - 'microsoft': 'Microsoft', - 'click_plus_to_create_record': 'Click + to create a record', - 'last365_days': 'Last 365 Days', - 'import_design': 'Import Design', - 'imported_design': 'Successfully imported design', - 'invalid_design': 'The design is invalid, the :value section is missing', - 'setup_wizard_logo': 'Would you like to upload your logo?', + 'emailed_statement': '已成功排隊要傳送的語句', + 'show_email_footer': '顯示電子郵件頁腳', + 'invoice_task_hours': '發票任務時間', + 'invoice_task_hours_help': '將小時數加入發票行項目', + 'auto_bill_standard_invoices': '自動帳單標準發票', + 'auto_bill_recurring_invoices': '自動開立定期發票', + 'email_alignment': '電子郵件對齊', + 'pdf_preview_location': 'PDF 預覽位置', + 'mailgun': '郵件槍', + 'postmark': '郵戳', + 'microsoft': '微軟', + 'click_plus_to_create_record': '點擊+建立記錄', + 'last365_days': '過去 365 天', + 'import_design': '導入設計', + 'imported_design': '成功導入設計', + 'invalid_design': '設計無效,缺:value部分', + 'setup_wizard_logo': '您想上傳您的徽標嗎?', 'upload': '上傳', - 'installed_version': 'Installed Version', - 'notify_vendor_when_paid': 'Notify Vendor When Paid', - 'notify_vendor_when_paid_help': - 'Send an email to the vendor when the expense is marked as paid', - 'update_payment': 'Update Payment', - 'markup': 'Markup', - 'purchase_order_created': 'Purchase Order Created', - 'purchase_order_sent': 'Purchase Order Sent', - 'purchase_order_viewed': 'Purchase Order Viewed', - 'purchase_order_accepted': 'Purchase Order Accepted', - 'credit_payment_error': - 'The credit amount can not be greater than the payment amount', - 'klarna': 'Klarna', - 'convert_payment_currency_help': - 'Set an exchange rate when entering a manual payment', - 'convert_expense_currency_help': - 'Set an exchange rate when creating an expense', - 'matomo_url': 'Matomo URL', - 'matomo_id': 'Matomo Id', - 'action_add_to_invoice': 'Add To Invoice', - 'online_payment_email_help': - 'Send an email when an online payment is made', - 'manual_payment_email_help': - 'Send an email when manually entering a payment', - 'mark_paid_payment_email_help': - 'Send an email when marking an invoice as paid', + 'installed_version': '安裝版本', + 'notify_vendor_when_paid': '付款後通知供應商', + 'notify_vendor_when_paid_help': '當費用標記為已付款時,向供應商發送電子郵件', + 'update_payment': '更新付款方式', + 'markup': '標記', + 'purchase_order_created': '已建立採購訂單', + 'purchase_order_sent': '採購訂單已發送', + 'purchase_order_viewed': '查看採購訂單', + 'purchase_order_accepted': '採購訂單已接受', + 'credit_payment_error': '信用金額不能大於付款金額', + 'klarna': '克拉納', + 'convert_payment_currency_help': '輸入手動付款時設定匯率', + 'convert_expense_currency_help': '創建費用時設定匯率', + 'matomo_url': '馬托網址', + 'matomo_id': '馬托莫 ID', + 'action_add_to_invoice': '新增到發票', + 'online_payment_email_help': '線上付款時發送電子郵件', + 'manual_payment_email_help': '手動輸入付款時發送電子郵件', + 'mark_paid_payment_email_help': '將發票標記為已付款時發送電子郵件', 'delete_project': '刪除專案', - 'linked_transaction': 'Successfully linked transaction', - 'link_payment': 'Link Payment', - 'link_expense': 'Link Expense', - 'lock_invoiced_tasks': 'Lock Invoiced Tasks', - 'lock_invoiced_tasks_help': - 'Prevent tasks from being edited once invoiced', - 'registration_required': 'Registration Required', - 'registration_required_help': 'Require clients to register', - 'use_inventory_management': 'Use Inventory Management', - 'use_inventory_management_help': 'Require products to be in stock', - 'optional_products': 'Optional Products', - 'optional_recurring_products': 'Optional Recurring Products', - 'convert_matched': 'Convert', - 'auto_billed_invoice': 'Successfully queued invoice to be auto-billed', - 'auto_billed_invoices': 'Successfully queued invoices to be auto-billed', - 'operator': 'Operator', - 'value': 'Value', - 'is': 'Is', - 'contains': 'Contains', - 'starts_with': 'Starts with', - 'is_empty': 'Is empty', - 'add_rule': 'Add Rule', - 'match_all_rules': 'Match All Rules', - 'match_all_rules_help': - 'All criteria needs to match for the rule to be applied', - 'auto_convert_help': - 'Automatically convert matched transactions to expenses', - 'rules': 'Rules', - 'transaction_rule': 'Transaction Rule', - 'transaction_rules': 'Transaction Rules', - 'new_transaction_rule': 'New Transaction Rule', - 'edit_transaction_rule': 'Edit Transaction Rule', - 'created_transaction_rule': 'Successfully created rule', - 'updated_transaction_rule': 'Successfully updated transaction rule', - 'archived_transaction_rule': 'Successfully archived transaction rule', - 'deleted_transaction_rule': 'Successfully deleted transaction rule', - 'removed_transaction_rule': 'Successfully removed transaction rule', - 'restored_transaction_rule': 'Successfully restored transaction rule', - 'search_transaction_rule': 'Search Transaction Rule', - 'search_transaction_rules': 'Search Transaction Rules', + 'linked_transaction': '關聯交易成功', + 'link_payment': '連結支付', + 'link_expense': '鏈路費用', + 'lock_invoiced_tasks': '鎖定開票任務', + 'lock_invoiced_tasks_help': '防止任務在開立發票後被編輯', + 'registration_required': '需要註冊', + 'registration_required_help': '要求客戶註冊', + 'use_inventory_management': '使用庫存管理', + 'use_inventory_management_help': '要求產品有庫存', + 'optional_products': '可選產品', + 'optional_recurring_products': '可選的經常性產品', + 'convert_matched': '轉變', + 'auto_billed_invoice': '已成功排隊發票以自動計費', + 'auto_billed_invoices': '已成功將發票排隊以自動計費', + 'operator': '操作員', + 'value': '價值', + 'is': '是', + 'contains': '包含', + 'starts_with': '以。。開始', + 'is_empty': '是空的', + 'add_rule': '新增規則', + 'match_all_rules': '符合所有規則', + 'match_all_rules_help': '所有條件都需要符合才能應用規則', + 'auto_convert_help': '自動將匹配交易轉換為費用', + 'rules': '規則', + 'transaction_rule': '交易規則', + 'transaction_rules': '交易規則', + 'new_transaction_rule': '新交易規則', + 'edit_transaction_rule': '編輯交易規則', + 'created_transaction_rule': '規則創建成功', + 'updated_transaction_rule': '交易規則更新成功', + 'archived_transaction_rule': '交易規則存檔成功', + 'deleted_transaction_rule': '成功刪除交易規則', + 'removed_transaction_rule': '成功刪除交易規則', + 'restored_transaction_rule': '交易規則恢復成功', + 'search_transaction_rule': '搜尋交易規則', + 'search_transaction_rules': '搜尋交易規則', 'save_as_default_terms': '儲存為預設品項', 'save_as_default_footer': '儲存為預設的頁尾', - 'auto_sync': 'Auto Sync', - 'refresh_accounts': 'Refresh Accounts', - 'upgrade_to_connect_bank_account': - 'Upgrade to Enterprise to connect your bank account', - 'click_here_to_connect_bank_account': - 'Click here to connect your bank account', - 'disable_2fa': 'Disable 2FA', - 'change_number': 'Change Number', - 'resend_code': 'Resend Code', - 'base_type': 'Base Type', - 'category_type': 'Category Type', - 'bank_transaction': 'Transaction', - 'bulk_print': 'Print PDF', - 'vendor_postal_code': 'Vendor Postal Code', - 'preview_location': 'Preview Location', - 'bottom': 'Bottom', - 'side': 'Side', - 'pdf_preview': 'PDF Preview', - 'long_press_to_select': 'Long Press to Select', - 'purchase_order_number': 'Purchase Order Number', - 'purchase_order_item': 'Purchase Order Item', - 'would_you_rate_the_app': 'Would you like to rate the app?', - 'include_deleted': 'Include Deleted', - 'include_deleted_help': 'Include deleted records in reports', - 'due_on': 'Due On', - 'converted_transactions': 'Successfully converted transactions', + 'auto_sync': '自動同步', + 'refresh_accounts': '刷新帳戶', + 'upgrade_to_connect_bank_account': '升級至企業版以連結您的銀行帳戶', + 'click_here_to_connect_bank_account': '按此連接您的銀行帳戶', + 'disable_2fa': '停用 2FA', + 'change_number': '更改號碼', + 'resend_code': '重新發送驗證碼', + 'base_type': '底座類型', + 'category_type': '類別類型', + 'bank_transaction': '交易', + 'bulk_print': '列印 PDF', + 'vendor_postal_code': '供應商郵遞區號', + 'preview_location': '預覽地點', + 'bottom': '底部', + 'side': '邊', + 'pdf_preview': 'PDF預覽', + 'long_press_to_select': '長按選擇', + 'purchase_order_number': '訂購單號', + 'purchase_order_item': '採購訂單項目', + 'would_you_rate_the_app': '您想評價該應用程式嗎?', + 'include_deleted': '包括已刪除', + 'include_deleted_help': '在報告中包含已刪除的記錄', + 'due_on': '由於上', + 'converted_transactions': '交易成功轉換', 'created_bank_account': '已成功建立銀行帳號', 'updated_bank_account': '更新銀行帳號成功', 'edit_bank_account': '編輯銀行帳號', - 'default_category': 'Default Category', - 'account_type': 'Account type', - 'new_bank_account': 'New bank account', - 'connect_accounts': 'Connect Accounts', - 'manage_rules': 'Manage Rules', - 'search_category': 'Search 1 Category', - 'search_categories': 'Search :count Categories', - 'min_amount': 'Min Amount', - 'max_amount': 'Max Amount', + 'default_category': '預設類別', + 'account_type': '帳戶類型', + 'new_bank_account': '新銀行帳戶', + 'connect_accounts': '連接帳戶', + 'manage_rules': '管理規則', + 'search_category': '搜尋 1 類別', + 'search_categories': '搜尋:count類別', + 'min_amount': '最低金額', + 'max_amount': '最大金額', 'selected': '已選的', - 'converted_transaction': 'Successfully converted transaction', - 'convert_to_payment': 'Convert to Payment', - 'deposit': 'Deposit', - 'withdrawal': 'Withdrawal', - 'deposits': 'Deposits', - 'withdrawals': 'Withdrawals', - 'matched': 'Matched', - 'unmatched': 'Unmatched', - 'create_credit': 'Create Credit', + 'converted_transaction': '交易成功轉換', + 'convert_to_payment': '轉換為付款', + 'deposit': '訂金', + 'withdrawal': '退出', + 'deposits': '存款', + 'withdrawals': '提款', + 'matched': '匹配的', + 'unmatched': '無與倫比', + 'create_credit': '創造信用', 'update_credit': '更新貸款資料', 'delete_credit': '刪除貸款資料', - 'transaction': 'Transaction', - 'transactions': 'Transactions', - 'new_transaction': 'New Transaction', - 'edit_transaction': 'Edit Transaction', - 'created_transaction': 'Successfully created transaction', - 'updated_transaction': 'Successfully updated transaction', - 'archived_transaction': 'Successfully archived transaction', - 'deleted_transaction': 'Successfully deleted transaction', - 'removed_transaction': 'Successfully removed transaction', - 'restored_transaction': 'Successfully restored transaction', - 'search_transaction': 'Search Transaction', - 'search_transactions': 'Search :count Transactions', + 'transaction': '交易', + 'transactions': '交易', + 'new_transaction': '新交易', + 'edit_transaction': '編輯交易', + 'created_transaction': '交易創建成功', + 'updated_transaction': '交易更新成功', + 'archived_transaction': '已成功存檔交易', + 'deleted_transaction': '成功刪除交易', + 'removed_transaction': '成功刪除交易', + 'restored_transaction': '交易恢復成功', + 'search_transaction': '搜尋交易', + 'search_transactions': '搜尋:count交易', 'bank_account': '銀行帳戶', 'bank_accounts': '信用卡與銀行', 'archived_bank_account': '歸檔銀行帳號成功', - 'deleted_bank_account': 'Successfully deleted bank account', - 'removed_bank_account': 'Successfully removed bank account', - 'restored_bank_account': 'Successfully restored bank account', - 'search_bank_account': 'Search Bank Account', - 'search_bank_accounts': 'Search :count Bank Accounts', - 'connect': 'Connect', - 'mark_paid_payment_email': 'Mark Paid Payment Email', - 'convert_to_project': 'Convert to Project', - 'client_email': 'Client Email', - 'invoice_task_project': 'Invoice Task Project', - 'invoice_task_project_help': 'Add the project to the invoice line items', - 'field': 'Field', - 'period': 'Period', - 'fields_per_row': 'Fields Per Row', - 'total_active_invoices': 'Active Invoices', - 'total_outstanding_invoices': 'Outstanding Invoices', - 'total_completed_payments': 'Completed Payments', - 'total_refunded_payments': 'Refunded Payments', - 'total_active_quotes': 'Active Quotes', - 'total_approved_quotes': 'Approved Quotes', - 'total_unapproved_quotes': 'Unapproved Quotes', - 'total_logged_tasks': 'Logged Tasks', - 'total_invoiced_tasks': 'Invoiced Tasks', - 'total_paid_tasks': 'Paid Tasks', - 'total_logged_expenses': 'Logged Expenses', - 'total_pending_expenses': 'Pending Expenses', - 'total_invoiced_expenses': 'Invoiced Expenses', - 'total_invoice_paid_expenses': 'Invoice Paid Expenses', - 'activity_130': ':user created purchase order :purchase_order', - 'activity_131': ':user updated purchase order :purchase_order', - 'activity_132': ':user archived purchase order :purchase_order', - 'activity_133': ':user deleted purchase order :purchase_order', - 'activity_134': ':user restored purchase order :purchase_order', - 'activity_135': ':user emailed purchase order :purchase_order', - 'activity_136': ':contact viewed purchase order :purchase_order', - 'activity_137': ':contact accepted purchase order :purchase_order', - 'vendor_portal': 'Vendor Portal', - 'send_code': 'Send Code', - 'save_to_upload_documents': 'Save the record to upload documents', - 'expense_tax_rates': 'Expense Tax Rates', - 'invoice_item_tax_rates': 'Invoice Item Tax Rates', - 'verified_phone_number': 'Successfully verified phone number', - 'code_was_sent': 'A code has been sent via SMS', - 'code_was_sent_to': 'A code has been sent via SMS to :number', - 'resend': 'Resend', - 'verify': 'Verify', - 'enter_phone_number': 'Please provide a phone number', - 'invalid_phone_number': 'Invalid phone number', - 'verify_phone_number': 'Verify Phone Number', - 'verify_phone_number_help': - 'Please verify your phone number to send emails', - 'verify_phone_number_2fa_help': - 'Please verify your phone number for 2FA backup', - 'merged_clients': 'Successfully merged clients', - 'merge_into': 'Merge Into', + 'deleted_bank_account': '已成功刪除銀行帳戶', + 'removed_bank_account': '已成功刪除銀行帳戶', + 'restored_bank_account': '已成功恢復銀行帳戶', + 'search_bank_account': '搜尋銀行帳戶', + 'search_bank_accounts': '搜尋:count銀行帳戶', + 'connect': '連接', + 'mark_paid_payment_email': '標記已付款電子郵件', + 'convert_to_project': '轉換為項目', + 'client_email': '客戶信箱', + 'invoice_task_project': '發票任務項目', + 'invoice_task_project_help': '將項目新增至發票行項目', + 'field': '場地', + 'period': '時期', + 'fields_per_row': '每行字段數', + 'total_active_invoices': '有效發票', + 'total_outstanding_invoices': '過期未付支票', + 'total_completed_payments': '已完成付款', + 'total_refunded_payments': '退款', + 'total_active_quotes': '活躍行情', + 'total_approved_quotes': '核准的報價', + 'total_unapproved_quotes': '未經批准的報價', + 'total_logged_tasks': '記錄的任務', + 'total_invoiced_tasks': '開立發票的任務', + 'total_paid_tasks': '有償任務', + 'total_logged_expenses': '記錄的費用', + 'total_pending_expenses': '待處理費用', + 'total_invoiced_expenses': '已開立發票的費用', + 'total_invoice_paid_expenses': '發票支付費用', + 'activity_130': ':user建立採購訂單:purchase_order', + 'activity_131': ':user更新的採購訂單:purchase_order', + 'activity_132': ':user已歸檔採購訂單:purchase_order', + 'activity_133': ':user已刪除採購訂單:purchase_order', + 'activity_134': ':user恢復採購訂單:purchase_order', + 'activity_135': ':user透過電子郵件發送採購訂單:purchase_order', + 'activity_136': ':contact查看採購訂單:purchase_order', + 'activity_137': ':contact已接受採購訂單:purchase_order', + 'vendor_portal': '供應商入口網站', + 'send_code': '傳送代碼', + 'save_to_upload_documents': '儲存上傳文檔記錄', + 'expense_tax_rates': '費用稅率', + 'invoice_item_tax_rates': '發票項目稅率', + 'verified_phone_number': '手機號碼驗證成功', + 'code_was_sent': '代碼已透過簡訊發送', + 'code_was_sent_to': '代碼已透過簡訊發送至:number', + 'resend': '重發', + 'verify': '核實', + 'enter_phone_number': '請提供電話號碼', + 'invalid_phone_number': '無效的電話號碼', + 'verify_phone_number': '驗證電話號碼', + 'verify_phone_number_help': '請驗證您的電話號碼以發送電子郵件', + 'verify_phone_number_2fa_help': '請驗證您的電話號碼以進行 2FA 備份', + 'merged_clients': '成功合併客戶', + 'merge_into': '合併到', 'merge': '合併', - 'price_change_accepted': 'Price change accepted', - 'price_change_failed': 'Price change failed with code', - 'restore_purchases': 'Restore Purchases', - 'activate': 'Activate', - 'connect_apple': 'Connect Apple', - 'disconnect_apple': 'Disconnect Apple', - 'disconnected_apple': 'Successfully disconnected Apple', - 'send_now': 'Send Now', - 'received': 'Received', - 'purchase_order_date': 'Purchase Order Date', - 'converted_to_expense': 'Successfully converted to expense', - 'converted_to_expenses': 'Successfully converted to expenses', - 'convert_to_expense': 'Convert to Expense', - 'add_to_inventory': 'Add to Inventory', - 'added_purchase_order_to_inventory': - 'Successfully added purchase order to inventory', - 'added_purchase_orders_to_inventory': - 'Successfully added purchase orders to inventory', - 'client_document_upload': 'Client Document Upload', - 'vendor_document_upload': 'Vendor Document Upload', - 'vendor_document_upload_help': 'Enable vendors to upload documents', - 'are_you_enjoying_the_app': 'Are you enjoying the app?', - 'yes_its_great': 'Yes, it\'s great!', - 'not_so_much': 'Not so much', - 'would_you_rate_it': 'Great to hear! Would you like to rate it?', - 'would_you_tell_us_more': - 'Sorry to hear it! Would you like to tell us more?', - 'sure_happy_to': 'Sure, happy to', - 'no_not_now': 'No, not now', - 'add': 'Add', - 'last_sent_template': 'Last Sent Template', - 'enable_flexible_search': 'Enable Flexible Search', - 'enable_flexible_search_help': - 'Match non-contiguous characters, ie. \'ct\' matches \'cat\'', - 'vendor_details': 'Vendor Details', - 'purchase_order_details': 'Purchase Order Details', - 'qr_iban': 'QR IBAN', + 'price_change_accepted': '接受價格變更', + 'price_change_failed': '價格更改失敗並顯示代碼', + 'restore_purchases': '恢復購買', + 'activate': '啟用', + 'connect_apple': '連接蘋果', + 'disconnect_apple': '斷開蘋果連接', + 'disconnected_apple': '成功斷開蘋果連接', + 'send_now': '現在發送', + 'received': '已收到', + 'purchase_order_date': '採購訂單日期', + 'converted_to_expense': '成功轉為費用', + 'converted_to_expenses': '成功轉為費用', + 'convert_to_expense': '轉換為費用', + 'add_to_inventory': '新增到庫存', + 'added_purchase_order_to_inventory': '已成功將採購訂單新增至庫存', + 'added_purchase_orders_to_inventory': '已成功將採購訂單新增至庫存', + 'client_document_upload': '客戶文件上傳', + 'vendor_document_upload': '供應商文件上傳', + 'vendor_document_upload_help': '允許供應商上傳文檔', + 'are_you_enjoying_the_app': '您喜歡這個應用程式嗎?', + 'yes_its_great': '是的這很好!', + 'not_so_much': '沒那麼多', + 'would_you_rate_it': '很高興聽到!您願意評價一下嗎?', + 'would_you_tell_us_more': '很抱歉聽到這個消息!您願意告訴我們更多嗎?', + 'sure_happy_to': '當然,很高興', + 'no_not_now': '不,現在不行', + 'add': '添加', + 'last_sent_template': '最後發送的模板', + 'enable_flexible_search': '啟用靈活搜尋', + 'enable_flexible_search_help': '匹配不連續的字符,即。 “ct”匹配“貓”', + 'vendor_details': '供應商詳情', + 'purchase_order_details': '採購訂單詳細信息', + 'qr_iban': 'QR 圖碼 IBAN', 'besr_id': 'BESR ID', 'accept': '接受', - 'clone_to_purchase_order': 'Clone to PO', - 'vendor_email_not_set': 'Vendor does not have an email address set', - 'bulk_send_email': 'Send Email', - 'marked_purchase_order_as_sent': - 'Successfully marked purchase order as sent', - 'marked_purchase_orders_as_sent': - 'Successfully marked purchase orders as sent', - 'accepted_purchase_order': 'Successfully accepted purchase order', - 'accepted_purchase_orders': 'Successfully accepted purchase orders', - 'cancelled_purchase_order': 'Successfully cancelled purchase order', - 'cancelled_purchase_orders': 'Successfully cancelled purchase orders', - 'accepted': 'Accepted', - 'please_select_a_vendor': 'Please select a vendor', - 'purchase_order_total': 'Purchase Order Total', - 'email_purchase_order': 'Email Purchase Order', - 'bulk_email_purchase_orders': 'Email Purchase Orders', - 'disconnected_email': 'Successfully disconnected email', - 'connect_email': 'Connect Email', - 'disconnect_email': 'Disconnect Email', - 'use_web_app_to_connect_microsoft': - 'Please use the web app to connect to Microsoft', - 'email_provider': 'Email Provider', - 'connect_microsoft': 'Connect Microsoft', - 'disconnect_microsoft': 'Disconnect Microsoft', - 'connected_microsoft': 'Successfully connected Microsoft', - 'disconnected_microsoft': 'Successfully disconnected Microsoft', - 'microsoft_sign_in': 'Login with Microsoft', - 'microsoft_sign_up': 'Sign up with Microsoft', - 'emailed_purchase_order': 'Successfully queued purchase order to be sent', - 'emailed_purchase_orders': - 'Successfully queued purchase orders to be sent', - 'enable_react_app': 'Change to the React web app', - 'purchase_order_design': 'Purchase Order Design', - 'purchase_order_terms': 'Purchase Order Terms', - 'purchase_order_footer': 'Purchase Order Footer', - 'require_purchase_order_signature': 'Purchase Order Signature', - 'require_purchase_order_signature_help': - 'Require vendor to provide their signature.', - 'purchase_order': 'Purchase Order', - 'purchase_orders': 'Purchase Orders', - 'new_purchase_order': 'New Purchase Order', - 'edit_purchase_order': 'Edit Purchase Order', - 'created_purchase_order': 'Successfully created purchase order', - 'updated_purchase_order': 'Successfully updated purchase order', - 'archived_purchase_order': 'Successfully archived purchase order', - 'deleted_purchase_order': 'Successfully deleted purchase order', - 'removed_purchase_order': 'Successfully removed purchase order', - 'restored_purchase_order': 'Successfully restored purchase order', - 'search_purchase_order': 'Search Purchase Order', - 'search_purchase_orders': 'Search Purchase Orders', - 'login_url': 'Login URL', + 'clone_to_purchase_order': '克隆到 PO', + 'vendor_email_not_set': '供應商沒有設定電子郵件地址', + 'bulk_send_email': '發電子郵件', + 'marked_purchase_order_as_sent': '已成功將採購訂單標記為已發送', + 'marked_purchase_orders_as_sent': '已成功將採購訂單標記為已發送', + 'accepted_purchase_order': '成功接受採購訂單', + 'accepted_purchase_orders': '成功接受採購訂單', + 'cancelled_purchase_order': '已成功取消採購訂單', + 'cancelled_purchase_orders': '已成功取消採購訂單', + 'accepted': '公認', + 'please_select_a_vendor': '請選擇供應商', + 'purchase_order_total': '採購訂單總計', + 'email_purchase_order': '電子郵件採購訂單', + 'bulk_email_purchase_orders': '透過電子郵件發送採購訂單', + 'disconnected_email': '成功斷開電子郵件連接', + 'connect_email': '連線電子郵件', + 'disconnect_email': '斷開電子郵件連接', + 'use_web_app_to_connect_microsoft': '請使用網頁應用程式連接到 Microsoft', + 'email_provider': '電子郵件提供者', + 'connect_microsoft': '連接微軟', + 'disconnect_microsoft': '斷開與微軟的連接', + 'connected_microsoft': '已成功連接微軟', + 'disconnected_microsoft': '已成功斷開 Microsoft 的連接', + 'microsoft_sign_in': '使用微軟登入', + 'microsoft_sign_up': '與微軟註冊', + 'emailed_purchase_order': '已成功排隊待發送的採購訂單', + 'emailed_purchase_orders': '已成功排隊待發送的採購訂單', + 'enable_react_app': '變更為 React Web 應用程式', + 'purchase_order_design': '採購訂單設計', + 'purchase_order_terms': '採購訂單條款', + 'purchase_order_footer': '採購訂單頁腳', + 'require_purchase_order_signature': '採購訂單簽名', + 'require_purchase_order_signature_help': '要求供應商提供簽名。', + 'purchase_order': '採購訂單', + 'purchase_orders': '訂單', + 'new_purchase_order': '新採購訂單', + 'edit_purchase_order': '編輯採購訂單', + 'created_purchase_order': '採購訂單建立成功', + 'updated_purchase_order': '已成功更新採購訂單', + 'archived_purchase_order': '已成功歸檔採購訂單', + 'deleted_purchase_order': '已成功刪除採購訂單', + 'removed_purchase_order': '已成功刪除採購訂單', + 'restored_purchase_order': '已成功恢復採購訂單', + 'search_purchase_order': '搜尋採購訂單', + 'search_purchase_orders': '搜尋採購訂單', + 'login_url': '登入網址', 'payment_settings': '付款設定', 'default': '預設', - 'stock_quantity': 'Stock Quantity', - 'notification_threshold': 'Notification Threshold', - 'track_inventory': 'Track Inventory', - 'track_inventory_help': - 'Display a product stock field and update when invoices are sent', - 'stock_notifications': 'Stock Notifications', - 'stock_notifications_help': - 'Send an email when the stock reaches the threshold', - 'vat': 'VAT', + 'stock_quantity': '庫存數量', + 'notification_threshold': '通知閾值', + 'track_inventory': '追蹤庫存', + 'track_inventory_help': '顯示產品庫存欄位並在發送發票時更新', + 'stock_notifications': '庫存通知', + 'stock_notifications_help': '庫存達到閾值時發送電子郵件', + 'vat': '加值稅', 'standing': '資格', - 'view_map': 'View Map', - 'set_default_design': 'Set Default Design', + 'view_map': '查看地圖', + 'set_default_design': '設定預設設計', 'add_gateway': '新增閘道', - 'add_gateway_help_message': - 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', - 'left': 'Left', - 'right': 'Right', - 'center': 'Center', - 'page_numbering': 'Page Numbering', - 'page_numbering_alignment': 'Page Numbering Alignment', - 'invoice_sent_notification_label': 'Invoice Sent', - 'show_product_description': 'Show Product Description', - 'show_product_description_help': - 'Include the description in the product dropdown', - 'invoice_items': 'Invoice Items', - 'quote_items': 'Quote Items', - 'profitloss': 'Profit and Loss', - 'import_format': 'Import Format', - 'export_format': 'Export Format', - 'export_type': 'Export Type', - 'stop_on_unpaid': 'Stop On Unpaid', - 'stop_on_unpaid_help': - 'Stop creating recurring invoices if the last invoice is unpaid.', - 'use_quote_terms': 'Use Quote Terms', - 'use_quote_terms_help': 'When converting a quote to an invoice', - 'add_country': 'Add Country', - 'enable_tooltips': 'Enable Tooltips', - 'enable_tooltips_help': 'Show tooltips when hovering the mouse', - 'multiple_client_error': 'Error: records belong to more than one client', - 'register_label': 'Create your account in seconds', - 'login_label': 'Login to an existing account', + 'add_gateway_help_message': '新增支付網關(即 Stripe、WePay 或 PayPal)以接受線上支付', + 'left': '左邊', + 'right': '正確的', + 'center': '中心', + 'page_numbering': '頁碼', + 'page_numbering_alignment': '頁碼對齊', + 'invoice_sent_notification_label': '發票已發送', + 'show_product_description': '顯示產品說明', + 'show_product_description_help': '在產品下拉清單中包含描述', + 'invoice_items': '發票項目', + 'quote_items': '報價項目', + 'profitloss': '收益與損失', + 'import_format': '導入格式', + 'export_format': '導出格式', + 'export_type': '出口類型', + 'stop_on_unpaid': '停止未付款', + 'stop_on_unpaid_help': '如果最後一張發票未付款,請停止建立定期發票。', + 'use_quote_terms': '使用報價條款', + 'use_quote_terms_help': '將報價單轉換為發票時', + 'add_country': '新增國家/地區', + 'enable_tooltips': '啟用工具提示', + 'enable_tooltips_help': '滑鼠懸停時顯示工具提示', + 'multiple_client_error': '錯誤:記錄屬於多個客戶', + 'register_label': '在幾秒鐘內建立您的帳戶', + 'login_label': '登入現有帳戶', 'add_to_invoice': '新增至發票 :invoice', - 'no_invoices_found': 'No invoices found', + 'no_invoices_found': '沒有找到發票', 'week': '星期', - 'created_record': 'Successfully created record', - 'auto_archive_paid_invoices': 'Auto Archive Paid', - 'auto_archive_paid_invoices_help': - 'Automatically archive invoices when they are paid.', - 'auto_archive_cancelled_invoices': 'Auto Archive Cancelled', - 'auto_archive_cancelled_invoices_help': - 'Automatically archive invoices when cancelled.', - 'alternate_pdf_viewer': 'Alternate PDF Viewer', - 'alternate_pdf_viewer_help': - 'Improve scrolling over the PDF preview [BETA]', + 'created_record': '記錄創建成功', + 'auto_archive_paid_invoices': '自動存檔付費', + 'auto_archive_paid_invoices_help': '付款後自動存檔發票。', + 'auto_archive_cancelled_invoices': '自動存檔已取消', + 'auto_archive_cancelled_invoices_help': '取消時自動存檔發票。', + 'alternate_pdf_viewer': '備用 PDF 檢視器', + 'alternate_pdf_viewer_help': '改進 PDF 預覽的滾動功能 [BETA]', 'invoice_currency': '發票使用的貨幣', 'range': 'Range', - 'tax_amount1': 'Tax Amount 1', - 'tax_amount2': 'Tax Amount 2', - 'tax_amount3': 'Tax Amount 3', + 'tax_amount1': '稅額1', + 'tax_amount2': '稅額2', + 'tax_amount3': '稅額3', 'create_project': '建立專案', - 'update_project': 'Update Project', - 'view_task': 'View Task', - 'cancel_invoice': 'Cancel', - 'changed_status': 'Successfully changed task status', - 'change_status': 'Change Status', + 'update_project': '更新項目', + 'view_task': '查看任務', + 'cancel_invoice': '取消', + 'changed_status': '已成功更改任務狀態', + 'change_status': '更改狀態', 'fees_sample': ':amount 份發票的費用應為 :total。', - 'enable_touch_events': 'Enable Touch Events', - 'enable_touch_events_help': 'Support drag events to scroll', - 'after_saving': 'After Saving', - 'view_record': 'View Record', - 'enable_email_markdown': 'Enable Email Markdown', - 'enable_email_markdown_help': 'Use visual markdown editor for emails', - 'enable_pdf_markdown': 'Enable PDF Markdown', - 'json_help': 'Note: JSON files generated by the v4 app are not supported', - 'release_notes': 'Release Notes', - 'upgrade_to_view_reports': 'Upgrade your plan to view reports', - 'started_tasks': 'Successfully started :value tasks', - 'stopped_tasks': 'Successfully stopped :value tasks', - 'approved_quote': 'Successfully apporved quote', - 'approved_quotes': 'Successfully :value approved quotes', + 'enable_touch_events': '啟用觸控事件', + 'enable_touch_events_help': '支援拖曳事件滾動', + 'after_saving': '儲存後', + 'view_record': '查看記錄', + 'enable_email_markdown': '啟用電子郵件 Markdown', + 'enable_email_markdown_help': '使用視覺化 Markdown 編輯器處理電子郵件', + 'enable_pdf_markdown': '啟用 PDF Markdown', + 'json_help': '注意:不支援 v4 應用程式產生的 JSON 文件', + 'release_notes': '發行說明', + 'upgrade_to_view_reports': '升級您的計劃以查看報告', + 'started_tasks': '成功啟動:value任務', + 'stopped_tasks': '成功停止:value任務', + 'approved_quote': '報價已成功批准', + 'approved_quotes': '已成功:value核准報價', 'approve': '同意', - 'client_website': 'Client Website', - 'invalid_time': 'Invalid Time', - 'client_shipping_state': 'Client Shipping State', - 'client_shipping_city': 'Client Shipping City', - 'client_shipping_postal_code': 'Client Shipping Postal Code', - 'client_shipping_country': 'Client Shipping Country', - 'load_pdf': 'Load PDF', - 'start_free_trial': 'Start Free Trial', - 'start_free_trial_message': - 'Start your FREE 14 day trial of the pro plan', - 'due_on_receipt': 'Due on Receipt', - 'is_paid': 'Is Paid', - 'age_group_paid': 'Paid', - 'id': 'Id', - 'convert_to': 'Convert To', - 'client_currency': 'Client Currency', - 'company_currency': 'Company Currency', + 'client_website': '客戶網站', + 'invalid_time': '無效時間', + 'client_shipping_state': '客戶運輸狀態', + 'client_shipping_city': '客戶出貨城市', + 'client_shipping_postal_code': '客戶出貨郵遞區號', + 'client_shipping_country': '客戶出貨國家/地區', + 'load_pdf': '載入 PDF', + 'start_free_trial': '開啟免費體驗', + 'start_free_trial_message': '開始 14 天免費試用專業計劃', + 'due_on_receipt': '收據到期', + 'is_paid': '已經付款了', + 'age_group_paid': '有薪資的', + 'id': 'ID', + 'convert_to': '轉換成', + 'client_currency': '客戶貨幣', + 'company_currency': '公司貨幣', 'purged_client': '清除用戶成功', - 'custom_emails_disabled_help': - 'To prevent spam we require upgrading to a paid account to customize the email', - 'upgrade_to_add_company': 'Upgrade your plan to add companies', - 'small': 'Small', - 'marked_credit_as_paid': 'Successfully marked credit as paid', - 'marked_credits_as_paid': 'Successfully marked credits as paid', - 'wait_for_loading': 'Data loading - please wait for it to complete', - 'wait_for_saving': 'Data saving - please wait for it to complete', - 'html_preview_warning': - 'Note: changes made here are only previewed, they must be applied in the tabs above to be saved', - 'remaining': 'Remaining', - 'invoice_paid': 'Invoice Paid', - 'activity_120': ':user created recurring expense :recurring_expense', - 'activity_121': ':user updated recurring expense :recurring_expense', - 'activity_122': ':user archived recurring expense :recurring_expense', - 'activity_123': ':user deleted recurring expense :recurring_expense', - 'activity_124': ':user restored recurring expense :recurring_expense', - 'normal': 'Normal', - 'large': 'Large', - 'extra_large': 'Extra Large', - 'show_pdf_preview': 'Show PDF Preview', - 'show_pdf_preview_help': 'Display PDF preview while editing invoices', - 'print_pdf': 'Print PDF', - 'remind_me': 'Remind Me', - 'instant_bank_pay': 'Instant Bank Pay', - 'click_selected': 'Click Selected', - 'hide_preview': 'Hide Preview', - 'edit_record': 'Edit Record', - 'credit_is_more_than_invoice': - 'The credit amount can not be more than the invoice amount', - 'giropay': 'GiroPay', - 'direct_debit': 'Direct Debit', - 'please_set_a_password': 'Please set an account password', + 'custom_emails_disabled_help': '為了防止垃圾郵件,我們需要升級到付費帳戶來自訂電子郵件', + 'upgrade_to_add_company': '升級您的計劃以添加公司', + 'small': '小的', + 'marked_credit_as_paid': '已成功將信用標記為已付款', + 'marked_credits_as_paid': '已成功將積分標記為已付款', + 'wait_for_loading': '資料載入 - 請等待完成', + 'wait_for_saving': '資料保存 - 請等待完成', + 'html_preview_warning': '注意:此處所做的更改只能預覽,必須在上面的選項卡中應用才能保存', + 'remaining': '其餘的', + 'invoice_paid': '發票已付', + 'activity_120': ':user創建經常性費用:recurring_expense', + 'activity_121': ':user更新經常性費用:recurring_expense', + 'activity_122': ':user存檔的經常性費用:recurring_expense', + 'activity_123': ':user刪除經常性費用:recurring_expense', + 'activity_124': ':user恢復經常性費用:recurring_expense', + 'normal': '普通的', + 'large': '大的', + 'extra_large': '特大號', + 'show_pdf_preview': '顯示 PDF 預覽', + 'show_pdf_preview_help': '編輯發票時顯示 PDF 預覽', + 'print_pdf': '列印 PDF', + 'remind_me': '提醒我', + 'instant_bank_pay': '即時銀行支付', + 'click_selected': '按一下選定', + 'hide_preview': '隱藏預覽', + 'edit_record': '編輯記錄', + 'credit_is_more_than_invoice': '信用金額不能超過發票金額', + 'giropay': '匯路支付', + 'direct_debit': '直接借記', + 'please_set_a_password': '請設定帳戶密碼', 'set_password': '設定密碼', - 'recommend_desktop': - 'We recommend using the desktop app for the best performance', - 'recommend_mobile': - 'We recommend using the mobile app for the best performance', - 'disconnected_gateway': 'Successfully disconnected gateway', - 'disconnect': 'Disconnect', - 'add_to_invoices': 'Add to Invoices', - 'acss': 'Pre-authorized debit payments', - 'becs': 'BECS Direct Debit', - 'bulk_download': 'Download', - 'persist_data_help': - 'Save data locally to enable the app to start faster, disabling may improve performance in large accounts', - 'persist_ui': 'Persist UI', - 'persist_ui_help': - 'Save UI state locally to enable the app to start at the last location, disabling may improve performance', - 'client_postal_code': 'Client Postal Code', - 'client_vat_number': 'Client VAT Number', - 'has_tasks': 'Has Tasks', - 'registration': 'Registration', - 'unauthorized_stripe_warning': - 'Please authorize Stripe to accept online payments.', + 'recommend_desktop': '我們建議使用桌面應用程式以獲得最佳效能', + 'recommend_mobile': '我們建議使用行動應用程式以獲得最佳效能', + 'disconnected_gateway': '成功斷開網關', + 'disconnect': '斷開', + 'add_to_invoices': '新增到發票', + 'acss': '預授權扣款付款', + 'becs': 'BECS 直接扣記', + 'bulk_download': '下載', + 'persist_data_help': '在本地保存資料以使應用程式能夠更快地啟動,禁用可能會提高大型帳戶的效能', + 'persist_ui': '保留使用者介面', + 'persist_ui_help': '在本機上保存 UI 狀態以使應用程式能夠在上次位置啟動,停用可能會提高效能', + 'client_postal_code': '客戶郵遞區號', + 'client_vat_number': '客戶增值稅號', + 'has_tasks': '有任務', + 'registration': '登記', + 'unauthorized_stripe_warning': '請授權 Stripe 接受線上付款。', 'view_expense': '檢視支出 # :expense', 'view_statement': '檢視財務報表', 'sepa': 'SEPA Direct Debit', - 'ideal': 'iDEAL', - 'przelewy24': 'Przelewy24', - 'eps': 'EPS', + 'ideal': '理想的', + 'przelewy24': '普澤萊維24', + 'eps': '每股盈餘', 'fpx': 'FPX', - 'update_all_records': 'Update all records', + 'update_all_records': '更新所有記錄', 'system': '系統', - 'set_default_company': 'Set Default Company', - 'updated_company': 'Successfully updated company', - 'kbc': 'KBC', - 'bancontact': 'Bancontact', - 'why_are_you_leaving': 'Help us improve by telling us why (optional)', - 'webhook_success': 'Webhook Success', - 'error_cross_client_tasks': 'Tasks must all belong to the same client', - 'error_cross_client_expenses': - 'Expenses must all belong to the same client', - 'app': 'App', - 'for_best_performance': 'For the best performance download the :app app', - 'gross_line_total': 'Gross line total', - 'bulk_email_invoices': 'Email Invoices', - 'bulk_email_quotes': 'Email Quotes', - 'bulk_email_credits': 'Email Credits', + 'set_default_company': '設定預設公司', + 'updated_company': '公司更新成功', + 'kbc': '韓國廣播公司', + 'bancontact': '聯繫銀行', + 'why_are_you_leaving': '告訴我們原因,幫助我們改進(可選)', + 'webhook_success': 'Webhook 成功', + 'error_cross_client_tasks': '任務必須全部屬於同一個客戶端', + 'error_cross_client_expenses': '費用必須全部屬於同一客戶', + 'app': '應用程式', + 'for_best_performance': '為了獲得最佳性能,請下載:app應用程式', + 'gross_line_total': '總行總計', + 'bulk_email_invoices': '電子郵件發票', + 'bulk_email_quotes': '電子郵件報價', + 'bulk_email_credits': '電子郵件積分', 'from_name': '按照姓名', - 'clone_to_expense': 'Clone to Expense', + 'clone_to_expense': '克隆到費用', 'recurring_expense': '週期性支出', 'recurring_expenses': '週期性支出', 'new_recurring_expense': '新的週期性支出', @@ -11000,763 +11047,735 @@ mixin LocalizationsProvider on LocaleCodeAware { 'created_recurring_expense': '建立週期性支出成功', 'updated_recurring_expense': '更新週期性支出成功', 'archived_recurring_expense': '歸檔週期性支出成功', - 'deleted_recurring_expense': 'Successfully deleted recurring expense', - 'removed_recurring_expense': 'Successfully removed recurring expense', + 'deleted_recurring_expense': '已成功刪除經常性費用', + 'removed_recurring_expense': '成功消除經常性費用', 'restored_recurring_expense': '復原週期性支出成功', - 'search_recurring_expense': 'Search Recurring Expense', - 'search_recurring_expenses': 'Search Recurring Expenses', - 'last_sent_date': 'Last Sent Date', - 'include_drafts': 'Include Drafts', - 'include_drafts_help': 'Include draft records in reports', - 'is_invoiced': 'Is Invoiced', - 'change_plan': 'Manage Plan', - 'persist_data': 'Persist Data', - 'customer_count': 'Customer Count', - 'verify_customers': 'Verify Customers', + 'search_recurring_expense': '搜尋經常性費用', + 'search_recurring_expenses': '搜尋經常性費用', + 'last_sent_date': '最後發送日期', + 'include_drafts': '包括草稿', + 'include_drafts_help': '在報告中包含草稿記錄', + 'is_invoiced': '已開立發票', + 'change_plan': '管理計劃', + 'persist_data': '保留資料', + 'customer_count': '顧客數量', + 'verify_customers': '驗證客戶', 'google_analytics': 'Googlezp 分析', - 'google_analytics_tracking_id': 'Google Analytics Tracking ID', - 'decimal_comma': 'Decimal Comma', - 'use_comma_as_decimal_place': 'Use comma as decimal place in forms', - 'select_method': 'Select Method', - 'select_platform': 'Select Platform', - 'use_web_app_to_connect_gmail': - 'Please use the web app to connect to Gmail', - 'expense_tax_help': 'Item tax rates are disabled', - 'enable_markdown': 'Enable Markdown', - 'enable_markdown_help': 'Convert markdown to HTML on the PDF', + 'google_analytics_tracking_id': 'Google分析追蹤ID', + 'decimal_comma': '十進制逗號', + 'use_comma_as_decimal_place': '在表格中使用逗號作為小數位', + 'select_method': '選擇方法', + 'select_platform': '選擇平台', + 'use_web_app_to_connect_gmail': '請使用網頁應用程式連接到 Gmail', + 'expense_tax_help': '商品稅率已禁用', + 'enable_markdown': '啟用降價', + 'enable_markdown_help': '將 PDF 上的 Markdown 轉換為 HTML', 'user_guide': '使用者指南', - 'add_second_contact': 'Add Second Contact', - 'previous_page': 'Previous Page', - 'next_page': 'Next Page', - 'export_colors': 'Export Colors', - 'import_colors': 'Import Colors', - 'clear_all': 'Clear All', - 'contrast': 'Contrast', - 'custom_colors': 'Custom Colors', - 'colors': 'Colors', - 'sidebar_active_background_color': 'Sidebar Active Background Color', - 'sidebar_active_font_color': 'Sidebar Active Font Color', - 'sidebar_inactive_background_color': 'Sidebar Inactive Background Color', - 'sidebar_inactive_font_color': 'Sidebar Inactive Font Color', - 'table_alternate_row_background_color': - 'Table Alternate Row Background Color', - 'invoice_header_background_color': 'Invoice Header Background Color', - 'invoice_header_font_color': 'Invoice Header Font Color', + 'add_second_contact': '增加第二個聯絡人', + 'previous_page': '上一頁', + 'next_page': '下一頁', + 'export_colors': '匯出顏色', + 'import_colors': '導入顏色', + 'clear_all': '全部清除', + 'contrast': '對比', + 'custom_colors': '客製化顏色', + 'colors': '顏色', + 'sidebar_active_background_color': '側邊欄活動背景顏色', + 'sidebar_active_font_color': '側邊欄活動字體顏色', + 'sidebar_inactive_background_color': '側邊欄非活動背景顏色', + 'sidebar_inactive_font_color': '側邊欄非活動字體顏色', + 'table_alternate_row_background_color': '表備用行背景顏色', + 'invoice_header_background_color': '發票標題背景顏色', + 'invoice_header_font_color': '發票標題字體顏色', 'net_subtotal': '淨', - 'review_app': 'Review App', - 'check_status': 'Check Status', - 'free_trial': 'Free Trial', - 'free_trial_ends_in_days': - 'The Pro plan trial ends in :count days, click to upgrade.', - 'free_trial_ends_today': - 'Today is the last day of the Pro plan trial, click to upgrade.', - 'change_email': 'Change Email', - 'client_portal_domain_hint': - 'Optionally configure a separate client portal domain', - 'tasks_shown_in_portal': 'Tasks Shown in Portal', - 'uninvoiced': 'Uninvoiced', + 'review_app': '評論應用程式', + 'check_status': '檢查狀態', + 'free_trial': '免費試用', + 'free_trial_ends_in_days': 'Pro 計畫試用期將於:count天後結束,點選升級。', + 'free_trial_ends_today': '今天是Pro計畫試用的最後一天,點選升級。', + 'change_email': '更改電子郵件', + 'client_portal_domain_hint': '可以選擇配置單獨的客戶端入口網站網域', + 'tasks_shown_in_portal': '門戶中顯示的任務', + 'uninvoiced': '未開發票', 'subdomain_guide': - 'The subdomain is used in the client portal to personalize links to match your brand. ie, https://your-brand.invoicing.co', - 'send_time': 'Send Time', + '子網域在客戶端入口網站中用於個性化連結以匹配您的品牌。即,https://your-brand.invoicing.co', + 'send_time': '發送時間', 'import_data': '匯入資料', - 'import_settings': 'Import Settings', - 'json_file_missing': 'Please provide the JSON file', - 'json_option_missing': 'Please select to import the settings and/or data', + 'import_settings': '導入設定', + 'json_file_missing': '請提供 JSON 文件', + 'json_option_missing': '請選擇匯入設定和/或數據', 'json': 'JSON', - 'no_payment_types_enabled': 'No payment types enabled', - 'wait_for_data': 'Please wait for the data to finish loading', - 'net_total': 'Net Total', - 'has_taxes': 'Has Taxes', - 'import_customers': 'Import Customers', - 'imported_customers': 'Successfully started importing customers', - 'login_success': 'Successful Login', - 'login_failure': 'Failed Login', - 'exported_data': - 'Once the file is ready you\'ll receive an email with a download link', - 'include_deleted_clients': 'Include Deleted Clients', - 'include_deleted_clients_help': - 'Load records belonging to deleted clients', - 'step_1_sign_in': 'Step 1: Sign In', - 'step_2_authorize': 'Step 2: Authorize', - 'account_id': 'Account ID', - 'migration_not_yet_completed': 'The migration has not yet completed', - 'activity_100': ':user created recurring invoice :recurring_invoice', - 'activity_101': ':user updated recurring invoice :recurring_invoice', - 'activity_102': ':user archived recurring invoice :recurring_invoice', - 'activity_103': ':user deleted recurring invoice :recurring_invoice', - 'activity_104': ':user restored recurring invoice :recurring_invoice', - 'show_task_end_date': 'Show Task End Date', - 'show_task_end_date_help': 'Enable specifying the task end date', - 'gateway_setup': 'Gateway Setup', - 'preview_sidebar': 'Preview Sidebar', - 'years_data_shown': 'Years Data Shown', - 'ended_all_sessions': 'Successfully ended all sessions', - 'end_all_sessions': 'End All Sessions', - 'count_session': '1 Session', - 'count_sessions': ':count Sessions', - 'invoice_created': 'Invoice Created', - 'quote_created': 'Quote Created', - 'credit_created': 'Credit Created', + 'no_payment_types_enabled': '未啟用付款類型', + 'wait_for_data': '請等待資料載入完成', + 'net_total': '淨總值', + 'has_taxes': '有稅', + 'import_customers': '進口客戶', + 'imported_customers': '成功開始導入客戶', + 'login_success': '登入成功', + 'login_failure': '登入失敗', + 'exported_data': '文件準備好後,您將收到一封包含下載連結的電子郵件', + 'include_deleted_clients': '包括已刪除的客戶', + 'include_deleted_clients_help': '載入屬於已刪除客戶端的記錄', + 'step_1_sign_in': '第 1 步:登入', + 'step_2_authorize': '第 2 步:授權', + 'account_id': '帳戶ID', + 'migration_not_yet_completed': '遷移尚未完成', + 'activity_100': ':user創建了定期發票:recurring_invoice', + 'activity_101': ':user更新的經常性發票:recurring_invoice', + 'activity_102': ':user存檔的經常性發票:recurring_invoice', + 'activity_103': ':user刪除定期發票:recurring_invoice', + 'activity_104': ':user恢復定期發票:recurring_invoice', + 'show_task_end_date': '顯示任務結束日期', + 'show_task_end_date_help': '啟用指定任務結束日期', + 'gateway_setup': '網關設定', + 'preview_sidebar': '預覽側邊欄', + 'years_data_shown': '顯示的年份數據', + 'ended_all_sessions': '成功結束所有會話', + 'end_all_sessions': '結束所有會話', + 'count_session': '1 節課', + 'count_sessions': ':count會話', + 'invoice_created': '發票已建立', + 'quote_created': '報價已創建', + 'credit_created': '創造信用', 'pro': '專業版', - 'enterprise': 'Enterprise', + 'enterprise': '企業', 'last_updated': '上次更新時間', - 'invoice_item': 'Invoice Item', - 'quote_item': 'Quote Item', + 'invoice_item': '發票項目', + 'quote_item': '報價項目', 'contact_first_name': '聯絡人名字', 'contact_last_name': '聯絡人姓氏', - 'order': 'Order', + 'order': '命令', 'unassigned': '未分配的', 'partial_value': '必須大於零且小於總額', - 'search_kanban': 'Search Kanban', - 'search_kanbans': 'Search Kanban', + 'search_kanban': '搜尋看板', + 'search_kanbans': '搜尋看板', 'kanban': '看板', 'enable': '啟用', - 'move_top': 'Move Top', - 'move_up': 'Move Up', - 'move_down': 'Move Down', - 'move_bottom': 'Move Bottom', + 'move_top': '移至頂部', + 'move_up': '提升', + 'move_down': '下移', + 'move_bottom': '移動底部', 'subdomain_help': '設定子網域或在您的網站上顯示發票。', - 'body_variable_missing': - 'Error: the custom email must include a :body variable', - 'add_body_variable_message': 'Make sure to include a :body variable', - 'view_date_formats': 'View Date Formats', - 'is_viewed': 'Is Viewed', - 'letter': 'Letter', - 'legal': 'Legal', - 'page_layout': 'Page Layout', - 'portrait': 'Portrait', - 'landscape': 'Landscape', - 'owner_upgrade_to_paid_plan': - 'The account owner can upgrade to a paid plan to enable the advanced advanced settings', - 'upgrade_to_paid_plan': - 'Upgrade to a paid plan to enable the advanced settings', - 'invoice_payment_terms': 'Invoice Payment Terms', - 'quote_valid_until': 'Quote Valid Until', - 'no_headers': 'No Headers', - 'add_header': 'Add Header', - 'remove_header': 'Remove Header', - 'return_url': 'Return URL', - 'rest_method': 'REST Method', - 'header_key': 'Header Key', - 'header_value': 'Header Value', - 'recurring_products': 'Recurring Products', - 'promo_code': 'Promo code', - 'promo_discount': 'Promo Discount', - 'allow_cancellation': 'Allow Cancellation', - 'per_seat_enabled': 'Per Seat Enabled', - 'max_seats_limit': 'Max Seats Limit', - 'trial_enabled': 'Trial Enabled', - 'trial_duration': 'Trial Duration', - 'allow_query_overrides': 'Allow Query Overrides', - 'allow_plan_changes': 'Allow Plan Changes', - 'plan_map': 'Plan Map', - 'refund_period': 'Refund Period', - 'webhook_configuration': 'Webhook Configuration', - 'purchase_page': 'Purchase Page', + 'body_variable_missing': '錯誤:自訂電子郵件必須包含:body變量', + 'add_body_variable_message': '確保包含:body變量', + 'view_date_formats': '查看日期格式', + 'is_viewed': '已瀏覽', + 'letter': '信', + 'legal': '合法的', + 'page_layout': '頁面佈局', + 'portrait': '肖像', + 'landscape': '景觀', + 'owner_upgrade_to_paid_plan': '帳戶所有者可以升級到付費計劃以啟用高級高級設置', + 'upgrade_to_paid_plan': '升級到付費計劃以啟用高級設置', + 'invoice_payment_terms': '發票付款條款', + 'quote_valid_until': '報價有效期限至', + 'no_headers': '無標題', + 'add_header': '新增標題', + 'remove_header': '刪除標題', + 'return_url': '返回網址', + 'rest_method': '休息法', + 'header_key': '標題鍵', + 'header_value': '標頭值', + 'recurring_products': '重複產品', + 'promo_code': '促銷代碼', + 'promo_discount': '促銷折扣', + 'allow_cancellation': '允許取消', + 'per_seat_enabled': '每個席位已啟用', + 'max_seats_limit': '最大座位數限制', + 'trial_enabled': '試用已啟用', + 'trial_duration': '試用時間', + 'allow_query_overrides': '允許查詢覆蓋', + 'allow_plan_changes': '允許計劃變更', + 'plan_map': '平面圖', + 'refund_period': '退款期限', + 'webhook_configuration': 'Webhook 配置', + 'purchase_page': '購買頁面', 'security': '安全', - 'email_bounced': 'Email Bounced', - 'email_spam_complaint': 'Spam Complaint', - 'email_delivery': 'Email Delivery', - 'webhook_response': 'Webhook Response', - 'pdf_response': 'PDF Response', - 'authentication_failure': 'Authentication Failure', - 'pdf_failed': 'PDF Failed', - 'pdf_success': 'PDF Success', - 'modified': 'Modified', - 'payment_link': 'Payment Link', - 'new_payment_link': 'New Payment Link', - 'edit_payment_link': 'Edit Payment Link', - 'created_payment_link': 'Successfully created payment link', - 'updated_payment_link': 'Successfully updated payment link', - 'archived_payment_link': 'Successfully archived payment link', - 'deleted_payment_link': 'Successfully deleted payment link', - 'removed_payment_link': 'Successfully removed payment link', - 'restored_payment_link': 'Successfully restored payment link', - 'search_payment_link': 'Search 1 Payment Link', - 'search_payment_links': 'Search :count Payment Links', - 'subdomain_is_not_available': 'Subdomain is not available', - 'connect_gmail': 'Connect Gmail', - 'disconnect_gmail': 'Disconnect Gmail', - 'connected_gmail': 'Successfully connected Gmail', - 'disconnected_gmail': 'Successfully disconnected Gmail', - 'update_fail_help': - 'Changes to the codebase may be blocking the update, you can run this command to discard the changes:', - 'client_id_number': 'Client ID Number', - 'count_minutes': ':count Minutes', - 'password_timeout': 'Password Timeout', - 'shared_invoice_credit_counter': 'Share Invoice/Credit Counter', - 'use_last_email': 'Use last email', - 'activate_company': 'Activate Company', - 'activate_company_help': - 'Enable emails, recurring invoices and notifications', - 'an_error_occurred_try_again': 'An error occurred, please try again', - 'please_first_set_a_password': 'Please first set a password', - 'changing_phone_disables_two_factor': - 'Warning: Changing your phone number will disable 2FA', - 'help_translate': 'Help Translate', - 'please_select_a_country': 'Please select a country', + 'email_bounced': '電子郵件被退回', + 'email_spam_complaint': '垃圾郵件投訴', + 'email_delivery': '電子郵件傳送', + 'webhook_response': 'Webhook 回應', + 'pdf_response': 'PDF 回覆', + 'authentication_failure': '驗證失敗', + 'pdf_failed': 'PDF 失敗', + 'pdf_success': 'PDF 成功', + 'modified': '修改的', + 'payment_link': '支付連結', + 'new_payment_link': '新的付款連結', + 'edit_payment_link': '編輯付款連結', + 'created_payment_link': '付款連結建立成功', + 'updated_payment_link': '付款連結已成功更新', + 'archived_payment_link': '付款連結已成功存檔', + 'deleted_payment_link': '已成功刪除付款鏈接', + 'removed_payment_link': '已成功刪除付款鏈接', + 'restored_payment_link': '付款連結已成功恢復', + 'search_payment_link': '搜尋 1 條付款鏈接', + 'search_payment_links': '搜尋:count付款鏈接', + 'subdomain_is_not_available': '子網域不可用', + 'connect_gmail': '連接 Gmail', + 'disconnect_gmail': '斷開 Gmail 連接', + 'connected_gmail': '已成功連接 Gmail', + 'disconnected_gmail': '已成功斷開 Gmail 連接', + 'update_fail_help': '對程式碼庫的變更可能會阻止更新,您可以執行以下命令來放棄變更:', + 'client_id_number': '客戶 ID 號碼', + 'count_minutes': ':count分鐘', + 'password_timeout': '密碼超時', + 'shared_invoice_credit_counter': '共享發票/信用櫃檯', + 'use_last_email': '使用最後的電子郵件', + 'activate_company': '啟動公司', + 'activate_company_help': '啟用電子郵件、定期發票和通知', + 'an_error_occurred_try_again': '發生錯誤,請重試', + 'please_first_set_a_password': '請先設定密碼', + 'changing_phone_disables_two_factor': '警告:更改您的電話號碼將停用 2FA', + 'help_translate': '幫助翻譯', + 'please_select_a_country': '請選擇一個國家', 'resend_invite': '重寄邀請函', - 'disabled_two_factor': 'Successfully disabled 2FA', - 'connected_google': 'Successfully connected account', - 'disconnected_google': 'Successfully disconnected account', - 'delivered': 'Delivered', + 'disabled_two_factor': '已成功停用 2FA', + 'connected_google': '帳號關聯成功', + 'disconnected_google': '帳號註銷成功', + 'delivered': '發表', 'bounced': '已退回', - 'spam': 'Spam', - 'view_docs': 'View Docs', - 'enter_phone_to_enable_two_factor': - 'Please provide a mobile phone number to enable two factor authentication', - 'send_sms': 'Send SMS', - 'sms_code': 'SMS Code', + 'spam': '垃圾郵件', + 'view_docs': '查看文件', + 'enter_phone_to_enable_two_factor': '請提供手機號碼以啟用兩步驟驗證', + 'send_sms': '發簡訊', + 'sms_code': '簡訊代碼', 'two_factor_setup_help': '使用 :link 相容的 App 掃描條碼。', 'enabled_two_factor': '啟用兩步驟驗證成功', - 'connect_google': 'Connect Google', - 'disconnect_google': 'Disconnect Google', + 'connect_google': '連接谷歌', + 'disconnect_google': '斷開與Google的連接', 'enable_two_factor': '兩步驟驗證', - 'disable_two_factor': 'Disable Two Factor', - 'require_password_with_social_login': - 'Require Password with Social Login', - 'stay_logged_in': 'Stay Logged In', - 'session_about_to_expire': 'Warning: Your session is about to expire', - 'count_hours': ':count Hours', - 'count_day': '1 Day', - 'count_days': ':count Days', - 'web_session_timeout': 'Web Session Timeout', - 'security_settings': 'Security Settings', - 'resend_email': 'Resend Email', - 'confirm_your_email_address': 'Please confirm your email address', + 'disable_two_factor': '禁用二因素', + 'require_password_with_social_login': '社群登入需要密碼', + 'stay_logged_in': '保持登入狀態', + 'session_about_to_expire': '警告:您的會話即將過期', + 'count_hours': ':count小時', + 'count_day': '1天', + 'count_days': ':count天', + 'web_session_timeout': '網路會話逾時', + 'security_settings': '安全設定', + 'resend_email': '重發電子郵件', + 'confirm_your_email_address': '請確認您的電子郵件地址', 'refunded_payment': '已退款的付款', - 'partially_unapplied': 'Partially Unapplied', - 'select_a_gmail_user': 'Please select a user authenticated with Gmail', - 'list_long_press': 'List Long Press', - 'show_actions': 'Show Actions', - 'start_multiselect': 'Start Multiselect', - 'email_sent_to_confirm_email': - 'An email has been sent to confirm the email address', + 'partially_unapplied': '部分未應用', + 'select_a_gmail_user': '請選擇透過 Gmail 驗證的用戶', + 'list_long_press': '列表長按', + 'show_actions': '顯示動作', + 'start_multiselect': '開始多選', + 'email_sent_to_confirm_email': '已發送一封電子郵件以確認電子郵件地址', 'counter_pattern_error': - 'To use :client_counter please add either :client_number or :client_id_number to prevent conflicts', - 'this_quarter': 'This Quarter', + '要使用:client _counter,請新增:client _number 或:client _id_number 以防止衝突', + 'this_quarter': '本季', 'last_quarter': 'Last Quarter', - 'to_update_run': 'To update run', + 'to_update_run': '更新運行', 'convert_to_invoice': '轉換至發票', - 'registration_url': 'Registration URL', + 'registration_url': '註冊網址', 'invoice_project': '發票專案', 'invoice_task': '為任務開立發票', 'invoice_expense': '為支出開立發票', - 'search_payment_term': 'Search 1 Payment Term', - 'search_payment_terms': 'Search :count Payment Terms', - 'save_and_preview': 'Save and Preview', - 'save_and_email': 'Save and Email', - 'supported_events': 'Supported Events', + 'search_payment_term': '搜尋 1 付款條件', + 'search_payment_terms': '搜尋:count付款條件', + 'save_and_preview': '儲存並預覽', + 'save_and_email': '儲存並透過電子郵件發送', + 'supported_events': '支持的活動', 'converted_amount': '轉換的金額', - 'converted_balance': 'Converted Balance', - 'converted_paid_to_date': 'Converted Paid to Date', - 'converted_credit_balance': 'Converted Credit Balance', - 'converted_total': 'Converted Total', - 'is_sent': 'Is Sent', + 'converted_balance': '換算餘額', + 'converted_paid_to_date': '轉換為付費日期', + 'converted_credit_balance': '轉換後的貸方餘額', + 'converted_total': '換算總計', + 'is_sent': '已發送', 'default_documents': '預設的文件', - 'document_upload': 'Document Upload', - 'document_upload_help': 'Enable clients to upload documents', - 'expense_total': 'Expense Total', - 'enter_taxes': 'Enter Taxes', - 'by_rate': 'By Rate', - 'by_amount': 'By Amount', - 'enter_amount': 'Enter Amount', - 'before_taxes': 'Before Taxes', - 'after_taxes': 'After Taxes', - 'color': 'Color', - 'show': 'Show', + 'document_upload': '文件上傳', + 'document_upload_help': '允許客戶上傳文檔', + 'expense_total': '費用總計', + 'enter_taxes': '輸入稅費', + 'by_rate': '按費率', + 'by_amount': '按金額', + 'enter_amount': '輸入金額', + 'before_taxes': '稅前', + 'after_taxes': '稅後', + 'color': '顏色', + 'show': '展示', 'hide': '隱藏', - 'empty_columns': 'Empty Columns', - 'debug_mode_is_enabled': 'Debug mode is enabled', - 'debug_mode_is_enabled_help': - 'Warning: it is intended for use on local machines, it can leak credentials. Click to learn more.', - 'running_tasks': 'Running Tasks', - 'recent_tasks': 'Recent Tasks', - 'recent_expenses': 'Recent Expenses', - 'upcoming_expenses': 'Upcoming Expenses', - 'update_app': 'Update App', - 'started_import': 'Successfully started import', - 'duplicate_column_mapping': 'Duplicate column mapping', - 'uses_inclusive_taxes': 'Uses Inclusive Taxes', - 'is_amount_discount': 'Is Amount Discount', + 'empty_columns': '空列', + 'debug_mode_is_enabled': '調試模式已啟用', + 'debug_mode_is_enabled_help': '警告:它適用於本機計算機,它可能會洩漏憑證。點擊了解更多。', + 'running_tasks': '運行任務', + 'recent_tasks': '最近的任務', + 'recent_expenses': '近期開支', + 'upcoming_expenses': '即將發生的費用', + 'update_app': '更新應用程式', + 'started_import': '成功開始導入', + 'duplicate_column_mapping': '重複列映射', + 'uses_inclusive_taxes': '使用包容性稅收', + 'is_amount_discount': '是金額折扣', 'column': '欄', 'sample': '樣本', - 'map_to': 'Map To', + 'map_to': '地圖至', 'import': '匯入', - 'first_row_as_column_names': 'Use first row as column names', + 'first_row_as_column_names': '使用第一行作為列名稱', 'select_file': '請選擇一個檔案', - 'no_file_selected': 'No File Selected', + 'no_file_selected': '未選擇文件', 'csv_file': 'CSV 檔案', 'csv': 'CSV', - 'freshbooks': 'FreshBooks', - 'invoice2go': 'Invoice2go', - 'invoicely': 'Invoicely', - 'waveaccounting': 'Wave Accounting', - 'zoho': 'Zoho', - 'accounting': 'Accounting', - 'required_files_missing': 'Please provide all CSVs.', - 'import_type': 'Import Type', - 'html_mode': 'HTML Mode', - 'html_mode_help': 'Preview updates faster but is less accurate', - 'view_licenses': 'View Licenses', + 'freshbooks': '新書', + 'invoice2go': '發票2go', + 'invoicely': '開立發票', + 'waveaccounting': '波浪會計', + 'zoho': '佐霍', + 'accounting': '會計', + 'required_files_missing': '請提供所有 CSV。', + 'import_type': '進口類型', + 'html_mode': 'HTML模式', + 'html_mode_help': '預覽更新速度較快,但準確性較差', + 'view_licenses': '查看許可證', 'webhook_url': 'Webhook URL', - 'fullscreen_editor': 'Fullscreen Editor', - 'sidebar_editor': 'Sidebar Editor', - 'please_type_to_confirm': 'Please type \':value\' to confirm', - 'purge': 'Purge', + 'fullscreen_editor': '全螢幕編輯器', + 'sidebar_editor': '側邊欄編輯器', + 'please_type_to_confirm': '請輸入「 :value 」確認', + 'purge': '清除', 'service': '服務', - 'clone_to': 'Clone To', - 'clone_to_other': 'Clone to Other', - 'labels': 'Labels', - 'add_custom': 'Add Custom', - 'payment_tax': 'Payment Tax', + 'clone_to': '克隆到', + 'clone_to_other': '克隆到其他', + 'labels': '標籤', + 'add_custom': '新增自訂', + 'payment_tax': '繳稅', 'unpaid': '未付款', - 'white_label': 'White Label', + 'white_label': '白色標籤', 'delivery_note': '寄送註記', - 'sent_invoices_are_locked': 'Sent invoices are locked', - 'paid_invoices_are_locked': 'Paid invoices are locked', - 'source_code': 'Source Code', - 'app_platforms': 'App Platforms', - 'invoice_late': 'Invoice Late', - 'quote_expired': 'Quote Expired', + 'sent_invoices_are_locked': '發送的發票已鎖定', + 'paid_invoices_are_locked': '已付款發票已鎖定', + 'source_code': '原始碼', + 'app_platforms': '應用程式平台', + 'invoice_late': '發票遲到', + 'quote_expired': '報價已過期', 'partial_due': '部分應付款', 'invoice_total': '發票總額', - 'quote_total': '報價單總計', - 'credit_total': '貸款總額', - 'recurring_invoice_total': 'Invoice Total', - 'actions': 'Actions', - 'expense_number': 'Expense Number', - 'task_number': 'Task Number', - 'project_number': 'Project Number', - 'project_name': 'Project Name', + 'quote_total': '報價單總計', + 'credit_total': '貸款總額', + 'recurring_invoice_total': '發票總計', + 'actions': '行動', + 'expense_number': '費用號碼', + 'task_number': '任務編號', + 'project_number': '項目編號', + 'project_name': '專案名', 'warning': '警告', - 'view_settings': 'View Settings', - 'company_disabled_warning': - 'Warning: this company has not yet been activated', - 'late_invoice': 'Late Invoice', - 'expired_quote': 'Expired Quote', - 'remind_invoice': 'Remind Invoice', + 'view_settings': '查看設定', + 'company_disabled_warning': '警告:該公司尚未激活', + 'late_invoice': '逾期發票', + 'expired_quote': '過期報價', + 'remind_invoice': '提醒發票', 'cvv': '信用卡認證編號', 'client_name': '用戶名稱', - 'client_phone': 'Client Phone', - 'required_fields': 'Required Fields', - 'calculated_rate': 'Calculated Rate', - 'default_task_rate': 'Default Task Rate', - 'clear_cache': 'Clear Cache', - 'sort_order': 'Sort Order', - 'task_status': 'Status', - 'task_statuses': 'Task Statuses', - 'new_task_status': 'New Task Status', - 'edit_task_status': 'Edit Task Status', - 'created_task_status': 'Successfully created task status', + 'client_phone': '客戶電話', + 'required_fields': '必填字段', + 'calculated_rate': '計算費率', + 'default_task_rate': '預設任務率', + 'clear_cache': '清除快取', + 'sort_order': '排序', + 'task_status': '地位', + 'task_statuses': '任務狀態', + 'new_task_status': '新任務狀態', + 'edit_task_status': '編輯任務狀態', + 'created_task_status': '建立成功任務狀態', 'updated_task_status': '更新工作狀態成功', - 'archived_task_status': 'Successfully archived task status', - 'deleted_task_status': 'Successfully deleted task status', - 'removed_task_status': 'Successfully removed task status', - 'restored_task_status': 'Successfully restored task status', - 'archived_task_statuses': 'Successfully archived :value task statuses', - 'deleted_task_statuses': 'Successfully deleted :value task statuses', - 'restored_task_statuses': 'Successfully restored :value task statuses', - 'search_task_status': 'Search 1 Task Status', - 'search_task_statuses': 'Search :count Task Statuses', - 'show_tasks_table': 'Show Tasks Table', - 'show_tasks_table_help': - 'Always show the tasks section when creating invoices', - 'invoice_task_timelog': 'Invoice Task Timelog', - 'invoice_task_timelog_help': 'Add time details to the invoice line items', - 'invoice_task_datelog': 'Invoice Task Datelog', - 'invoice_task_datelog_help': 'Add date details to the invoice line items', - 'auto_start_tasks_help': 'Start tasks before saving', - 'configure_statuses': 'Configure Statuses', - 'task_settings': 'Task Settings', - 'configure_categories': 'Configure Categories', + 'archived_task_status': '成功歸檔任務狀態', + 'deleted_task_status': '成功刪除任務狀態', + 'removed_task_status': '已成功刪除任務狀態', + 'restored_task_status': '成功恢復任務狀態', + 'archived_task_statuses': '已成功存檔:value任務狀態', + 'deleted_task_statuses': '已成功刪除:value任務狀態', + 'restored_task_statuses': '成功恢復:value任務狀態', + 'search_task_status': '搜尋 1 任務狀態', + 'search_task_statuses': '搜尋:count任務狀態', + 'show_tasks_table': '顯示任務表', + 'show_tasks_table_help': '建立發票時始終顯示任務部分', + 'invoice_task_timelog': '發票任務時間日誌', + 'invoice_task_timelog_help': '將時間詳細資料新增至發票行項目', + 'invoice_task_datelog': '發票任務日期日誌', + 'invoice_task_datelog_help': '將日期詳細資料新增至發票行項目', + 'auto_start_tasks_help': '儲存前啟動任務', + 'configure_statuses': '配置狀態', + 'task_settings': '任務設定', + 'configure_categories': '配置類別', 'expense_categories': '支出類別', 'new_expense_category': '新的支出類別', - 'edit_expense_category': 'Edit Expense Category', + 'edit_expense_category': '編輯費用類別', 'created_expense_category': '成功建立支出類別', 'updated_expense_category': '更新支出類別成功', 'archived_expense_category': '歸檔支出類別成功', 'deleted_expense_category': '刪除類別成功', - 'removed_expense_category': 'Successfully removed expense category', + 'removed_expense_category': '已成功刪除費用類別', 'restored_expense_category': '復原支出類別成功', 'archived_expense_categories': '歸檔 :count 項支出類別成功', - 'deleted_expense_categories': - 'Successfully deleted expense :value categories', - 'restored_expense_categories': - 'Successfully restored expense :value categories', - 'search_expense_category': 'Search 1 Expense Category', - 'search_expense_categories': 'Search :count Expense Categories', - 'use_available_credits': 'Use Available Credits', - 'show_option': 'Show Option', - 'negative_payment_error': - 'The credit amount cannot exceed the payment amount', - 'view_changes': 'View Changes', - 'force_update': 'Force Update', - 'force_update_help': - 'You are running the latest version but there may be pending fixes available.', - 'mark_paid_help': 'Track the expense has been paid', + 'deleted_expense_categories': '已成功刪除費用:value類別', + 'restored_expense_categories': '成功恢復費用:value類別', + 'search_expense_category': '搜尋 1 費用類別', + 'search_expense_categories': '搜尋:count費用類別', + 'use_available_credits': '使用可用積分', + 'show_option': '顯示選項', + 'negative_payment_error': '信用金額不能超過付款金額', + 'view_changes': '查看變更', + 'force_update': '強制性升級', + 'force_update_help': '您正在運行最新版本,但可能有待修復的可用補丁。', + 'mark_paid_help': '追蹤已支付的費用', 'should_be_invoiced': '應為此開立發票', - 'should_be_invoiced_help': 'Enable the expense to be invoiced', - 'add_documents_to_invoice_help': 'Make the documents visible to client', - 'convert_currency_help': 'Set an exchange rate', - 'expense_settings': 'Expense Settings', - 'clone_to_recurring': 'Clone to Recurring', - 'crypto': 'Crypto', + 'should_be_invoiced_help': '啟用費用發票', + 'add_documents_to_invoice_help': '使文件對客戶可見', + 'convert_currency_help': '設定匯率', + 'expense_settings': '費用設定', + 'clone_to_recurring': '克隆到重複', + 'crypto': '加密貨幣', 'paypal': 'PayPal', 'alipay': 'Alipay', 'sofort': 'Sofort', 'apple_pay': 'Apple/Google Pay', - 'user_field': 'User Field', - 'variables': 'Variables', - 'show_password': 'Show Password', - 'hide_password': 'Hide Password', - 'copy_error': 'Copy Error', - 'capture_card': 'Capture Card', - 'auto_bill_enabled': 'Auto Bill Enabled', - 'total_taxes': 'Total Taxes', - 'line_taxes': 'Line Taxes', - 'total_fields': 'Total Fields', - 'stopped_recurring_invoice': 'Successfully stopped recurring invoice', - 'started_recurring_invoice': 'Successfully started recurring invoice', - 'resumed_recurring_invoice': 'Successfully resumed recurring invoice', - 'gateway_refund': 'Gateway Refund', - 'gateway_refund_help': 'Process the refund with the payment gateway', - 'due_date_days': 'Due Date', - 'paused': 'Paused', + 'user_field': '使用者欄位', + 'variables': '變數', + 'show_password': '顯示密碼', + 'hide_password': '隱藏密碼', + 'copy_error': '複製錯誤', + 'capture_card': '採集卡', + 'auto_bill_enabled': '自動計費已啟用', + 'total_taxes': '總稅金', + 'line_taxes': '行稅', + 'total_fields': '總字段數', + 'stopped_recurring_invoice': '已成功停止定期發票', + 'started_recurring_invoice': '已成功開始定期發票', + 'resumed_recurring_invoice': '已成功恢復定期發票', + 'gateway_refund': '網關退款', + 'gateway_refund_help': '透過支付網關處理退款', + 'due_date_days': '到期日', + 'paused': '已暫停', 'mark_active': '標記使用中', - 'day_count': 'Day :count', - 'first_day_of_the_month': 'First Day of the Month', - 'last_day_of_the_month': 'Last Day of the Month', - 'use_payment_terms': 'Use Payment Terms', - 'endless': 'Endless', - 'next_send_date': 'Next Send Date', - 'remaining_cycles': 'Remaining Cycles', + 'day_count': '日:count', + 'first_day_of_the_month': '該月的第一天', + 'last_day_of_the_month': '本月最後一天', + 'use_payment_terms': '使用付款條件', + 'endless': '無盡', + 'next_send_date': '下次發送日期', + 'remaining_cycles': '剩餘週期', 'recurring_invoice': '週期性發票', 'recurring_invoices': '週期性發票', 'new_recurring_invoice': '新的週期性發票', 'edit_recurring_invoice': '編輯週期性發票', - 'created_recurring_invoice': 'Successfully created recurring invoice', - 'updated_recurring_invoice': 'Successfully updated recurring invoice', + 'created_recurring_invoice': '已成功建立定期發票', + 'updated_recurring_invoice': '已成功更新定期發票', 'archived_recurring_invoice': '歸檔週期性發票成功', 'deleted_recurring_invoice': '刪除週期性發票成功', - 'removed_recurring_invoice': 'Successfully removed recurring invoice', + 'removed_recurring_invoice': '已成功刪除定期發票', 'restored_recurring_invoice': '復原週期性發票成功', - 'archived_recurring_invoices': - 'Successfully archived recurring :value invoices', - 'deleted_recurring_invoices': - 'Successfully deleted recurring :value invoices', - 'restored_recurring_invoices': - 'Successfully restored recurring :value invoices', - 'search_recurring_invoice': 'Search 1 Recurring Invoice', - 'search_recurring_invoices': 'Search :count Recurring Invoices', - 'send_date': 'Send Date', - 'auto_bill_on': 'Auto Bill On', - 'minimum_under_payment_amount': 'Minimum Under Payment Amount', + 'archived_recurring_invoices': '已成功存檔定期:value發票', + 'deleted_recurring_invoices': '已成功刪除定期:value發票', + 'restored_recurring_invoices': '已成功恢復定期:value發票', + 'search_recurring_invoice': '搜尋 1 份經常性發票', + 'search_recurring_invoices': '搜尋:count經常性發票', + 'send_date': '發送日期', + 'auto_bill_on': '自動計費開啟', + 'minimum_under_payment_amount': '最低付款金額', 'profit': '利潤', 'line_item': '單列品項', - 'allow_over_payment': 'Allow Over Payment', - 'allow_over_payment_help': 'Support paying extra to accept tips', - 'allow_under_payment': 'Allow Under Payment', - 'allow_under_payment_help': - 'Support paying at minimum the partial/deposit amount', - 'test_mode': 'Test Mode', + 'allow_over_payment': '允許超額支付', + 'allow_over_payment_help': '支持額外付費接受小費', + 'allow_under_payment': '允許少付', + 'allow_under_payment_help': '支持至少支付部分/存款金額', + 'test_mode': '測試模式', 'opened': '已開啟', - 'payment_reconciliation_failure': 'Reconciliation Failure', - 'payment_reconciliation_success': 'Reconciliation Success', - 'gateway_success': 'Gateway Success', - 'gateway_failure': 'Gateway Failure', - 'gateway_error': 'Gateway Error', - 'email_send': 'Email Send', - 'email_retry_queue': 'Email Retry Queue', - 'failure': 'Failure', - 'quota_exceeded': 'Quota Exceeded', - 'upstream_failure': 'Upstream Failure', - 'system_logs': 'System Logs', + 'payment_reconciliation_failure': '協調失敗', + 'payment_reconciliation_success': '和解成功', + 'gateway_success': '成功之路', + 'gateway_failure': '網關故障', + 'gateway_error': '網關錯誤', + 'email_send': '電子郵件發送', + 'email_retry_queue': '電子郵件重試佇列', + 'failure': '失敗', + 'quota_exceeded': '超過配額', + 'upstream_failure': '上游故障', + 'system_logs': '系統日誌', 'view_portal': '檢視入口頁面', - 'copy_link': 'Copy Link', + 'copy_link': '複製連結', 'token_billing': '儲存卡片詳細資料', - 'welcome_to_invoice_ninja': 'Welcome to Invoice Ninja', + 'welcome_to_invoice_ninja': '歡迎來到發票忍者', 'always': '永遠', - 'optin': 'Opt-In', - 'optout': 'Opt-Out', + 'optin': '選擇參加', + 'optout': '選擇退出', 'label': '標籤', 'client_number': '用戶編號', - 'auto_convert': 'Auto Convert', + 'auto_convert': '自動轉換', 'company_name': '公司名稱', - 'reminder1_sent': 'Reminder 1 Sent', - 'reminder2_sent': 'Reminder 2 Sent', - 'reminder3_sent': 'Reminder 3 Sent', - 'reminder_last_sent': 'Reminder Last Sent', - 'pdf_page_info': 'Page :current of :total', + 'reminder1_sent': '提醒 1 已發送', + 'reminder2_sent': '提醒 2 已發送', + 'reminder3_sent': '提醒 3 已發送', + 'reminder_last_sent': '上次發送提醒', + 'pdf_page_info': ':total的頁面:current', 'emailed_invoices': '以電子郵件寄出發票成功', 'emailed_quotes': '以電子郵件寄出報價單成功', - 'emailed_credits': 'Successfully emailed credits', + 'emailed_credits': '已成功透過電子郵件發送積分', 'gateway': '閘道', - 'view_in_stripe': 'View in Stripe', - 'rows_per_page': 'Rows Per Page', + 'view_in_stripe': '條紋視圖', + 'rows_per_page': '每頁行數', 'hours': '時', 'statement': '財務報表', 'taxes': '各類稅金', 'surcharge': '額外費用', - 'apply_payment': 'Apply Payment', + 'apply_payment': '申請付款', 'apply_credit': '套用貸款', 'apply': '套用', - 'unapplied': 'Unapplied', + 'unapplied': '未應用', 'select_label': '選擇標籤', - 'custom_labels': 'Custom Labels', - 'record_type': 'Record Type', - 'record_name': 'Record Name', - 'file_type': 'File Type', - 'height': 'Height', - 'width': 'Width', + 'custom_labels': '客製化標籤', + 'record_type': '記錄類型', + 'record_name': '記錄名稱', + 'file_type': '文件類型', + 'height': '高度', + 'width': '寬度', 'to': '到', - 'health_check': 'Health Check', + 'health_check': '健康檢查', 'payment_type_id': '付款方式', - 'last_login_at': 'Last Login At', - 'company_key': 'Company Key', - 'storefront': 'Storefront', - 'storefront_help': 'Enable third-party apps to create invoices', - 'client_created': 'Client Created', - 'online_payment_email': 'Online Payment Email', - 'manual_payment_email': 'Manual Payment Email', - 'completed': 'Completed', - 'gross': 'Gross', - 'net_amount': 'Net Amount', - 'net_balance': 'Net Balance', - 'client_settings': 'Client Settings', - 'selected_invoices': 'Selected Invoices', - 'selected_payments': 'Selected Payments', - 'selected_quotes': 'Selected Quotes', - 'selected_tasks': 'Selected Tasks', - 'selected_expenses': 'Selected Expenses', + 'last_login_at': '上次登入時間', + 'company_key': '公司金鑰', + 'storefront': '店面', + 'storefront_help': '允許第三方應用程式建立發票', + 'client_created': '客戶已創建', + 'online_payment_email': '網上支付郵箱', + 'manual_payment_email': '手動付款電子郵件', + 'completed': '完全的', + 'gross': '總的', + 'net_amount': '淨額', + 'net_balance': '淨餘額', + 'client_settings': '客戶端設定', + 'selected_invoices': '選定的發票', + 'selected_payments': '選定的付款方式', + 'selected_quotes': '精選行情', + 'selected_tasks': '選定的任務', + 'selected_expenses': '選定的費用', 'upcoming_invoices': '即將到期的發票', - 'past_due_invoices': 'Past Due Invoices', + 'past_due_invoices': '逾期發票', 'recent_payments': '最近的支付', 'upcoming_quotes': '即將到期的報價單', 'expired_quotes': '過期的報價單', 'create_client': '建立用戶', 'create_invoice': '建立發票', 'create_quote': '建立報價單', - 'create_payment': 'Create Payment', + 'create_payment': '建立付款', 'create_vendor': '建立供應商', - 'update_quote': 'Update Quote', + 'update_quote': '更新報價', 'delete_quote': '刪除報價單', - 'update_invoice': 'Update Invoice', + 'update_invoice': '更新發票', 'delete_invoice': '刪除發票', - 'update_client': 'Update Client', + 'update_client': '更新客戶端', 'delete_client': '刪除用戶', 'delete_payment': '刪除付款紀錄', - 'update_vendor': 'Update Vendor', + 'update_vendor': '更新供應商', 'delete_vendor': '刪除供應商', - 'create_expense': 'Create Expense', - 'update_expense': 'Update Expense', + 'create_expense': '創建費用', + 'update_expense': '更新費用', 'delete_expense': '刪除支出', 'create_task': '建立工作項目', - 'update_task': 'Update Task', + 'update_task': '更新任務', 'delete_task': '刪除工作項目', - 'approve_quote': 'Approve Quote', + 'approve_quote': '批准報價', 'off': '關', - 'when_paid': 'When Paid', - 'expires_on': 'Expires On', + 'when_paid': '付款時', + 'expires_on': '到期', 'free': '免費', 'plan': '資費案', - 'show_sidebar': 'Show Sidebar', - 'hide_sidebar': 'Hide Sidebar', - 'event_type': 'Event Type', + 'show_sidebar': '顯示側邊欄', + 'hide_sidebar': '隱藏側邊欄', + 'event_type': '事件類型', 'target_url': '目標', - 'copy': 'Copy', - 'must_be_online': 'Please restart the app once connected to the internet', - 'crons_not_enabled': 'The crons need to be enabled', - 'api_webhooks': 'API Webhooks', - 'search_webhooks': 'Search :count Webhooks', - 'search_webhook': 'Search 1 Webhook', - 'webhook': 'Webhook', - 'webhooks': 'Webhooks', - 'new_webhook': 'New Webhook', - 'edit_webhook': 'Edit Webhook', - 'created_webhook': 'Successfully created webhook', - 'updated_webhook': 'Successfully updated webhook', - 'archived_webhook': 'Successfully archived webhook', - 'deleted_webhook': 'Successfully deleted webhook', - 'removed_webhook': 'Successfully removed webhook', - 'restored_webhook': 'Successfully restored webhook', - 'archived_webhooks': 'Successfully archived :value webhooks', - 'deleted_webhooks': 'Successfully deleted :value webhooks', - 'removed_webhooks': 'Successfully removed :value webhooks', - 'restored_webhooks': 'Successfully restored :value webhooks', + 'copy': '複製', + 'must_be_online': '連接到互聯網後請重新啟動應用程式', + 'crons_not_enabled': '需要啟用 crons', + 'api_webhooks': 'API 網路鉤子', + 'search_webhooks': '搜尋:count Webhooks', + 'search_webhook': '搜尋 1 個 Webhook', + 'webhook': '網路鉤子', + 'webhooks': '網路鉤子', + 'new_webhook': '新的Webhook', + 'edit_webhook': '編輯網路鉤子', + 'created_webhook': '成功創建網路鉤子', + 'updated_webhook': '已成功更新網路鉤子', + 'archived_webhook': '成功歸檔 webhook', + 'deleted_webhook': '成功刪除網路鉤子', + 'removed_webhook': '已成功刪除網路鉤子', + 'restored_webhook': '成功恢復網路鉤子', + 'archived_webhooks': '已成功存檔:value webhooks', + 'deleted_webhooks': '已成功刪除:value webhooks', + 'removed_webhooks': '已成功刪除:value webhooks', + 'restored_webhooks': '已成功恢復:value webhooks', 'api_tokens': 'API 的安全代碼', - 'api_docs': 'API Docs', - 'search_tokens': 'Search :count Tokens', - 'search_token': 'Search 1 Token', + 'api_docs': 'API文件', + 'search_tokens': '搜尋:count代幣', + 'search_token': '搜尋 1 代幣', 'token': '安全代碼', 'tokens': '安全代碼', - 'new_token': 'New Token', + 'new_token': '新代幣', 'edit_token': '編輯安全代碼', 'created_token': '安全代碼建立成功', 'updated_token': '更新安全代碼成功', 'archived_token': '歸檔安全代碼成功', 'deleted_token': '刪除安全代碼成功', - 'removed_token': 'Successfully removed token', - 'restored_token': 'Successfully restored token', - 'archived_tokens': 'Successfully archived :value tokens', - 'deleted_tokens': 'Successfully deleted :value tokens', - 'restored_tokens': 'Successfully restored :value tokens', - 'client_registration': 'Client Registration', - 'client_registration_help': - 'Enable clients to self register in the portal', + 'removed_token': '成功刪除令牌', + 'restored_token': '成功恢復令牌', + 'archived_tokens': '已成功存檔:value令牌', + 'deleted_tokens': '已成功刪除:value令牌', + 'restored_tokens': '已成功恢復:value令牌', + 'client_registration': '客戶註冊', + 'client_registration_help': '使客戶能夠在入口網站中自行註冊', 'email_invoice': '以電子郵件寄送發票', 'email_quote': '以電子郵件傳送報價單', - 'email_credit': 'Email Credit', + 'email_credit': '電子郵件信用', 'email_payment': '以電子郵件傳送付款資料', - 'client_email_not_set': 'Client does not have an email address set', - 'ledger': 'Ledger', - 'view_pdf': 'View PDF', - 'all_records': 'All records', - 'owned_by_user': 'Owned by user', - 'credit_remaining': 'Credit Remaining', + 'client_email_not_set': '客戶沒有設定電子郵件地址', + 'ledger': '分類帳', + 'view_pdf': '查看PDF', + 'all_records': '所有記錄', + 'owned_by_user': '歸用戶所有', + 'credit_remaining': '剩餘信用', 'contact_name': '聯絡人姓名', - 'use_default': 'Use default', - 'reminder_endless': 'Endless Reminders', - 'number_of_days': 'Number of days', - 'configure_payment_terms': 'Configure Payment Terms', - 'payment_term': 'Payment Term', - 'new_payment_term': 'New Payment Term', + 'use_default': '預設使用', + 'reminder_endless': '無盡的提醒', + 'number_of_days': '天數', + 'configure_payment_terms': '配置付款條件', + 'payment_term': '付款期限', + 'new_payment_term': '新的付款期限', 'edit_payment_term': '編輯付款條件', 'created_payment_term': '建立付款條款成功', 'updated_payment_term': '更新付款條款成功', 'archived_payment_term': '歸檔付款條款成功', - 'deleted_payment_term': 'Successfully deleted payment term', - 'removed_payment_term': 'Successfully removed payment term', - 'restored_payment_term': 'Successfully restored payment term', - 'archived_payment_terms': 'Successfully archived :value payment terms', - 'deleted_payment_terms': 'Successfully deleted :value payment terms', - 'restored_payment_terms': 'Successfully restored :value payment terms', - 'email_sign_in': 'Sign in with email', - 'change': 'Change', - 'change_to_mobile_layout': 'Change to the mobile layout?', - 'change_to_desktop_layout': 'Change to the desktop layout?', - 'send_from_gmail': 'Send from Gmail', - 'reversed': 'Reversed', - 'cancelled': 'Cancelled', + 'deleted_payment_term': '已成功刪除付款條件', + 'removed_payment_term': '已成功刪除付款條件', + 'restored_payment_term': '成功恢復付款期限', + 'archived_payment_terms': '已成功存檔:value付款條件', + 'deleted_payment_terms': '已成功刪除:value付款條件', + 'restored_payment_terms': '已成功恢復:value付款條件', + 'email_sign_in': '使用電子郵件登入', + 'change': '改變', + 'change_to_mobile_layout': '更改移動佈局?', + 'change_to_desktop_layout': '更改桌面佈局?', + 'send_from_gmail': '從 Gmail 傳送', + 'reversed': '反轉', + 'cancelled': '取消', 'credit_amount': '貸款金額', - 'quote_amount': 'Quote Amount', - 'hosted': 'Hosted', - 'selfhosted': 'Self-Hosted', + 'quote_amount': '報價金額', + 'hosted': '主辦', + 'selfhosted': '自託管', 'exclusive': '不含', 'inclusive': '內含', - 'hide_menu': 'Hide Menu', - 'show_menu': 'Show Menu', - 'partially_refunded': 'Partially Refunded', - 'search_documents': 'Search Documents', - 'search_designs': 'Search Designs', - 'search_invoices': 'Search Invoices', - 'search_clients': 'Search Clients', - 'search_products': 'Search Products', - 'search_quotes': 'Search Quotes', - 'search_credits': 'Search Credits', - 'search_vendors': 'Search Vendors', - 'search_users': 'Search Users', - 'search_tax_rates': 'Search Tax Rates', - 'search_tasks': 'Search Tasks', - 'search_settings': 'Search Settings', - 'search_projects': 'Search Projects', - 'search_expenses': 'Search Expenses', - 'search_payments': 'Search Payments', - 'search_groups': 'Search Groups', - 'search_company': 'Search Company', - 'search_document': 'Search 1 Document', - 'search_design': 'Search 1 Design', - 'search_invoice': 'Search 1 Invoice', - 'search_client': 'Search 1 Client', - 'search_product': 'Search 1 Product', - 'search_quote': 'Search 1 Quote', - 'search_credit': 'Search 1 Credit', - 'search_vendor': 'Search 1 Vendor', - 'search_user': 'Search 1 User', - 'search_tax_rate': 'Search 1 Tax Rate', - 'search_task': 'Search 1 Tasks', - 'search_project': 'Search 1 Project', - 'search_expense': 'Search 1 Expense', - 'search_payment': 'Search 1 Payment', - 'search_group': 'Search 1 Group', + 'hide_menu': '隱藏選單', + 'show_menu': '顯示選單', + 'partially_refunded': '部分退款', + 'search_documents': '搜尋文件', + 'search_designs': '搜尋設計', + 'search_invoices': '搜尋發票', + 'search_clients': '搜尋客戶', + 'search_products': '搜尋產品', + 'search_quotes': '搜尋行情', + 'search_credits': '搜尋製作人員', + 'search_vendors': '搜尋供應商', + 'search_users': '搜尋用戶', + 'search_tax_rates': '搜尋稅率', + 'search_tasks': '搜尋任務', + 'search_settings': '搜尋設定', + 'search_projects': '搜尋項目', + 'search_expenses': '搜尋費用', + 'search_payments': '搜尋付款', + 'search_groups': '搜尋組', + 'search_company': '搜尋公司', + 'search_document': '搜尋 1 個文檔', + 'search_design': '搜尋 1 設計', + 'search_invoice': '搜尋 1 份發票', + 'search_client': '搜尋 1 客戶', + 'search_product': '搜尋 1 個產品', + 'search_quote': '搜尋 1 個報價', + 'search_credit': '搜尋 1 點', + 'search_vendor': '搜尋 1 供應商', + 'search_user': '搜尋 1 用戶', + 'search_tax_rate': '搜尋 1 稅率', + 'search_task': '搜尋 1 任務', + 'search_project': '搜尋 1 個項目', + 'search_expense': '搜尋 1 費用', + 'search_payment': '搜尋 1 付款', + 'search_group': '搜尋 1 組', 'refund_payment': '已退款的支付', - 'cancelled_invoice': 'Successfully cancelled invoice', - 'cancelled_invoices': 'Successfully cancelled invoices', - 'reversed_invoice': 'Successfully reversed invoice', - 'reversed_invoices': 'Successfully reversed invoices', - 'reverse': 'Reverse', + 'cancelled_invoice': '已成功取消發票', + 'cancelled_invoices': '已成功取消發票', + 'reversed_invoice': '成功沖銷發票', + 'reversed_invoices': '已成功沖銷發票', + 'reverse': '反向', 'full_name': '全名', 'city_state_postal': '城市/州省/郵遞區號', 'postal_city_state': '城市/州省/郵遞區號', 'custom1': '首位顧客', 'custom2': '第二名顧客', - 'custom3': 'Third Custom', - 'custom4': 'Fourth Custom', - 'optional': 'Optional', - 'license': 'License', + 'custom3': '第三個習慣', + 'custom4': '第四個習慣', + 'optional': '選修的', + 'license': '執照', 'purge_data': '清除資料', 'purge_successful': '清除公司資料成功', 'purge_data_message': '警告: 這將永久性地抹除您的資料;沒有恢復的可能。', - 'invoice_balance': 'Invoice Balance', + 'invoice_balance': '發票餘額', 'age_group_0': '0 - 30 天', 'age_group_30': '30 - 60 天', 'age_group_60': '60 - 90 天', 'age_group_90': '90 - 120 天', 'age_group_120': '120 天以上', 'refresh': '更新', - 'saved_design': 'Successfully saved design', - 'client_details': 'Client Details', - 'company_address': 'Company Address', + 'saved_design': '成功保存設計', + 'client_details': '客戶詳情', + 'company_address': '公司地址', 'invoice_details': '發票詳細內容', - 'quote_details': 'Quote Details', - 'credit_details': 'Credit Details', - 'product_columns': 'Product Columns', - 'task_columns': 'Task Columns', - 'add_field': 'Add Field', - 'all_events': 'All Events', + 'quote_details': '報價詳情', + 'credit_details': '信用詳情', + 'product_columns': '產品專欄', + 'task_columns': '工作列', + 'add_field': '新增字段', + 'all_events': '所有活動', 'permissions': '權限', 'none': '無', - 'owned': 'Owned', - 'payment_success': 'Payment Success', - 'payment_failure': 'Payment Failure', + 'owned': '擁有', + 'payment_success': '支付成功', + 'payment_failure': '付款失敗', 'invoice_sent': '已寄出 :count 份發票', - 'quote_sent': 'Quote Sent', - 'credit_sent': 'Credit Sent', - 'invoice_viewed': 'Invoice Viewed', - 'quote_viewed': 'Quote Viewed', - 'credit_viewed': 'Credit Viewed', - 'quote_approved': 'Quote Approved', - 'receive_all_notifications': 'Receive All Notifications', - 'purchase_license': 'Purchase License', + 'quote_sent': '報價已發送', + 'credit_sent': '信用已發送', + 'invoice_viewed': '已查看發票', + 'quote_viewed': '已查看報價', + 'credit_viewed': '信用查看', + 'quote_approved': '報價已獲批准', + 'receive_all_notifications': '接收所有通知', + 'purchase_license': '購買許可證', 'apply_license': '套用授權', 'cancel_account': '刪除帳戶', 'cancel_account_message': '警告: 這將永久刪除您的帳戶,而且無法恢復。', 'delete_company': '刪除公司資料', 'delete_company_message': '警告: 這將永久刪除您的公司資料,而且不可能復原。', - 'enabled_modules': 'Enabled Modules', - 'converted_quote': 'Successfully converted quote', - 'credit_design': 'Credit Design', - 'includes': 'Includes', + 'enabled_modules': '啟用的模組', + 'converted_quote': '報價轉換成功', + 'credit_design': '信用設計', + 'includes': '包括', 'header': '頁首', 'load_design': '載入設計', - 'css_framework': 'CSS Framework', - 'custom_designs': 'Custom Designs', - 'designs': 'Designs', - 'new_design': 'New Design', - 'edit_design': 'Edit Design', - 'created_design': 'Successfully created design', - 'updated_design': 'Successfully updated design', - 'archived_design': 'Successfully archived design', - 'deleted_design': 'Successfully deleted design', - 'removed_design': 'Successfully removed design', - 'restored_design': 'Successfully restored design', - 'archived_designs': 'Successfully archived :value designs', - 'deleted_designs': 'Successfully deleted :value designs', - 'restored_designs': 'Successfully restored :value designs', + 'css_framework': 'CSS框架', + 'custom_designs': '客製化設計', + 'designs': '設計', + 'new_design': '新設計', + 'edit_design': '編輯設計', + 'created_design': '成功創建設計', + 'updated_design': '成功更新設計', + 'archived_design': '成功歸檔設計', + 'deleted_design': '成功刪除設計', + 'removed_design': '成功刪除設計', + 'restored_design': '成功恢復設計', + 'archived_designs': '成功存檔:value設計', + 'deleted_designs': '成功刪除:value設計', + 'restored_designs': '成功恢復:value設計', 'proposals': '提案', 'tickets': '票證', 'recurring_quotes': '週期性報價單', - 'recurring_tasks': 'Recurring Tasks', + 'recurring_tasks': '重複任務', 'account_management': '帳號管理', 'credit_date': '貸款日期', 'credit': '貸款', @@ -11767,94 +11786,94 @@ mixin LocalizationsProvider on LocaleCodeAware { 'updated_credit': '更新貸款資料成功', 'archived_credit': '歸檔貸款資料成功', 'deleted_credit': '刪除貸款資料成功', - 'removed_credit': 'Successfully removed credit', + 'removed_credit': '已成功刪除信用', 'restored_credit': '復原貸款資料成功', 'archived_credits': '歸檔 :count 筆貸款資料成功', 'deleted_credits': '刪除 :count 筆貸款資料成功', - 'restored_credits': 'Successfully restored :value credits', + 'restored_credits': '已成功恢復:value積分', 'current_version': '目前版本', - 'latest_version': 'Latest Version', - 'update_now': 'Update Now', - 'a_new_version_is_available': 'A new version of the web app is available', - 'update_available': 'Update Available', - 'app_updated': 'Update successfully completed', + 'latest_version': '最新版本', + 'update_now': '現在更新', + 'a_new_version_is_available': '新版本的網路應用程式現已推出', + 'update_available': '可用更新', + 'app_updated': '更新成功完成', 'learn_more': '瞭解更多', - 'integrations': 'Integrations', - 'tracking_id': 'Tracking Id', + 'integrations': '整合', + 'tracking_id': '追蹤號碼', 'slack_webhook_url': 'Slack Webhook URL', - 'credit_footer': 'Credit Footer', - 'credit_terms': 'Credit Terms', + 'credit_footer': '信用頁腳', + 'credit_terms': '信用條款', 'new_company': '新的公司資料', - 'added_company': 'Successfully added company', + 'added_company': '添加公司成功', 'company1': '自訂公司1', 'company2': '自訂公司2', 'company3': '自訂公司3', 'company4': '自訂公司4', - 'product1': 'Custom Product 1', - 'product2': 'Custom Product 2', - 'product3': 'Custom Product 3', - 'product4': 'Custom Product 4', - 'client1': 'Custom Client 1', - 'client2': 'Custom Client 2', - 'client3': 'Custom Client 3', - 'client4': 'Custom Client 4', - 'contact1': 'Custom Contact 1', - 'contact2': 'Custom Contact 2', - 'contact3': 'Custom Contact 3', - 'contact4': 'Custom Contact 4', - 'task1': 'Custom Task 1', - 'task2': 'Custom Task 2', - 'task3': 'Custom Task 3', - 'task4': 'Custom Task 4', - 'project1': 'Custom Project 1', - 'project2': 'Custom Project 2', - 'project3': 'Custom Project 3', - 'project4': 'Custom Project 4', - 'expense1': 'Custom Expense 1', - 'expense2': 'Custom Expense 2', - 'expense3': 'Custom Expense 3', - 'expense4': 'Custom Expense 4', - 'vendor1': 'Custom Vendor 1', - 'vendor2': 'Custom Vendor 2', - 'vendor3': 'Custom Vendor 3', - 'vendor4': 'Custom Vendor 4', - 'invoice1': 'Custom Invoice 1', - 'invoice2': 'Custom Invoice 2', - 'invoice3': 'Custom Invoice 3', - 'invoice4': 'Custom Invoice 4', - 'payment1': 'Custom Payment 1', - 'payment2': 'Custom Payment 2', - 'payment3': 'Custom Payment 3', - 'payment4': 'Custom Payment 4', - 'surcharge1': 'Custom Surcharge 1', - 'surcharge2': 'Custom Surcharge 2', - 'surcharge3': 'Custom Surcharge 3', - 'surcharge4': 'Custom Surcharge 4', - 'group1': 'Custom Group 1', - 'group2': 'Custom Group 2', - 'group3': 'Custom Group 3', - 'group4': 'Custom Group 4', + 'product1': '客製化產品1', + 'product2': '客製化產品2', + 'product3': '客製化產品3', + 'product4': '客製化產品4', + 'client1': '客製化客戶端1', + 'client2': '客製化客戶端2', + 'client3': '客製化客戶端3', + 'client4': '客製化客戶端4', + 'contact1': '客製化聯絡方式 1', + 'contact2': '客製化聯絡方式2', + 'contact3': '客製化聯絡方式 3', + 'contact4': '客製化聯絡方式 4', + 'task1': '自訂任務1', + 'task2': '自訂任務2', + 'task3': '自訂任務3', + 'task4': '自訂任務 4', + 'project1': '客製化項目1', + 'project2': '客製化項目2', + 'project3': '客製化項目3', + 'project4': '客製化項目4', + 'expense1': '客製費用1', + 'expense2': '客製費用2', + 'expense3': '客製化費用3', + 'expense4': '客製化費用 4', + 'vendor1': '客製化供應商 1', + 'vendor2': '客製化供應商 2', + 'vendor3': '客製化供應商 3', + 'vendor4': '客製化供應商 4', + 'invoice1': '定制發票1', + 'invoice2': '定制發票2', + 'invoice3': '定制發票3', + 'invoice4': '定制發票 4', + 'payment1': '客製支付1', + 'payment2': '客製化支付2', + 'payment3': '客製支付3', + 'payment4': '客製支付4', + 'surcharge1': '客製化附加費 1', + 'surcharge2': '客製化附加費2', + 'surcharge3': '客製化附加費3', + 'surcharge4': '客製化附加費 4', + 'group1': '自訂組 1', + 'group2': '自訂組 2', + 'group3': '自訂組 3', + 'group4': '自訂組 4', 'reset': '重設', - 'number': 'Number', + 'number': '數位', 'export': '匯出', 'chart': '圖表', - 'count': 'Count', + 'count': '數數', 'totals': '總計', 'blank': '空白', 'day': '日', 'month': '月', 'year': '年', 'subgroup': '次群組', - 'is_active': 'Is Active', + 'is_active': '活躍', 'group_by': '分組方式', 'credit_balance': '貸款餘額', - 'contact_last_login': 'Contact Last Login', - 'contact_full_name': 'Contact Full Name', + 'contact_last_login': '聯絡方式 上次登入', + 'contact_full_name': '聯絡全名', 'contact_phone': '聯絡人電話', - 'contact_custom_value1': 'Contact Custom Value 1', - 'contact_custom_value2': 'Contact Custom Value 2', - 'contact_custom_value3': 'Contact Custom Value 3', - 'contact_custom_value4': 'Contact Custom Value 4', + 'contact_custom_value1': '聯繫客製化價值 1', + 'contact_custom_value2': '聯繫客製化價值 2', + 'contact_custom_value3': '聯繫客製化價值 3', + 'contact_custom_value4': '聯繫客製化價值 4', 'shipping_address1': '送貨地址之街道', 'shipping_address2': '送貨地址之大樓/套房', 'shipping_city': '送貨地址之城市', @@ -11870,10 +11889,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'client_id': '用戶 Id', 'assigned_to': '分配給', 'created_by': '由 :name 建立', - 'assigned_to_id': 'Assigned To Id', - 'created_by_id': 'Created By Id', - 'add_column': 'Add Column', - 'edit_columns': 'Edit Columns', + 'assigned_to_id': '分配給 ID', + 'created_by_id': '創建者: ID', + 'add_column': '新增列', + 'edit_columns': '編輯列', 'columns': '欄', 'aging': '帳齡', 'profit_and_loss': '利潤與損失', @@ -11885,101 +11904,94 @@ mixin LocalizationsProvider on LocaleCodeAware { 'unapproved_quote': '未同意之報價單', 'help': '說明', 'refund': '退款', - 'refund_date': 'Refund Date', + 'refund_date': '退款日期', 'filtered_by': '篩選依據', 'contact_email': '聯絡人電子郵件', - 'multiselect': 'Multiselect', + 'multiselect': '多選', 'entity_state': '狀態', - 'verify_password': 'Verify Password', - 'applied': 'Applied', - 'include_recent_errors': 'Include recent errors from the logs', - 'your_message_has_been_received': - 'We have received your message and will try to respond promptly.', + 'verify_password': '驗證密碼', + 'applied': '應用', + 'include_recent_errors': '包括日誌中的最近錯誤', + 'your_message_has_been_received': '我們已收到您的留言,並將盡力及時回覆。', 'message': '訊息', 'from': '從', - 'show_product_details': 'Show Product Details', - 'show_product_details_help': - 'Include the description and cost in the product dropdown', - 'pdf_min_requirements': 'The PDF renderer requires :version', - 'adjust_fee_percent': 'Adjust Fee Percent', + 'show_product_details': '顯示產品詳情', + 'show_product_details_help': '在產品下拉清單中包含描述和成本', + 'pdf_min_requirements': 'PDF 渲染器需要:version', + 'adjust_fee_percent': '調整費用百分比', 'adjust_fee_percent_help': '調整百分比以計入費用', - 'configure_settings': 'Configure Settings', - 'support_forum': 'Support Forums', - 'about': 'About', + 'configure_settings': '配置設定', + 'support_forum': '支援論壇', + 'about': '關於', 'documentation': '文件', 'contact_us': '聯絡我們', 'subtotal': '小計', 'line_total': '總計', 'item': '品項', - 'credit_email': 'Credit Email', + 'credit_email': '信用電子郵件', 'iframe_url': '網站', - 'domain_url': 'Domain URL', + 'domain_url': '網域網址', 'password_is_too_short': '密碼太短', - 'password_is_too_easy': - 'Password must contain an upper case character and a number', - 'client_portal_tasks': 'Client Portal Tasks', - 'client_portal_dashboard': 'Client Portal Dashboard', - 'please_enter_a_value': 'Please enter a value', - 'deleted_logo': 'Successfully deleted logo', + 'password_is_too_easy': '密碼必須包含大寫字元和數字', + 'client_portal_tasks': '客戶端任務', + 'client_portal_dashboard': '客戶入口網站儀表板', + 'please_enter_a_value': '請輸入一個值', + 'deleted_logo': '成功刪除標誌', 'yes': '是', 'no': '否', - 'generate_number': 'Generate Number', - 'when_saved': 'When Saved', - 'when_sent': 'When Sent', - 'select_company': 'Select Company', - 'float': 'Float', - 'collapse': 'Collapse', - 'show_or_hide': 'Show/hide', - 'menu_sidebar': 'Menu Sidebar', - 'history_sidebar': 'History Sidebar', - 'tablet': 'Tablet', + 'generate_number': '產生號碼', + 'when_saved': '保存時', + 'when_sent': '發送時', + 'select_company': '選擇公司', + 'float': '漂浮', + 'collapse': '坍塌', + 'show_or_hide': '顯示隱藏', + 'menu_sidebar': '選單側邊欄', + 'history_sidebar': '歷史側邊欄', + 'tablet': '藥片', 'mobile': '行動裝置', 'desktop': '電腦桌面', - 'layout': 'Layout', + 'layout': '佈局', 'view': '檢視', - 'module': 'Module', - 'first_custom': 'First Custom', - 'second_custom': 'Second Custom', - 'third_custom': 'Third Custom', - 'show_cost': 'Show Cost', - 'show_product_cost': 'Show Product Cost', - 'show_cost_help': - 'Display a product cost field to track the markup/profit', - 'show_product_quantity': 'Show Product Quantity', - 'show_product_quantity_help': - 'Display a product quantity field, otherwise default to one', - 'show_invoice_quantity': 'Show Invoice Quantity', - 'show_invoice_quantity_help': - 'Display a line item quantity field, otherwise default to one', - 'show_product_discount': 'Show Product Discount', - 'show_product_discount_help': 'Display a line item discount field', - 'default_quantity': 'Default Quantity', - 'default_quantity_help': - 'Automatically set the line item quantity to one', - 'one_tax_rate': 'One Tax Rate', - 'two_tax_rates': 'Two Tax Rates', - 'three_tax_rates': 'Three Tax Rates', - 'default_tax_rate': 'Default Tax Rate', + 'module': '模組', + 'first_custom': '第一次客製化', + 'second_custom': '第二個客製化', + 'third_custom': '第三個習慣', + 'show_cost': '顯示費用', + 'show_product_cost': '顯示產品成本', + 'show_cost_help': '顯示產品成本欄位以追蹤加價/利潤', + 'show_product_quantity': '顯示產品數量', + 'show_product_quantity_help': '顯示產品數量字段,否則預設為 1', + 'show_invoice_quantity': '顯示發票數量', + 'show_invoice_quantity_help': '顯示行項目數量字段,否則預設為 1', + 'show_product_discount': '顯示產品折扣', + 'show_product_discount_help': '顯示訂單項目折扣字段', + 'default_quantity': '預設數量', + 'default_quantity_help': '自動將行項目數量設定為 1', + 'one_tax_rate': '一種稅率', + 'two_tax_rates': '兩種稅率', + 'three_tax_rates': '三種稅率', + 'default_tax_rate': '預設稅率', 'user': '使用者', - 'invoice_tax': 'Invoice Tax', - 'line_item_tax': 'Line Item Tax', - 'inclusive_taxes': 'Inclusive Taxes', - 'invoice_tax_rates': 'Invoice Tax Rates', - 'item_tax_rates': 'Item Tax Rates', + 'invoice_tax': '發票稅', + 'line_item_tax': '行項目稅', + 'inclusive_taxes': '普惠稅', + 'invoice_tax_rates': '發票稅率', + 'item_tax_rates': '項目稅率', 'no_client_selected': '請選取一個用戶', - 'configure_rates': 'Configure rates', - 'configure_gateways': 'Configure Gateways', + 'configure_rates': '配置費率', + 'configure_gateways': '設定網關', 'tax_settings': '稅額設定', - 'tax_settings_rates': 'Tax Rates', - 'accent_color': 'Accent Color', + 'tax_settings_rates': '稅率', + 'accent_color': '強調色', 'switch': 'Switch', - 'comma_sparated_list': 'Comma separated list', + 'comma_sparated_list': '逗號分隔列表', 'options': '選項', - 'single_line_text': 'Single-line text', - 'multi_line_text': 'Multi-line text', - 'dropdown': 'Dropdown', - 'field_type': 'Field Type', - 'recover_password_email_sent': 'A password recovery email has been sent', + 'single_line_text': '單行文字', + 'multi_line_text': '多行文字', + 'dropdown': '落下', + 'field_type': '字段類型', + 'recover_password_email_sent': '密碼恢復電子郵件已發送', 'submit': '提交', 'recover_password': '重設您的密碼', 'late_fees': '滯納金', @@ -11993,9 +12005,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'days': '日', 'invoice_email': '發票電子郵件', 'payment_email': '付款資料電子郵件', - 'partial_payment': 'Partial Payment', - 'payment_partial': 'Partial Payment', - 'partial_payment_email': 'Partial Payment Email', + 'partial_payment': '部分付款', + 'payment_partial': '部分付款', + 'partial_payment_email': '部分付款電子郵件', 'quote_email': '報價單電子郵件', 'endless_reminder': '不終止的提醒函', 'filtered_by_user': '依使用者篩選', @@ -12009,12 +12021,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'updated_user': '更新使用者資料成功', 'archived_user': '歸檔使用者資料成功', 'deleted_user': '刪除使用者成功', - 'removed_user': 'Successfully removed user', + 'removed_user': '成功刪除用戶', 'restored_user': '復原使用者資料成功', - 'archived_users': 'Successfully archived :value users', - 'deleted_users': 'Successfully deleted :value users', - 'removed_users': 'Successfully removed :value users', - 'restored_users': 'Successfully restored :value users', + 'archived_users': '已成功歸檔:value用戶', + 'deleted_users': '已成功刪除:value用戶', + 'removed_users': '已成功刪除:value用戶', + 'restored_users': '成功恢復:value用戶', 'general_settings': '一般設定', 'invoice_options': '發票選項', 'hide_paid_to_date': '隱藏迄今之付款金額', @@ -12040,14 +12052,11 @@ mixin LocalizationsProvider on LocaleCodeAware { 'quote_terms': '報價單條款', 'quote_footer': '報價單頁尾', 'auto_email_invoice': '自動電子郵件', - 'auto_email_invoice_help': - 'Automatically email recurring invoices when created.', + 'auto_email_invoice_help': '建立後自動透過電子郵件發送定期發票。', 'auto_archive_quote': '自動歸檔', - 'auto_archive_quote_help': - 'Automatically archive quotes when converted to invoice.', + 'auto_archive_quote_help': '轉換為發票後自動存檔報價。', 'auto_convert_quote': '自動轉換', - 'auto_convert_quote_help': - 'Automatically convert a quote to an invoice when approved.', + 'auto_convert_quote_help': '批准後自動將報價轉換為發票。', 'workflow_settings': '工作流程設定', 'freq_daily': '每天', 'freq_weekly': '每星期', @@ -12060,7 +12069,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'freq_six_months': '六個月', 'freq_annually': 'Annually', 'freq_two_years': '兩年', - 'freq_three_years': 'Three Years', + 'freq_three_years': '三年', 'never': '永不', 'company': '公司', 'generated_numbers': '自動產生之號碼', @@ -12119,7 +12128,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'email_style': '電子郵件樣式', 'enable_email_markup': '啟用網頁標示', 'reply_to_email': '回覆電子郵件', - 'reply_to_name': 'Reply-To Name', + 'reply_to_name': '回覆名稱', 'bcc_email': '電子郵件密件副本', 'processed': '處理', 'credit_card': '信用卡', @@ -12148,9 +12157,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archived_tax_rate': '歸檔稅率資料成功', 'deleted_tax_rate': '成功刪除稅率', 'restored_tax_rate': '成功恢復稅率', - 'archived_tax_rates': 'Successfully archived :value tax rates', - 'deleted_tax_rates': 'Successfully deleted :value tax rates', - 'restored_tax_rates': 'Successfully restored :value tax rates', + 'archived_tax_rates': '成功存檔:value稅率', + 'deleted_tax_rates': '已成功刪除:value稅率', + 'restored_tax_rates': '成功恢復:value稅率', 'fill_products': '自動填入之產品項目', 'fill_products_help': '選擇產品將自動填寫描述和成本', 'update_products': '自動更新產品', @@ -12169,9 +12178,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archived_company_gateway': '封存閘道資料成功', 'deleted_company_gateway': '刪除閘道資料成功', 'restored_company_gateway': '復原閘道成功', - 'archived_company_gateways': 'Successfully archived :value gateways', - 'deleted_company_gateways': 'Successfully deleted :value gateways', - 'restored_company_gateways': 'Successfully restored :value gateways', + 'archived_company_gateways': '已成功存檔:value網關', + 'deleted_company_gateways': '已成功刪除:value網關', + 'restored_company_gateways': '成功恢復:value網關', 'continue_editing': '繼續編輯', 'discard_changes': '放棄變更', 'default_value': '預設值', @@ -12203,10 +12212,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'date_format': '日期格式', 'datetime_format': '日期時間格式', 'military_time': '24 小時制', - 'military_time_help': '24 Hour Display', + 'military_time_help': '24小時顯示', 'send_reminders': '傳送提醒', 'timezone': '時區', - 'filtered_by_project': 'Filtered by Project', + 'filtered_by_project': '按項目過濾', 'filtered_by_group': '依群組篩選', 'filtered_by_invoice': '依發票篩選', 'filtered_by_client': '依用戶端篩選', @@ -12218,9 +12227,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'edit_group': '編輯群組', 'created_group': '已成功建立群組', 'updated_group': '已成功更新群組', - 'archived_groups': 'Successfully archived :value groups', - 'deleted_groups': 'Successfully deleted :value groups', - 'restored_groups': 'Successfully restored :value groups', + 'archived_groups': '已成功存檔:value組', + 'deleted_groups': '已成功刪除:value組', + 'restored_groups': '成功恢復:value組', 'archived_group': '已成功封存群組', 'deleted_group': '已成功刪除群組', 'restored_group': '已成功還原群組', @@ -12276,7 +12285,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'download': '下載', 'requires_an_enterprise_plan': '需要企業方案', 'take_picture': '拍照', - 'upload_files': 'Upload Files', + 'upload_files': '上傳文件', 'document': '文件', 'documents': '文件', 'new_document': '新新文件', @@ -12286,9 +12295,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archived_document': '已成功封存文件', 'deleted_document': '已成功刪除文件', 'restored_document': '已成功還原文件', - 'archived_documents': 'Successfully archived :value documents', - 'deleted_documents': 'Successfully deleted :value documents', - 'restored_documents': 'Successfully restored :value documents', + 'archived_documents': '已成功歸檔:value文檔', + 'deleted_documents': '成功刪除:value文檔', + 'restored_documents': '成功恢復:value文檔', 'no_history': '無歷史記錄', 'expense_date': '支出日期', 'pending': '擱置', @@ -12296,7 +12305,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'expense_status_2': '擱置', 'expense_status_3': '已開立發票的', 'converted': '已轉換', - 'add_documents_to_invoice': 'Add Documents to Invoice', + 'add_documents_to_invoice': '將文件新增至發票', 'exchange_rate': '匯率', 'convert_currency': '轉換貨幣單位', 'mark_paid': '標記已付', @@ -12310,7 +12319,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_vendor': '復原供應商成功', 'archived_vendors': '歸檔 :count 筆供應商資料成功', 'deleted_vendors': '刪除 :count 筆供應商成功', - 'restored_vendors': 'Successfully restored :value vendors', + 'restored_vendors': '成功恢復:value供應商', 'new_expense': '輸入支出', 'created_expense': '已成功建立支出', 'updated_expense': '更新支出資料成功', @@ -12319,7 +12328,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_expense': '復原支出資料成功', 'archived_expenses': '歸檔支出項目成功', 'deleted_expenses': '刪除支出項目成功', - 'restored_expenses': 'Successfully restored :value expenses', + 'restored_expenses': '成功恢復:value費用', 'copy_shipping': '複製送貨地址', 'copy_billing': '複製帳單地址', 'design': '設計', @@ -12352,7 +12361,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_task': '復原任務資料成功', 'archived_tasks': '歸檔 :count 項任務成功', 'deleted_tasks': '刪除 :count 項任務成功', - 'restored_tasks': 'Successfully restored :value tasks', + 'restored_tasks': '成功恢復:value任務', 'please_enter_a_name': '請輸入姓名', 'budgeted_hours': '列入預算的小時', 'created_project': '建立專案成功', @@ -12362,12 +12371,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_project': '復原專案成功', 'archived_projects': '歸檔 :count 項專案成功', 'deleted_projects': '刪除 :count 件專案成功', - 'restored_projects': 'Successfully restored :value projects', + 'restored_projects': '成功恢復:value項目', 'new_project': '新專案', 'thank_you_for_using_our_app': '感謝您使用我們的應用程式!', 'if_you_like_it': '如果您喜歡,請', 'click_here': '按一下此處', - 'click_here_capital': 'Click here', + 'click_here_capital': '點這裡', 'to_rate_it': '給它評分。', 'average': '平均', 'unapproved': '未同意', @@ -12380,7 +12389,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'compare': '比較', 'hosted_login': '託管登入', 'selfhost_login': 'Selfhost 登入', - 'google_sign_in': 'Sign in with Google', + 'google_sign_in': '使用 Google 登入', 'today': '今天', 'custom_range': '自訂範圍', 'date_range': '日期範圍', @@ -12398,11 +12407,11 @@ mixin LocalizationsProvider on LocaleCodeAware { 'last_month': '上個月', 'this_year': '今年', 'last_year': '下個月', - 'all_time': 'All Time', + 'all_time': '整天', 'custom': '自訂', 'clone_to_invoice': '再製到發票', 'clone_to_quote': '再製到報價單', - 'clone_to_credit': 'Clone to Credit', + 'clone_to_credit': '克隆到信用', 'view_invoice': '檢視發票', 'convert': '轉換', 'more': '更多', @@ -12483,7 +12492,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_product': '復原產品資料成功', 'archived_products': '歸檔 :count 項產品資料成功', 'deleted_products': '刪除 :count 筆產品資料成功', - 'restored_products': 'Successfully restored :value products', + 'restored_products': '成功恢復:value產品', 'product_key': '產品', 'notes': '註記', 'cost': '成本', @@ -12497,7 +12506,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'deleted_client': '刪除用戶資料成功', 'deleted_clients': '刪除 :count 筆用戶資料成功', 'restored_client': '復原用戶資料成功', - 'restored_clients': 'Successfully restored :value clients', + 'restored_clients': '成功恢復:value客戶端', 'address1': '街道', 'address2': '大樓/套房', 'city': '城市', @@ -12514,7 +12523,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_invoice': '復原發票成功', 'archived_invoices': '歸檔 :count 筆發票資料成功', 'deleted_invoices': '刪除 :count 筆發票成功', - 'restored_invoices': 'Successfully restored :value invoices', + 'restored_invoices': '已成功恢復:value發票', 'emailed_invoice': '以電子郵件寄出發票成功', 'emailed_payment': '以電子郵件寄出付款成功', 'amount': '金額', @@ -12543,7 +12552,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'pdf': 'PDF', 'due_date': '應付款日期', 'partial_due_date': '部分截止日期', - 'paid_date': 'Paid Date', + 'paid_date': '支付日期', 'status': '狀態', 'invoice_status_id': '發票狀態', 'quote_status': '報價單狀態', @@ -12562,7 +12571,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'language': '語言', 'currency': '貨幣', 'created_at': '建立日期', - 'created_on': 'Created On', + 'created_on': '創建於', 'updated_at': '更新', 'tax': '稅', 'please_enter_an_invoice_number': '請輸入發票編號', @@ -12576,9 +12585,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'paid': '已付款', 'mark_sent': '標記已傳送', 'marked_invoice_as_sent': '標記發票為已傳送成功', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', - 'marked_invoices_as_sent': 'Successfully marked invoices as sent', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoice_as_paid': '已成功將發票標記為已付款', + 'marked_invoices_as_sent': '已成功將發票標記為已發送', + 'marked_invoices_as_paid': '已成功將發票標記為已付款', 'done': '完成', 'please_enter_a_client_or_contact_name': '請輸入用戶或連絡人姓名', 'dark_mode': '黑暗模式', @@ -12600,8 +12609,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'payment_status_4': '完成', 'payment_status_5': '部分退款', 'payment_status_6': '退款', - 'payment_status_-1': 'Unapplied', - 'payment_status_-2': 'Partially Unapplied', + 'payment_status_-1': '未應用', + 'payment_status_-2': '部分未應用', 'net': '淨額', 'client_portal': '用戶門戶頁面', 'show_tasks': '顯示任務', @@ -12640,7 +12649,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_payment': '復原付款資料成功', 'archived_payments': '歸檔 :count 筆付款資料成功', 'deleted_payments': '刪除 :count 筆付款資料成功', - 'restored_payments': 'Successfully restored :value payments', + 'restored_payments': '已成功恢復:value付款', 'quote': '報價單', 'quotes': '報價單', 'new_quote': '新報價單', @@ -12651,11 +12660,11 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_quote': '復原報價單成功', 'archived_quotes': '歸檔 :count 份報價單成功', 'deleted_quotes': '刪除 :count 筆報價單成功', - 'restored_quotes': 'Successfully restored :value quotes', + 'restored_quotes': '成功恢復:value報價', 'expense': '支出', 'expenses': '支出', 'vendor': '供應商', - 'vendors': 'Vendors', + 'vendors': '供應商', 'task': '任務', 'tasks': '任務', 'project': '專案', @@ -12669,8 +12678,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_7': ':contact viewed invoice :invoice for :client', 'activity_8': ':user 已將發票 :invoice 歸檔', 'activity_9': ':user 已刪除發票 :invoice', - 'activity_10': - ':user entered payment :payment for :payment_amount on invoice :invoice for :client', + 'activity_10': ':user輸入了:payment的付款:payment發票上的金額:invoice的:client', 'activity_11': ':user 已更新付款資料 :payment', 'activity_12': ':user 已將付款資料 :payment 歸檔', 'activity_13': ':user 已刪除付款資料 :payment', @@ -12707,139 +12715,161 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_45': ':user 已刪除任務 :task', 'activity_46': ':user 已將任務 :task復原', 'activity_47': ':user 已將支出 :expense 更新', - 'activity_48': ':user created user :user', - 'activity_49': ':user updated user :user', - 'activity_50': ':user archived user :user', - 'activity_51': ':user deleted user :user', - 'activity_52': ':user restored user :user', - 'activity_53': ':user marked sent :invoice', - 'activity_54': ':user paid invoice :invoice', + 'activity_48': ':user建立使用者:user', + 'activity_49': ':user更新用戶:user', + 'activity_50': ':user存檔用戶:user', + 'activity_51': ':user已刪除使用者:user', + 'activity_52': ':user恢復用戶:user', + 'activity_53': ':user標記已發送:invoice', + 'activity_54': ':user已付款發票:invoice', 'activity_55': ':contact 已回覆票證 :ticket', 'activity_56': ':user 已檢視票證 :ticket', - 'activity_57': 'System failed to email invoice :invoice', - 'activity_58': ':user reversed invoice :invoice', - 'activity_59': ':user cancelled invoice :invoice', - 'activity_60': ':contact viewed quote :quote', - 'activity_61': ':user updated client :client', - 'activity_62': ':user updated vendor :vendor', - 'activity_63': - ':user emailed first reminder for invoice :invoice to :contact', - 'activity_64': - ':user emailed second reminder for invoice :invoice to :contact', - 'activity_65': - ':user emailed third reminder for invoice :invoice to :contact', - 'activity_66': - ':user emailed endless reminder for invoice :invoice to :contact', - 'activity_80': ':user created subscription :subscription', - 'activity_81': ':user updated subscription :subscription', - 'activity_82': ':user archived subscription :subscription', - 'activity_83': ':user deleted subscription :subscription', - 'activity_84': ':user restored subscription :subscription', + 'activity_57': '系統無法透過電子郵件發送發票:invoice', + 'activity_58': ':user沖銷發票:invoice', + 'activity_59': ':user取消的發票:invoice', + 'activity_60': ':contact查看報價:quote', + 'activity_61': ':user更新客戶端:client', + 'activity_62': ':user更新供應商:vendor', + 'activity_63': ':user透過電子郵件將發票:invoice的第一次提醒發送至:contact', + 'activity_64': ':user透過電子郵件將發票:invoice的第二次提醒發送至:contact', + 'activity_65': ':user透過電子郵件將發票:invoice的第三次提醒發送至:contact', + 'activity_66': ':user透過電子郵件發送了發票:invoice的無盡提醒至:contact', + 'activity_80': ':user建立訂閱:subscription', + 'activity_81': ':user更新訂閱:subscription', + 'activity_82': ':user存檔訂閱:subscription', + 'activity_83': ':user已刪除訂閱:subscription', + 'activity_84': ':user恢復訂閱:subscription', 'one_time_password': '一次性密碼', 'emailed_quote': '以電子郵件寄出報價單成功', - 'emailed_credit': 'Successfully emailed credit', + 'emailed_credit': '已成功透過電子郵件發送信用證', 'marked_quote_as_sent': '標記報價單為已傳送成功', - 'marked_credit_as_sent': 'Successfully marked credit as sent', + 'marked_credit_as_sent': '已成功將信用標記為已發送', 'expired': '過期', 'all': '全部', 'select': '選擇', 'long_press_multiselect': '長按多選', - 'custom_value1': 'Custom Value 1', - 'custom_value2': 'Custom Value 2', - 'custom_value3': 'Custom Value 3', - 'custom_value4': 'Custom Value 4', - 'email_style_custom': 'Custom Email Style', - 'custom_message_dashboard': 'Custom Dashboard Message', - 'custom_message_unpaid_invoice': 'Custom Unpaid Invoice Message', - 'custom_message_paid_invoice': 'Custom Paid Invoice Message', - 'custom_message_unapproved_quote': 'Custom Unapproved Quote Message', - 'lock_invoices': 'Lock Invoices', - 'translations': 'Translations', - 'task_number_pattern': 'Task Number Pattern', - 'task_number_counter': 'Task Number Counter', - 'expense_number_pattern': 'Expense Number Pattern', - 'expense_number_counter': 'Expense Number Counter', - 'vendor_number_pattern': 'Vendor Number Pattern', - 'vendor_number_counter': 'Vendor Number Counter', - 'ticket_number_pattern': 'Ticket Number Pattern', - 'ticket_number_counter': 'Ticket Number Counter', - 'payment_number_pattern': 'Payment Number Pattern', - 'payment_number_counter': 'Payment Number Counter', - 'invoice_number_pattern': 'Invoice Number Pattern', + 'custom_value1': '自訂值1', + 'custom_value2': '自訂值2', + 'custom_value3': '自訂值3', + 'custom_value4': '定制值4', + 'email_style_custom': '自訂電子郵件樣式', + 'custom_message_dashboard': '自訂儀表板訊息', + 'custom_message_unpaid_invoice': '自訂未付發票訊息', + 'custom_message_paid_invoice': '自訂付費發票訊息', + 'custom_message_unapproved_quote': '自訂未經批准的報價訊息', + 'lock_invoices': '鎖定發票', + 'translations': '翻譯', + 'task_number_pattern': '任務編號模式', + 'task_number_counter': '任務數量計數器', + 'expense_number_pattern': '費用數字模式', + 'expense_number_counter': '費用計數器', + 'vendor_number_pattern': '供應商編號模式', + 'vendor_number_counter': '供應商編號計數器', + 'ticket_number_pattern': '票號圖案', + 'ticket_number_counter': '票號櫃檯', + 'payment_number_pattern': '付款號碼模式', + 'payment_number_counter': '付款號碼櫃檯', + 'invoice_number_pattern': '發票號碼模式', 'invoice_number_counter': '發票號碼計數器', - 'quote_number_pattern': 'Quote Number Pattern', + 'quote_number_pattern': '報價號碼模式', 'quote_number_counter': '報價單編號計數器', - 'client_number_pattern': 'Credit Number Pattern', - 'client_number_counter': 'Credit Number Counter', - 'credit_number_pattern': 'Credit Number Pattern', - 'credit_number_counter': 'Credit Number Counter', - 'reset_counter_date': 'Reset Counter Date', - 'counter_padding': 'Counter Padding', - 'shared_invoice_quote_counter': 'Share Invoice Quote Counter', - 'default_tax_name_1': 'Default Tax Name 1', - 'default_tax_rate_1': 'Default Tax Rate 1', - 'default_tax_name_2': 'Default Tax Name 2', - 'default_tax_rate_2': 'Default Tax Rate 2', - 'default_tax_name_3': 'Default Tax Name 3', - 'default_tax_rate_3': 'Default Tax Rate 3', - 'email_subject_invoice': 'Email Invoice Subject', - 'email_subject_quote': 'Email Quote Subject', - 'email_subject_payment': 'Email Payment Subject', - 'email_subject_payment_partial': 'Email Partial Payment Subject', - 'show_table': 'Show Table', - 'show_list': 'Show List', - 'client_city': 'Client City', - 'client_state': 'Client State', - 'client_country': 'Client Country', - 'client_is_active': 'Client is Active', - 'client_balance': 'Client Balance', - 'client_address1': 'Client Street', - 'client_address2': 'Client Apt/Suite', - 'vendor_address1': 'Vendor Street', - 'vendor_address2': 'Vendor Apt/Suite', - 'client_shipping_address1': 'Client Shipping Street', - 'client_shipping_address2': 'Client Shipping Apt/Suite', + 'client_number_pattern': '信用號模式', + 'client_number_counter': '信用號碼櫃檯', + 'credit_number_pattern': '信用號模式', + 'credit_number_counter': '信用號碼櫃檯', + 'reset_counter_date': '重置計數器日期', + 'counter_padding': '計數器填充', + 'shared_invoice_quote_counter': '共享發票報價櫃檯', + 'default_tax_name_1': '預設稅名 1', + 'default_tax_rate_1': '預設稅率 1', + 'default_tax_name_2': '預設稅名 2', + 'default_tax_rate_2': '預設稅率2', + 'default_tax_name_3': '預設稅名 3', + 'default_tax_rate_3': '預設稅率3', + 'email_subject_invoice': '電子郵件發票主題', + 'email_subject_quote': '電子郵件報價主題', + 'email_subject_payment': '郵件付款主題', + 'email_subject_payment_partial': '電子郵件部分付款主題', + 'show_table': '顯示表', + 'show_list': '顯示清單', + 'client_city': '客戶城市', + 'client_state': '客戶狀態', + 'client_country': '客戶國家', + 'client_is_active': '客戶端處於活動狀態', + 'client_balance': '客戶餘額', + 'client_address1': '客戶街', + 'client_address2': '客戶公寓/套房', + 'vendor_address1': '供應商街', + 'vendor_address2': '供應商 公寓/套房', + 'client_shipping_address1': '客戶航運街', + 'client_shipping_address2': '客戶運送公寓/套房', 'type': '類型', 'invoice_amount': '發票金額', 'invoice_due_date': '應付款日期', - 'tax_rate1': 'Tax Rate 1', - 'tax_rate2': 'Tax Rate 2', - 'tax_rate3': 'Tax Rate 3', + 'tax_rate1': '稅率1', + 'tax_rate2': '稅率2', + 'tax_rate3': '稅率3', 'auto_bill': '自動帳單', - 'archived_at': 'Archived At', - 'has_expenses': 'Has Expenses', - 'custom_taxes1': 'Custom Taxes 1', - 'custom_taxes2': 'Custom Taxes 2', - 'custom_taxes3': 'Custom Taxes 3', - 'custom_taxes4': 'Custom Taxes 4', - 'custom_surcharge1': 'Custom Surcharge 1', - 'custom_surcharge2': 'Custom Surcharge 2', - 'custom_surcharge3': 'Custom Surcharge 3', - 'custom_surcharge4': 'Custom Surcharge 4', - 'is_deleted': 'Is Deleted', - 'vendor_city': 'Vendor City', - 'vendor_state': 'Vendor State', - 'vendor_country': 'Vendor Country', - 'is_approved': 'Is Approved', + 'archived_at': '存檔於', + 'has_expenses': '有費用', + 'custom_taxes1': '關稅 1', + 'custom_taxes2': '關稅 2', + 'custom_taxes3': '關稅 3', + 'custom_taxes4': '關稅 4', + 'custom_surcharge1': '客製化附加費1', + 'custom_surcharge2': '客製化附加費2', + 'custom_surcharge3': '客製化附加費3', + 'custom_surcharge4': '客製化附加費 4', + 'is_deleted': '已刪除', + 'vendor_city': '供應商城市', + 'vendor_state': '供應商狀態', + 'vendor_country': '供應商國家/地區', + 'is_approved': '被批准', 'tax_name': '稅名', 'tax_amount': '稅金金額', 'tax_paid': '已付稅', 'payment_amount': '付款金額', 'age': '年齡', - 'is_running': 'Is Running', + 'is_running': '在跑', 'time_log': '時間日誌', 'bank_id': '銀行', - 'expense_category_id': 'Expense Category ID', + 'expense_category_id': '費用類別 ID', 'expense_category': '支出類別', - 'invoice_currency_id': 'Invoice Currency ID', - 'tax_name1': 'Tax Name 1', - 'tax_name2': 'Tax Name 2', - 'tax_name3': 'Tax Name 3', - 'transaction_id': 'Transaction ID', - 'status_color_theme': 'Status Color Theme', - 'load_color_theme': 'Load Color Theme', + 'invoice_currency_id': '發票貨幣 ID', + 'tax_name1': '稅名 1', + 'tax_name2': '稅名2', + 'tax_name3': '稅名 3', + 'transaction_id': '交易ID', + 'status_color_theme': '狀態顏色主題', + 'load_color_theme': '載入顏色主題', }, 'hr': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Zadnja prijava', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Redovni', @@ -15408,26 +15438,52 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'cs': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Poslední přihlášení', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Kontakt na klienta', + 'expense_status_4': 'Neplacené', + 'expense_status_5': 'Placené', 'recurring': 'Pravidelné', 'ziptax_help': 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', 'cache_data': 'Cache Data', 'unknown': 'Unknown', 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', + 'email_opened': 'E-mail otevřen', + 'email_delivered': 'E-mail doručen', 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', + 'individual': 'Jednotlivec', + 'partnership': 'Partnerství', 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', + 'charity': 'Charita', + 'government': 'Vláda', + 'classification': 'Klasifikace', 'click_or_drop_files_here': 'Click or drop files here', 'public': 'Public', - 'private': 'Private', + 'private': 'Soukromé', 'image': 'Image', 'other': 'Other', 'hash': 'Hash', @@ -15438,7 +15494,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'unlink': 'Odpojit', 'view_dashboard_permission': 'Allow user to access the dashboard, data is limited to available permissions', - 'is_tax_exempt': 'Tax Exempt', + 'is_tax_exempt': 'Osvobozen od daní', 'district': 'District', 'region': 'Region', 'county': 'County', @@ -15489,10 +15545,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'payment_manual': 'Payment Manual', 'tax_category': 'Tax Category', 'physical_goods': 'Physical Goods', - 'digital_products': 'Digital Products', + 'digital_products': 'Digitální produkty', 'services': 'Services', 'shipping': 'Shipping', - 'tax_exempt': 'Tax Exempt', + 'tax_exempt': 'Osvobozen od daní', 'reduced_rate': 'Reduced Rate', 'tax_all': 'Tax All', 'tax_selected': 'Tax Selected', @@ -15540,7 +15596,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'view_report_permission': 'Allow user to access the reports, data is limited to available permissions', 'activity_138': 'Payment :payment was emailed to :client', - 'one_time_products': 'One-Time Products', + 'one_time_products': 'Jednorázové produkty', 'optional_one_time_products': 'Optional One-Time Products', 'required': 'Required', 'hidden': 'Hidden', @@ -15573,7 +15629,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archive_credit': 'Archivovat kredit', 'archive_task': 'Archivovat úlohu', 'archive_client': 'Archivovat klienta', - 'archive_project': 'Archive Project', + 'archive_project': 'Archivovat projekt', 'archive_expense': 'Archivovat náklad', 'restore_payment': 'Obnovit platbu', 'restore_invoice': 'Obnovit fakturu', @@ -15581,14 +15637,14 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restore_credit': 'Obnovit kredit', 'restore_task': 'Obnovit úlohu', 'restore_client': 'Obnovit klienta', - 'restore_project': 'Restore Project', - 'restore_expense': 'Obnovit náklady', + 'restore_project': 'Obnovit projekt', + 'restore_expense': 'Obnovit náklad', 'archive_vendor': 'Archivovat dodavatele', 'restore_vendor': 'Obnovit dodavatele', 'create_product': 'Přidat produkt', - 'update_product': 'Update Product', - 'delete_product': 'Delete Product', - 'restore_product': 'Restore Product', + 'update_product': 'Aktualizovat produkt', + 'delete_product': 'Smazat produkt', + 'restore_product': 'Obnovit produkt', 'archive_product': 'Archivovat produkt', 'create_purchase_order': 'Create Purchase Order', 'update_purchase_order': 'Update Purchase Order', @@ -15615,7 +15671,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'from_email': 'From Email', 'show_preview': 'Show Preview', 'show_paid_stamp': 'Show Paid Stamp', - 'show_shipping_address': 'Show Shipping Address', + 'show_shipping_address': 'Zobrazit doručovací adresu', 'no_documents_to_download': 'There are no documents in the selected records to download', 'pixels': 'Pixels', @@ -15670,7 +15726,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'Send an email when manually entering a payment', 'mark_paid_payment_email_help': 'Send an email when marking an invoice as paid', - 'delete_project': 'Delete Project', + 'delete_project': 'Smazat projekt', 'linked_transaction': 'Successfully linked transaction', 'link_payment': 'Link Payment', 'link_expense': 'Link Expense', @@ -15681,8 +15737,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'registration_required_help': 'Require clients to register', 'use_inventory_management': 'Use Inventory Management', 'use_inventory_management_help': 'Require products to be in stock', - 'optional_products': 'Optional Products', - 'optional_recurring_products': 'Optional Recurring Products', + 'optional_products': 'Volitelné produkty', + 'optional_recurring_products': 'Volitelné pravidelné produkty', 'convert_matched': 'Convert', 'auto_billed_invoice': 'Successfully queued invoice to be auto-billed', 'auto_billed_invoices': 'Successfully queued invoices to be auto-billed', @@ -15776,7 +15832,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'search_transaction': 'Search Transaction', 'search_transactions': 'Hledat v :count transakcích', 'bank_account': 'Bank Account', - 'bank_accounts': 'Platební karty & Banky', + 'bank_accounts': 'Platební karty a banky', 'archived_bank_account': 'Bankovní účet úspěšně archivován', 'deleted_bank_account': 'Successfully deleted bank account', 'removed_bank_account': 'Successfully removed bank account', @@ -15801,10 +15857,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'total_unapproved_quotes': 'Unapproved Quotes', 'total_logged_tasks': 'Logged Tasks', 'total_invoiced_tasks': 'Invoiced Tasks', - 'total_paid_tasks': 'Paid Tasks', + 'total_paid_tasks': 'Placené úlohy', 'total_logged_expenses': 'Logged Expenses', 'total_pending_expenses': 'Pending Expenses', - 'total_invoiced_expenses': 'Invoiced Expenses', + 'total_invoiced_expenses': 'Vyfakturované náklady', 'total_invoice_paid_expenses': 'Invoice Paid Expenses', 'activity_130': ':user created purchase order :purchase_order', 'activity_131': ':user updated purchase order :purchase_order', @@ -15816,7 +15872,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_137': ':contact accepted purchase order :purchase_order', 'vendor_portal': 'Vendor Portal', 'send_code': 'Send Code', - 'save_to_upload_documents': 'Save the record to upload documents', + 'save_to_upload_documents': + 'Uložte záznam, abyste mohl/a nahrát dokumenty.', 'expense_tax_rates': 'Expense Tax Rates', 'invoice_item_tax_rates': 'Invoice Item Tax Rates', 'verified_phone_number': 'Successfully verified phone number', @@ -15846,7 +15903,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'purchase_order_date': 'Purchase Order Date', 'converted_to_expense': 'Successfully converted to expense', 'converted_to_expenses': 'Successfully converted to expenses', - 'convert_to_expense': 'Convert to Expense', + 'convert_to_expense': 'Převést na náklad', 'add_to_inventory': 'Add to Inventory', 'added_purchase_order_to_inventory': 'Successfully added purchase order to inventory', @@ -15854,7 +15911,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'Successfully added purchase orders to inventory', 'client_document_upload': 'Client Document Upload', 'vendor_document_upload': 'Vendor Document Upload', - 'vendor_document_upload_help': 'Enable vendors to upload documents', + 'vendor_document_upload_help': 'Umožnit dodavatelům nahrávat dokumenty', 'are_you_enjoying_the_app': 'Are you enjoying the app?', 'yes_its_great': 'Yes, it\'s great!', 'not_so_much': 'Not so much', @@ -15872,7 +15929,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'purchase_order_details': 'Purchase Order Details', 'qr_iban': 'QR IBAN', 'besr_id': 'BESR ID', - 'accept': 'Accept', + 'accept': 'Přijmout', 'clone_to_purchase_order': 'Clone to PO', 'vendor_email_not_set': 'Vendor does not have an email address set', 'bulk_send_email': 'Send Email', @@ -15947,7 +16004,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'page_numbering': 'Page Numbering', 'page_numbering_alignment': 'Page Numbering Alignment', 'invoice_sent_notification_label': 'Invoice Sent', - 'show_product_description': 'Show Product Description', + 'show_product_description': 'Zobrazit popis produktu', 'show_product_description_help': 'Include the description in the product dropdown', 'invoice_items': 'Invoice Items', @@ -15985,8 +16042,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'tax_amount1': 'Tax Amount 1', 'tax_amount2': 'Tax Amount 2', 'tax_amount3': 'Tax Amount 3', - 'create_project': 'Create project', - 'update_project': 'Update Project', + 'create_project': 'Vytvořit projekt', + 'update_project': 'Aktualizovat projekt', 'view_task': 'View Task', 'cancel_invoice': 'Cancel', 'changed_status': 'Successfully changed task status', @@ -16002,12 +16059,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'json_help': 'Note: JSON files generated by the v4 app are not supported', 'release_notes': 'Release Notes', 'upgrade_to_view_reports': 'Upgrade your plan to view reports', - 'started_tasks': 'Successfully started :value tasks', - 'stopped_tasks': 'Successfully stopped :value tasks', + 'started_tasks': 'Úspěšně zahájeno :value úloh', + 'stopped_tasks': 'Úspěšně ukončeno :value úloh', 'approved_quote': 'Successfully apporved quote', 'approved_quotes': 'Successfully :value approved quotes', 'approve': 'Schválit', - 'client_website': 'Client Website', + 'client_website': 'Klientský web', 'invalid_time': 'Invalid Time', 'client_shipping_state': 'Client Shipping State', 'client_shipping_city': 'Client Shipping City', @@ -16045,8 +16102,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'normal': 'Normální', 'large': 'Velký', 'extra_large': 'Extra velký', - 'show_pdf_preview': 'Zobrazit PDF náhled', - 'show_pdf_preview_help': 'Zobrazit PDF náhled při editaci faktur', + 'show_pdf_preview': 'Zobrazovat náhled PDF', + 'show_pdf_preview_help': 'Zobrazovat náhled PDF při úpravě faktur', 'print_pdf': 'Tisk PDF', 'remind_me': 'Remind Me', 'instant_bank_pay': 'Instant Bank Pay', @@ -16065,7 +16122,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'We recommend using the mobile app for the best performance', 'disconnected_gateway': 'Successfully disconnected gateway', 'disconnect': 'Odpojit', - 'add_to_invoices': 'Add to Invoices', + 'add_to_invoices': 'Přidávat do faktur', 'acss': 'Pre-authorized debit payments', 'becs': 'BECS Direct Debit', 'bulk_download': 'Stáhnout', @@ -16106,16 +16163,16 @@ mixin LocalizationsProvider on LocaleCodeAware { 'bulk_email_credits': 'Email Credits', 'from_name': 'From Name', 'clone_to_expense': 'Clone to Expense', - 'recurring_expense': 'Recurring Expense', + 'recurring_expense': 'Pravidelný náklad', 'recurring_expenses': 'Pravidelné náklady', - 'new_recurring_expense': 'New Recurring Expense', - 'edit_recurring_expense': 'Edit Recurring Expense', - 'created_recurring_expense': 'Successfully created recurring expense', - 'updated_recurring_expense': 'Successfully updated recurring expense', - 'archived_recurring_expense': 'Successfully archived recurring expense', - 'deleted_recurring_expense': 'Successfully deleted recurring expense', + 'new_recurring_expense': 'Nový pravidelný náklad', + 'edit_recurring_expense': 'Upravit pravidelný náklad', + 'created_recurring_expense': 'Pravidelný náklad úspěšně vytvořen', + 'updated_recurring_expense': 'Pravidelný náklad úspěšně aktualizován', + 'archived_recurring_expense': 'Pravidelný náklad úspěšně archivován', + 'deleted_recurring_expense': 'Pravidelný náklad úspěšně smazán', 'removed_recurring_expense': 'Pravidelný náklad úspěšně odstraněn', - 'restored_recurring_expense': 'Successfully restored recurring expense', + 'restored_recurring_expense': 'Pravidelný náklad úspěšně obnoven', 'search_recurring_expense': 'Hledat pravidelný náklad', 'search_recurring_expenses': 'Hledat pravidelné náklady', 'last_sent_date': 'Last Sent Date', @@ -16138,7 +16195,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'expense_tax_help': 'Item tax rates are disabled', 'enable_markdown': 'Zapnout Markdown', 'enable_markdown_help': 'Konvertovat Markdown do HTML na PDF', - 'user_guide': 'User Guide', + 'user_guide': 'Uživatelská příručka', 'add_second_contact': 'Přidat druhý kontakt', 'previous_page': 'Přechozí stránka', 'next_page': 'Další stránka', @@ -16164,7 +16221,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'The Pro plan trial ends in :count days, click to upgrade.', 'free_trial_ends_today': 'Today is the last day of the Pro plan trial, click to upgrade.', - 'change_email': 'Změnit email', + 'change_email': 'Změnit e-mail', 'client_portal_domain_hint': 'Optionally configure a separate client portal domain', 'tasks_shown_in_portal': 'Tasks Shown in Portal', @@ -16254,7 +16311,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'rest_method': 'REST metoda', 'header_key': 'Header Key', 'header_value': 'Header Value', - 'recurring_products': 'Recurring Products', + 'recurring_products': 'Pravidelné produkty', 'promo_code': 'Promo kód', 'promo_discount': 'Promo Discount', 'allow_cancellation': 'Allow Cancellation', @@ -16313,8 +16370,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'please_select_a_country': 'Vyberte zemi', 'resend_invite': 'Resend Invitation', 'disabled_two_factor': 'Dvoufázové ověření úspěšně deaktivováno', - 'connected_google': 'Successfully connected account', - 'disconnected_google': 'Successfully disconnected account', + 'connected_google': 'Účet úspěšně připojen', + 'disconnected_google': 'Účet úspěšně odpojen', 'delivered': 'Doručeno', 'bounced': 'Bounced', 'spam': 'Spam', @@ -16324,10 +16381,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'send_sms': 'Odeslat SMS', 'sms_code': 'SMS kód', 'two_factor_setup_help': 'Scan the bar code with a :link compatible app.', - 'enabled_two_factor': 'Successfully enabled Two-Factor Authentication', + 'enabled_two_factor': 'Dvoufaktorové ověření úspěšně nastaveno', 'connect_google': 'Propojit s Google', 'disconnect_google': 'Odpojit od Google', - 'enable_two_factor': 'Two-Factor Authentication', + 'enable_two_factor': 'Dvoufaktorové ověření', 'disable_two_factor': 'Deaktivovat dvoufázové ověření', 'require_password_with_social_login': 'Require Password with Social Login', @@ -16337,9 +16394,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'count_day': '1 den', 'count_days': ':count dní', 'web_session_timeout': 'Web Session Timeout', - 'security_settings': 'Security Settings', - 'resend_email': 'Znovu odeslat email', - 'confirm_your_email_address': 'Potvrďte svou emailovou adresu', + 'security_settings': 'Nastavení bezpečí', + 'resend_email': 'Znovu odeslat e-mail', + 'confirm_your_email_address': 'Potvrďte svou e-mailovou adresu', 'refunded_payment': 'Vrácená platba', 'partially_unapplied': 'Partially Unapplied', 'select_a_gmail_user': 'Please select a user authenticated with Gmail', @@ -16361,7 +16418,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'search_payment_term': 'Search 1 Payment Term', 'search_payment_terms': 'Search :count Payment Terms', 'save_and_preview': 'Uložit a zobrazit náhled', - 'save_and_email': 'Uložit a odeslat emailem', + 'save_and_email': 'Uložit a odeslat e-mailem', 'supported_events': 'Supported Events', 'converted_amount': 'Converted Amount', 'converted_balance': 'Converted Balance', @@ -16372,7 +16429,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'default_documents': 'Default Documents', 'document_upload': 'Nahrání dokumentu', 'document_upload_help': 'Povolit klientům nahrávat dokumenty', - 'expense_total': 'Výdajů celkem', + 'expense_total': 'Náklady celkem', 'enter_taxes': 'Zadejte daně', 'by_rate': 'Podle sazby', 'by_amount': 'Podle částky', @@ -16386,7 +16443,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'debug_mode_is_enabled': 'Debugovací mód je zapnutý', 'debug_mode_is_enabled_help': 'Varování: je určený pouze pro vývoj na lokálním serveru. Může vyzradit údaje. Klikněte pro další informace.', - 'running_tasks': 'Running Tasks', + 'running_tasks': 'Běžící úlohy', 'recent_tasks': 'Nedávné úkoly', 'recent_expenses': 'Nedávné náklady', 'upcoming_expenses': 'Nadcházející náklady', @@ -16420,7 +16477,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'sidebar_editor': 'Sidebar Editor', 'please_type_to_confirm': 'Please type \':value\' to confirm', 'purge': 'Purge', - 'service': 'Service', + 'service': 'Služba', 'clone_to': 'Clone To', 'clone_to_other': 'Clone to Other', 'labels': 'Labels', @@ -16446,7 +16503,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'project_number': 'Project Number', 'project_name': 'Název projektu', 'warning': 'Warning', - 'view_settings': 'View Settings', + 'view_settings': 'Nastavení zobrazení', 'company_disabled_warning': 'Varování: tato firma ještě nebylo aktivována', 'late_invoice': 'Late Invoice', @@ -16475,16 +16532,16 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_task_statuses': 'Successfully restored :value task statuses', 'search_task_status': 'Search 1 Task Status', 'search_task_statuses': 'Search :count Task Statuses', - 'show_tasks_table': 'Show Tasks Table', + 'show_tasks_table': 'Zobrazit tabulku úloh', 'show_tasks_table_help': - 'Always show the tasks section when creating invoices', + 'Vždy zobrazovat sekci s úlohami při zakládání faktur', 'invoice_task_timelog': 'Invoice Task Timelog', 'invoice_task_timelog_help': 'Add time details to the invoice line items', 'invoice_task_datelog': 'Invoice Task Datelog', 'invoice_task_datelog_help': 'Add date details to the invoice line items', - 'auto_start_tasks_help': 'Start tasks before saving', + 'auto_start_tasks_help': 'Zahájit úlohy před uložením', 'configure_statuses': 'Configure Statuses', - 'task_settings': 'Task Settings', + 'task_settings': 'Nastavení úloh', 'configure_categories': 'Configure Categories', 'expense_categories': 'Expense Categories', 'new_expense_category': 'New Expense Category', @@ -16516,7 +16573,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'should_be_invoiced_help': 'Enable the expense to be invoiced', 'add_documents_to_invoice_help': 'Make the documents visible to client', 'convert_currency_help': 'Set an exchange rate', - 'expense_settings': 'Expense Settings', + 'expense_settings': 'Nastavení nákladů', 'clone_to_recurring': 'Clone to Recurring', 'crypto': 'Crypto', 'paypal': 'PayPal', @@ -16571,9 +16628,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Minimum Under Payment Amount', 'profit': 'Profit', 'line_item': 'Line Item', - 'allow_over_payment': 'Allow Over Payment', + 'allow_over_payment': 'Allow Overpayment', 'allow_over_payment_help': 'Support paying extra to accept tips', - 'allow_under_payment': 'Allow Under Payment', + 'allow_under_payment': 'Allow Underpayment', 'allow_under_payment_help': 'Support paying at minimum the partial/deposit amount', 'test_mode': 'Test Mode', @@ -16593,10 +16650,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'copy_link': 'Copy Link', 'token_billing': 'Ukládat platební údaje', 'welcome_to_invoice_ninja': 'Welcome to Invoice Ninja', - 'always': 'Always', + 'always': 'Vždy', 'optin': 'Opt-In', 'optout': 'Opt-Out', - 'label': 'Label', + 'label': 'Štítek', 'client_number': 'Client Number', 'auto_convert': 'Auto Convert', 'company_name': 'Název firmy', @@ -16619,7 +16676,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'apply_credit': 'Použít kredit', 'apply': 'Apply', 'unapplied': 'Unapplied', - 'select_label': 'Select Label', + 'select_label': 'Vybrat štítek', 'custom_labels': 'Custom Labels', 'record_type': 'Record Type', 'record_name': 'Record Name', @@ -16640,12 +16697,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'gross': 'Gross', 'net_amount': 'Net Amount', 'net_balance': 'Net Balance', - 'client_settings': 'Client Settings', + 'client_settings': 'Klientské nastavení', 'selected_invoices': 'Selected Invoices', 'selected_payments': 'Selected Payments', 'selected_quotes': 'Selected Quotes', - 'selected_tasks': 'Selected Tasks', - 'selected_expenses': 'Selected Expenses', + 'selected_tasks': 'Vybrané úlohy', + 'selected_expenses': 'Vybrané náklady', 'upcoming_invoices': 'Nadcházející faktury', 'past_due_invoices': 'Past Due Invoices', 'recent_payments': 'Poslední platby', @@ -16665,8 +16722,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'delete_payment': 'Smazat platbu', 'update_vendor': 'Update Vendor', 'delete_vendor': 'Smazat dodavatele', - 'create_expense': 'Create Expense', - 'update_expense': 'Update Expense', + 'create_expense': 'Vytvořit náklad', + 'update_expense': 'Aktualizovat náklad', 'delete_expense': 'Smazat náklad', 'create_task': 'Vytvořit úlohu', 'update_task': 'Update Task', @@ -16721,8 +16778,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'client_registration': 'Client Registration', 'client_registration_help': 'Enable clients to self register in the portal', - 'email_invoice': 'Poslat emailem', - 'email_quote': 'Odeslat nabídku emailem', + 'email_invoice': 'Poslat e-mailem', + 'email_quote': 'Odeslat nabídku e-mailem', 'email_credit': 'Email Credit', 'email_payment': 'Email Payment', 'client_email_not_set': 'Client does not have an email address set', @@ -16734,7 +16791,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'contact_name': 'Jméno', 'use_default': 'Use default', 'reminder_endless': 'Endless Reminders', - 'number_of_days': 'Number of days', + 'number_of_days': 'Počet dní', 'configure_payment_terms': 'Configure Payment Terms', 'payment_term': 'Payment Term', 'new_payment_term': 'New Payment Term', @@ -16774,10 +16831,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'search_vendors': 'Hledat dodavatele', 'search_users': 'Hledat uživatele', 'search_tax_rates': 'Search Tax Rates', - 'search_tasks': 'Search Tasks', - 'search_settings': 'Search Settings', + 'search_tasks': 'Hledat úlohy', + 'search_settings': 'Nastavení vyhledávání', 'search_projects': 'Hledat projekt', - 'search_expenses': 'Hledat výdaje', + 'search_expenses': 'Hledat náklady', 'search_payments': 'Search Payments', 'search_groups': 'Search Groups', 'search_company': 'Hledat firmu', @@ -16849,16 +16906,16 @@ mixin LocalizationsProvider on LocaleCodeAware { 'apply_license': 'Apply License', 'cancel_account': 'Smazat účet', 'cancel_account_message': - 'Varování: Toto permanentně odstraní Váš účet. Tato akce je nevratná.', + 'Varování: Toto trvale odstraní Váš účet. Tato akce je nevratná.', 'delete_company': 'Odstranit firmu', 'delete_company_message': 'Warning: This will permanently delete your company, there is no undo.', - 'enabled_modules': 'Enabled Modules', + 'enabled_modules': 'Aktivované moduly', 'converted_quote': 'Successfully converted quote', 'credit_design': 'Credit Design', 'includes': 'Includes', 'header': 'Hlavička', - 'load_design': 'Load Design', + 'load_design': 'Načíst design', 'css_framework': 'CSS Framework', 'custom_designs': 'Custom Designs', 'designs': 'Designs', @@ -16876,8 +16933,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'proposals': 'Proposals', 'tickets': 'Tickets', 'recurring_quotes': 'Pravidelné nabídky', - 'recurring_tasks': 'Recurring Tasks', - 'account_management': 'Account Management', + 'recurring_tasks': 'Pravidelné úlohy', + 'account_management': 'Spravování účtů', 'credit_date': 'Datum kreditu', 'credit': 'Kredit', 'credits': 'Kredity', @@ -16899,21 +16956,21 @@ mixin LocalizationsProvider on LocaleCodeAware { 'update_available': 'Update Available', 'app_updated': 'Update successfully completed', 'learn_more': 'Zjistit více', - 'integrations': 'Integrations', + 'integrations': 'Integrace', 'tracking_id': 'Tracking Id', 'slack_webhook_url': 'Slack Webhook URL', 'credit_footer': 'Credit Footer', 'credit_terms': 'Credit Terms', 'new_company': 'Nová firma', - 'added_company': 'Successfully added company', - 'company1': 'Custom Company 1', - 'company2': 'Custom Company 2', - 'company3': 'Custom Company 3', - 'company4': 'Custom Company 4', - 'product1': 'Custom Product 1', - 'product2': 'Custom Product 2', - 'product3': 'Custom Product 3', - 'product4': 'Custom Product 4', + 'added_company': 'Firma úspěšně přidána', + 'company1': 'Vlastní firma 1', + 'company2': 'Vlastní firma 2', + 'company3': 'Vlastní firma 3', + 'company4': 'Vlastní firma 4', + 'product1': 'Vlastní produkt 1', + 'product2': 'Vlastní produkt 2', + 'product3': 'Vlastní produkt 3', + 'product4': 'Vlastní produkt 4', 'client1': 'Custom Client 1', 'client2': 'Custom Client 2', 'client3': 'Custom Client 3', @@ -16926,14 +16983,14 @@ mixin LocalizationsProvider on LocaleCodeAware { 'task2': 'Custom Task 2', 'task3': 'Custom Task 3', 'task4': 'Custom Task 4', - 'project1': 'Custom Project 1', - 'project2': 'Custom Project 2', - 'project3': 'Custom Project 3', - 'project4': 'Custom Project 4', - 'expense1': 'Custom Expense 1', - 'expense2': 'Custom Expense 2', - 'expense3': 'Custom Expense 3', - 'expense4': 'Custom Expense 4', + 'project1': 'Vlastní projekt 1', + 'project2': 'Vlastní projekt 2', + 'project3': 'Vlastní projekt 3', + 'project4': 'Vlastní projekt 4', + 'expense1': 'Vlastní náklad 1', + 'expense2': 'Vlastní náklad 2', + 'expense3': 'Vlastní náklad 3', + 'expense4': 'Vlastní náklad 4', 'vendor1': 'Custom Vendor 1', 'vendor2': 'Custom Vendor 2', 'vendor3': 'Custom Vendor 3', @@ -16970,23 +17027,23 @@ mixin LocalizationsProvider on LocaleCodeAware { 'credit_balance': 'Zůstatek kreditu', 'contact_last_login': 'Contact Last Login', 'contact_full_name': 'Contact Full Name', - 'contact_phone': 'Telefon', + 'contact_phone': 'Kontaktní tel. číslo', 'contact_custom_value1': 'Contact Custom Value 1', 'contact_custom_value2': 'Contact Custom Value 2', 'contact_custom_value3': 'Contact Custom Value 3', 'contact_custom_value4': 'Contact Custom Value 4', - 'shipping_address1': 'Shipping Street', - 'shipping_address2': 'Shipping Apt/Suite', - 'shipping_city': 'Shipping City', + 'shipping_address1': 'Doručovací ulice', + 'shipping_address2': 'Doručovací číslo patra/bytu', + 'shipping_city': 'Doručovací město', 'shipping_state': 'Shipping State/Province', 'shipping_postal_code': 'Shipping Postal Code', 'shipping_country': 'Shipping Country', - 'billing_address1': 'Billing Street', - 'billing_address2': 'Billing Apt/Suite', - 'billing_city': 'Billing City', + 'billing_address1': 'Fakturační ulice', + 'billing_address2': 'Faktučaní číslo patra/bytu', + 'billing_city': 'Fakturační město', 'billing_state': 'Billing State/Province', - 'billing_postal_code': 'Billing Postal Code', - 'billing_country': 'Billing Country', + 'billing_postal_code': 'Fakturační PSČ', + 'billing_country': 'Fakturační země', 'client_id': 'ID klienta', 'assigned_to': 'Assigned to', 'created_by': 'Created by :name', @@ -17007,7 +17064,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'refund': 'Vrácení peněz', 'refund_date': 'Refund Date', 'filtered_by': 'Filtered by', - 'contact_email': 'Email', + 'contact_email': 'E-mail', 'multiselect': 'Multiselect', 'entity_state': 'State', 'verify_password': 'Verify Password', @@ -17017,7 +17074,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'We have received your message and will try to respond promptly.', 'message': 'Zpráva', 'from': 'Od', - 'show_product_details': 'Show Product Details', + 'show_product_details': 'Zobrazit detaily produktu', 'show_product_details_help': 'Include the description and cost in the product dropdown', 'pdf_min_requirements': 'The PDF renderer requires :version', @@ -17025,7 +17082,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent_help': 'Adjust percent to account for fee', 'configure_settings': 'Configure Settings', 'support_forum': 'Support Forums', - 'about': 'About', + 'about': 'O nás', 'documentation': 'Dokumentace', 'contact_us': 'Kontaktuje nás', 'subtotal': 'Mezisoučet', @@ -17091,7 +17148,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'configure_gateways': 'Configure Gateways', 'tax_settings': 'Nastavení daní', 'tax_settings_rates': 'Tax Rates', - 'accent_color': 'Accent Color', + 'accent_color': 'Akcentní barva', 'switch': 'Switch', 'comma_sparated_list': 'Comma separated list', 'options': 'Options', @@ -17111,12 +17168,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'after_due_date': 'After the due date', 'after_invoice_date': 'After the invoice date', 'days': 'Days', - 'invoice_email': 'Email pro fakturu', - 'payment_email': 'Email pro platbu', + 'invoice_email': 'E-mail pro fakturu', + 'payment_email': 'E-mail pro platbu', 'partial_payment': 'Partial Payment', 'payment_partial': 'Partial Payment', 'partial_payment_email': 'Partial Payment Email', - 'quote_email': 'Email pro nabídku', + 'quote_email': 'E-mail pro nabídku', 'endless_reminder': 'Endless Reminder', 'filtered_by_user': 'Filtered by User', 'administrator': 'Administrátor', @@ -17141,7 +17198,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'hide_paid_to_date': 'Skrýt Zaplaceno ke dni', 'hide_paid_to_date_help': 'Zobrazit na faktuře \'Zaplaceno ke dni\' pouze když přijde platba.', - 'invoice_embed_documents': 'Embed Documents', + 'invoice_embed_documents': 'Vložit dokumenty', 'invoice_embed_documents_help': 'Include attached images in the invoice.', 'all_pages_header': 'Zobrazit hlavičku', 'all_pages_footer': 'Zobrazit patičku', @@ -17235,13 +17292,13 @@ mixin LocalizationsProvider on LocaleCodeAware { 'portal_mode': 'Portal Mode', 'email_signature': 'S pozdravem,', 'enable_email_markup_help': - 'Přidejte si mikroznačky schema.org do emailu a usnadněte tak vašim klientům platby.', + 'Přidejte si mikroznačky schema.org do e-mailu a usnadněte tak vašim klientům platby.', 'plain': 'Prostý text', 'light': 'Světlý', 'dark': 'Tmavý', - 'email_design': 'Vzhled emailu', + 'email_design': 'Vzhled e-mailu', 'attach_pdf': 'Attach PDF', - 'attach_documents': 'Attach Documents', + 'attach_documents': 'Přiložit dokumenty', 'attach_ubl': 'Attach UBL', 'email_style': 'Email Style', 'enable_email_markup': 'Umožnit mikroznačky', @@ -17262,7 +17319,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'max_limit': 'Max: :max', 'min': 'Min', 'max': 'Max', - 'accepted_card_logos': 'Accepted Card Logos', + 'accepted_card_logos': 'Loga přijímaných karet', 'credentials': 'Credentials', 'update_address': 'Změnit adresu', 'update_address_help': 'Změnit adresu klienta podle poskytnutých detailů', @@ -17340,7 +17397,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'filtered_by_invoice': 'Filtered by Invoice', 'filtered_by_client': 'Filtered by Client', 'filtered_by_vendor': 'Filtered by Vendor', - 'group_settings': 'Group Settings', + 'group_settings': 'Nastavení skupiny', 'group': 'Group', 'groups': 'Groups', 'new_group': 'New Group', @@ -17358,7 +17415,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'logo': 'Logo', 'saved_settings': 'Successfully saved settings', 'product_settings': 'Nastavení produktu', - 'device_settings': 'Device Settings', + 'device_settings': 'Nastavení zařízení', 'defaults': 'Výchozí', 'basic_settings': 'Základní nastavení', 'advanced_settings': 'Pokročilé nastavení', @@ -17372,16 +17429,16 @@ mixin LocalizationsProvider on LocaleCodeAware { 'custom_fields': 'Volitelná pole', 'invoice_design': 'Vzhled faktur', 'buy_now_buttons': 'Buy Now Buttons', - 'email_settings': 'Nastavení emailu', - 'templates_and_reminders': 'Šablony & Připomínky', - 'credit_cards_and_banks': 'Credit Cards & Banks', + 'email_settings': 'Nastavení e-mailu', + 'templates_and_reminders': 'Šablony a připomínky', + 'credit_cards_and_banks': 'Kreditní karty a banky', 'data_visualizations': 'Vizualizace dat', 'price': 'Price', 'email_sign_up': 'Email Sign Up', 'google_sign_up': 'Google Sign Up', 'thank_you_for_your_purchase': 'Thank you for your purchase!', 'redeem': 'Redeem', - 'back': 'Back', + 'back': 'Zpět', 'past_purchases': 'Past Purchases', 'annual_subscription': 'Annual Subscription', 'pro_plan': 'Pro Plan', @@ -17397,7 +17454,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'privacy_policy': 'Privacy Policy', 'sign_up': 'Zaregistrovat se', 'account_login': 'Přihlášení k účtu', - 'view_website': 'View Website', + 'view_website': 'Navštívit web', 'create_account': 'Create Account', 'email_login': 'Email Login', 'create_new': 'Create New', @@ -17408,7 +17465,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'take_picture': 'Take Picture', 'upload_files': 'Upload Files', 'document': 'Document', - 'documents': 'Documents', + 'documents': 'Dokumenty', 'new_document': 'New Document', 'edit_document': 'Edit Document', 'uploaded_document': 'Successfully uploaded document', @@ -17447,7 +17504,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archived_expense': 'Náklad úspěšně archivován', 'deleted_expense': 'Náklad úspěšně smazán', 'restored_expense': 'Náklady úspěšně obnoveny', - 'archived_expenses': 'Náklady úspěšně archivovány', + 'archived_expenses': 'Náklad úspěšně archivovány', 'deleted_expenses': 'Náklad úspěšně smazán', 'restored_expenses': 'Successfully restored :value expenses', 'copy_shipping': 'Copy Shipping', @@ -17482,18 +17539,18 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_task': 'Úloha úspěšně obnovena', 'archived_tasks': 'Úspěšně archivováno :count úloh', 'deleted_tasks': 'Úspěšně smazáno :count úloh', - 'restored_tasks': 'Successfully restored :value tasks', + 'restored_tasks': 'Úspěšně obnoveno :value úloh', 'please_enter_a_name': 'Please enter a name', 'budgeted_hours': 'Budgeted Hours', - 'created_project': 'Successfully created project', - 'updated_project': 'Successfully updated project', - 'archived_project': 'Successfully archived project', - 'deleted_project': 'Successfully deleted project', - 'restored_project': 'Successfully restored project', + 'created_project': 'Projekt úspěšně vytvořen', + 'updated_project': 'Projekt úspěšně aktualizován', + 'archived_project': 'Projekt úspěšně archivován', + 'deleted_project': 'Projekt úspěšně smazán', + 'restored_project': 'Projekt úspěšně obnoven', 'archived_projects': ':count projektů archivováno', 'deleted_projects': ':count projektů smazáno', 'restored_projects': 'Projekt :value obnoven', - 'new_project': 'New Project', + 'new_project': 'Nový projekt', 'thank_you_for_using_our_app': 'Thank you for using our app!', 'if_you_like_it': 'If you like it please', 'click_here': 'klikněte zde', @@ -17543,19 +17600,19 @@ mixin LocalizationsProvider on LocaleCodeAware { 'edit_quote': 'Upravit nabídku', 'edit_payment': 'Editovat platbu', 'edit_task': 'Editovat úlohu', - 'edit_expense': 'Editovat náklad', + 'edit_expense': 'Upravit náklad', 'edit_vendor': 'Editovat dodavatele', - 'edit_project': 'Edit Project', + 'edit_project': 'Upravit projekt', 'edit_recurring_quote': 'Edit Recurring Quote', 'billing_address': 'Fakturační adresa', - 'shipping_address': 'Shipping Address', + 'shipping_address': 'Doručovací adresa', 'total_revenue': 'Celkové příjmy', 'average_invoice': 'Průměrná faktura', 'outstanding': 'Nezaplaceno', 'invoices_sent': ':count faktur odesláno', 'active_clients': 'aktivní klienti', 'close': 'Zavřít', - 'email': 'Email', + 'email': 'E-mail', 'password': 'Heslo', 'url': 'URL', 'secret': 'Secret', @@ -17573,26 +17630,26 @@ mixin LocalizationsProvider on LocaleCodeAware { 'delete': 'Smazat', 'restore': 'Obnovit', 'refresh_complete': 'Refresh Complete', - 'please_enter_your_email': 'Please enter your email', - 'please_enter_your_password': 'Please enter your password', - 'please_enter_your_url': 'Please enter your URL', + 'please_enter_your_email': 'Prosím zadejte svůj e-mail', + 'please_enter_your_password': 'Prosím zadejte svoje heslo', + 'please_enter_your_url': 'Prosím zadejte svoji URL', 'please_enter_a_product_key': 'Please enter a product key', 'ascending': 'Ascending', 'descending': 'Descending', 'save': 'Uložit', - 'an_error_occurred': 'An error occurred', + 'an_error_occurred': 'Došlo k chybě', 'paid_to_date': 'Zaplaceno ke dni', 'balance_due': 'Zbývá zaplatit', 'balance': 'Zůstatek', - 'overview': 'Overview', + 'overview': 'Přehled', 'details': 'Detaily', 'phone': 'Telefon', - 'website': 'Stránky', + 'website': 'Web', 'vat_number': 'DIČ', 'id_number': 'IČO', 'create': 'Vytvořit', 'copied_to_clipboard': 'Copied :value to the clipboard', - 'error': 'Error', + 'error': 'Chyba', 'could_not_launch': 'Could not launch', 'contacts': 'Kontakty', 'additional': 'Additional', @@ -17601,19 +17658,19 @@ mixin LocalizationsProvider on LocaleCodeAware { 'add_contact': 'Přidat kontakt', 'are_you_sure': 'Jste si jisti?', 'cancel': 'Zrušit', - 'ok': 'Ok', + 'ok': 'OK', 'remove': 'Odstranit', - 'email_is_invalid': 'Email is invalid', + 'email_is_invalid': 'E-mail je neplatný', 'product': 'Produkt', 'products': 'Produkty', 'new_product': 'Nový produkt', 'created_product': 'Produkt úspěšně vytvořen', 'updated_product': 'Produkt úspěšně aktualizován', 'archived_product': 'Produkt úspěšně archivován', - 'deleted_product': 'Successfully deleted product', - 'restored_product': 'Successfully restored product', + 'deleted_product': 'Produkt úspěšně smazán', + 'restored_product': 'Produkt úspěšně obnoven', 'archived_products': 'Successfully archived :count products', - 'deleted_products': 'Successfully deleted :count products', + 'deleted_products': 'Úspěšně smazáno :count produktů', 'restored_products': 'Successfully restored :value products', 'product_key': 'Product', 'notes': 'Poznámky', @@ -17662,12 +17719,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'quote_number': 'Číslo nabídky', 'quote_date': 'Datum nabídky', 'valid_until': 'Platí do', - 'items': 'Items', + 'items': 'Položky', 'partial_deposit': 'Partial/Deposit', 'description': 'Popis', 'unit_cost': 'Jedn. cena', 'quantity': 'Množství', - 'add_item': 'Add Item', + 'add_item': 'Přidat položku', 'contact': 'Kontakt', 'work_phone': 'Telefon', 'total_amount': 'Total Amount', @@ -17678,19 +17735,19 @@ mixin LocalizationsProvider on LocaleCodeAware { 'status': 'Status', 'invoice_status_id': 'Invoice Status', 'quote_status': 'Quote Status', - 'click_plus_to_add_item': 'Click + to add an item', + 'click_plus_to_add_item': 'Stiskněte + pro přidání položky', 'click_plus_to_add_time': 'Click + to add time', 'count_selected': ':count selected', 'total': 'Celkem', 'percent': 'Percent', 'edit': 'Upravit', 'dismiss': 'Dismiss', - 'please_select_a_date': 'Please select a date', + 'please_select_a_date': 'Prosím vyberte datum', 'please_select_a_client': 'Please select a client', 'please_select_an_invoice': 'Please select an invoice', 'task_rate': 'Task Rate', 'settings': 'Nastavení', - 'language': 'Language', + 'language': 'Jazyk', 'currency': 'Currency', 'created_at': 'Date Created', 'created_on': 'Created On', @@ -17699,7 +17756,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'please_enter_an_invoice_number': 'Please enter an invoice number', 'please_enter_a_quote_number': 'Please enter a quote number', 'past_due': 'Past Due', - 'draft': 'Draft', + 'draft': 'Koncept', 'sent': 'Odesláno', 'viewed': 'Viewed', 'approved': 'Approved', @@ -17736,22 +17793,22 @@ mixin LocalizationsProvider on LocaleCodeAware { 'payment_status_-2': 'Partially Unapplied', 'net': 'Net', 'client_portal': 'Klientský portál', - 'show_tasks': 'Show tasks', + 'show_tasks': 'Zobrazit úlohy', 'email_reminders': 'Email Reminders', 'enabled': 'Zapnuto', 'recipients': 'Recipients', - 'initial_email': 'Initial Email', + 'initial_email': 'Původní e-mail', 'first_reminder': 'První připomínka', 'second_reminder': 'Druhá připomínka', 'third_reminder': 'Třetí připomínka', 'reminder1': 'First Reminder', 'reminder2': 'Second Reminder', 'reminder3': 'Third Reminder', - 'template': 'Template', + 'template': 'Šablona', 'send': 'Send', 'subject': 'Předmět', 'body': 'Tělo', - 'send_email': 'Odeslat email', + 'send_email': 'Odeslat e-mail', 'email_receipt': 'Odeslat potvrzení platby klientovi', 'auto_billing': 'Auto billing', 'button': 'Button', @@ -17761,7 +17818,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'payment': 'Platba', 'payments': 'Platby', 'refunded': 'Refunded', - 'payment_type': 'Payment Type', + 'payment_type': 'Typ platby', 'transaction_reference': 'Odkaz na transakci', 'enter_payment': 'Zadat platbu', 'new_payment': 'Zadat platbu', @@ -17787,10 +17844,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'expense': 'Náklad', 'expenses': 'Náklady', 'vendor': 'Dodavatel', - 'vendors': 'Vendors', + 'vendors': 'Dodavatelé', 'task': 'Task', 'tasks': 'Úlohy', - 'project': 'Project', + 'project': 'Projekt', 'projects': 'Projekty', 'activity_1': ':user vytvořil klienta :client', 'activity_2': ':user archivoval klienta :client', @@ -17798,7 +17855,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_4': ':user vytvořil fakturu :invoice', 'activity_5': ':user změnil fakturu :invoice', 'activity_6': - ':user poslal email s fakturou :invoice pro :client na :contact', + ':user poslal e-mail s fakturou :invoice pro :client na :contact', 'activity_7': 'Klient :contact zobrazil fakturu :invoice pro :client', 'activity_8': ':user archivoval fakturu :invoice', 'activity_9': ':user smazal fakturu :invoice', @@ -17827,10 +17884,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_31': ':user archivoval dodavatele :vendor', 'activity_32': ':user smazal dodavatele :vendor', 'activity_33': ':user obnovil dodavatele :vendor', - 'activity_34': ':user vytvořil výdaj :expense', - 'activity_35': ':user archivoval výdaj :expense', - 'activity_36': ':user smazal výdaj :expense', - 'activity_37': ':user obnovil výdaj :expense', + 'activity_34': ':user vytvořil náklad :expense', + 'activity_35': ':user archivoval náklad :expense', + 'activity_36': ':user smazal náklad :expense', + 'activity_37': ':user obnovil náklad :expense', 'activity_39': ':user zrušil platbu :payment v hodnotě :payment_amount', 'activity_40': ':user refunded :adjustment of a :payment_amount payment :payment', @@ -17840,7 +17897,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_44': ':user archivoval úkol :task', 'activity_45': ':user smazal úkol :task', 'activity_46': ':user obnovil úkol :task', - 'activity_47': ':user aktualizoval výdaj :expense', + 'activity_47': ':user aktualizoval náklad :expense', 'activity_48': ':user vytvořil uživatele :user', 'activity_49': ':user aktualizoval uživatele :user', 'activity_50': ':user archivoval uživatele :user', @@ -17928,11 +17985,11 @@ mixin LocalizationsProvider on LocaleCodeAware { 'client_is_active': 'Client is Active', 'client_balance': 'Client Balance', 'client_address1': 'Client Street', - 'client_address2': 'Client Apt/Suite', + 'client_address2': 'Klientské číslo patra/bytu', 'vendor_address1': 'Vendor Street', - 'vendor_address2': 'Vendor Apt/Suite', + 'vendor_address2': 'Dodavatelské číslo patra/bytu', 'client_shipping_address1': 'Client Shipping Street', - 'client_shipping_address2': 'Client Shipping Apt/Suite', + 'client_shipping_address2': 'Klientské doručovací číslo patra/bytu', 'type': 'Typ', 'invoice_amount': 'Částka faktury', 'invoice_due_date': 'Datum splatnosti', @@ -17974,165 +18031,191 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'da': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Kør skabelon', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Sidst set', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Klient kontakt', + 'expense_status_4': 'Ubetalt', + 'expense_status_5': 'Betalt', 'recurring': 'Gentagne', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', + 'Bemærk : denne funktion kræver en Zip-Tax API-nøgle for at slå amerikansk moms efter adresse', + 'cache_data': 'Cache data', + 'unknown': 'Ukendt', + 'webhook_failure': 'Webhook-fejl', + 'email_opened': 'e-mail åbnet', + 'email_delivered': 'e-mail leveret', 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', - 'public': 'Public', - 'private': 'Private', - 'image': 'Image', - 'other': 'Other', + 'individual': 'Individuel', + 'partnership': 'partnerskab', + 'trust': 'Tillid', + 'charity': 'Velgørenhed', + 'government': 'Regering', + 'classification': 'Klassifikation', + 'click_or_drop_files_here': 'Klik eller slip filer her', + 'public': 'Offentlig', + 'private': 'Privat', + 'image': 'Billede', + 'other': 'Andet', 'hash': 'Hash', - 'linked_to': 'Linked To', - 'file_saved_in_path': 'The file has been saved in :path', - 'unlinked_transactions': 'Successfully unlinked :count transactions', - 'unlinked_transaction': 'Successfully unlinked transaction', + 'linked_to': 'Knyttet til', + 'file_saved_in_path': 'Filen er blevet gemt i :sti', + 'unlinked_transactions': 'Succesfuldt ulinkede :count transaktioner', + 'unlinked_transaction': 'Succesfuldt ulinket transaktion', 'unlink': 'Fjern sammenkædning', 'view_dashboard_permission': - 'Allow user to access the dashboard, data is limited to available permissions', - 'is_tax_exempt': 'Tax Exempt', - 'district': 'District', - 'region': 'Region', - 'county': 'County', - 'tax_details': 'Tax Details', + 'Tillad Bruger at få adgang til dashboardet, data er begrænset til tilgængelige tilladelser', + 'is_tax_exempt': 'Skattefritaget', + 'district': 'Distrikt', + 'region': 'Område', + 'county': 'Amt', + 'tax_details': 'Skatteoplysninger', 'activity_10_online': - ':contact entered payment :payment for invoice :invoice for :client', + ':contact indtastet Betaling :payment for Faktura :invoice for :client', 'activity_10_manual': - ':user entered payment :payment for invoice :invoice for :client', - 'default_payment_type': 'Default Payment Type', - 'admin_initiated_payments': 'Admin Initiated Payments', + ':user indtastet Betaling :payment for Faktura :invoice for :client', + 'default_payment_type': 'Standard Betaling', + 'admin_initiated_payments': 'Admin Påbegyndt Betalinger', 'admin_initiated_payments_help': - 'Support entering a payment in the admin portal without an invoice', + 'Support til at indtaste en Betaling i adminportalen uden Faktura', 'use_mobile_to_manage_plan': - 'Use your phone subscription settings to manage your plan', - 'show_task_billable': 'Show Task Billable', - 'credit_item': 'Credit Item', - 'files': 'Files', - 'camera': 'Camera', - 'gallery': 'Gallery', - 'email_count_invoices': 'Email :count invoices', - 'project_location': 'Project Location', - 'invoice_task_item_description': 'Invoice Task Item Description', + 'Brug dit Telefon abonnement Indstillinger til at administrere din plan', + 'show_task_billable': 'Vis Opgave fakturerbar', + 'credit_item': 'Kreditting', + 'files': 'Filer', + 'camera': 'Kamera', + 'gallery': 'Galleri', + 'email_count_invoices': 'e-mail :count Fakturaer', + 'project_location': 'Projektets placering', + 'invoice_task_item_description': 'Faktura Opgave Varebeskrivelse', 'invoice_task_item_description_help': - 'Add the item description to the invoice line items', - 'next_send_time': 'Next Send Time', - 'uploaded_certificate': 'Successfully uploaded certificate', - 'certificate_set': 'Certificate set', - 'certificate_not_set': 'Certificate not set', - 'passphrase_set': 'Passphrase set', - 'passphrase_not_set': 'Passphrase not set', - 'upload_certificate': 'Upload Certificate', - 'certificate_passphrase': 'Certificate Passphrase', - 'rename': 'Rename', - 'renamed_document': 'Successfully renamed document', - 'e_invoice': 'E-Invoice', - 'light_dark_mode': 'Light/Dark Mode', - 'activities': 'Activities', + 'Tilføj varebeskrivelsen til Faktura linjeposterne', + 'next_send_time': 'Næste sendetid', + 'uploaded_certificate': 'Succesfuldt uploadet certifikat', + 'certificate_set': 'Certifikat sæt', + 'certificate_not_set': 'Certifikatet ikke indstillet', + 'passphrase_set': 'Adgangssætning sæt', + 'passphrase_not_set': 'Adgangssætning ikke angivet', + 'upload_certificate': 'Upload certifikat', + 'certificate_passphrase': 'Certifikatadgangssætning', + 'rename': 'Omdøb', + 'renamed_document': 'Succesfuldt omdøbt dokument', + 'e_invoice': 'E- Faktura', + 'light_dark_mode': 'Lys/Mørk tilstand', + 'activities': 'Aktiviteter', 'routing_id': 'Routing ID', - 'enable_e_invoice': 'Enable E-Invoice', - 'e_invoice_type': 'E-Invoice Type', - 'reduced_tax': 'Reduced Tax', - 'override_tax': 'Override Tax', - 'zero_rated': 'Zero Rated', - 'reverse_tax': 'Reverse Tax', - 'updated_tax_category': 'Successfully updated the tax category', - 'updated_tax_categories': 'Successfully updated the tax categories', - 'set_tax_category': 'Set Tax Category', - 'payment_manual': 'Payment Manual', - 'tax_category': 'Tax Category', - 'physical_goods': 'Physical Goods', - 'digital_products': 'Digital Products', - 'services': 'Services', - 'shipping': 'Shipping', - 'tax_exempt': 'Tax Exempt', - 'reduced_rate': 'Reduced Rate', - 'tax_all': 'Tax All', - 'tax_selected': 'Tax Selected', + 'enable_e_invoice': 'Aktiver E- Faktura', + 'e_invoice_type': 'E- Faktura Type', + 'reduced_tax': 'Nedsat skat', + 'override_tax': 'Tilsidesæt skat', + 'zero_rated': 'Nul vurderet', + 'reverse_tax': 'Omvendt skat', + 'updated_tax_category': 'Succesfuldt opdateret skattekategorien', + 'updated_tax_categories': 'Succesfuldt opdateret skattekategorierne', + 'set_tax_category': 'Indstil skattekategori', + 'payment_manual': 'Betaling', + 'tax_category': 'Skattekategori', + 'physical_goods': 'Fysiske varer', + 'digital_products': 'Digitale produkter', + 'services': 'Tjenester', + 'shipping': 'Forsendelse', + 'tax_exempt': 'Skattefritaget', + 'reduced_rate': 'Reduceret sats', + 'tax_all': 'Skat alle', + 'tax_selected': 'Skat valgt', 'version': 'version', - 'seller_subregion': 'Seller Subregion', - 'calculate_taxes': 'Calculate Taxes', - 'calculate_taxes_help': - 'Automatically calculate taxes when saving invoices', + 'seller_subregion': 'Sælger Underregion', + 'calculate_taxes': 'Beregn skatter', + 'calculate_taxes_help': 'Beregn automatisk skat, når du gemmer Fakturaer', 'admin': 'Admin', 'owner': 'Owner', - 'link_expenses': 'Link Expenses', - 'converted_client_balance': 'Converted Client Balance', - 'converted_payment_balance': 'Converted Payment Balance', - 'total_hours': 'Total Hours', - 'date_picker_hint': 'Use +days to set the date in the future', - 'browser_pdf_viewer': 'Use Browser PDF Viewer', + 'link_expenses': 'Linkudgifter', + 'converted_client_balance': 'Konverteret Klient', + 'converted_payment_balance': 'Konverteret Betaling', + 'total_hours': 'Total timer', + 'date_picker_hint': 'Brug +dage til at indstille datoen i fremtiden', + 'browser_pdf_viewer': 'Brug Browser PDF Viewer', 'browser_pdf_viewer_help': - 'Warning: Prevents interacting with app over the PDF', - 'increase_prices': 'Increase Prices', - 'update_prices': 'Update Prices', - 'incresed_prices': 'Successfully queued prices to be increased', - 'updated_prices': 'Successfully queued prices to be updated', - 'bacs': 'BACS Direct Debit', - 'api_token': 'API Token', - 'api_key': 'API Key', - 'endpoint': 'Endpoint', + 'Advarsel: Forhindrer interaktion med app over PDF', + 'increase_prices': 'Forøg priserne', + 'update_prices': 'Opdater priser', + 'incresed_prices': 'Succesfuldt køpriser skal hæves', + 'updated_prices': + 'Succesfuldt stillede priser i kø for at blive opdateret', + 'bacs': 'BACS direkte debitering', + 'api_token': 'API-token', + 'api_key': 'API nøgle', + 'endpoint': 'Slutpunkt', 'billable': 'Fakturérbar', - 'not_billable': 'Not Billable', - 'allow_billable_task_items': 'Allow Billable Task Items', + 'not_billable': 'Ikke fakturerbar', + 'allow_billable_task_items': 'Tillad fakturerbare Opgave genstande', 'allow_billable_task_items_help': - 'Enable configuring which task items are billed', - 'show_task_item_description': 'Show Task Item Description', + 'Aktiver konfiguration af, hvilke Opgave -varer der faktureres', + 'show_task_item_description': 'Vis Opgave varebeskrivelse', 'show_task_item_description_help': - 'Enable specifying task item descriptions', - 'email_record': 'Email Record', - 'invoice_product_columns': 'Invoice Product Columns', - 'quote_product_columns': 'Quote Product Columns', - 'minimum_payment_amount': 'Minimum Payment Amount', - 'client_initiated_payments': 'Client Initiated Payments', + 'Aktiver angivelse af Opgave varebeskrivelser', + 'email_record': 'e-mail Record', + 'invoice_product_columns': 'Faktura produktkolonner', + 'quote_product_columns': 'Citat produktkolonner', + 'minimum_payment_amount': 'Minimum Betaling Beløb', + 'client_initiated_payments': 'Klient initieret Betalinger', 'client_initiated_payments_help': - 'Support making a payment in the client portal without an invoice', - 'share_invoice_quote_columns': 'Share Invoice/Quote Columns', - 'cc_email': 'CC Email', - 'payment_balance': 'Payment Balance', + 'Støt at lave en Betaling i Klient uden Faktura', + 'share_invoice_quote_columns': 'Del Faktura /Citatkolonner', + 'cc_email': 'CC e-mail', + 'payment_balance': 'Betaling Saldo', 'view_report_permission': - 'Allow user to access the reports, data is limited to available permissions', - 'activity_138': 'Payment :payment was emailed to :client', - 'one_time_products': 'One-Time Products', - 'optional_one_time_products': 'Optional One-Time Products', - 'required': 'Required', - 'hidden': 'Hidden', - 'payment_links': 'Payment Links', + 'Tillad Bruger at få adgang til rapporterne, data er begrænset til tilgængelige tilladelser', + 'activity_138': 'Betaling :payment blev sendt til :client', + 'one_time_products': 'Engangsprodukter', + 'optional_one_time_products': 'Valgfri engangsprodukter', + 'required': 'Påkrævet', + 'hidden': 'Skjult', + 'payment_links': 'Betaling Links', 'action': 'Handling', 'upgrade_to_paid_plan_to_schedule': - 'Upgrade to a paid plan to create schedules', - 'next_run': 'Next Run', - 'all_clients': 'All Clients', - 'show_aging_table': 'Show Aging Table', - 'show_payments_table': 'Show Payments Table', - 'only_clients_with_invoices': 'Only Clients with Invoices', - 'email_statement': 'Email Statement', - 'once': 'Once', + 'Opgrader til en betalt plan til Opret planer', + 'next_run': 'Næste løb', + 'all_clients': 'Alle Klienter', + 'show_aging_table': 'Vis aldringstabel', + 'show_payments_table': 'Vis Betalinger Tabel', + 'only_clients_with_invoices': 'Kun Klienter med Fakturaer', + 'email_statement': 'e-mail erklæring', + 'once': 'Enkelt gang', 'schedule': 'Schedule', - 'schedules': 'Schedules', - 'new_schedule': 'New Schedule', - 'edit_schedule': 'Edit Schedule', - 'created_schedule': 'Successfully created schedule', - 'updated_schedule': 'Successfully updated schedule', - 'archived_schedule': 'Successfully archived schedule', - 'deleted_schedule': 'Successfully deleted schedule', - 'removed_schedule': 'Successfully removed schedule', - 'restored_schedule': 'Successfully restored schedule', - 'search_schedule': 'Search Schedule', - 'search_schedules': 'Search Schedules', + 'schedules': 'Tidsplaner', + 'new_schedule': 'Nyt skema', + 'edit_schedule': 'Redigér Tidsplan', + 'created_schedule': 'Succesfuldt oprettet tidsplan', + 'updated_schedule': 'Succesfuldt opdateret tidsplan', + 'archived_schedule': 'Succesfuldt arkiveret tidsplan', + 'deleted_schedule': 'Succesfuldt slettet tidsplan', + 'removed_schedule': 'Succesfuldt fjernet tidsplan', + 'restored_schedule': 'Succesfuldt genskabt skema', + 'search_schedule': 'Søgeplan', + 'search_schedules': 'Søg skemaer', 'archive_payment': 'Arkivér betaling', 'archive_invoice': 'Arkivér faktura', 'archive_quote': 'Arkivér tilbud', @@ -18152,1294 +18235,1311 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archive_vendor': 'Arkivér sælger', 'restore_vendor': 'Genskab sælger', 'create_product': 'Opret nyt produkt', - 'update_product': 'Update Product', + 'update_product': 'Opdater produkt', 'delete_product': 'Slet produkt', 'restore_product': 'Gendan produkt', 'archive_product': 'Arkivér produkt', - 'create_purchase_order': 'Create Purchase Order', - 'update_purchase_order': 'Update Purchase Order', - 'delete_purchase_order': 'Delete Purchase Order', - 'restore_purchase_order': 'Restore Purchase Order', - 'archive_purchase_order': 'Archive Purchase Order', - 'sent_invoice': 'Sent Invoice', - 'sent_quote': 'Sent Quote', - 'sent_credit': 'Sent Credit', - 'sent_purchase_order': 'Sent Purchase Order', - 'image_url': 'Image URL', - 'max_quantity': 'Max Quantity', + 'create_purchase_order': 'Opret købsordre', + 'update_purchase_order': 'Opdater indkøbsordre', + 'delete_purchase_order': 'Slet Indkøbsordre', + 'restore_purchase_order': 'Genskab Indkøbsordre', + 'archive_purchase_order': 'Arkiv Indkøbsordre', + 'sent_invoice': 'Sendt Faktura', + 'sent_quote': 'Sendt tilbud', + 'sent_credit': 'Sendt kredit', + 'sent_purchase_order': 'Sendt indkøbsordre', + 'image_url': 'Billed-URL', + 'max_quantity': 'Max mængde', 'test_url': 'Test URL', - 'auto_bill_help_off': 'Option is not shown', - 'auto_bill_help_optin': 'Option is shown but not selected', - 'auto_bill_help_optout': 'Option is shown and selected', - 'auto_bill_help_always': 'Option is not shown', + 'auto_bill_help_off': 'Indstillingen vises ikke', + 'auto_bill_help_optin': 'Indstillingen vises, men er ikke valgt', + 'auto_bill_help_optout': 'Indstillingen vises og vælges', + 'auto_bill_help_always': 'Indstillingen vises ikke', 'payment_methods': 'Betalingsmetoder', - 'view_all': 'View All', - 'edit_all': 'Edit All', - 'accept_purchase_order_number': 'Accept Purchase Order Number', + 'view_all': 'Vis Alle', + 'edit_all': 'Redigér Alle', + 'accept_purchase_order_number': 'Accepter købsordrenummer', 'accept_purchase_order_number_help': - 'Enable clients to provide a PO number when approving a quote', - 'from_email': 'From Email', - 'show_preview': 'Show Preview', - 'show_paid_stamp': 'Show Paid Stamp', - 'show_shipping_address': 'Show Shipping Address', + 'Aktiver Klienter til at angive et PO-nummer, når du godkender et tilbud', + 'from_email': 'Fra e-mail', + 'show_preview': 'Vis forhåndsvisning', + 'show_paid_stamp': 'Vis betalt stempel', + 'show_shipping_address': 'Vis leveringsadresse', 'no_documents_to_download': - 'There are no documents in the selected records to download', + 'Der er ingen dokumenter i de valgte poster at downloade', 'pixels': 'Pixels', - 'logo_size': 'Logo Size', + 'logo_size': 'Logo størrelse', 'postal_city': 'Postnr og by', - 'failed': 'Failed', - 'client_contacts': 'Client Contacts', - 'sync_from': 'Sync From', - 'inventory_threshold': 'Inventory Threshold', + 'failed': 'mislykkedes', + 'client_contacts': 'Klient', + 'sync_from': 'Synkroniser fra', + 'inventory_threshold': 'Beholdningstærskel', 'hour': 'Time', - 'emailed_statement': 'Successfully queued statement to be sent', - 'show_email_footer': 'Show Email Footer', - 'invoice_task_hours': 'Invoice Task Hours', - 'invoice_task_hours_help': 'Add the hours to the invoice line items', - 'auto_bill_standard_invoices': 'Auto Bill Standard Invoices', - 'auto_bill_recurring_invoices': 'Auto Bill Recurring Invoices', - 'email_alignment': 'Email Alignment', - 'pdf_preview_location': 'PDF Preview Location', + 'emailed_statement': 'Succesfuldt erklæring i kø skal sendes', + 'show_email_footer': 'Vis e-mail -sidefod', + 'invoice_task_hours': 'Faktura Opgave Timer', + 'invoice_task_hours_help': 'Tilføj timerne til Faktura linjeposterne', + 'auto_bill_standard_invoices': 'Auto Bill Standard Fakturaer', + 'auto_bill_recurring_invoices': 'Auto Bill Gentagen Fakturaer', + 'email_alignment': 'e-mail justering', + 'pdf_preview_location': 'PDF eksempelplacering', 'mailgun': 'Mailgun', - 'postmark': 'Postmark', + 'postmark': 'Poststempel', 'microsoft': 'Microsoft', - 'click_plus_to_create_record': 'Click + to create a record', - 'last365_days': 'Last 365 Days', - 'import_design': 'Import Design', - 'imported_design': 'Successfully imported design', - 'invalid_design': 'The design is invalid, the :value section is missing', - 'setup_wizard_logo': 'Would you like to upload your logo?', + 'click_plus_to_create_record': 'Klik på + for at Opret en post', + 'last365_days': 'Sidste 365 dage', + 'import_design': 'Import design', + 'imported_design': 'Succesfuldt importeret design', + 'invalid_design': 'Designet er ugyldigt, :value sektionen mangler', + 'setup_wizard_logo': 'Vil du uploade dit logo?', 'upload': 'Send', - 'installed_version': 'Installed Version', - 'notify_vendor_when_paid': 'Notify Vendor When Paid', + 'installed_version': 'Installeret version', + 'notify_vendor_when_paid': 'Giv Sælger besked ved betaling', 'notify_vendor_when_paid_help': - 'Send an email to the vendor when the expense is marked as paid', - 'update_payment': 'Update Payment', + 'Send en e-mail til Sælger , når Udgift er markeret som betalt', + 'update_payment': 'Opdater Betaling', 'markup': 'Markup', - 'purchase_order_created': 'Purchase Order Created', - 'purchase_order_sent': 'Purchase Order Sent', - 'purchase_order_viewed': 'Purchase Order Viewed', - 'purchase_order_accepted': 'Purchase Order Accepted', + 'purchase_order_created': 'Købsordre oprettet', + 'purchase_order_sent': 'Købsordre sendt', + 'purchase_order_viewed': 'Købsordre set', + 'purchase_order_accepted': 'Købsordre accepteret', 'credit_payment_error': - 'The credit amount can not be greater than the payment amount', + 'Kreditten Beløb kan ikke være større end Betaling Beløb', 'klarna': 'Klarna', 'convert_payment_currency_help': - 'Set an exchange rate when entering a manual payment', + 'Indstil en valutakurs ved indtastning af en manuel Betaling', 'convert_expense_currency_help': - 'Set an exchange rate when creating an expense', + 'Indstil en valutakurs, når du opretter en Udgift', 'matomo_url': 'Matomo URL', 'matomo_id': 'Matomo Id', - 'action_add_to_invoice': 'Add To Invoice', + 'action_add_to_invoice': 'Tilføj til Faktura', 'online_payment_email_help': - 'Send an email when an online payment is made', + 'Send en e-mail , når en online Betaling er lavet', 'manual_payment_email_help': - 'Send an email when manually entering a payment', + 'Send en e-mail ved manuel indtastning af en Betaling', 'mark_paid_payment_email_help': - 'Send an email when marking an invoice as paid', + 'Send en e-mail , når du markerer en Faktura som betalt', 'delete_project': 'Slet projekt', - 'linked_transaction': 'Successfully linked transaction', - 'link_payment': 'Link Payment', - 'link_expense': 'Link Expense', - 'lock_invoiced_tasks': 'Lock Invoiced Tasks', + 'linked_transaction': 'Succesfuldt forbundet transaktion', + 'link_payment': 'Link Betaling', + 'link_expense': 'Link Udgift', + 'lock_invoiced_tasks': 'Lås fakturerede opgaver', 'lock_invoiced_tasks_help': - 'Prevent tasks from being edited once invoiced', - 'registration_required': 'Registration Required', - 'registration_required_help': 'Require clients to register', - 'use_inventory_management': 'Use Inventory Management', - 'use_inventory_management_help': 'Require products to be in stock', - 'optional_products': 'Optional Products', - 'optional_recurring_products': 'Optional Recurring Products', - 'convert_matched': 'Convert', - 'auto_billed_invoice': 'Successfully queued invoice to be auto-billed', - 'auto_billed_invoices': 'Successfully queued invoices to be auto-billed', - 'operator': 'Operator', - 'value': 'Value', - 'is': 'Is', - 'contains': 'Contains', - 'starts_with': 'Starts with', - 'is_empty': 'Is empty', - 'add_rule': 'Add Rule', - 'match_all_rules': 'Match All Rules', + 'Undgå, at opgaver redigeres, når de er faktureret', + 'registration_required': 'Tilmelding påkrævet', + 'registration_required_help': 'Kræv, at Klienter registrerer sig', + 'use_inventory_management': 'Brug lagerstyring', + 'use_inventory_management_help': 'Kræv produkter på lager', + 'optional_products': 'Valgfrie produkter', + 'optional_recurring_products': 'Valgfri Gentagen -produkter', + 'convert_matched': 'Konvertere', + 'auto_billed_invoice': + 'Succesfuldt stillede Faktura i kø for at blive autofaktureret', + 'auto_billed_invoices': + 'Succesfuldt stillede Fakturaer i kø for at blive autofaktureret', + 'operator': 'Operatør', + 'value': 'Værdi', + 'is': 'Er', + 'contains': 'Indeholder', + 'starts_with': 'Starter med', + 'is_empty': 'Er tom', + 'add_rule': 'Tilføj regel', + 'match_all_rules': 'Match alle regler', 'match_all_rules_help': - 'All criteria needs to match for the rule to be applied', + 'Alle kriterier skal matche, for at reglen kan anvendes', 'auto_convert_help': - 'Automatically convert matched transactions to expenses', - 'rules': 'Rules', - 'transaction_rule': 'Transaction Rule', - 'transaction_rules': 'Transaction Rules', - 'new_transaction_rule': 'New Transaction Rule', - 'edit_transaction_rule': 'Edit Transaction Rule', - 'created_transaction_rule': 'Successfully created rule', - 'updated_transaction_rule': 'Successfully updated transaction rule', - 'archived_transaction_rule': 'Successfully archived transaction rule', - 'deleted_transaction_rule': 'Successfully deleted transaction rule', - 'removed_transaction_rule': 'Successfully removed transaction rule', - 'restored_transaction_rule': 'Successfully restored transaction rule', - 'search_transaction_rule': 'Search Transaction Rule', - 'search_transaction_rules': 'Search Transaction Rules', + 'Konverter automatisk matchede transaktioner til udgifter', + 'rules': 'Regler', + 'transaction_rule': 'Transaktionsregel', + 'transaction_rules': 'Transaktionsregler', + 'new_transaction_rule': 'Ny transaktionsregel', + 'edit_transaction_rule': 'Redigér Transaktionsregel', + 'created_transaction_rule': 'Succesfuldt oprettet regel', + 'updated_transaction_rule': 'Succesfuldt opdateret transaktionsregel', + 'archived_transaction_rule': 'Succesfuldt arkiveret transaktionsregel', + 'deleted_transaction_rule': 'Succesfuldt slettet transaktionsregel', + 'removed_transaction_rule': 'Succesfuldt fjernet transaktionsregel', + 'restored_transaction_rule': 'Succesfuldt genskabt transaktionsregel', + 'search_transaction_rule': 'Søgetransaktionsregel', + 'search_transaction_rules': 'Søgetransaktionsregler', 'save_as_default_terms': 'Gem som standard vilkår', 'save_as_default_footer': 'Gem som standard fodnoter', - 'auto_sync': 'Auto Sync', - 'refresh_accounts': 'Refresh Accounts', + 'auto_sync': 'Automatisk synkronisering', + 'refresh_accounts': 'Opdater konti', 'upgrade_to_connect_bank_account': - 'Upgrade to Enterprise to connect your bank account', + 'Opgrader til Enterprise for at tilknytte din bankkonto', 'click_here_to_connect_bank_account': - 'Click here to connect your bank account', - 'disable_2fa': 'Disable 2FA', - 'change_number': 'Change Number', - 'resend_code': 'Resend Code', + 'Klik her for at tilknytte din bankkonto', + 'disable_2fa': 'Deaktiver 2FA', + 'change_number': 'Skift nummer', + 'resend_code': 'Gensend kode', 'base_type': 'Base Type', - 'category_type': 'Category Type', - 'bank_transaction': 'Transaction', - 'bulk_print': 'Print PDF', - 'vendor_postal_code': 'Vendor Postal Code', - 'preview_location': 'Preview Location', - 'bottom': 'Bottom', + 'category_type': 'Kategori Type', + 'bank_transaction': 'Transaktion', + 'bulk_print': 'Udskriv PDF', + 'vendor_postal_code': 'Sælger Postnummer', + 'preview_location': 'Forhåndsvisning af placering', + 'bottom': 'Bund', 'side': 'Side', - 'pdf_preview': 'PDF Preview', - 'long_press_to_select': 'Long Press to Select', - 'purchase_order_number': 'Purchase Order Number', - 'purchase_order_item': 'Purchase Order Item', - 'would_you_rate_the_app': 'Would you like to rate the app?', - 'include_deleted': 'Include Deleted', - 'include_deleted_help': 'Include deleted records in reports', - 'due_on': 'Due On', - 'converted_transactions': 'Successfully converted transactions', + 'pdf_preview': 'PDF forhåndsvisning', + 'long_press_to_select': 'Langt tryk for at vælge', + 'purchase_order_number': 'Købsordrenummer', + 'purchase_order_item': 'Indkøbsordre vare', + 'would_you_rate_the_app': 'Vil du bedømme appen?', + 'include_deleted': 'Inkluder slettet', + 'include_deleted_help': 'Inkluder slettet i rapporter', + 'due_on': 'Forfalder', + 'converted_transactions': 'Succesfuldt konverterede transaktioner', 'created_bank_account': 'Successfully created bank account', 'updated_bank_account': 'Successfully updated bank account', 'edit_bank_account': 'Edit Bank Account', - 'default_category': 'Default Category', - 'account_type': 'Account type', - 'new_bank_account': 'New bank account', - 'connect_accounts': 'Connect Accounts', - 'manage_rules': 'Manage Rules', - 'search_category': 'Search 1 Category', - 'search_categories': 'Search :count Categories', - 'min_amount': 'Min Amount', - 'max_amount': 'Max Amount', + 'default_category': 'Standard kategori', + 'account_type': 'Kontotype', + 'new_bank_account': 'Ny bankkonto', + 'connect_accounts': 'Tilslut konti', + 'manage_rules': 'Administrer regler', + 'search_category': 'Søg 1 kategori', + 'search_categories': 'Søg i :count Kategorier', + 'min_amount': 'Min Beløb', + 'max_amount': 'Max Beløb', 'selected': 'Valgt', - 'converted_transaction': 'Successfully converted transaction', - 'convert_to_payment': 'Convert to Payment', - 'deposit': 'Deposit', - 'withdrawal': 'Withdrawal', - 'deposits': 'Deposits', - 'withdrawals': 'Withdrawals', - 'matched': 'Matched', - 'unmatched': 'Unmatched', - 'create_credit': 'Create Credit', + 'converted_transaction': 'Succesfuldt konverteret transaktion', + 'convert_to_payment': 'Konverter til Betaling', + 'deposit': 'Depositum', + 'withdrawal': 'Tilbagetrækning', + 'deposits': 'Indskud', + 'withdrawals': 'Udbetalinger', + 'matched': 'Matchet', + 'unmatched': 'Uovertruffen', + 'create_credit': 'Opret Kredit', 'update_credit': 'Opdatér kredit', 'delete_credit': 'Slet kredit', - 'transaction': 'Transaction', - 'transactions': 'Transactions', - 'new_transaction': 'New Transaction', - 'edit_transaction': 'Edit Transaction', - 'created_transaction': 'Successfully created transaction', - 'updated_transaction': 'Successfully updated transaction', - 'archived_transaction': 'Successfully archived transaction', - 'deleted_transaction': 'Successfully deleted transaction', - 'removed_transaction': 'Successfully removed transaction', - 'restored_transaction': 'Successfully restored transaction', - 'search_transaction': 'Search Transaction', - 'search_transactions': 'Search :count Transactions', + 'transaction': 'Transaktion', + 'transactions': 'Transaktioner', + 'new_transaction': 'Ny transaktion', + 'edit_transaction': 'Redigér Transaktion', + 'created_transaction': 'Succesfuldt oprettet transaktion', + 'updated_transaction': 'Succesfuldt opdateret transaktion', + 'archived_transaction': 'Succesfuldt arkiveret transaktion', + 'deleted_transaction': 'Succesfuldt slettet transaktion', + 'removed_transaction': 'Succesfuldt fjernet transaktion', + 'restored_transaction': 'Succesfuldt genskabt transaktion', + 'search_transaction': 'Søg transaktion', + 'search_transactions': 'Søg :count Transaktioner', 'bank_account': 'Bankkonto', 'bank_accounts': 'Bank Accounts', 'archived_bank_account': 'Successfully archived bank account', - 'deleted_bank_account': 'Successfully deleted bank account', - 'removed_bank_account': 'Successfully removed bank account', - 'restored_bank_account': 'Successfully restored bank account', - 'search_bank_account': 'Search Bank Account', - 'search_bank_accounts': 'Search :count Bank Accounts', - 'connect': 'Connect', - 'mark_paid_payment_email': 'Mark Paid Payment Email', - 'convert_to_project': 'Convert to Project', - 'client_email': 'Client Email', - 'invoice_task_project': 'Invoice Task Project', - 'invoice_task_project_help': 'Add the project to the invoice line items', - 'field': 'Field', - 'period': 'Period', - 'fields_per_row': 'Fields Per Row', - 'total_active_invoices': 'Active Invoices', - 'total_outstanding_invoices': 'Outstanding Invoices', - 'total_completed_payments': 'Completed Payments', - 'total_refunded_payments': 'Refunded Payments', - 'total_active_quotes': 'Active Quotes', - 'total_approved_quotes': 'Approved Quotes', - 'total_unapproved_quotes': 'Unapproved Quotes', - 'total_logged_tasks': 'Logged Tasks', - 'total_invoiced_tasks': 'Invoiced Tasks', - 'total_paid_tasks': 'Paid Tasks', - 'total_logged_expenses': 'Logged Expenses', - 'total_pending_expenses': 'Pending Expenses', - 'total_invoiced_expenses': 'Invoiced Expenses', - 'total_invoice_paid_expenses': 'Invoice Paid Expenses', - 'activity_130': ':user created purchase order :purchase_order', - 'activity_131': ':user updated purchase order :purchase_order', - 'activity_132': ':user archived purchase order :purchase_order', - 'activity_133': ':user deleted purchase order :purchase_order', - 'activity_134': ':user restored purchase order :purchase_order', - 'activity_135': ':user emailed purchase order :purchase_order', - 'activity_136': ':contact viewed purchase order :purchase_order', - 'activity_137': ':contact accepted purchase order :purchase_order', - 'vendor_portal': 'Vendor Portal', - 'send_code': 'Send Code', - 'save_to_upload_documents': 'Save the record to upload documents', - 'expense_tax_rates': 'Expense Tax Rates', - 'invoice_item_tax_rates': 'Invoice Item Tax Rates', - 'verified_phone_number': 'Successfully verified phone number', - 'code_was_sent': 'A code has been sent via SMS', - 'code_was_sent_to': 'A code has been sent via SMS to :number', - 'resend': 'Resend', - 'verify': 'Verify', - 'enter_phone_number': 'Please provide a phone number', - 'invalid_phone_number': 'Invalid phone number', - 'verify_phone_number': 'Verify Phone Number', + 'deleted_bank_account': 'Succesfuldt slettet bankkonto', + 'removed_bank_account': 'Succesfuldt fjernet bankkonto', + 'restored_bank_account': 'Succesfuldt genskabt bankkonto', + 'search_bank_account': 'Søg bankkonto', + 'search_bank_accounts': 'Søg på :count bankkonti', + 'connect': 'Forbinde', + 'mark_paid_payment_email': 'Mark Betalt Betaling e-mail', + 'convert_to_project': 'Konverter til projekt', + 'client_email': 'Klient e-mail', + 'invoice_task_project': 'Faktura Opgave Projekt', + 'invoice_task_project_help': 'Tilføj projektet til Faktura linjeposterne', + 'field': 'Mark', + 'period': 'Periode', + 'fields_per_row': 'Felter pr. række', + 'total_active_invoices': 'Aktiv Fakturaer', + 'total_outstanding_invoices': 'Fremragende Fakturaer', + 'total_completed_payments': 'Gennemført Betalinger', + 'total_refunded_payments': 'Refunderet Betalinger', + 'total_active_quotes': 'Aktive citater', + 'total_approved_quotes': 'Godkendt Citater', + 'total_unapproved_quotes': 'Ikke-godkendte citater', + 'total_logged_tasks': 'Loggede opgaver', + 'total_invoiced_tasks': 'Fakturerede opgaver', + 'total_paid_tasks': 'Betalte opgaver', + 'total_logged_expenses': 'Loggede Udgifter', + 'total_pending_expenses': 'Afventende udgifter', + 'total_invoiced_expenses': 'Fakturerede udgifter', + 'total_invoice_paid_expenses': 'Faktura Betalte Udgifter', + 'activity_130': ':user oprettet indkøbsordre :purchase_order', + 'activity_131': ':user opdateret indkøbsordre :purchase_order', + 'activity_132': ':user arkiveret indkøbsordre :purchase_order', + 'activity_133': ':user slettet indkøbsordre :purchase_order', + 'activity_134': ':user genskabt indkøbsordre :purchase_order', + 'activity_135': ':user e-mailet indkøbsordre :purchase_order', + 'activity_136': ':contact set indkøbsordre :purchase_order', + 'activity_137': ':contact accepteret indkøbsordre :purchase_order', + 'vendor_portal': 'Sælger Portal', + 'send_code': 'Send kode', + 'save_to_upload_documents': 'Gem posten for at uploade dokumenter', + 'expense_tax_rates': 'Udgift Skattesatser', + 'invoice_item_tax_rates': 'Faktura Vareafgiftssatser', + 'verified_phone_number': 'Succesfuldt verificeret Telefon', + 'code_was_sent': 'En kode er sendt via SMS', + 'code_was_sent_to': 'En kode er sendt via SMS til :number', + 'resend': 'Send igen', + 'verify': 'Verificere', + 'enter_phone_number': 'Angiv venligst et Telefon', + 'invalid_phone_number': 'Ugyldigt Telefon', + 'verify_phone_number': 'Bekræft Telefon', 'verify_phone_number_help': - 'Please verify your phone number to send emails', + 'Bekræft venligst dit Telefon for at sende e-mails', 'verify_phone_number_2fa_help': - 'Please verify your phone number for 2FA backup', - 'merged_clients': 'Successfully merged clients', - 'merge_into': 'Merge Into', - 'merge': 'Merge', - 'price_change_accepted': 'Price change accepted', - 'price_change_failed': 'Price change failed with code', - 'restore_purchases': 'Restore Purchases', - 'activate': 'Activate', - 'connect_apple': 'Connect Apple', - 'disconnect_apple': 'Disconnect Apple', - 'disconnected_apple': 'Successfully disconnected Apple', - 'send_now': 'Send Now', - 'received': 'Received', - 'purchase_order_date': 'Purchase Order Date', - 'converted_to_expense': 'Successfully converted to expense', - 'converted_to_expenses': 'Successfully converted to expenses', - 'convert_to_expense': 'Convert to Expense', - 'add_to_inventory': 'Add to Inventory', + 'Bekræft venligst dit Telefon for 2FA backup', + 'merged_clients': 'Succesfuldt fusionerede Klienter', + 'merge_into': 'Flet ind i', + 'merge': 'Fusionere', + 'price_change_accepted': 'Prisændring accepteret', + 'price_change_failed': 'Prisændring mislykkedes med kode', + 'restore_purchases': 'Genskab Indkøb', + 'activate': 'Aktiver', + 'connect_apple': 'Tilslut Apple', + 'disconnect_apple': 'Afbryd Apple', + 'disconnected_apple': 'Succesfuldt afbrudt Apple', + 'send_now': 'Send nu', + 'received': 'Modtaget', + 'purchase_order_date': 'Dato for købsordre', + 'converted_to_expense': 'Succesfuldt konverteret til Udgift', + 'converted_to_expenses': 'Succesfuldt omregnet til udgifter', + 'convert_to_expense': 'Konverter til Udgift', + 'add_to_inventory': 'Tilføj til inventar', 'added_purchase_order_to_inventory': - 'Successfully added purchase order to inventory', - 'added_purchase_orders_to_inventory': - 'Successfully added purchase orders to inventory', - 'client_document_upload': 'Client Document Upload', - 'vendor_document_upload': 'Vendor Document Upload', - 'vendor_document_upload_help': 'Enable vendors to upload documents', - 'are_you_enjoying_the_app': 'Are you enjoying the app?', - 'yes_its_great': 'Yes, it\'s great!', - 'not_so_much': 'Not so much', - 'would_you_rate_it': 'Great to hear! Would you like to rate it?', - 'would_you_tell_us_more': - 'Sorry to hear it! Would you like to tell us more?', - 'sure_happy_to': 'Sure, happy to', - 'no_not_now': 'No, not now', - 'add': 'Add', - 'last_sent_template': 'Last Sent Template', - 'enable_flexible_search': 'Enable Flexible Search', - 'enable_flexible_search_help': - 'Match non-contiguous characters, ie. \'ct\' matches \'cat\'', - 'vendor_details': 'Vendor Details', - 'purchase_order_details': 'Purchase Order Details', - 'qr_iban': 'QR IBAN', - 'besr_id': 'BESR ID', - 'accept': 'Accept', - 'clone_to_purchase_order': 'Clone to PO', - 'vendor_email_not_set': 'Vendor does not have an email address set', - 'bulk_send_email': 'Send Email', - 'marked_purchase_order_as_sent': - 'Successfully marked purchase order as sent', - 'marked_purchase_orders_as_sent': - 'Successfully marked purchase orders as sent', - 'accepted_purchase_order': 'Successfully accepted purchase order', - 'accepted_purchase_orders': 'Successfully accepted purchase orders', - 'cancelled_purchase_order': 'Successfully cancelled purchase order', - 'cancelled_purchase_orders': 'Successfully cancelled purchase orders', - 'accepted': 'Accepted', - 'please_select_a_vendor': 'Please select a vendor', - 'purchase_order_total': 'Purchase Order Total', - 'email_purchase_order': 'Email Purchase Order', - 'bulk_email_purchase_orders': 'Email Purchase Orders', - 'disconnected_email': 'Successfully disconnected email', - 'connect_email': 'Connect Email', - 'disconnect_email': 'Disconnect Email', - 'use_web_app_to_connect_microsoft': - 'Please use the web app to connect to Microsoft', - 'email_provider': 'Email Provider', - 'connect_microsoft': 'Connect Microsoft', - 'disconnect_microsoft': 'Disconnect Microsoft', - 'connected_microsoft': 'Successfully connected Microsoft', - 'disconnected_microsoft': 'Successfully disconnected Microsoft', - 'microsoft_sign_in': 'Login with Microsoft', - 'microsoft_sign_up': 'Sign up with Microsoft', - 'emailed_purchase_order': 'Successfully queued purchase order to be sent', + 'Succesfuldt tilføjede indkøbsordre til lagerbeholdningen', + 'added_purchase_orders_to_inventory': + 'Succesfuldt tilføjede indkøbsordrer til lagerbeholdningen', + 'client_document_upload': 'Klient dokument upload', + 'vendor_document_upload': 'Sælger Dokument Upload', + 'vendor_document_upload_help': + 'Gør det muligt for leverandører at uploade dokumenter', + 'are_you_enjoying_the_app': 'Nyder du appen?', + 'yes_its_great': 'Ja, det er fantastisk!', + 'not_so_much': 'Ikke så meget', + 'would_you_rate_it': 'Godt at høre! Vil du bedømme det?', + 'would_you_tell_us_more': 'Ked af at høre det! Vil du fortælle os mere?', + 'sure_happy_to': 'Selvfølgelig, glad for det', + 'no_not_now': 'Nej, ikke nu', + 'add': 'Tilføj', + 'last_sent_template': 'Sidst sendt skabelon', + 'enable_flexible_search': 'Aktiver fleksibel søgning', + 'enable_flexible_search_help': + 'Match ikke sammenhængende tegn, dvs. "ct" matcher "kat"', + 'vendor_details': 'Sælger Detaljer', + 'purchase_order_details': 'Købsordredetaljer', + 'qr_iban': 'QR IBAN', + 'besr_id': 'BESR ID', + 'accept': 'Acceptere', + 'clone_to_purchase_order': 'Klon til PO', + 'vendor_email_not_set': 'Sælger har ikke angivet en e-mail', + 'bulk_send_email': 'Send e-mail', + 'marked_purchase_order_as_sent': + 'Succesfuldt markeret indkøbsordre som sendt', + 'marked_purchase_orders_as_sent': + 'Succesfuldt markerede indkøbsordrer som afsendt', + 'accepted_purchase_order': 'Succesfuldt accepteret indkøbsordre', + 'accepted_purchase_orders': 'Succesfuldt accepterede indkøbsordrer', + 'cancelled_purchase_order': 'Succesfuldt annulleret indkøbsordre', + 'cancelled_purchase_orders': 'Succesfuldt annullerede indkøbsordrer', + 'accepted': 'Accepteret', + 'please_select_a_vendor': 'Vælg venligst en Sælger', + 'purchase_order_total': 'Købsordre Total', + 'email_purchase_order': 'e-mail Indkøbsordre', + 'bulk_email_purchase_orders': 'e-mail Indkøbsordrer', + 'disconnected_email': 'Succesfuldt afbrudt e-mail', + 'connect_email': 'Tilslut e-mail', + 'disconnect_email': 'Afbryd forbindelsen e-mail', + 'use_web_app_to_connect_microsoft': + 'Brug venligst webappen til at oprette forbindelse til Microsoft', + 'email_provider': 'e-mail udbyder', + 'connect_microsoft': 'Tilslut Microsoft', + 'disconnect_microsoft': 'Afbryd Microsoft', + 'connected_microsoft': 'Succesfuldt forbundet Microsoft', + 'disconnected_microsoft': 'Succesfuldt afbrudt Microsoft', + 'microsoft_sign_in': 'Log ind med Microsoft', + 'microsoft_sign_up': 'Tilmeld dig hos Microsoft', + 'emailed_purchase_order': 'Succesfuldt købsordre i kø skal sendes', 'emailed_purchase_orders': - 'Successfully queued purchase orders to be sent', - 'enable_react_app': 'Change to the React web app', - 'purchase_order_design': 'Purchase Order Design', - 'purchase_order_terms': 'Purchase Order Terms', - 'purchase_order_footer': 'Purchase Order Footer', - 'require_purchase_order_signature': 'Purchase Order Signature', + 'Succesfuldt stillede indkøbsordrer i kø, der skulle sendes', + 'enable_react_app': 'Skift til React-webappen', + 'purchase_order_design': 'Indkøbsordre design', + 'purchase_order_terms': 'Købsordre Betingelser', + 'purchase_order_footer': 'Indkøbsordre sidefod', + 'require_purchase_order_signature': 'Købsordresignatur', 'require_purchase_order_signature_help': - 'Require vendor to provide their signature.', - 'purchase_order': 'Purchase Order', - 'purchase_orders': 'Purchase Orders', - 'new_purchase_order': 'New Purchase Order', - 'edit_purchase_order': 'Edit Purchase Order', - 'created_purchase_order': 'Successfully created purchase order', - 'updated_purchase_order': 'Successfully updated purchase order', - 'archived_purchase_order': 'Successfully archived purchase order', - 'deleted_purchase_order': 'Successfully deleted purchase order', - 'removed_purchase_order': 'Successfully removed purchase order', - 'restored_purchase_order': 'Successfully restored purchase order', - 'search_purchase_order': 'Search Purchase Order', - 'search_purchase_orders': 'Search Purchase Orders', + 'Kræv Sælger om at give deres underskrift.', + 'purchase_order': 'Købsordre', + 'purchase_orders': 'Indkøbsordre', + 'new_purchase_order': 'Ny indkøbsordre', + 'edit_purchase_order': 'Redigér Indkøbsordre', + 'created_purchase_order': 'Succesfuldt oprettet indkøbsordre', + 'updated_purchase_order': 'Succesfuldt opdateret indkøbsordre', + 'archived_purchase_order': 'Succesfuldt arkiveret indkøbsordre', + 'deleted_purchase_order': 'Succesfuldt slettet indkøbsordre', + 'removed_purchase_order': 'Succesfuldt fjernet indkøbsordre', + 'restored_purchase_order': 'Succesfuldt genskabt indkøbsordre', + 'search_purchase_order': 'Søg indkøbsordre', + 'search_purchase_orders': 'Søg i indkøbsordrer', 'login_url': 'Login URL', 'payment_settings': 'Betalingsindstillinger', - 'default': 'Default', - 'stock_quantity': 'Stock Quantity', - 'notification_threshold': 'Notification Threshold', - 'track_inventory': 'Track Inventory', + 'default': 'Standard', + 'stock_quantity': 'Lagermængde', + 'notification_threshold': 'Underretningstærskel', + 'track_inventory': 'Spor inventar', 'track_inventory_help': - 'Display a product stock field and update when invoices are sent', - 'stock_notifications': 'Stock Notifications', + 'Vis et produktlagerfelt og opdater, når Fakturaer sendes', + 'stock_notifications': 'Aktiemeddelelser', 'stock_notifications_help': - 'Send an email when the stock reaches the threshold', - 'vat': 'VAT', + 'Send en e-mail , når beholdningen når tærsklen', + 'vat': 'moms', 'standing': 'Stående', - 'view_map': 'View Map', - 'set_default_design': 'Set Default Design', + 'view_map': 'Vis kort', + 'set_default_design': 'Indstil standarddesign', 'add_gateway': 'Tilføj gateway', 'add_gateway_help_message': - 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', - 'left': 'Left', - 'right': 'Right', - 'center': 'Center', - 'page_numbering': 'Page Numbering', - 'page_numbering_alignment': 'Page Numbering Alignment', - 'invoice_sent_notification_label': 'Invoice Sent', - 'show_product_description': 'Show Product Description', + 'Tilføj en Betalingsgateway (dvs. Stripe, WePay eller PayPal) for at acceptere online Betalinger', + 'left': 'Venstre', + 'right': 'Højre', + 'center': 'Centrum', + 'page_numbering': 'Sidenummerering', + 'page_numbering_alignment': 'Sidenummereringsjustering', + 'invoice_sent_notification_label': 'Faktura Sendt', + 'show_product_description': 'Vis produktbeskrivelse', 'show_product_description_help': - 'Include the description in the product dropdown', - 'invoice_items': 'Invoice Items', - 'quote_items': 'Quote Items', - 'profitloss': 'Profit and Loss', - 'import_format': 'Import Format', - 'export_format': 'Export Format', - 'export_type': 'Export Type', - 'stop_on_unpaid': 'Stop On Unpaid', + 'Inkluder beskrivelsen i produktrullemenuen', + 'invoice_items': 'Faktura varer', + 'quote_items': 'Citat varer', + 'profitloss': 'Fortjeneste og tab', + 'import_format': 'Format', + 'export_format': 'Eksporter Format', + 'export_type': 'Eksporttype', + 'stop_on_unpaid': 'Stop ved ulønnet', 'stop_on_unpaid_help': - 'Stop creating recurring invoices if the last invoice is unpaid.', - 'use_quote_terms': 'Use Quote Terms', - 'use_quote_terms_help': 'When converting a quote to an invoice', - 'add_country': 'Add Country', - 'enable_tooltips': 'Enable Tooltips', - 'enable_tooltips_help': 'Show tooltips when hovering the mouse', - 'multiple_client_error': 'Error: records belong to more than one client', - 'register_label': 'Create your account in seconds', - 'login_label': 'Login to an existing account', + 'Stop med at oprette Gentagen Faktura er, hvis den sidste Faktura er ubetalt.', + 'use_quote_terms': 'Brug Citat Betingelser', + 'use_quote_terms_help': 'Ved konvertering af et tilbud til en Faktura', + 'add_country': 'Tilføj land', + 'enable_tooltips': 'Aktiver Værktøjstip', + 'enable_tooltips_help': 'Vis værktøjstip, når du holder musen over', + 'multiple_client_error': 'Fejl: Optegnelser tilhører mere end én Klient', + 'register_label': 'Opret din konto på få sekunder', + 'login_label': 'Log ind på en eksisterende konto', 'add_to_invoice': 'Tilføj til faktura nr.: :invoice', - 'no_invoices_found': 'No invoices found', + 'no_invoices_found': 'Ingen Fakturaer fundet', 'week': 'Uge', - 'created_record': 'Successfully created record', - 'auto_archive_paid_invoices': 'Auto Archive Paid', + 'created_record': 'Succesfuldt oprettet record', + 'auto_archive_paid_invoices': 'Auto Arkiv Betalt', 'auto_archive_paid_invoices_help': - 'Automatically archive invoices when they are paid.', - 'auto_archive_cancelled_invoices': 'Auto Archive Cancelled', + 'Automatisk Arkiv Fakturaer når de er betalt.', + 'auto_archive_cancelled_invoices': 'Arkiv annulleret', 'auto_archive_cancelled_invoices_help': - 'Automatically archive invoices when cancelled.', - 'alternate_pdf_viewer': 'Alternate PDF Viewer', - 'alternate_pdf_viewer_help': - 'Improve scrolling over the PDF preview [BETA]', + 'Automatisk Arkiv Fakturaer ved aflysning.', + 'alternate_pdf_viewer': 'Alternativ PDF fremviser', + 'alternate_pdf_viewer_help': 'Forbedre rulning over PDF eksemplet [BETA]', 'invoice_currency': 'Invoice Currency', 'range': 'Interval', - 'tax_amount1': 'Tax Amount 1', - 'tax_amount2': 'Tax Amount 2', - 'tax_amount3': 'Tax Amount 3', + 'tax_amount1': 'Skat Beløb 1', + 'tax_amount2': 'Skat Beløb 2', + 'tax_amount3': 'Skat Beløb 3', 'create_project': 'Opret projekt', - 'update_project': 'Update Project', - 'view_task': 'View Task', - 'cancel_invoice': 'Cancel', - 'changed_status': 'Successfully changed task status', - 'change_status': 'Change Status', - 'fees_sample': 'The fee for a :amount invoice would be :total.', - 'enable_touch_events': 'Enable Touch Events', - 'enable_touch_events_help': 'Support drag events to scroll', - 'after_saving': 'After Saving', - 'view_record': 'View Record', - 'enable_email_markdown': 'Enable Email Markdown', - 'enable_email_markdown_help': 'Use visual markdown editor for emails', - 'enable_pdf_markdown': 'Enable PDF Markdown', - 'json_help': 'Note: JSON files generated by the v4 app are not supported', - 'release_notes': 'Release Notes', - 'upgrade_to_view_reports': 'Upgrade your plan to view reports', - 'started_tasks': 'Successfully started :value tasks', - 'stopped_tasks': 'Successfully stopped :value tasks', - 'approved_quote': 'Successfully apporved quote', - 'approved_quotes': 'Successfully :value approved quotes', + 'update_project': 'Opdater projekt', + 'view_task': 'Vis Opgave', + 'cancel_invoice': 'Afbryd', + 'changed_status': 'Succesfuldt ændrede Opgave status', + 'change_status': 'Skift status', + 'fees_sample': 'Gebyret for en :amount Faktura ville være :total .', + 'enable_touch_events': 'Aktiver Touch Events', + 'enable_touch_events_help': 'Understøtter træk begivenheder for at rulle', + 'after_saving': 'Efter at have gemt', + 'view_record': 'Vis Rekord', + 'enable_email_markdown': 'Aktiver e-mail Markdown', + 'enable_email_markdown_help': 'Brug visuel markdown-editor til e-mails', + 'enable_pdf_markdown': 'Aktiver PDF Markdown', + 'json_help': + 'Bemærk : JSON-filer genereret af v4-appen understøttes ikke', + 'release_notes': 'Udgivelses noter', + 'upgrade_to_view_reports': 'Opgrader din plan til Vis rapporter', + 'started_tasks': 'Succesfuldt startede :value opgaver', + 'stopped_tasks': 'Succesfuldt stoppede :value opgaver', + 'approved_quote': 'Succesfuldt godkendt citat', + 'approved_quotes': 'Succesfuldt :value Godkendt citater', 'approve': 'Godkend', - 'client_website': 'Client Website', - 'invalid_time': 'Invalid Time', - 'client_shipping_state': 'Client Shipping State', - 'client_shipping_city': 'Client Shipping City', - 'client_shipping_postal_code': 'Client Shipping Postal Code', - 'client_shipping_country': 'Client Shipping Country', - 'load_pdf': 'Load PDF', - 'start_free_trial': 'Start Free Trial', + 'client_website': 'Klient hjemmeside', + 'invalid_time': 'Ugyldig tid', + 'client_shipping_state': 'Klient Shipping State', + 'client_shipping_city': 'Klient Shipping City', + 'client_shipping_postal_code': 'Klient forsendelses postnummer', + 'client_shipping_country': 'Klient forsendelsesland', + 'load_pdf': 'Indlæs PDF', + 'start_free_trial': 'Start gratis prøveperiode', 'start_free_trial_message': - 'Start your FREE 14 day trial of the pro plan', - 'due_on_receipt': 'Due on Receipt', - 'is_paid': 'Is Paid', - 'age_group_paid': 'Paid', + 'Start din GRATIS 14 dages prøveversion af pro-planen', + 'due_on_receipt': 'Forfalder ved modtagelse', + 'is_paid': 'Er betalt', + 'age_group_paid': 'Betalt', 'id': 'Id', - 'convert_to': 'Convert To', - 'client_currency': 'Client Currency', - 'company_currency': 'Company Currency', - 'purged_client': 'Successfully purged client', + 'convert_to': 'Konvertere til', + 'client_currency': 'Klient valuta', + 'company_currency': 'Virksomhedens valuta', + 'purged_client': 'Succesfuldt renset Klient', 'custom_emails_disabled_help': - 'To prevent spam we require upgrading to a paid account to customize the email', - 'upgrade_to_add_company': 'Upgrade your plan to add companies', - 'small': 'Small', - 'marked_credit_as_paid': 'Successfully marked credit as paid', - 'marked_credits_as_paid': 'Successfully marked credits as paid', - 'wait_for_loading': 'Data loading - please wait for it to complete', - 'wait_for_saving': 'Data saving - please wait for it to complete', + 'For at forhindre spam kræver vi opgradering til en betalt konto for at tilpasse e-mail', + 'upgrade_to_add_company': 'Opgrader din plan til Tilføj virksomheder', + 'small': 'Lille', + 'marked_credit_as_paid': 'Succesfuldt markerede kredit som betalt', + 'marked_credits_as_paid': 'Succesfuldt markerede kreditter som betalte', + 'wait_for_loading': + 'Dataindlæsning - vent venligst på, at det er fuldført', + 'wait_for_saving': 'Datalagring - vent venligst på, at det er fuldført', 'html_preview_warning': - 'Note: changes made here are only previewed, they must be applied in the tabs above to be saved', - 'remaining': 'Remaining', - 'invoice_paid': 'Invoice Paid', - 'activity_120': ':user created recurring expense :recurring_expense', - 'activity_121': ':user updated recurring expense :recurring_expense', - 'activity_122': ':user archived recurring expense :recurring_expense', - 'activity_123': ':user deleted recurring expense :recurring_expense', - 'activity_124': ':user restored recurring expense :recurring_expense', + 'Bemærk : ændringer foretaget her er kun forhåndsvist, de skal anvendes i fanerne ovenfor for at blive gemt', + 'remaining': 'Tilbage', + 'invoice_paid': 'Faktura Betalt', + 'activity_120': ':user oprettet Gentagen Udgift :recurring_expense', + 'activity_121': ':user opdateret Gentagen Udgift :recurring_expense', + 'activity_122': ':user arkiveret Gentagen Udgift :recurring_expense', + 'activity_123': ':user slettet Gentagen Udgift :recurring_expense', + 'activity_124': ':user genskabt Gentagen Udgift :recurring_expense', 'normal': 'Normal', - 'large': 'Large', - 'extra_large': 'Extra Large', - 'show_pdf_preview': 'Show PDF Preview', - 'show_pdf_preview_help': 'Display PDF preview while editing invoices', - 'print_pdf': 'Print PDF', - 'remind_me': 'Remind Me', - 'instant_bank_pay': 'Instant Bank Pay', - 'click_selected': 'Click Selected', - 'hide_preview': 'Hide Preview', - 'edit_record': 'Edit Record', + 'large': 'Stor', + 'extra_large': 'Ekstra stor', + 'show_pdf_preview': 'Vis PDF forhåndsvisning', + 'show_pdf_preview_help': + 'Vis PDF forhåndsvisning, mens du redigerer Fakturaer', + 'print_pdf': 'Udskriv PDF', + 'remind_me': 'Mind mig om', + 'instant_bank_pay': 'Øjeblikkelig bankbetaling', + 'click_selected': 'Klik på Valgt', + 'hide_preview': 'Skjul forhåndsvisning', + 'edit_record': 'Redigér Record', 'credit_is_more_than_invoice': - 'The credit amount can not be more than the invoice amount', + 'Æren Beløb kan ikke være mere end Faktura Beløb', 'giropay': 'GiroPay', - 'direct_debit': 'Direct Debit', - 'please_set_a_password': 'Please set an account password', + 'direct_debit': 'Direkte debitering', + 'please_set_a_password': 'Indstil venligst en kontoadgangskode', 'set_password': 'Sæt adgangskode', 'recommend_desktop': - 'We recommend using the desktop app for the best performance', + 'Vi anbefaler at bruge desktop-appen for den bedste ydeevne', 'recommend_mobile': - 'We recommend using the mobile app for the best performance', - 'disconnected_gateway': 'Successfully disconnected gateway', - 'disconnect': 'Disconnect', - 'add_to_invoices': 'Add to Invoices', - 'acss': 'Pre-authorized debit payments', - 'becs': 'BECS Direct Debit', - 'bulk_download': 'Download', + 'Vi anbefaler at bruge mobilappen for den bedste ydeevne', + 'disconnected_gateway': 'Succesfuldt afbrudt Gateway', + 'disconnect': 'Koble fra', + 'add_to_invoices': 'Tilføj til Fakturaer', + 'acss': 'Forhåndsautoriseret debet Betalinger', + 'becs': 'BECS direkte debitering', + 'bulk_download': 'Hent', 'persist_data_help': - 'Save data locally to enable the app to start faster, disabling may improve performance in large accounts', - 'persist_ui': 'Persist UI', + 'Gem data lokalt for at gøre det muligt for appen at starte hurtigere. Deaktivering kan forbedre ydeevnen på store konti', + 'persist_ui': 'Vedvarende UI', 'persist_ui_help': - 'Save UI state locally to enable the app to start at the last location, disabling may improve performance', - 'client_postal_code': 'Client Postal Code', - 'client_vat_number': 'Client VAT Number', - 'has_tasks': 'Has Tasks', - 'registration': 'Registration', + 'Gem UI-tilstand lokalt for at aktivere appen til at starte på den sidste placering, deaktivering kan forbedre ydeevnen', + 'client_postal_code': 'Klient postnummer', + 'client_vat_number': 'Klient momsnummer', + 'has_tasks': 'Har opgaver', + 'registration': 'Registrering', 'unauthorized_stripe_warning': - 'Please authorize Stripe to accept online payments.', + 'Giv venligst Stripe tilladelse til at acceptere online Betalinger .', 'view_expense': 'View expense # :expense', 'view_statement': 'Se kontoudskrift', - 'sepa': 'SEPA Direct Debit', + 'sepa': 'SEPA direkte debitering', 'ideal': 'iDEAL', 'przelewy24': 'Przelewy24', 'eps': 'EPS', 'fpx': 'FPX', - 'update_all_records': 'Update all records', + 'update_all_records': 'Opdater alle poster', 'system': 'System', - 'set_default_company': 'Set Default Company', - 'updated_company': 'Successfully updated company', + 'set_default_company': 'Indstil standardfirma', + 'updated_company': 'Succesfuldt opdateret virksomhed', 'kbc': 'KBC', 'bancontact': 'Bancontact', - 'why_are_you_leaving': 'Help us improve by telling us why (optional)', - 'webhook_success': 'Webhook Success', - 'error_cross_client_tasks': 'Tasks must all belong to the same client', - 'error_cross_client_expenses': - 'Expenses must all belong to the same client', + 'why_are_you_leaving': + 'Hjælp os med at blive bedre ved at fortælle os hvorfor (valgfrit)', + 'webhook_success': 'Webhook succes', + 'error_cross_client_tasks': + 'Opgaverne skal alle tilhøre den samme Klient', + 'error_cross_client_expenses': 'Udgifter skal alle tilhøre samme Klient', 'app': 'App', - 'for_best_performance': 'For the best performance download the :app app', - 'gross_line_total': 'Gross line total', - 'bulk_email_invoices': 'Email Invoices', - 'bulk_email_quotes': 'Email Quotes', - 'bulk_email_credits': 'Email Credits', - 'from_name': 'From Name', - 'clone_to_expense': 'Clone to Expense', - 'recurring_expense': 'Recurring Expense', - 'recurring_expenses': 'Recurring Expenses', - 'new_recurring_expense': 'New Recurring Expense', - 'edit_recurring_expense': 'Edit Recurring Expense', - 'created_recurring_expense': 'Successfully created recurring expense', - 'updated_recurring_expense': 'Successfully updated recurring expense', - 'archived_recurring_expense': 'Successfully archived recurring expense', - 'deleted_recurring_expense': 'Successfully deleted recurring expense', - 'removed_recurring_expense': 'Successfully removed recurring expense', - 'restored_recurring_expense': 'Successfully restored recurring expense', - 'search_recurring_expense': 'Search Recurring Expense', - 'search_recurring_expenses': 'Search Recurring Expenses', - 'last_sent_date': 'Last Sent Date', - 'include_drafts': 'Include Drafts', - 'include_drafts_help': 'Include draft records in reports', - 'is_invoiced': 'Is Invoiced', - 'change_plan': 'Manage Plan', - 'persist_data': 'Persist Data', - 'customer_count': 'Customer Count', - 'verify_customers': 'Verify Customers', + 'for_best_performance': + 'For den bedste ydeevne skal du downloade :app -appen', + 'gross_line_total': 'Bruttolinje Total', + 'bulk_email_invoices': 'e-mail Fakturaer', + 'bulk_email_quotes': 'e-mail tilbud', + 'bulk_email_credits': 'e-mail Credits', + 'from_name': 'Fra Navn', + 'clone_to_expense': 'Klon til Udgift', + 'recurring_expense': 'Gentagen Udgift', + 'recurring_expenses': 'Gentagen Udgifter', + 'new_recurring_expense': 'Ny Gentagen Udgift', + 'edit_recurring_expense': 'Redigér Gentagen Udgift', + 'created_recurring_expense': 'Succesfuldt oprettet Gentagen Udgift', + 'updated_recurring_expense': 'Succesfuldt opdateret Gentagen Udgift', + 'archived_recurring_expense': 'Succesfuldt arkiveret Gentagen Udgift', + 'deleted_recurring_expense': 'Succesfuldt slettet Gentagen Udgift', + 'removed_recurring_expense': 'Succesfuldt fjernet Gentagen Udgift', + 'restored_recurring_expense': 'Succesfuldt genskabt Gentagen Udgift', + 'search_recurring_expense': 'Søg Gentagen Udgift', + 'search_recurring_expenses': 'Søg Gentagen Udgifter', + 'last_sent_date': 'Sidste afsendelsesdato', + 'include_drafts': 'Inkluder udkast', + 'include_drafts_help': 'Medtag udkast til poster i rapporter', + 'is_invoiced': 'Er faktureret', + 'change_plan': 'Administrer plan', + 'persist_data': 'Vedvarende data', + 'customer_count': 'Kundeantal', + 'verify_customers': 'Bekræft kunder', 'google_analytics': 'Google Analytics', - 'google_analytics_tracking_id': 'Google Analytics Tracking ID', - 'decimal_comma': 'Decimal Comma', - 'use_comma_as_decimal_place': 'Use comma as decimal place in forms', - 'select_method': 'Select Method', - 'select_platform': 'Select Platform', + 'google_analytics_tracking_id': 'Google Analytics sporings-id', + 'decimal_comma': 'Decimalkomma', + 'use_comma_as_decimal_place': 'Brug komma som decimal i formularer', + 'select_method': 'Vælg metode', + 'select_platform': 'Vælg Platform', 'use_web_app_to_connect_gmail': - 'Please use the web app to connect to Gmail', - 'expense_tax_help': 'Item tax rates are disabled', - 'enable_markdown': 'Enable Markdown', - 'enable_markdown_help': 'Convert markdown to HTML on the PDF', + 'Brug webappen til at oprette forbindelse til Gmail', + 'expense_tax_help': 'Vareafgiftssatser er deaktiveret', + 'enable_markdown': 'Aktiver Markdown', + 'enable_markdown_help': 'Konverter markdown til HTML på PDF', 'user_guide': 'Brugerguide', - 'add_second_contact': 'Add Second Contact', - 'previous_page': 'Previous Page', - 'next_page': 'Next Page', - 'export_colors': 'Export Colors', - 'import_colors': 'Import Colors', - 'clear_all': 'Clear All', - 'contrast': 'Contrast', - 'custom_colors': 'Custom Colors', - 'colors': 'Colors', - 'sidebar_active_background_color': 'Sidebar Active Background Color', - 'sidebar_active_font_color': 'Sidebar Active Font Color', - 'sidebar_inactive_background_color': 'Sidebar Inactive Background Color', - 'sidebar_inactive_font_color': 'Sidebar Inactive Font Color', + 'add_second_contact': 'Tilføj anden kontakt', + 'previous_page': 'Forrige side', + 'next_page': 'Næste side', + 'export_colors': 'Eksporter farver', + 'import_colors': 'Importer farver', + 'clear_all': 'Slet alt', + 'contrast': 'Kontrast', + 'custom_colors': 'Speciel farver', + 'colors': 'Farver', + 'sidebar_active_background_color': 'Sidebar aktiv baggrundsfarve', + 'sidebar_active_font_color': 'Sidebar aktiv skrifttypefarve', + 'sidebar_inactive_background_color': 'Sidebjælke inaktiv baggrundsfarve', + 'sidebar_inactive_font_color': 'Sidebjælke inaktiv skrifttypefarve', 'table_alternate_row_background_color': - 'Table Alternate Row Background Color', - 'invoice_header_background_color': 'Invoice Header Background Color', - 'invoice_header_font_color': 'Invoice Header Font Color', + 'Tabel Alternativ Række baggrundsfarve', + 'invoice_header_background_color': 'Faktura Header Baggrundsfarve', + 'invoice_header_font_color': 'Faktura Header Font Farve', 'net_subtotal': 'Net', - 'review_app': 'Review App', - 'check_status': 'Check Status', - 'free_trial': 'Free Trial', + 'review_app': 'Gennemgå app', + 'check_status': 'Tjek Status', + 'free_trial': 'Gratis prøveversion', 'free_trial_ends_in_days': - 'The Pro plan trial ends in :count days, click to upgrade.', + 'Prøveversionen af Pro-planen slutter om :count dage, klik for at opgradere.', 'free_trial_ends_today': - 'Today is the last day of the Pro plan trial, click to upgrade.', - 'change_email': 'Change Email', + 'I dag er den sidste dag af prøveversionen af Pro-planen, klik for at opgradere.', + 'change_email': 'Skift e-mail', 'client_portal_domain_hint': - 'Optionally configure a separate client portal domain', - 'tasks_shown_in_portal': 'Tasks Shown in Portal', - 'uninvoiced': 'Uninvoiced', + 'Konfigurer eventuelt et separat Klient portaldomæne', + 'tasks_shown_in_portal': 'Opgaver vist i portalen', + 'uninvoiced': 'Ufaktureret', 'subdomain_guide': - 'The subdomain is used in the client portal to personalize links to match your brand. ie, https://your-brand.invoicing.co', - 'send_time': 'Send Time', + 'Underdomænet bruges i Klient portalen til at tilpasse links, så de matcher dit brand. dvs. https://dit-mærke. Fakturering .co', + 'send_time': 'Send tid', 'import_data': 'Import Data', - 'import_settings': 'Import Settings', - 'json_file_missing': 'Please provide the JSON file', - 'json_option_missing': 'Please select to import the settings and/or data', + 'import_settings': 'Import Indstillinger', + 'json_file_missing': 'Angiv venligst JSON-filen', + 'json_option_missing': + 'Vælg venligst at importere Indstillinger og/eller data', 'json': 'JSON', - 'no_payment_types_enabled': 'No payment types enabled', - 'wait_for_data': 'Please wait for the data to finish loading', - 'net_total': 'Net Total', - 'has_taxes': 'Has Taxes', - 'import_customers': 'Import Customers', - 'imported_customers': 'Successfully started importing customers', - 'login_success': 'Successful Login', - 'login_failure': 'Failed Login', + 'no_payment_types_enabled': 'Ingen Betaling aktiveret', + 'wait_for_data': 'Vent venligst på, at dataene er færdige med at indlæse', + 'net_total': 'Netto Total', + 'has_taxes': 'Har Skatter', + 'import_customers': 'Importer kunder', + 'imported_customers': 'Succesfuldt begyndte at importere kunder', + 'login_success': 'Vellykket login', + 'login_failure': 'Mislykket login', 'exported_data': - 'Once the file is ready you\'ll receive an email with a download link', - 'include_deleted_clients': 'Include Deleted Clients', + 'Når filen er klar, modtager du en e-mail med et downloadlink', + 'include_deleted_clients': 'Inkluder slettet Klienter', 'include_deleted_clients_help': - 'Load records belonging to deleted clients', - 'step_1_sign_in': 'Step 1: Sign In', - 'step_2_authorize': 'Step 2: Authorize', - 'account_id': 'Account ID', - 'migration_not_yet_completed': 'The migration has not yet completed', - 'activity_100': ':user created recurring invoice :recurring_invoice', - 'activity_101': ':user updated recurring invoice :recurring_invoice', - 'activity_102': ':user archived recurring invoice :recurring_invoice', - 'activity_103': ':user deleted recurring invoice :recurring_invoice', - 'activity_104': ':user restored recurring invoice :recurring_invoice', - 'show_task_end_date': 'Show Task End Date', - 'show_task_end_date_help': 'Enable specifying the task end date', - 'gateway_setup': 'Gateway Setup', - 'preview_sidebar': 'Preview Sidebar', - 'years_data_shown': 'Years Data Shown', - 'ended_all_sessions': 'Successfully ended all sessions', - 'end_all_sessions': 'End All Sessions', - 'count_session': '1 Session', - 'count_sessions': ':count Sessions', - 'invoice_created': 'Invoice Created', - 'quote_created': 'Quote Created', - 'credit_created': 'Credit Created', + 'Indlæs poster tilhørende slettet Klienter', + 'step_1_sign_in': 'Trin 1: Log ind', + 'step_2_authorize': 'Trin 2: Godkend', + 'account_id': 'Konto-id', + 'migration_not_yet_completed': 'Migreringen er endnu ikke afsluttet', + 'activity_100': ':user oprettet Gentagen Faktura :recurring_invoice', + 'activity_101': ':user opdateret Gentagen Faktura :recurring_invoice', + 'activity_102': ':user arkiveret Gentagen Faktura :recurring_invoice', + 'activity_103': ':user slettet Gentagen Faktura :recurring_invoice', + 'activity_104': ':user genskabt Gentagen Faktura :recurring_invoice', + 'show_task_end_date': 'Vis Opgave Slutdato', + 'show_task_end_date_help': 'Aktiver angivelse af Opgave slutdatoen', + 'gateway_setup': 'Gateway opsætning', + 'preview_sidebar': 'Forhåndsvisning af sidebjælke', + 'years_data_shown': 'Årsdata vist', + 'ended_all_sessions': 'Succesfuldt afsluttede alle sessioner', + 'end_all_sessions': 'Afslut alle sessioner', + 'count_session': '1 session', + 'count_sessions': ':count Sessioner', + 'invoice_created': 'Faktura oprettet', + 'quote_created': 'Citat oprettet', + 'credit_created': 'Kredit oprettet', 'pro': 'Pro', 'enterprise': 'Enterprise', 'last_updated': 'Senest opdateret', - 'invoice_item': 'Invoice Item', - 'quote_item': 'Quote Item', - 'contact_first_name': 'Contact First Name', - 'contact_last_name': 'Contact Last Name', - 'order': 'Order', + 'invoice_item': 'Faktura vare', + 'quote_item': 'Citat vare', + 'contact_first_name': 'kontakt Fornavn', + 'contact_last_name': 'kontakt Efternavn', + 'order': 'Bestille', 'unassigned': 'Ikke tilknyttet', 'partial_value': 'Skal være større end nul og mindre end totalen', - 'search_kanban': 'Search Kanban', - 'search_kanbans': 'Search Kanban', + 'search_kanban': 'Søg efter Kanban', + 'search_kanbans': 'Søg efter Kanban', 'kanban': 'Kanban', 'enable': 'Aktivér', - 'move_top': 'Move Top', - 'move_up': 'Move Up', - 'move_down': 'Move Down', - 'move_bottom': 'Move Bottom', + 'move_top': 'Flyt Top', + 'move_up': 'Flyt op', + 'move_down': 'Flyt ned', + 'move_bottom': 'Flyt bund', 'subdomain_help': 'Angiv subdomænet eller vis fakturaen på din egen hjemmeside.', 'body_variable_missing': - 'Error: the custom email must include a :body variable', - 'add_body_variable_message': 'Make sure to include a :body variable', - 'view_date_formats': 'View Date Formats', - 'is_viewed': 'Is Viewed', - 'letter': 'Letter', - 'legal': 'Legal', - 'page_layout': 'Page Layout', - 'portrait': 'Portrait', - 'landscape': 'Landscape', + 'Fejl: Speciel e-mail skal indeholde en :body variabel', + 'add_body_variable_message': 'Sørg for at inkludere en :body -variabel', + 'view_date_formats': 'Vis datoformater', + 'is_viewed': 'Er set', + 'letter': 'Brev', + 'legal': 'gyldige', + 'page_layout': 'Sidelayout', + 'portrait': 'Portræt', + 'landscape': 'Landskab', 'owner_upgrade_to_paid_plan': - 'The account owner can upgrade to a paid plan to enable the advanced advanced settings', + 'Kontoejeren kan opgradere til en betalt plan for at aktivere de avancerede avancerede Indstillinger', 'upgrade_to_paid_plan': - 'Upgrade to a paid plan to enable the advanced settings', - 'invoice_payment_terms': 'Invoice Payment Terms', - 'quote_valid_until': 'Quote Valid Until', - 'no_headers': 'No Headers', - 'add_header': 'Add Header', - 'remove_header': 'Remove Header', - 'return_url': 'Return URL', - 'rest_method': 'REST Method', - 'header_key': 'Header Key', - 'header_value': 'Header Value', - 'recurring_products': 'Recurring Products', - 'promo_code': 'Promo code', - 'promo_discount': 'Promo Discount', - 'allow_cancellation': 'Allow Cancellation', - 'per_seat_enabled': 'Per Seat Enabled', - 'max_seats_limit': 'Max Seats Limit', - 'trial_enabled': 'Trial Enabled', - 'trial_duration': 'Trial Duration', - 'allow_query_overrides': 'Allow Query Overrides', - 'allow_plan_changes': 'Allow Plan Changes', - 'plan_map': 'Plan Map', - 'refund_period': 'Refund Period', - 'webhook_configuration': 'Webhook Configuration', - 'purchase_page': 'Purchase Page', + 'Opgrader til en betalt plan for at aktivere de avancerede Indstillinger', + 'invoice_payment_terms': 'Faktura Betaling Betingelser', + 'quote_valid_until': 'Tilbud Gælder til', + 'no_headers': 'Ingen overskrifter', + 'add_header': 'Tilføj Header', + 'remove_header': 'Fjern overskrift', + 'return_url': 'Returner URL', + 'rest_method': 'REST metode', + 'header_key': 'Hovednøgle', + 'header_value': 'Overskriftsværdi', + 'recurring_products': 'Gentagen produkter', + 'promo_code': 'Tilbudskode', + 'promo_discount': 'Kampagne rabat', + 'allow_cancellation': 'Tillad annullering', + 'per_seat_enabled': 'Per sæde aktiveret', + 'max_seats_limit': 'Max sædergrænse', + 'trial_enabled': 'Prøveversion aktiveret', + 'trial_duration': 'Prøvens varighed', + 'allow_query_overrides': 'Tillad tilsidesættelse af forespørgsler', + 'allow_plan_changes': 'Tillad planændringer', + 'plan_map': 'Plankort', + 'refund_period': 'Tilbagebetalingsperiode', + 'webhook_configuration': 'Webhook-konfiguration', + 'purchase_page': 'Købsside', 'security': 'Sikkerhed', - 'email_bounced': 'Email Bounced', - 'email_spam_complaint': 'Spam Complaint', - 'email_delivery': 'Email Delivery', - 'webhook_response': 'Webhook Response', - 'pdf_response': 'PDF Response', - 'authentication_failure': 'Authentication Failure', - 'pdf_failed': 'PDF Failed', - 'pdf_success': 'PDF Success', - 'modified': 'Modified', - 'payment_link': 'Payment Link', - 'new_payment_link': 'New Payment Link', - 'edit_payment_link': 'Edit Payment Link', - 'created_payment_link': 'Successfully created payment link', - 'updated_payment_link': 'Successfully updated payment link', - 'archived_payment_link': 'Successfully archived payment link', - 'deleted_payment_link': 'Successfully deleted payment link', - 'removed_payment_link': 'Successfully removed payment link', - 'restored_payment_link': 'Successfully restored payment link', - 'search_payment_link': 'Search 1 Payment Link', - 'search_payment_links': 'Search :count Payment Links', - 'subdomain_is_not_available': 'Subdomain is not available', - 'connect_gmail': 'Connect Gmail', - 'disconnect_gmail': 'Disconnect Gmail', - 'connected_gmail': 'Successfully connected Gmail', - 'disconnected_gmail': 'Successfully disconnected Gmail', + 'email_bounced': 'e-mail Bounced', + 'email_spam_complaint': 'Spam klage', + 'email_delivery': 'e-mail levering', + 'webhook_response': 'Webhook-svar', + 'pdf_response': 'PDF svar', + 'authentication_failure': 'Godkendelsesfejl', + 'pdf_failed': 'PDF mislykkedes', + 'pdf_success': 'PDF succes', + 'modified': 'Ændret', + 'payment_link': 'Betaling Link', + 'new_payment_link': 'Nyt Betaling', + 'edit_payment_link': 'Redigér Betaling Link', + 'created_payment_link': 'Succesfuldt oprettet Betaling link', + 'updated_payment_link': 'Succesfuldt opdateret Betaling link', + 'archived_payment_link': 'Succesfuldt arkiveret Betaling link', + 'deleted_payment_link': 'Succesfuldt slettet Betaling link', + 'removed_payment_link': 'Succesfuldt fjernet Betaling', + 'restored_payment_link': 'Succesfuldt genskabt Betaling link', + 'search_payment_link': 'Søg 1 Betaling Link', + 'search_payment_links': 'Søg :count Betaling Links', + 'subdomain_is_not_available': 'Underdomæne er ikke tilgængeligt', + 'connect_gmail': 'Tilslut Gmail', + 'disconnect_gmail': 'Afbryd forbindelsen til Gmail', + 'connected_gmail': 'Succesfuldt forbundet Gmail', + 'disconnected_gmail': 'Succesfuldt afbrudt Gmail', 'update_fail_help': - 'Changes to the codebase may be blocking the update, you can run this command to discard the changes:', - 'client_id_number': 'Client ID Number', - 'count_minutes': ':count Minutes', - 'password_timeout': 'Password Timeout', - 'shared_invoice_credit_counter': 'Share Invoice/Credit Counter', - 'use_last_email': 'Use last email', - 'activate_company': 'Activate Company', + 'Ændringer i kodebasen blokerer muligvis for opdateringen. Du kan køre denne kommando for at kassere ændringerne:', + 'client_id_number': 'Klient ID-nummer', + 'count_minutes': ':count Minutter', + 'password_timeout': 'Adgangskode timeout', + 'shared_invoice_credit_counter': 'Del Faktura /Kredittæller', + 'use_last_email': 'Brug sidste e-mail', + 'activate_company': 'Aktiver virksomheden', 'activate_company_help': - 'Enable emails, recurring invoices and notifications', - 'an_error_occurred_try_again': 'An error occurred, please try again', - 'please_first_set_a_password': 'Please first set a password', + 'Aktiver e-mails, Gentagen Fakturaer og meddelelser', + 'an_error_occurred_try_again': 'Der opstod en fejl, prøv venligst igen', + 'please_first_set_a_password': 'Indstil venligst først en adgangskode', 'changing_phone_disables_two_factor': - 'Warning: Changing your phone number will disable 2FA', - 'help_translate': 'Help Translate', - 'please_select_a_country': 'Please select a country', - 'resend_invite': 'Resend Invitation', - 'disabled_two_factor': 'Successfully disabled 2FA', - 'connected_google': 'Successfully connected account', - 'disconnected_google': 'Successfully disconnected account', - 'delivered': 'Delivered', + 'Advarsel: Ændring af dit Telefon vil deaktivere 2FA', + 'help_translate': 'Hjælp til at oversætte', + 'please_select_a_country': 'Vælg venligst et land', + 'resend_invite': 'Send invitation igen', + 'disabled_two_factor': 'Succesfuldt deaktiveret 2FA', + 'connected_google': 'Succesfuldt forbundet konto', + 'disconnected_google': 'Succesfuldt afbrudt konto', + 'delivered': 'Leveret', 'bounced': 'Bounced', 'spam': 'Spam', - 'view_docs': 'View Docs', + 'view_docs': 'Vis Docs', 'enter_phone_to_enable_two_factor': - 'Please provide a mobile phone number to enable two factor authentication', + 'Angiv venligst et Telefon for at aktivere tofaktorautentificering', 'send_sms': 'Send SMS', - 'sms_code': 'SMS Code', - 'two_factor_setup_help': 'Scan the bar code with a :link compatible app.', - 'enabled_two_factor': 'Successfully enabled Two-Factor Authentication', - 'connect_google': 'Connect Google', - 'disconnect_google': 'Disconnect Google', - 'enable_two_factor': 'Two-Factor Authentication', - 'disable_two_factor': 'Disable Two Factor', + 'sms_code': 'SMS kode', + 'two_factor_setup_help': 'Scan stregkoden med en :link kompatibel app.', + 'enabled_two_factor': 'Succesfuldt aktiveret to-faktor-godkendelse', + 'connect_google': 'Tilslut Google', + 'disconnect_google': 'Afbryd forbindelsen til Google', + 'enable_two_factor': 'To-faktor-godkendelse', + 'disable_two_factor': 'Deaktiver tofaktor', 'require_password_with_social_login': - 'Require Password with Social Login', - 'stay_logged_in': 'Stay Logged In', - 'session_about_to_expire': 'Warning: Your session is about to expire', - 'count_hours': ':count Hours', - 'count_day': '1 Day', - 'count_days': ':count Days', - 'web_session_timeout': 'Web Session Timeout', - 'security_settings': 'Security Settings', - 'resend_email': 'Resend Email', - 'confirm_your_email_address': 'Please confirm your email address', + 'Kræv adgangskode med socialt login', + 'stay_logged_in': 'Forbliv logget ind', + 'session_about_to_expire': 'Advarsel: Din session er ved at udløbe', + 'count_hours': ':count Timer', + 'count_day': '1 dag', + 'count_days': ':count dage', + 'web_session_timeout': 'Websession timeout', + 'security_settings': 'Indstillinger', + 'resend_email': 'Send e-mail igen', + 'confirm_your_email_address': 'Bekræft venligst din e-mail', 'refunded_payment': 'Refunderet betaling', - 'partially_unapplied': 'Partially Unapplied', - 'select_a_gmail_user': 'Please select a user authenticated with Gmail', - 'list_long_press': 'List Long Press', - 'show_actions': 'Show Actions', + 'partially_unapplied': 'Delvist ikke anvendt', + 'select_a_gmail_user': + 'Vælg venligst en Bruger , der er godkendt med Gmail', + 'list_long_press': 'Liste Langt tryk', + 'show_actions': 'Vis handlinger', 'start_multiselect': 'Start Multiselect', 'email_sent_to_confirm_email': - 'An email has been sent to confirm the email address', + 'Der er sendt en e-mail for at bekræfte e-mail', 'counter_pattern_error': - 'To use :client_counter please add either :client_number or :client_id_number to prevent conflicts', - 'this_quarter': 'This Quarter', + 'For at bruge :client _counter skal du Tilføj enten :client _number eller :client _id_number for at forhindre konflikter', + 'this_quarter': 'Dette Kvartal', 'last_quarter': 'Forrige kvartal', - 'to_update_run': 'To update run', + 'to_update_run': 'Kør for at opdatere', 'convert_to_invoice': 'Konvertér til en faktura', - 'registration_url': 'Registration URL', + 'registration_url': 'Registrerings-URL', 'invoice_project': 'Fakturér projekt', 'invoice_task': 'Fakturer opgave', 'invoice_expense': 'Invoice Expense', - 'search_payment_term': 'Search 1 Payment Term', - 'search_payment_terms': 'Search :count Payment Terms', - 'save_and_preview': 'Save and Preview', - 'save_and_email': 'Save and Email', - 'supported_events': 'Supported Events', - 'converted_amount': 'Converted Amount', - 'converted_balance': 'Converted Balance', - 'converted_paid_to_date': 'Converted Paid to Date', - 'converted_credit_balance': 'Converted Credit Balance', - 'converted_total': 'Converted Total', - 'is_sent': 'Is Sent', - 'default_documents': 'Default Documents', - 'document_upload': 'Document Upload', - 'document_upload_help': 'Enable clients to upload documents', - 'expense_total': 'Expense Total', - 'enter_taxes': 'Enter Taxes', - 'by_rate': 'By Rate', - 'by_amount': 'By Amount', - 'enter_amount': 'Enter Amount', - 'before_taxes': 'Before Taxes', - 'after_taxes': 'After Taxes', - 'color': 'Color', - 'show': 'Show', + 'search_payment_term': 'Søg 1 Betaling Term', + 'search_payment_terms': 'Søg :count Betaling Betingelser', + 'save_and_preview': 'Gem og Preview', + 'save_and_email': 'Gem og e-mail', + 'supported_events': 'Understøttede begivenheder', + 'converted_amount': 'Ombygget Beløb', + 'converted_balance': 'Konverteret saldo', + 'converted_paid_to_date': 'Konverteret betalt til dato', + 'converted_credit_balance': 'Konverteret kreditsaldo', + 'converted_total': 'Omregnet Total', + 'is_sent': 'Er sendt', + 'default_documents': 'Standarddokumenter', + 'document_upload': 'Dokument upload', + 'document_upload_help': 'Aktiver Klienter for at uploade dokumenter', + 'expense_total': 'Udgift Total', + 'enter_taxes': 'Indtast Skatter', + 'by_rate': 'Efter sats', + 'by_amount': 'Ved Beløb', + 'enter_amount': 'Indtast Beløb', + 'before_taxes': 'Før skat', + 'after_taxes': 'Efter skat', + 'color': 'Farve', + 'show': 'At vise', 'hide': 'Skjul', - 'empty_columns': 'Empty Columns', - 'debug_mode_is_enabled': 'Debug mode is enabled', + 'empty_columns': 'Tomme kolonner', + 'debug_mode_is_enabled': 'Debug-tilstand er aktiveret', 'debug_mode_is_enabled_help': - 'Warning: it is intended for use on local machines, it can leak credentials. Click to learn more.', - 'running_tasks': 'Running Tasks', - 'recent_tasks': 'Recent Tasks', - 'recent_expenses': 'Recent Expenses', - 'upcoming_expenses': 'Upcoming Expenses', - 'update_app': 'Update App', - 'started_import': 'Successfully started import', - 'duplicate_column_mapping': 'Duplicate column mapping', - 'uses_inclusive_taxes': 'Uses Inclusive Taxes', - 'is_amount_discount': 'Is Amount Discount', + 'Advarsel: det er beregnet til brug på lokale maskiner, det kan lække legitimationsoplysninger. Klik for at lære mere.', + 'running_tasks': 'Løbende opgaver', + 'recent_tasks': 'Seneste opgaver', + 'recent_expenses': 'Seneste Udgifter', + 'upcoming_expenses': 'Kommende Udgifter', + 'update_app': 'Opdater app', + 'started_import': 'Succesfuldt startet import', + 'duplicate_column_mapping': 'Dubleret kolonnetilknytning', + 'uses_inclusive_taxes': 'Bruger inklusive skatter', + 'is_amount_discount': 'Er Beløb Rabat', 'column': 'Kolonne', 'sample': 'Eksempel', - 'map_to': 'Map To', + 'map_to': 'Kort til', 'import': 'Importer', - 'first_row_as_column_names': 'Use first row as column names', + 'first_row_as_column_names': 'Brug første række som kolonnenavne', 'select_file': 'Venligst vælg en fil', - 'no_file_selected': 'No File Selected', + 'no_file_selected': 'Ingen fil valgt', 'csv_file': 'Vælg CSV-fil', 'csv': 'CSV', - 'freshbooks': 'FreshBooks', + 'freshbooks': 'Friske bøger', 'invoice2go': 'Invoice2go', - 'invoicely': 'Invoicely', - 'waveaccounting': 'Wave Accounting', + 'invoicely': 'Faktura', + 'waveaccounting': 'Wave regnskab', 'zoho': 'Zoho', - 'accounting': 'Accounting', - 'required_files_missing': 'Please provide all CSVs.', - 'import_type': 'Import Type', - 'html_mode': 'HTML Mode', - 'html_mode_help': 'Preview updates faster but is less accurate', - 'view_licenses': 'View Licenses', + 'accounting': 'Regnskab', + 'required_files_missing': 'Angiv alle CSV'er.', + 'import_type': 'Importtype', + 'html_mode': 'HTML-tilstand', + 'html_mode_help': + 'Forhåndsvisning opdateres hurtigere, men er mindre nøjagtig', + 'view_licenses': 'Vis licenser', 'webhook_url': 'Webhook URL', - 'fullscreen_editor': 'Fullscreen Editor', + 'fullscreen_editor': 'Fuldskærms-editor', 'sidebar_editor': 'Sidebar Editor', - 'please_type_to_confirm': 'Please type \':value\' to confirm', - 'purge': 'Purge', + 'please_type_to_confirm': + 'Indtast venligst " :value " for at bekræfte', + 'purge': 'Udrensning', 'service': 'Service', - 'clone_to': 'Clone To', - 'clone_to_other': 'Clone to Other', - 'labels': 'Labels', - 'add_custom': 'Add Custom', - 'payment_tax': 'Payment Tax', + 'clone_to': 'Klon Til', + 'clone_to_other': 'Klon til Andet', + 'labels': 'Etiketter', + 'add_custom': 'Tilføj Speciel', + 'payment_tax': 'Betaling Skat', 'unpaid': 'Ikke betalt', - 'white_label': 'White Label', - 'delivery_note': 'Delivery Note', - 'sent_invoices_are_locked': 'Sent invoices are locked', - 'paid_invoices_are_locked': 'Paid invoices are locked', - 'source_code': 'Source Code', - 'app_platforms': 'App Platforms', - 'invoice_late': 'Invoice Late', - 'quote_expired': 'Quote Expired', + 'white_label': 'Hvidmærke', + 'delivery_note': 'Levering Bemærk', + 'sent_invoices_are_locked': 'Sendte Fakturaer er låst', + 'paid_invoices_are_locked': 'Betalte Fakturaer er låst', + 'source_code': 'Kildekode', + 'app_platforms': 'App-platforme', + 'invoice_late': 'Faktura Sen', + 'quote_expired': 'Citat udløbet', 'partial_due': 'Partial Due', 'invoice_total': 'Faktura total', 'quote_total': 'Tilbud total', - 'credit_total': 'Credit Total', - 'recurring_invoice_total': 'Invoice Total', - 'actions': 'Actions', - 'expense_number': 'Expense Number', - 'task_number': 'Task Number', - 'project_number': 'Project Number', - 'project_name': 'Project Name', + 'credit_total': 'Kredit Total', + 'recurring_invoice_total': 'Faktura Total', + 'actions': 'Handlinger', + 'expense_number': 'Udgift', + 'task_number': 'Opgave nummer', + 'project_number': 'Projektnummer', + 'project_name': 'Projekt navn', 'warning': 'Advarsel', - 'view_settings': 'View Settings', + 'view_settings': 'Vis Indstillinger', 'company_disabled_warning': - 'Warning: this company has not yet been activated', - 'late_invoice': 'Late Invoice', - 'expired_quote': 'Expired Quote', - 'remind_invoice': 'Remind Invoice', + 'Advarsel: dette firma er endnu ikke blevet aktiveret', + 'late_invoice': 'Sen Faktura', + 'expired_quote': 'Udløbet citat', + 'remind_invoice': 'Mind Faktura', 'cvv': 'Kontrolcifre', 'client_name': 'Kundenavn', - 'client_phone': 'Client Phone', - 'required_fields': 'Required Fields', - 'calculated_rate': 'Calculated Rate', - 'default_task_rate': 'Default Task Rate', - 'clear_cache': 'Clear Cache', - 'sort_order': 'Sort Order', + 'client_phone': 'Klient Telefon', + 'required_fields': 'krævede felter', + 'calculated_rate': 'Beregnet rate', + 'default_task_rate': 'Standard Opgave Rate', + 'clear_cache': 'Ryd cache', + 'sort_order': 'Sorteringsrækkefølge', 'task_status': 'Status', - 'task_statuses': 'Task Statuses', - 'new_task_status': 'New Task Status', - 'edit_task_status': 'Edit Task Status', - 'created_task_status': 'Successfully created task status', - 'updated_task_status': 'Successfully update task status', - 'archived_task_status': 'Successfully archived task status', - 'deleted_task_status': 'Successfully deleted task status', - 'removed_task_status': 'Successfully removed task status', - 'restored_task_status': 'Successfully restored task status', - 'archived_task_statuses': 'Successfully archived :value task statuses', - 'deleted_task_statuses': 'Successfully deleted :value task statuses', - 'restored_task_statuses': 'Successfully restored :value task statuses', - 'search_task_status': 'Search 1 Task Status', - 'search_task_statuses': 'Search :count Task Statuses', - 'show_tasks_table': 'Show Tasks Table', + 'task_statuses': 'Opgave Statusser', + 'new_task_status': 'Ny Opgave Status', + 'edit_task_status': 'Redigér Opgave Status', + 'created_task_status': 'Succesfuldt oprettet Opgave status', + 'updated_task_status': 'Succesfuldt opdatere Opgave status', + 'archived_task_status': 'Succesfuldt arkiveret Opgave status', + 'deleted_task_status': 'Succesfuldt slettet Opgave status', + 'removed_task_status': 'Succesfuldt fjernet Opgave status', + 'restored_task_status': 'Succesfuldt genskabt Opgave status', + 'archived_task_statuses': 'Succesfuldt arkiveret :value Opgave statusser', + 'deleted_task_statuses': 'Succesfuldt slettet :value Opgave statusser', + 'restored_task_statuses': 'Succesfuldt genskabt :value Opgave statusser', + 'search_task_status': 'Søg 1 Opgave Status', + 'search_task_statuses': 'Søg :count Opgave Statuss', + 'show_tasks_table': 'Vis opgavetabellen', 'show_tasks_table_help': - 'Always show the tasks section when creating invoices', - 'invoice_task_timelog': 'Invoice Task Timelog', - 'invoice_task_timelog_help': 'Add time details to the invoice line items', - 'invoice_task_datelog': 'Invoice Task Datelog', - 'invoice_task_datelog_help': 'Add date details to the invoice line items', - 'auto_start_tasks_help': 'Start tasks before saving', - 'configure_statuses': 'Configure Statuses', - 'task_settings': 'Task Settings', - 'configure_categories': 'Configure Categories', + 'Vis altid opgaveafsnittet, når du opretter Fakturaer', + 'invoice_task_timelog': 'Faktura Opgave Timelog', + 'invoice_task_timelog_help': + 'Tilføj tidsdetaljer til Faktura linjeposterne', + 'invoice_task_datelog': 'Faktura Opgave Datelog', + 'invoice_task_datelog_help': + 'Tilføj datodetaljer til Faktura linjeposterne', + 'auto_start_tasks_help': 'Start opgaver før du gemmer', + 'configure_statuses': 'Konfigurer statusser', + 'task_settings': 'Opgave Indstillinger', + 'configure_categories': 'Konfigurer kategorier', 'expense_categories': 'Udgiftskategorier', 'new_expense_category': 'Ny udgiftskategori', - 'edit_expense_category': 'Edit Expense Category', + 'edit_expense_category': 'Redigér Udgift Kategori', 'created_expense_category': 'Udgiftskategori oprettet', 'updated_expense_category': 'Ajourført udgiftskategori', 'archived_expense_category': 'Udgiftskategori arkiveret', 'deleted_expense_category': 'Sletning af kategori er gennemført', - 'removed_expense_category': 'Successfully removed expense category', + 'removed_expense_category': 'Succesfuldt fjernet Udgift kategori', 'restored_expense_category': 'Udgiftskategori genoprettet', - 'archived_expense_categories': '.count udgiftskategori(er) arkiveret', - 'deleted_expense_categories': - 'Successfully deleted expense :value categories', - 'restored_expense_categories': - 'Successfully restored expense :value categories', - 'search_expense_category': 'Search 1 Expense Category', - 'search_expense_categories': 'Search :count Expense Categories', - 'use_available_credits': 'Use Available Credits', - 'show_option': 'Show Option', + 'archived_expense_categories': '.count udgiftskategori(er) arkiveret', + 'deleted_expense_categories': + 'Succesfuldt slettet Udgift :value kategorier', + 'restored_expense_categories': + 'Succesfuldt genskabt Udgift :value kategorier', + 'search_expense_category': 'Søg 1 Udgift Kategori', + 'search_expense_categories': 'Søg :count Udgift Kategorier', + 'use_available_credits': 'Brug tilgængelige kreditter', + 'show_option': 'Vis indstilling', 'negative_payment_error': - 'The credit amount cannot exceed the payment amount', - 'view_changes': 'View Changes', - 'force_update': 'Force Update', + 'Kreditten Beløb kan ikke overstige Betaling Beløb', + 'view_changes': 'Vis ændringer', + 'force_update': 'Gennemtving opdatering', 'force_update_help': - 'You are running the latest version but there may be pending fixes available.', - 'mark_paid_help': 'Track the expense has been paid', + 'Du kører den seneste version, men der kan være afventende rettelser tilgængelige.', + 'mark_paid_help': 'Spor Udgift er betalt', 'should_be_invoiced': 'Should be invoiced', - 'should_be_invoiced_help': 'Enable the expense to be invoiced', - 'add_documents_to_invoice_help': 'Make the documents visible to client', - 'convert_currency_help': 'Set an exchange rate', - 'expense_settings': 'Expense Settings', - 'clone_to_recurring': 'Clone to Recurring', - 'crypto': 'Crypto', + 'should_be_invoiced_help': 'Aktiver Udgift til at blive faktureret', + 'add_documents_to_invoice_help': 'Gør dokumenterne synlige for Klient', + 'convert_currency_help': 'Indstil en valutakurs', + 'expense_settings': 'Udgift Indstillinger', + 'clone_to_recurring': 'Klon til Gentagen', + 'crypto': 'Krypto', 'paypal': 'Paypal', 'alipay': 'Alipay', 'sofort': 'Sofort', 'apple_pay': 'Apple/Google Pay', - 'user_field': 'User Field', - 'variables': 'Variables', - 'show_password': 'Show Password', - 'hide_password': 'Hide Password', - 'copy_error': 'Copy Error', - 'capture_card': 'Capture Card', - 'auto_bill_enabled': 'Auto Bill Enabled', - 'total_taxes': 'Total Taxes', - 'line_taxes': 'Line Taxes', - 'total_fields': 'Total Fields', - 'stopped_recurring_invoice': 'Successfully stopped recurring invoice', - 'started_recurring_invoice': 'Successfully started recurring invoice', - 'resumed_recurring_invoice': 'Successfully resumed recurring invoice', - 'gateway_refund': 'Gateway Refund', - 'gateway_refund_help': 'Process the refund with the payment gateway', - 'due_date_days': 'Due Date', - 'paused': 'Paused', + 'user_field': 'Bruger Field', + 'variables': 'Variabler', + 'show_password': 'Vis adgangskode', + 'hide_password': 'Skjul adgangskode', + 'copy_error': 'Kopieringsfejl', + 'capture_card': 'Capture kort', + 'auto_bill_enabled': 'Automatisk fakturering aktiveret', + 'total_taxes': 'Total skatter', + 'line_taxes': 'Line Skatter', + 'total_fields': 'Felter Total', + 'stopped_recurring_invoice': 'Succesfuldt stoppede Gentagen Faktura', + 'started_recurring_invoice': 'Succesfuldt startede Gentagen Faktura', + 'resumed_recurring_invoice': 'Succesfuldt genoptog Gentagen Faktura', + 'gateway_refund': 'Gateway refusion', + 'gateway_refund_help': 'Behandle tilbagebetalingen med Betalingsgateway', + 'due_date_days': 'Afleveringsdato', + 'paused': 'Pause', 'mark_active': 'Markér som aktiv', - 'day_count': 'Day :count', - 'first_day_of_the_month': 'First Day of the Month', - 'last_day_of_the_month': 'Last Day of the Month', - 'use_payment_terms': 'Use Payment Terms', - 'endless': 'Endless', - 'next_send_date': 'Next Send Date', - 'remaining_cycles': 'Remaining Cycles', + 'day_count': 'Dag :count', + 'first_day_of_the_month': 'Første dag i måneden', + 'last_day_of_the_month': 'Sidste dag i måneden', + 'use_payment_terms': 'Brug Betaling Betingelser', + 'endless': 'Endeløs', + 'next_send_date': 'Næste afsendelsesdato', + 'remaining_cycles': 'Resterende cyklusser', 'recurring_invoice': 'Gentaget faktura', 'recurring_invoices': 'Gentagende fakturaer', 'new_recurring_invoice': 'Ny gentaget fakture', - 'edit_recurring_invoice': 'Edit Recurring Invoice', - 'created_recurring_invoice': 'Successfully created recurring invoice', - 'updated_recurring_invoice': 'Successfully updated recurring invoice', + 'edit_recurring_invoice': 'Redigér Gentagen Faktura', + 'created_recurring_invoice': 'Succesfuldt oprettet Gentagen Faktura', + 'updated_recurring_invoice': 'Succesfuldt opdateret Gentagen Faktura', 'archived_recurring_invoice': 'Successfully archived recurring invoice', 'deleted_recurring_invoice': 'Successfully deleted recurring invoice', - 'removed_recurring_invoice': 'Successfully removed recurring invoice', + 'removed_recurring_invoice': 'Succesfuldt fjernet Gentagen Faktura', 'restored_recurring_invoice': 'Successfully restored recurring invoice', 'archived_recurring_invoices': - 'Successfully archived recurring :value invoices', + 'Succesfuldt arkiveret Gentagen :value Fakturaer', 'deleted_recurring_invoices': - 'Successfully deleted recurring :value invoices', + 'Succesfuldt slettet Gentagen :value Fakturaer', 'restored_recurring_invoices': - 'Successfully restored recurring :value invoices', - 'search_recurring_invoice': 'Search 1 Recurring Invoice', - 'search_recurring_invoices': 'Search :count Recurring Invoices', - 'send_date': 'Send Date', + 'Succesfuldt genskabt Gentagen :value Fakturaer', + 'search_recurring_invoice': 'Søg 1 Gentagen Faktura', + 'search_recurring_invoices': 'Søg :count Gentagen Fakturaer', + 'send_date': 'Send dato', 'auto_bill_on': 'Auto Bill On', - 'minimum_under_payment_amount': 'Minimum Under Payment Amount', + 'minimum_under_payment_amount': 'Minimum Under Betaling Beløb', 'profit': 'Fortjeneste', - 'line_item': 'Line Item', - 'allow_over_payment': 'Allow Over Payment', - 'allow_over_payment_help': 'Support paying extra to accept tips', - 'allow_under_payment': 'Allow Under Payment', + 'line_item': 'Linjepost', + 'allow_over_payment': 'Tillad overbetaling', + 'allow_over_payment_help': + 'Support, der betaler ekstra for at modtage drikkepenge', + 'allow_under_payment': 'Tillad underbetaling', 'allow_under_payment_help': - 'Support paying at minimum the partial/deposit amount', - 'test_mode': 'Test Mode', - 'opened': 'Opened', - 'payment_reconciliation_failure': 'Reconciliation Failure', - 'payment_reconciliation_success': 'Reconciliation Success', - 'gateway_success': 'Gateway Success', - 'gateway_failure': 'Gateway Failure', - 'gateway_error': 'Gateway Error', - 'email_send': 'Email Send', - 'email_retry_queue': 'Email Retry Queue', - 'failure': 'Failure', - 'quota_exceeded': 'Quota Exceeded', - 'upstream_failure': 'Upstream Failure', - 'system_logs': 'System Logs', + 'Støtte betaling af minimum del-/depositum Beløb', + 'test_mode': 'Test mode', + 'opened': 'Åbnet', + 'payment_reconciliation_failure': 'Forsoningsfejl', + 'payment_reconciliation_success': 'Forsoningssucces', + 'gateway_success': 'Gateway succes', + 'gateway_failure': 'Gateway -fejl', + 'gateway_error': 'Gateway fejl', + 'email_send': 'e-mail Send', + 'email_retry_queue': 'e-mail Genforsøgskø', + 'failure': 'Fiasko', + 'quota_exceeded': 'Kvote overskredet', + 'upstream_failure': 'Upstream fiasko', + 'system_logs': 'Systemlogs', 'view_portal': 'Se Portal', - 'copy_link': 'Copy Link', + 'copy_link': 'Kopier link', 'token_billing': 'Gem kort detaljer', - 'welcome_to_invoice_ninja': 'Welcome to Invoice Ninja', + 'welcome_to_invoice_ninja': 'Velkommen til Faktura Ninja', 'always': 'Altid', - 'optin': 'Opt-In', - 'optout': 'Opt-Out', - 'label': 'Label', + 'optin': 'Tilmeld', + 'optout': 'Opt-out', + 'label': 'Etiket', 'client_number': 'Klientnummer', - 'auto_convert': 'Auto Convert', + 'auto_convert': 'Autokonvertering', 'company_name': 'Firma navn', - 'reminder1_sent': 'Reminder 1 Sent', - 'reminder2_sent': 'Reminder 2 Sent', - 'reminder3_sent': 'Reminder 3 Sent', - 'reminder_last_sent': 'Reminder Last Sent', - 'pdf_page_info': 'Page :current of :total', - 'emailed_invoices': 'Successfully emailed invoices', - 'emailed_quotes': 'Successfully emailed quotes', - 'emailed_credits': 'Successfully emailed credits', + 'reminder1_sent': 'Påmindelse 1 Sendt', + 'reminder2_sent': 'Påmindelse 2 Sendt', + 'reminder3_sent': 'Påmindelse 3 Sendt', + 'reminder_last_sent': 'Påmindelse sidst sendt', + 'pdf_page_info': 'Side :current af :total', + 'emailed_invoices': 'Succesfuldt mailede Fakturaer', + 'emailed_quotes': 'Succesfuldt mailede citater', + 'emailed_credits': 'Succesfuldt e-mailede kreditter', 'gateway': 'Gateway', - 'view_in_stripe': 'View in Stripe', - 'rows_per_page': 'Rows Per Page', + 'view_in_stripe': 'Vis i Stripe', + 'rows_per_page': 'Rækker pr. side', 'hours': 'Timer', 'statement': 'Kontoudtog', 'taxes': 'Skatter', - 'surcharge': 'Surcharge', - 'apply_payment': 'Apply Payment', + 'surcharge': 'Ekstragebyr', + 'apply_payment': 'Ansøg Betaling', 'apply_credit': 'Apply Credit', - 'apply': 'Apply', - 'unapplied': 'Unapplied', - 'select_label': 'Select Label', - 'custom_labels': 'Custom Labels', + 'apply': 'ansøge', + 'unapplied': 'Ikke anvendt', + 'select_label': 'Vælg Label', + 'custom_labels': 'Speciel etiketter', 'record_type': 'Record Type', - 'record_name': 'Record Name', - 'file_type': 'File Type', - 'height': 'Height', - 'width': 'Width', + 'record_name': 'Optegnelsesnavn', + 'file_type': 'Filtype', + 'height': 'Højde', + 'width': 'Bredde', 'to': 'Til', - 'health_check': 'Health Check', + 'health_check': 'Sundhedstjek', 'payment_type_id': 'Betalingsmetode', - 'last_login_at': 'Last Login At', - 'company_key': 'Company Key', - 'storefront': 'Storefront', - 'storefront_help': 'Enable third-party apps to create invoices', - 'client_created': 'Client Created', - 'online_payment_email': 'Online Payment Email', - 'manual_payment_email': 'Manual Payment Email', - 'completed': 'Completed', - 'gross': 'Gross', - 'net_amount': 'Net Amount', - 'net_balance': 'Net Balance', - 'client_settings': 'Client Settings', - 'selected_invoices': 'Selected Invoices', - 'selected_payments': 'Selected Payments', - 'selected_quotes': 'Selected Quotes', - 'selected_tasks': 'Selected Tasks', - 'selected_expenses': 'Selected Expenses', + 'last_login_at': 'Sidste login kl', + 'company_key': 'Firmanøgle', + 'storefront': 'Butiksfacade', + 'storefront_help': 'Aktiver tredjepartsapps til Opret Fakturaer', + 'client_created': 'Klient oprettet', + 'online_payment_email': 'Online Betaling e-mail', + 'manual_payment_email': 'Manuel Betaling e-mail', + 'completed': 'Afsluttet', + 'gross': 'Brutto', + 'net_amount': 'Net Beløb', + 'net_balance': 'Nettobalance', + 'client_settings': 'Klient Indstillinger', + 'selected_invoices': 'Udvalgte Fakturaer', + 'selected_payments': 'Valgte Betalinger', + 'selected_quotes': 'Udvalgte citater', + 'selected_tasks': 'Udvalgte opgaver', + 'selected_expenses': 'Udvalgte Udgifter', 'upcoming_invoices': 'Kommende fakturaer', - 'past_due_invoices': 'Past Due Invoices', + 'past_due_invoices': 'Forfaldne Fakturaer', 'recent_payments': 'Nylige betalinger', 'upcoming_quotes': 'Upcoming Quotes', 'expired_quotes': 'Expired Quotes', - 'create_client': 'Create Client', + 'create_client': 'Opret Klient', 'create_invoice': 'Opret faktura', 'create_quote': 'Opret tilbud', - 'create_payment': 'Create Payment', - 'create_vendor': 'Create vendor', - 'update_quote': 'Update Quote', + 'create_payment': 'Opret Betaling', + 'create_vendor': 'Opret Sælger', + 'update_quote': 'Opdater citat', 'delete_quote': 'Slet tilbud', - 'update_invoice': 'Update Invoice', + 'update_invoice': 'Opdater Faktura', 'delete_invoice': 'Slet faktura', - 'update_client': 'Update Client', + 'update_client': 'Opdater Klient', 'delete_client': 'Slet kunde', 'delete_payment': 'Slet betaling', - 'update_vendor': 'Update Vendor', + 'update_vendor': 'Opdater Sælger', 'delete_vendor': 'Slet sælger', - 'create_expense': 'Create Expense', - 'update_expense': 'Update Expense', + 'create_expense': 'Opret Udgift', + 'update_expense': 'Opdater Udgift', 'delete_expense': 'Delete Expense', 'create_task': 'Opret opgave', - 'update_task': 'Update Task', + 'update_task': 'Opdater Opgave', 'delete_task': 'Slet opgave', - 'approve_quote': 'Approve Quote', + 'approve_quote': 'Godkend citat', 'off': 'Deaktiver', - 'when_paid': 'When Paid', - 'expires_on': 'Expires On', + 'when_paid': 'Når betalt', + 'expires_on': 'Udløber på', 'free': 'Free', 'plan': 'Plan', - 'show_sidebar': 'Show Sidebar', - 'hide_sidebar': 'Hide Sidebar', - 'event_type': 'Event Type', - 'target_url': 'Target', - 'copy': 'Copy', - 'must_be_online': 'Please restart the app once connected to the internet', - 'crons_not_enabled': 'The crons need to be enabled', + 'show_sidebar': 'Vis sidebjælke', + 'hide_sidebar': 'Skjul sidebjælke', + 'event_type': 'Begivenhedstype', + 'target_url': 'Mål', + 'copy': 'Kopi', + 'must_be_online': + 'Genstart appen, når du har forbindelse til internettet', + 'crons_not_enabled': 'Crons skal aktiveres', 'api_webhooks': 'API Webhooks', - 'search_webhooks': 'Search :count Webhooks', - 'search_webhook': 'Search 1 Webhook', + 'search_webhooks': 'Søg efter :count Webhooks', + 'search_webhook': 'Søg 1 Webhook', 'webhook': 'Webhook', 'webhooks': 'Webhooks', - 'new_webhook': 'New Webhook', - 'edit_webhook': 'Edit Webhook', - 'created_webhook': 'Successfully created webhook', - 'updated_webhook': 'Successfully updated webhook', - 'archived_webhook': 'Successfully archived webhook', - 'deleted_webhook': 'Successfully deleted webhook', - 'removed_webhook': 'Successfully removed webhook', - 'restored_webhook': 'Successfully restored webhook', - 'archived_webhooks': 'Successfully archived :value webhooks', - 'deleted_webhooks': 'Successfully deleted :value webhooks', - 'removed_webhooks': 'Successfully removed :value webhooks', - 'restored_webhooks': 'Successfully restored :value webhooks', + 'new_webhook': 'Ny Webhook', + 'edit_webhook': 'Redigér Webhook', + 'created_webhook': 'Succesfuldt oprettet webhook', + 'updated_webhook': 'Succesfuldt opdateret webhook', + 'archived_webhook': 'Succesfuldt arkiveret webhook', + 'deleted_webhook': 'Succesfuldt slettet webhook', + 'removed_webhook': 'Succesfuldt fjernet webhook', + 'restored_webhook': 'Succesfuldt genskabt webhook', + 'archived_webhooks': 'Succesfuldt arkiveret :value webhooks', + 'deleted_webhooks': 'Succesfuldt slettet :value webhooks', + 'removed_webhooks': 'Succesfuldt fjernet :value webhooks', + 'restored_webhooks': 'Succesfuldt genskabt :value webhooks', 'api_tokens': 'API Token\'s', - 'api_docs': 'API Docs', - 'search_tokens': 'Search :count Tokens', - 'search_token': 'Search 1 Token', + 'api_docs': 'API-dokumenter', + 'search_tokens': 'Søg :count Tokens', + 'search_token': 'Søg efter 1 token', 'token': 'Token', 'tokens': 'Token\'s', - 'new_token': 'New Token', + 'new_token': 'Ny token', 'edit_token': 'Redigér token', 'created_token': 'Token oprettet', 'updated_token': 'Token opdateret', 'archived_token': 'Successfully archived token', 'deleted_token': 'Token slettet', - 'removed_token': 'Successfully removed token', - 'restored_token': 'Successfully restored token', - 'archived_tokens': 'Successfully archived :value tokens', - 'deleted_tokens': 'Successfully deleted :value tokens', - 'restored_tokens': 'Successfully restored :value tokens', - 'client_registration': 'Client Registration', + 'removed_token': 'Succesfuldt fjernet token', + 'restored_token': 'Succesfuldt genskabt token', + 'archived_tokens': 'Succesfuldt arkiveret :value tokens', + 'deleted_tokens': 'Succesfuldt slettet :value tokens', + 'restored_tokens': 'Succesfuldt genskabt :value tokens', + 'client_registration': 'Klient', 'client_registration_help': - 'Enable clients to self register in the portal', + 'Giv Klienter mulighed for selv at registrere sig i portalen', 'email_invoice': 'Send faktura som e-mail', 'email_quote': 'E-mail tilbuddet', - 'email_credit': 'Email Credit', - 'email_payment': 'Email Payment', - 'client_email_not_set': 'Client does not have an email address set', - 'ledger': 'Ledger', - 'view_pdf': 'View PDF', - 'all_records': 'All records', - 'owned_by_user': 'Owned by user', - 'credit_remaining': 'Credit Remaining', + 'email_credit': 'e-mail Kredit', + 'email_payment': 'e-mail Betaling', + 'client_email_not_set': 'Klient har ikke angivet en e-mail', + 'ledger': 'Hovedbog', + 'view_pdf': 'Vis PDF', + 'all_records': 'Alle optegnelser', + 'owned_by_user': 'Ejes af Bruger', + 'credit_remaining': 'Tilbageværende kredit', 'contact_name': 'Kontakt navn', - 'use_default': 'Use default', - 'reminder_endless': 'Endless Reminders', - 'number_of_days': 'Number of days', - 'configure_payment_terms': 'Configure Payment Terms', - 'payment_term': 'Payment Term', - 'new_payment_term': 'New Payment Term', + 'use_default': 'Brug standard', + 'reminder_endless': 'Uendelige påmindelser', + 'number_of_days': 'Antal dage', + 'configure_payment_terms': 'Konfigurer Betaling Betingelser', + 'payment_term': 'Betaling Term', + 'new_payment_term': 'Ny Betaling', 'edit_payment_term': 'Edit Payment Term', - 'created_payment_term': 'Successfully created payment term', - 'updated_payment_term': 'Successfully updated payment term', - 'archived_payment_term': 'Successfully archived payment term', - 'deleted_payment_term': 'Successfully deleted payment term', - 'removed_payment_term': 'Successfully removed payment term', - 'restored_payment_term': 'Successfully restored payment term', - 'archived_payment_terms': 'Successfully archived :value payment terms', - 'deleted_payment_terms': 'Successfully deleted :value payment terms', - 'restored_payment_terms': 'Successfully restored :value payment terms', - 'email_sign_in': 'Sign in with email', - 'change': 'Change', - 'change_to_mobile_layout': 'Change to the mobile layout?', - 'change_to_desktop_layout': 'Change to the desktop layout?', - 'send_from_gmail': 'Send from Gmail', - 'reversed': 'Reversed', - 'cancelled': 'Cancelled', + 'created_payment_term': 'Succesfuldt oprettet Betaling term', + 'updated_payment_term': 'Succesfuldt opdateret Betaling', + 'archived_payment_term': 'Succesfuldt arkiveret Betaling termin', + 'deleted_payment_term': 'Succesfuldt slettet Betaling termin', + 'removed_payment_term': 'Succesfuldt fjernet Betaling', + 'restored_payment_term': 'Succesfuldt genskabt Betaling termin', + 'archived_payment_terms': + 'Succesfuldt arkiveret :value Betaling Betingelser', + 'deleted_payment_terms': + 'Succesfuldt slettet :value Betaling Betingelser', + 'restored_payment_terms': + 'Succesfuldt genskabt :value Betaling Betingelser', + 'email_sign_in': 'Log ind med e-mail', + 'change': 'Lave om', + 'change_to_mobile_layout': 'Skift til mobillayoutet?', + 'change_to_desktop_layout': 'Skift til skrivebordslayout?', + 'send_from_gmail': 'Send fra Gmail', + 'reversed': 'Omvendt', + 'cancelled': 'Aflyst', 'credit_amount': 'Kreditbeløb', - 'quote_amount': 'Quote Amount', - 'hosted': 'Hosted', - 'selfhosted': 'Self-Hosted', + 'quote_amount': 'Citat Beløb', + 'hosted': 'Hostet', + 'selfhosted': 'Selvvært', 'exclusive': 'Eksklusiv', 'inclusive': 'Inklusiv', - 'hide_menu': 'Hide Menu', - 'show_menu': 'Show Menu', - 'partially_refunded': 'Partially Refunded', - 'search_documents': 'Search Documents', - 'search_designs': 'Search Designs', - 'search_invoices': 'Search Invoices', - 'search_clients': 'Search Clients', - 'search_products': 'Search Products', - 'search_quotes': 'Search Quotes', - 'search_credits': 'Search Credits', - 'search_vendors': 'Search Vendors', - 'search_users': 'Search Users', - 'search_tax_rates': 'Search Tax Rates', - 'search_tasks': 'Search Tasks', - 'search_settings': 'Search Settings', - 'search_projects': 'Search Projects', - 'search_expenses': 'Search Expenses', - 'search_payments': 'Search Payments', - 'search_groups': 'Search Groups', - 'search_company': 'Search Company', - 'search_document': 'Search 1 Document', - 'search_design': 'Search 1 Design', - 'search_invoice': 'Search 1 Invoice', - 'search_client': 'Search 1 Client', - 'search_product': 'Search 1 Product', - 'search_quote': 'Search 1 Quote', - 'search_credit': 'Search 1 Credit', - 'search_vendor': 'Search 1 Vendor', - 'search_user': 'Search 1 User', - 'search_tax_rate': 'Search 1 Tax Rate', - 'search_task': 'Search 1 Tasks', - 'search_project': 'Search 1 Project', - 'search_expense': 'Search 1 Expense', - 'search_payment': 'Search 1 Payment', - 'search_group': 'Search 1 Group', + 'hide_menu': 'Skjul menu', + 'show_menu': 'Vis menu', + 'partially_refunded': 'Delvist refunderet', + 'search_documents': 'Søg i dokumenter', + 'search_designs': 'Søg designs', + 'search_invoices': 'Søg Fakturaer', + 'search_clients': 'Søg efter Klienter', + 'search_products': 'Søg efter produkter', + 'search_quotes': 'Søg citater', + 'search_credits': 'Søg Credits', + 'search_vendors': 'Søg efter leverandører', + 'search_users': 'Søg efter brugere', + 'search_tax_rates': 'Søg efter skattesatser', + 'search_tasks': 'Søgeopgaver', + 'search_settings': 'Søg Indstillinger', + 'search_projects': 'Søg projekter', + 'search_expenses': 'Søgeudgifter', + 'search_payments': 'Søg Betalinger', + 'search_groups': 'Søg i grupper', + 'search_company': 'Søg efter firma', + 'search_document': 'Søg i 1 dokument', + 'search_design': 'Søg 1 Design', + 'search_invoice': 'Søg 1 Faktura', + 'search_client': 'Søg 1 Klient', + 'search_product': 'Søg 1 produkt', + 'search_quote': 'Søg 1 citat', + 'search_credit': 'Søg 1 kredit', + 'search_vendor': 'Søg 1 Sælger', + 'search_user': 'Søg efter 1 Bruger', + 'search_tax_rate': 'Søg 1 Skattesats', + 'search_task': 'Søg 1 Opgaver', + 'search_project': 'Søg 1 projekt', + 'search_expense': 'Søg 1 Udgift', + 'search_payment': 'Søg 1 Betaling', + 'search_group': 'Søg 1 gruppe', 'refund_payment': 'Refunder betaling', - 'cancelled_invoice': 'Successfully cancelled invoice', - 'cancelled_invoices': 'Successfully cancelled invoices', - 'reversed_invoice': 'Successfully reversed invoice', - 'reversed_invoices': 'Successfully reversed invoices', - 'reverse': 'Reverse', - 'full_name': 'Full Name', + 'cancelled_invoice': 'Succesfuldt aflyst Faktura', + 'cancelled_invoices': 'Succesfuldt aflyst Fakturaer', + 'reversed_invoice': 'Succesfuldt vendt Faktura', + 'reversed_invoices': 'Succesfuldt omvendt Fakturaer', + 'reverse': 'Baglæns', + 'full_name': 'Fulde navn', 'city_state_postal': 'By/Postnummer', 'postal_city_state': 'Postnummer/By/Region', - 'custom1': 'First Custom', - 'custom2': 'Second Custom', - 'custom3': 'Third Custom', - 'custom4': 'Fourth Custom', - 'optional': 'Optional', - 'license': 'License', - 'purge_data': 'Purge Data', - 'purge_successful': 'Successfully purged company data', + 'custom1': 'Første Speciel', + 'custom2': 'Andet Speciel', + 'custom3': 'Tredje Speciel', + 'custom4': 'Fjerde Speciel', + 'optional': 'Valgfri', + 'license': 'Licens', + 'purge_data': 'Rens data', + 'purge_successful': 'Succesfuldt rensede virksomhedsdata', 'purge_data_message': 'Advarsel: Dette vil slette dine data permanent, der er ingen måder at fortryde.', - 'invoice_balance': 'Invoice Balance', + 'invoice_balance': 'Faktura Balance', 'age_group_0': '0 - 30 dage', 'age_group_30': '30 - 60 dage', 'age_group_60': '60 - 90 dage', 'age_group_90': '90 - 120 dage', 'age_group_120': '120+ dage', - 'refresh': 'Refresh', - 'saved_design': 'Successfully saved design', - 'client_details': 'Client Details', - 'company_address': 'Company Address', + 'refresh': 'Opdater', + 'saved_design': 'Succesfuldt gemt design', + 'client_details': 'Klient', + 'company_address': 'Virksomhedens adresse', 'invoice_details': 'Fakturadetaljer', - 'quote_details': 'Quote Details', - 'credit_details': 'Credit Details', - 'product_columns': 'Product Columns', - 'task_columns': 'Task Columns', - 'add_field': 'Add Field', - 'all_events': 'All Events', + 'quote_details': 'Citat detaljer', + 'credit_details': 'Kreditoplysninger', + 'product_columns': 'Produktkolonner', + 'task_columns': 'Opgave', + 'add_field': 'Tilføj felt', + 'all_events': 'Alle begivenheder', 'permissions': 'Permissions', - 'none': 'None', - 'owned': 'Owned', - 'payment_success': 'Payment Success', - 'payment_failure': 'Payment Failure', + 'none': 'Ingen', + 'owned': 'Ejet', + 'payment_success': 'Betaling succes', + 'payment_failure': 'Betaling', 'invoice_sent': ':count fakturaer sendt', - 'quote_sent': 'Quote Sent', - 'credit_sent': 'Credit Sent', - 'invoice_viewed': 'Invoice Viewed', - 'quote_viewed': 'Quote Viewed', - 'credit_viewed': 'Credit Viewed', - 'quote_approved': 'Quote Approved', - 'receive_all_notifications': 'Receive All Notifications', - 'purchase_license': 'Purchase License', + 'quote_sent': 'Citat sendt', + 'credit_sent': 'Kredit sendt', + 'invoice_viewed': 'Faktura set', + 'quote_viewed': 'Citat set', + 'credit_viewed': 'Kredit set', + 'quote_approved': 'Citat Godkendt', + 'receive_all_notifications': 'Modtag alle meddelelser', + 'purchase_license': 'Køb Licens', 'apply_license': 'Anvend licens', 'cancel_account': 'Annuller konto', 'cancel_account_message': 'ADVARSEL: Dette vil permanent slette din konto, der er INGEN mulighed for at fortryde.', - 'delete_company': 'Delete Company', + 'delete_company': 'Slet Selskab', 'delete_company_message': - 'Warning: This will permanently delete your company, there is no undo.', - 'enabled_modules': 'Enabled Modules', - 'converted_quote': 'Successfully converted quote', - 'credit_design': 'Credit Design', - 'includes': 'Includes', + 'Advarsel: Dette vil permanent Slet din virksomhed, der er ingen fortrydelse.', + 'enabled_modules': 'Aktiverede moduler', + 'converted_quote': 'Succesfuldt konverteret citat', + 'credit_design': 'Kreditdesign', + 'includes': 'Inkluderer', 'header': 'Hoved', 'load_design': 'Indlæs design', 'css_framework': 'CSS Framework', - 'custom_designs': 'Custom Designs', + 'custom_designs': 'Speciel designs', 'designs': 'Designs', - 'new_design': 'New Design', - 'edit_design': 'Edit Design', - 'created_design': 'Successfully created design', - 'updated_design': 'Successfully updated design', - 'archived_design': 'Successfully archived design', - 'deleted_design': 'Successfully deleted design', - 'removed_design': 'Successfully removed design', - 'restored_design': 'Successfully restored design', - 'archived_designs': 'Successfully archived :value designs', - 'deleted_designs': 'Successfully deleted :value designs', - 'restored_designs': 'Successfully restored :value designs', + 'new_design': 'Nyt design', + 'edit_design': 'Redigér Design', + 'created_design': 'Succesfuldt oprettet design', + 'updated_design': 'Succesfuldt opdateret design', + 'archived_design': 'Succesfuldt arkiveret design', + 'deleted_design': 'Succesfuldt slettet design', + 'removed_design': 'Succesfuldt fjernet design', + 'restored_design': 'Succesfuldt genskabt design', + 'archived_designs': 'Succesfuldt arkiveret :value designs', + 'deleted_designs': 'Succesfuldt slettet :value designs', + 'restored_designs': 'Succesfuldt genskabt :value designs', 'proposals': 'Projektforslag', 'tickets': 'Sager', 'recurring_quotes': 'Gentagne tilbud', - 'recurring_tasks': 'Recurring Tasks', + 'recurring_tasks': 'Gentagen opgaver', 'account_management': 'Account Management', 'credit_date': 'Kreditdato', 'credit': 'Kredit', @@ -19450,238 +19550,238 @@ mixin LocalizationsProvider on LocaleCodeAware { 'updated_credit': 'Opdatering af kredit gennemført', 'archived_credit': 'Kredit arkiveret', 'deleted_credit': 'Kredit slettet', - 'removed_credit': 'Successfully removed credit', + 'removed_credit': 'Succesfuldt fjernet kredit', 'restored_credit': 'Kredit genskabt', 'archived_credits': 'Arkiverede :count kreditter', 'deleted_credits': 'Slettede :count kreditter', - 'restored_credits': 'Successfully restored :value credits', + 'restored_credits': 'Succesfuldt genskabt :value credits', 'current_version': 'Nuværende version', - 'latest_version': 'Latest Version', - 'update_now': 'Update Now', - 'a_new_version_is_available': 'A new version of the web app is available', - 'update_available': 'Update Available', - 'app_updated': 'Update successfully completed', + 'latest_version': 'Nyeste version', + 'update_now': 'Opdatere nu', + 'a_new_version_is_available': 'En ny version af webappen er tilgængelig', + 'update_available': 'Opdatering tilgængelig', + 'app_updated': 'Opdatering Succesfuldt gennemført', 'learn_more': 'Lær mere', - 'integrations': 'Integrations', - 'tracking_id': 'Tracking Id', + 'integrations': 'Integrationer', + 'tracking_id': 'Sporings-id', 'slack_webhook_url': 'Slack Webhook URL', - 'credit_footer': 'Credit Footer', - 'credit_terms': 'Credit Terms', + 'credit_footer': 'Kreditsidefod', + 'credit_terms': 'Kredit Betingelser', 'new_company': 'Nyt firma', - 'added_company': 'Successfully added company', - 'company1': 'Custom Company 1', - 'company2': 'Custom Company 2', - 'company3': 'Custom Company 3', - 'company4': 'Custom Company 4', - 'product1': 'Custom Product 1', - 'product2': 'Custom Product 2', - 'product3': 'Custom Product 3', - 'product4': 'Custom Product 4', - 'client1': 'Custom Client 1', - 'client2': 'Custom Client 2', - 'client3': 'Custom Client 3', - 'client4': 'Custom Client 4', - 'contact1': 'Custom Contact 1', - 'contact2': 'Custom Contact 2', - 'contact3': 'Custom Contact 3', - 'contact4': 'Custom Contact 4', - 'task1': 'Custom Task 1', - 'task2': 'Custom Task 2', - 'task3': 'Custom Task 3', - 'task4': 'Custom Task 4', - 'project1': 'Custom Project 1', - 'project2': 'Custom Project 2', - 'project3': 'Custom Project 3', - 'project4': 'Custom Project 4', - 'expense1': 'Custom Expense 1', - 'expense2': 'Custom Expense 2', - 'expense3': 'Custom Expense 3', - 'expense4': 'Custom Expense 4', - 'vendor1': 'Custom Vendor 1', - 'vendor2': 'Custom Vendor 2', - 'vendor3': 'Custom Vendor 3', - 'vendor4': 'Custom Vendor 4', - 'invoice1': 'Custom Invoice 1', - 'invoice2': 'Custom Invoice 2', - 'invoice3': 'Custom Invoice 3', - 'invoice4': 'Custom Invoice 4', - 'payment1': 'Custom Payment 1', - 'payment2': 'Custom Payment 2', - 'payment3': 'Custom Payment 3', - 'payment4': 'Custom Payment 4', - 'surcharge1': 'Custom Surcharge 1', - 'surcharge2': 'Custom Surcharge 2', - 'surcharge3': 'Custom Surcharge 3', - 'surcharge4': 'Custom Surcharge 4', - 'group1': 'Custom Group 1', - 'group2': 'Custom Group 2', - 'group3': 'Custom Group 3', - 'group4': 'Custom Group 4', + 'added_company': 'Succesfuldt tilføjet firma', + 'company1': 'Speciel 1', + 'company2': 'Speciel 2', + 'company3': 'Speciel 3', + 'company4': 'Speciel 4', + 'product1': 'Speciel produkt 1', + 'product2': 'Speciel produkt 2', + 'product3': 'Speciel produkt 3', + 'product4': 'Speciel produkt 4', + 'client1': 'Speciel Klient', + 'client2': 'Speciel Klient 2', + 'client3': 'Speciel Klient', + 'client4': 'Speciel Klient', + 'contact1': 'Speciel kontakt 1', + 'contact2': 'Speciel kontakt 2', + 'contact3': 'Speciel kontakt 3', + 'contact4': 'Speciel kontakt 4', + 'task1': 'Speciel Opgave 1', + 'task2': 'Speciel Opgave 2', + 'task3': 'Speciel Opgave 3', + 'task4': 'Speciel Opgave 4', + 'project1': 'Speciel 1', + 'project2': 'Speciel 2', + 'project3': 'Speciel 3', + 'project4': 'Speciel 4', + 'expense1': 'Speciel Udgift 1', + 'expense2': 'Speciel Udgift 2', + 'expense3': 'Speciel Udgift 3', + 'expense4': 'Speciel Udgift 4', + 'vendor1': 'Speciel Sælger 1', + 'vendor2': 'Speciel Sælger 2', + 'vendor3': 'Speciel Sælger 3', + 'vendor4': 'Speciel Sælger 4', + 'invoice1': 'Speciel Faktura 1', + 'invoice2': 'Speciel Faktura 2', + 'invoice3': 'Speciel Faktura 3', + 'invoice4': 'Speciel Faktura 4', + 'payment1': 'Speciel Betaling 1', + 'payment2': 'Speciel Betaling 2', + 'payment3': 'Speciel Betaling 3', + 'payment4': 'Speciel Betaling 4', + 'surcharge1': 'Speciel 1', + 'surcharge2': 'Speciel 2', + 'surcharge3': 'Speciel 3', + 'surcharge4': 'Speciel 4', + 'group1': 'Speciel 1', + 'group2': 'Speciel 2', + 'group3': 'Speciel 3', + 'group4': 'Speciel 4', 'reset': 'Reset', - 'number': 'Number', + 'number': 'Nummer', 'export': 'Eksport', 'chart': 'Diagram', - 'count': 'Count', + 'count': 'Tælle', 'totals': 'Totaler', 'blank': 'Blank', 'day': 'Dag', 'month': 'Måned', 'year': 'År', - 'subgroup': 'Subgroup', - 'is_active': 'Is Active', + 'subgroup': 'Undergruppe', + 'is_active': 'er aktiv', 'group_by': 'Gruppér efter', 'credit_balance': 'Kreditsaldo', - 'contact_last_login': 'Contact Last Login', - 'contact_full_name': 'Contact Full Name', + 'contact_last_login': 'kontakt Sidste login', + 'contact_full_name': 'kontakt fulde navn', 'contact_phone': 'Kontakttelefon', - 'contact_custom_value1': 'Contact Custom Value 1', - 'contact_custom_value2': 'Contact Custom Value 2', - 'contact_custom_value3': 'Contact Custom Value 3', - 'contact_custom_value4': 'Contact Custom Value 4', - 'shipping_address1': 'Shipping Street', - 'shipping_address2': 'Shipping Apt/Suite', - 'shipping_city': 'Shipping City', - 'shipping_state': 'Shipping State/Province', - 'shipping_postal_code': 'Shipping Postal Code', - 'shipping_country': 'Shipping Country', + 'contact_custom_value1': 'kontakt Speciel 1', + 'contact_custom_value2': 'kontakt Speciel Value 2', + 'contact_custom_value3': 'kontakt Speciel Value 3', + 'contact_custom_value4': 'kontakt Speciel Value 4', + 'shipping_address1': 'Skibsgade', + 'shipping_address2': 'Forsendelseslejlighed/Suite', + 'shipping_city': 'Forsendelsesby', + 'shipping_state': 'Forsendelsesstat/provins', + 'shipping_postal_code': 'Forsendelses postnummer', + 'shipping_country': 'Forsendelsesland', 'billing_address1': 'Billing Street', 'billing_address2': 'Billing Apt/Suite', 'billing_city': 'Billing City', - 'billing_state': 'Billing State/Province', - 'billing_postal_code': 'Billing Postal Code', - 'billing_country': 'Billing Country', + 'billing_state': 'Faktureringsstat/provins', + 'billing_postal_code': 'Faktureringspostnummer', + 'billing_country': 'Faktureringsland', 'client_id': 'Klients ID', - 'assigned_to': 'Assigned to', + 'assigned_to': 'Tildelt', 'created_by': 'Oprettet af :navn', - 'assigned_to_id': 'Assigned To Id', - 'created_by_id': 'Created By Id', - 'add_column': 'Add Column', - 'edit_columns': 'Edit Columns', + 'assigned_to_id': 'Tildelt til id', + 'created_by_id': 'oprettet Af Id', + 'add_column': 'Tilføj kolonne', + 'edit_columns': 'Redigér kolonner', 'columns': 'Kolonner', - 'aging': 'Aging', + 'aging': 'Aldring', 'profit_and_loss': 'Fortjeneste og tab', 'reports': 'Rapporter', 'report': 'Rapport', 'add_company': 'Tilføj firma', - 'unpaid_invoice': 'Unpaid Invoice', - 'paid_invoice': 'Paid Invoice', - 'unapproved_quote': 'Unapproved Quote', + 'unpaid_invoice': 'Ubetalte Faktura', + 'paid_invoice': 'Betalt Faktura', + 'unapproved_quote': 'Ikke godkendt citat', 'help': 'Hjælp', 'refund': 'Refunder', - 'refund_date': 'Refund Date', - 'filtered_by': 'Filtered by', + 'refund_date': 'Refusionsdato', + 'filtered_by': 'Filtreret efter', 'contact_email': 'E-mailkontakt', 'multiselect': 'Multiselect', 'entity_state': 'Status', - 'verify_password': 'Verify Password', - 'applied': 'Applied', - 'include_recent_errors': 'Include recent errors from the logs', + 'verify_password': 'Bekræft adgangskode', + 'applied': 'Anvendt', + 'include_recent_errors': 'Medtag nylige fejl fra loggene', 'your_message_has_been_received': - 'We have received your message and will try to respond promptly.', + 'Vi har modtaget din Besked og vil forsøge at svare hurtigt.', 'message': 'Besked', 'from': 'Fra', - 'show_product_details': 'Show Product Details', + 'show_product_details': 'Vis produktdetaljer', 'show_product_details_help': - 'Include the description and cost in the product dropdown', - 'pdf_min_requirements': 'The PDF renderer requires :version', - 'adjust_fee_percent': 'Adjust Fee Percent', - 'adjust_fee_percent_help': 'Adjust percent to account for fee', - 'configure_settings': 'Configure Settings', - 'support_forum': 'Support Forums', - 'about': 'About', + 'Inkluder beskrivelse og pris i produktrullemenuen', + 'pdf_min_requirements': 'PDF rendereren kræver :version', + 'adjust_fee_percent': 'Juster gebyrprocent', + 'adjust_fee_percent_help': 'Juster procent for at tage højde for gebyr', + 'configure_settings': 'Konfigurer Indstillinger', + 'support_forum': 'Supportfora', + 'about': 'Om', 'documentation': 'Dokumentation', 'contact_us': 'Kontakt os', 'subtotal': 'Subtotal', 'line_total': 'Sum', 'item': 'Produkttype', - 'credit_email': 'Credit Email', + 'credit_email': 'Kredit e-mail', 'iframe_url': 'Website', - 'domain_url': 'Domain URL', - 'password_is_too_short': 'Password is too short', + 'domain_url': 'Domæne-URL', + 'password_is_too_short': 'Adgangskoden er for kort', 'password_is_too_easy': - 'Password must contain an upper case character and a number', - 'client_portal_tasks': 'Client Portal Tasks', - 'client_portal_dashboard': 'Client Portal Dashboard', - 'please_enter_a_value': 'Please enter a value', - 'deleted_logo': 'Successfully deleted logo', + 'Adgangskoden skal indeholde et stort bogstav og et tal', + 'client_portal_tasks': 'Klient', + 'client_portal_dashboard': 'Klient Portal Dashboard', + 'please_enter_a_value': 'Indtast venligst en værdi', + 'deleted_logo': 'Succesfuldt slettet logo', 'yes': 'Yes', 'no': 'No', - 'generate_number': 'Generate Number', - 'when_saved': 'When Saved', - 'when_sent': 'When Sent', - 'select_company': 'Select Company', - 'float': 'Float', - 'collapse': 'Collapse', - 'show_or_hide': 'Show/hide', - 'menu_sidebar': 'Menu Sidebar', - 'history_sidebar': 'History Sidebar', + 'generate_number': 'Generer nummer', + 'when_saved': 'Når gemt', + 'when_sent': 'Ved afsendelse', + 'select_company': 'Vælg Firma', + 'float': 'Flyde', + 'collapse': 'Bryder sammen', + 'show_or_hide': 'Vis/skjul', + 'menu_sidebar': 'Sidebjælke i menuen', + 'history_sidebar': 'Historie sidebjælke', 'tablet': 'Tablet', - 'mobile': 'Mobile', + 'mobile': 'Mobil', 'desktop': 'Desktop', 'layout': 'Layout', 'view': 'View', - 'module': 'Module', - 'first_custom': 'First Custom', - 'second_custom': 'Second Custom', - 'third_custom': 'Third Custom', - 'show_cost': 'Show Cost', - 'show_product_cost': 'Show Product Cost', + 'module': 'modul', + 'first_custom': 'Første Speciel', + 'second_custom': 'Andet Speciel', + 'third_custom': 'Tredje Speciel', + 'show_cost': 'Vis pris', + 'show_product_cost': 'Vis produktomkostninger', 'show_cost_help': - 'Display a product cost field to track the markup/profit', - 'show_product_quantity': 'Show Product Quantity', + 'Vis et produktprisfelt for at spore opmærkningen/fortjenesten', + 'show_product_quantity': 'Vis produktmængde', 'show_product_quantity_help': - 'Display a product quantity field, otherwise default to one', - 'show_invoice_quantity': 'Show Invoice Quantity', + 'Vis et felt for produktantal, ellers er der et som standard', + 'show_invoice_quantity': 'Vis Faktura Antal', 'show_invoice_quantity_help': - 'Display a line item quantity field, otherwise default to one', - 'show_product_discount': 'Show Product Discount', - 'show_product_discount_help': 'Display a line item discount field', - 'default_quantity': 'Default Quantity', - 'default_quantity_help': - 'Automatically set the line item quantity to one', - 'one_tax_rate': 'One Tax Rate', - 'two_tax_rates': 'Two Tax Rates', - 'three_tax_rates': 'Three Tax Rates', - 'default_tax_rate': 'Default Tax Rate', + 'Vis et linjepostantal felt, ellers standard til ét', + 'show_product_discount': 'Vis produktrabat', + 'show_product_discount_help': 'Vis et linjevarerabatfelt', + 'default_quantity': 'Standardmængde', + 'default_quantity_help': 'Indstil automatisk linjepostantallet til én', + 'one_tax_rate': 'Én skattesats', + 'two_tax_rates': 'To skattesatser', + 'three_tax_rates': 'Tre skattesatser', + 'default_tax_rate': 'Standard afgiftssats', 'user': 'User', - 'invoice_tax': 'Invoice Tax', - 'line_item_tax': 'Line Item Tax', - 'inclusive_taxes': 'Inclusive Taxes', - 'invoice_tax_rates': 'Invoice Tax Rates', - 'item_tax_rates': 'Item Tax Rates', + 'invoice_tax': 'Faktura Skat', + 'line_item_tax': 'Linjepostafgift', + 'inclusive_taxes': 'Inklusiv skatter', + 'invoice_tax_rates': 'Faktura Skattesatser', + 'item_tax_rates': 'Vareafgiftssatser', 'no_client_selected': 'Vælg venligst en kunde', - 'configure_rates': 'Configure rates', - 'configure_gateways': 'Configure Gateways', + 'configure_rates': 'Konfigurer satser', + 'configure_gateways': 'Konfigurer gateways', 'tax_settings': 'Tax Settings', - 'tax_settings_rates': 'Tax Rates', - 'accent_color': 'Accent Color', + 'tax_settings_rates': 'Skattesatser', + 'accent_color': 'Accent farve', 'switch': 'Skift', - 'comma_sparated_list': 'Comma separated list', - 'options': 'Options', - 'single_line_text': 'Single-line text', - 'multi_line_text': 'Multi-line text', + 'comma_sparated_list': 'Kommasepareret liste', + 'options': 'Muligheder', + 'single_line_text': 'Enkeltlinjetekst', + 'multi_line_text': 'Tekst med flere linjer', 'dropdown': 'Dropdown', - 'field_type': 'Field Type', - 'recover_password_email_sent': 'A password recovery email has been sent', + 'field_type': 'Felttype', + 'recover_password_email_sent': + 'En e-mail til gendannelse af adgangskode er blevet sendt', 'submit': 'Indsend', 'recover_password': 'Generhverv din adgangskode', - 'late_fees': 'Late Fees', + 'late_fees': 'Forsinkede gebyrer', 'credit_number': 'Kreditnummer', - 'payment_number': 'Payment Number', - 'late_fee_amount': 'Late Fee Amount', - 'late_fee_percent': 'Late Fee Percent', - 'before_due_date': 'Before the due date', - 'after_due_date': 'After the due date', - 'after_invoice_date': 'After the invoice date', + 'payment_number': 'Betaling', + 'late_fee_amount': 'Sengebyr Beløb', + 'late_fee_percent': 'Forsinket gebyr i procent', + 'before_due_date': 'Inden forfaldsdatoen', + 'after_due_date': 'Efter forfaldsdatoen', + 'after_invoice_date': 'Efter Faktura datoen', 'days': 'Dage', 'invoice_email': 'Faktura e-mail', 'payment_email': 'Betalings e-mail', - 'partial_payment': 'Partial Payment', - 'payment_partial': 'Partial Payment', - 'partial_payment_email': 'Partial Payment Email', + 'partial_payment': 'Delvis Betaling', + 'payment_partial': 'Delvis Betaling', + 'partial_payment_email': 'Delvis Betaling e-mail', 'quote_email': 'Tilbuds e-mail', - 'endless_reminder': 'Endless Reminder', - 'filtered_by_user': 'Filtered by User', + 'endless_reminder': 'Uendelig påmindelse', + 'filtered_by_user': 'Filtreret af Bruger', 'administrator': 'Administrator', 'administrator_help': 'Allow user to manage users, change settings and modify all records', @@ -19689,16 +19789,16 @@ mixin LocalizationsProvider on LocaleCodeAware { 'users': 'Brugere', 'new_user': 'New User', 'edit_user': 'Rediger bruger', - 'created_user': 'Successfully created user', + 'created_user': 'Succesfuldt oprettet Bruger', 'updated_user': 'Bruger opdateret', 'archived_user': 'Successfully archived user', 'deleted_user': 'Bruger slettet', - 'removed_user': 'Successfully removed user', + 'removed_user': 'Succesfuldt fjernet Bruger', 'restored_user': 'Bruger genskabt', - 'archived_users': 'Successfully archived :value users', - 'deleted_users': 'Successfully deleted :value users', - 'removed_users': 'Successfully removed :value users', - 'restored_users': 'Successfully restored :value users', + 'archived_users': 'Succesfuldt arkiveret :value brugere', + 'deleted_users': 'Succesfuldt slettet :value brugere', + 'removed_users': 'Succesfuldt fjernede :value brugere', + 'restored_users': 'Succesfuldt genskabt :value brugere', 'general_settings': 'General Settings', 'invoice_options': 'Fakturaindstillinger', 'hide_paid_to_date': 'Skjul delbetalinger', @@ -19711,29 +19811,29 @@ mixin LocalizationsProvider on LocaleCodeAware { 'first_page': 'first page', 'all_pages': 'all pages', 'last_page': 'last page', - 'primary_font': 'Primary Font', - 'secondary_font': 'Secondary Font', + 'primary_font': 'Primær skrifttype', + 'secondary_font': 'Sekundær skrifttype', 'primary_color': 'Primær Farve', 'secondary_color': 'Sekundær Farve', 'page_size': 'Page Size', 'font_size': 'Font Størrelse', - 'quote_design': 'Quote Design', + 'quote_design': 'Citat design', 'invoice_fields': 'Faktura felt', - 'product_fields': 'Product Fields', + 'product_fields': 'Produktfelter', 'invoice_terms': 'Vilkår for fakturaen', 'invoice_footer': 'Faktura fodnoter', 'quote_terms': 'Quote Terms', 'quote_footer': 'Quote Footer', - 'auto_email_invoice': 'Auto Email', + 'auto_email_invoice': 'Automatisk e-mail', 'auto_email_invoice_help': - 'Automatically email recurring invoices when created.', - 'auto_archive_quote': 'Auto Archive', + 'Send automatisk e-mail Gentagen Fakturaer , når oprettet .', + 'auto_archive_quote': 'Auto Arkiv', 'auto_archive_quote_help': - 'Automatically archive quotes when converted to invoice.', + 'Arkiv automatisk citater ved konvertering til Faktura .', 'auto_convert_quote': 'Auto konvertering', 'auto_convert_quote_help': - 'Automatically convert a quote to an invoice when approved.', - 'workflow_settings': 'Workflow Settings', + 'Konverter automatisk et tilbud til en Faktura , når Godkendt .', + 'workflow_settings': 'Workflow Indstillinger', 'freq_daily': 'Daglig', 'freq_weekly': 'Ugentlig', 'freq_two_weeks': 'To uger', @@ -19741,44 +19841,43 @@ mixin LocalizationsProvider on LocaleCodeAware { 'freq_monthly': 'Månedlig', 'freq_two_months': 'To måneder', 'freq_three_months': 'Tre måneder', - 'freq_four_months': 'Fire måneder', - 'freq_six_months': 'Seks måneder', - 'freq_annually': 'Årlig', - 'freq_two_years': 'To år', - 'freq_three_years': 'Three Years', - 'never': 'Never', - 'company': 'Company', - 'generated_numbers': 'Dannede numre', - 'charge_taxes': 'Inkluder skat', - 'next_reset': 'Next Reset', - 'reset_counter': 'Reset Counter', - 'recurring_prefix': 'Recurring Prefix', - 'number_padding': 'Number Padding', - 'general': 'General', - 'surcharge_field': 'Surcharge Field', - 'company_field': 'Company Field', - 'company_value': 'Company Value', - 'credit_field': 'Credit Field', - 'invoice_field': 'Invoice Field', - 'invoice_surcharge': 'Invoice Surcharge', - 'client_field': 'Client Field', - 'product_field': 'Product Field', - 'payment_field': 'Payment Field', - 'contact_field': 'Contact Field', - 'vendor_field': 'Vendor Field', - 'expense_field': 'Expense Field', + 'freq_four_months': 'Fire måneder', + 'freq_six_months': 'Seks måneder', + 'freq_annually': 'Årlig', + 'freq_two_years': 'To år', + 'freq_three_years': '3 år', + 'never': 'Never', + 'company': 'Selskab', + 'generated_numbers': 'Dannede numre', + 'charge_taxes': 'Inkluder skat', + 'next_reset': 'Næste nulstilling', + 'reset_counter': 'Nulstil tæller', + 'recurring_prefix': 'Gentagen præfiks', + 'number_padding': 'Nummerpolstring', + 'general': 'Generel', + 'surcharge_field': 'Tillægsfelt', + 'company_field': 'Company Field', + 'company_value': 'Virksomhedens værdi', + 'credit_field': 'Kreditfelt', + 'invoice_field': 'Faktura Field', + 'invoice_surcharge': 'Faktura Tillæg', + 'client_field': 'Klient Field', + 'product_field': 'Produktfelt', + 'payment_field': 'Betaling', + 'contact_field': 'kontakt felt', + 'vendor_field': 'Sælger Mark', + 'expense_field': 'Udgift Mark', 'project_field': 'Projektfelt', - 'task_field': 'Task Field', - 'group_field': 'Group Field', - 'number_counter': 'Number Counter', + 'task_field': 'Opgave Mark', + 'group_field': 'Gruppefelt', + 'number_counter': 'Nummertæller', 'prefix': 'Præfix', - 'number_pattern': 'Number Pattern', - 'messages': 'Messages', + 'number_pattern': 'Nummermønster', + 'messages': 'Beskeder', 'custom_css': 'Brugerdefineret CSS', - 'custom_javascript': 'Custom JavaScript', - 'signature_on_pdf': 'Show on PDF', - 'signature_on_pdf_help': - 'Show the client signature on the invoice/quote PDF.', + 'custom_javascript': 'Speciel JavaScript', + 'signature_on_pdf': 'Vis på PDF', + 'signature_on_pdf_help': 'Vis Klient på Faktura /citat PDF .', 'show_accept_invoice_terms': 'Afkrydsningsfelt for fakturavilkår', 'show_accept_invoice_terms_help': 'Bed kunden om at bekræfte, at de accepterer fakturavilkårene.', @@ -19795,7 +19894,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'authorization': 'Autorisation', 'subdomain': 'Underdomain', 'domain': 'Domæne', - 'portal_mode': 'Portal Mode', + 'portal_mode': 'Portaltilstand', 'email_signature': 'Venlig hilsen,', 'enable_email_markup_help': 'Gør det lettere for dine klienter at betale dig ved at tilføje schema.org markup i dine e-mails.', @@ -19803,30 +19902,30 @@ mixin LocalizationsProvider on LocaleCodeAware { 'light': 'Light', 'dark': 'Dark', 'email_design': 'Email Design', - 'attach_pdf': 'Attach PDF', - 'attach_documents': 'Attach Documents', - 'attach_ubl': 'Attach UBL', - 'email_style': 'Email Style', + 'attach_pdf': 'Vedhæft PDF', + 'attach_documents': 'Vedhæft dokumenter', + 'attach_ubl': 'Vedhæft UBL', + 'email_style': 'e-mail stil', 'enable_email_markup': 'Brug HTML markup sprog', 'reply_to_email': 'Svar-til e-mail', - 'reply_to_name': 'Reply-To Name', + 'reply_to_name': 'Svar-til-navn', 'bcc_email': 'BCC-email', - 'processed': 'Processed', + 'processed': 'Bearbejdet', 'credit_card': 'Kreditkort', 'bank_transfer': 'Bankoverførsel', - 'priority': 'Priority', - 'fee_amount': 'Fee Amount', - 'fee_percent': 'Fee Percent', - 'fee_cap': 'Fee Cap', - 'limits_and_fees': 'Limits/Fees', + 'priority': 'Prioritet', + 'fee_amount': 'Gebyr Beløb', + 'fee_percent': 'Gebyr i procent', + 'fee_cap': 'Gebyrloft', + 'limits_and_fees': 'Grænser/gebyrer', 'enable_min': 'Aktivér minimum', 'enable_max': 'Aktivér maksimum', 'min_limit': 'Min: :min', 'max_limit': 'Max: :max', 'min': 'Min', 'max': 'Max', - 'accepted_card_logos': 'Accepted Card Logos', - 'credentials': 'Credentials', + 'accepted_card_logos': 'Accepterede kortlogoer', + 'credentials': 'Legitimationsoplysninger', 'update_address': 'Opdater adresse', 'update_address_help': 'Opdater kundens adresse med de opgivne detaljer', 'rate': 'Sats', @@ -19836,42 +19935,42 @@ mixin LocalizationsProvider on LocaleCodeAware { 'created_tax_rate': 'Successfully created tax rate', 'updated_tax_rate': 'Successfully updated tax rate', 'archived_tax_rate': 'Successfully archived the tax rate', - 'deleted_tax_rate': 'Successfully deleted tax rate', - 'restored_tax_rate': 'Successfully restored tax rate', - 'archived_tax_rates': 'Successfully archived :value tax rates', - 'deleted_tax_rates': 'Successfully deleted :value tax rates', - 'restored_tax_rates': 'Successfully restored :value tax rates', + 'deleted_tax_rate': 'Succesfuldt slettet skattesats', + 'restored_tax_rate': 'Succesfuldt genskabt skattesats', + 'archived_tax_rates': 'Succesfuldt arkiveret :value skattesatser', + 'deleted_tax_rates': 'Succesfuldt slettet :value skattesatser', + 'restored_tax_rates': 'Succesfuldt genskabt :value skattesatser', 'fill_products': 'Automatisk-udfyld produkter', 'fill_products_help': 'Valg af produkt vil automatisk udfylde beskrivelse og pris', 'update_products': 'Automatisk opdatering af produkter', 'update_products_help': 'En opdatering af en faktura vil automatisk opdaterer Produkt biblioteket', - 'convert_products': 'Convert Products', + 'convert_products': 'Konverter produkter', 'convert_products_help': - 'Automatically convert product prices to the client\'s currency', + 'Konverter automatisk produktpriser til Klient valuta', 'fees': 'Gebyrer', 'limits': 'Grænser', - 'provider': 'Provider', - 'company_gateway': 'Payment Gateway', - 'company_gateways': 'Payment Gateways', - 'new_company_gateway': 'New Gateway', - 'edit_company_gateway': 'Edit Gateway', - 'created_company_gateway': 'Successfully created gateway', - 'updated_company_gateway': 'Successfully updated gateway', - 'archived_company_gateway': 'Successfully archived gateway', - 'deleted_company_gateway': 'Successfully deleted gateway', - 'restored_company_gateway': 'Successfully restored gateway', - 'archived_company_gateways': 'Successfully archived :value gateways', - 'deleted_company_gateways': 'Successfully deleted :value gateways', - 'restored_company_gateways': 'Successfully restored :value gateways', - 'continue_editing': 'Continue Editing', - 'discard_changes': 'Discard Changes', - 'default_value': 'Default value', + 'provider': 'Udbyder', + 'company_gateway': 'Betalingsgateway', + 'company_gateways': 'Betaling Gateways', + 'new_company_gateway': 'Ny Gateway', + 'edit_company_gateway': 'Redigér Gateway', + 'created_company_gateway': 'Succesfuldt oprettet Gateway', + 'updated_company_gateway': 'Succesfuldt opdateret Gateway', + 'archived_company_gateway': 'Succesfuldt arkiveret Gateway', + 'deleted_company_gateway': 'Succesfuldt slettet Gateway', + 'restored_company_gateway': 'Succesfuldt genskabt Gateway', + 'archived_company_gateways': 'Succesfuldt arkiveret :value gateways', + 'deleted_company_gateways': 'Succesfuldt slettet :value gateways', + 'restored_company_gateways': 'Succesfuldt genskabt :value gateways', + 'continue_editing': 'Fortsæt redigering', + 'discard_changes': 'Kassér ændringer', + 'default_value': 'Standard værdi', 'disabled': 'Disabled', - 'currency_format': 'Currency Format', - 'first_day_of_the_week': 'First Day of the Week', - 'first_month_of_the_year': 'First Month of the Year', + 'currency_format': 'Format', + 'first_day_of_the_week': 'Ugens første dag', + 'first_month_of_the_year': 'Årets første måned', 'sunday': 'Sunday', 'monday': 'Monday', 'tuesday': 'Tuesday', @@ -19892,37 +19991,37 @@ mixin LocalizationsProvider on LocaleCodeAware { 'november': 'November', 'december': 'December', 'symbol': 'Symbol', - 'ocde': 'Code', - 'date_format': 'Date Format', - 'datetime_format': 'Datetime Format', + 'ocde': 'Kode', + 'date_format': 'Format', + 'datetime_format': 'Dato-tid Format', 'military_time': '24 Hour Time', - 'military_time_help': '24 Hour Display', - 'send_reminders': 'Send Reminders', - 'timezone': 'Timezone', - 'filtered_by_project': 'Filtered by Project', - 'filtered_by_group': 'Filtered by Group', - 'filtered_by_invoice': 'Filtered by Invoice', - 'filtered_by_client': 'Filtered by Client', - 'filtered_by_vendor': 'Filtered by Vendor', - 'group_settings': 'Group Settings', - 'group': 'Group', - 'groups': 'Groups', - 'new_group': 'New Group', - 'edit_group': 'Edit Group', - 'created_group': 'Successfully created group', - 'updated_group': 'Successfully updated group', - 'archived_groups': 'Successfully archived :value groups', - 'deleted_groups': 'Successfully deleted :value groups', - 'restored_groups': 'Successfully restored :value groups', - 'archived_group': 'Successfully archived group', - 'deleted_group': 'Successfully deleted group', - 'restored_group': 'Successfully restored group', - 'upload_logo': 'Upload Logo', - 'uploaded_logo': 'Successfully uploaded logo', + 'military_time_help': '24 timers visning', + 'send_reminders': 'Send påmindelser', + 'timezone': 'Tidszone', + 'filtered_by_project': 'Filtreret efter projekt', + 'filtered_by_group': 'Filtreret efter gruppe', + 'filtered_by_invoice': 'Filtreret efter Faktura', + 'filtered_by_client': 'Filtreret af Klient', + 'filtered_by_vendor': 'Filtreret af Sælger', + 'group_settings': 'Gruppe Indstillinger', + 'group': 'Gruppe', + 'groups': 'Grupper', + 'new_group': 'Ny gruppe', + 'edit_group': 'Redigér Group', + 'created_group': 'Succesfuldt oprettet gruppe', + 'updated_group': 'Succesfuldt opdateret gruppe', + 'archived_groups': 'Succesfuldt arkiveret :value grupper', + 'deleted_groups': 'Succesfuldt slettet :value grupper', + 'restored_groups': 'Succesfuldt genskabt :value grupper', + 'archived_group': 'Succesfuldt arkiveret gruppe', + 'deleted_group': 'Succesfuldt slettet gruppe', + 'restored_group': 'Succesfuldt genskabt gruppe', + 'upload_logo': 'Upload logo', + 'uploaded_logo': 'Succesfuldt uploadet logo', 'logo': 'Logo', - 'saved_settings': 'Successfully saved settings', + 'saved_settings': 'Succesfuldt reddede Indstillinger', 'product_settings': 'Produkt Indstillinger', - 'device_settings': 'Device Settings', + 'device_settings': 'Indstillinger', 'defaults': 'Standarder', 'basic_settings': 'Basic Settings', 'advanced_settings': 'Avancerede indstillinger', @@ -19938,59 +20037,59 @@ mixin LocalizationsProvider on LocaleCodeAware { 'buy_now_buttons': '\'Køb nu\' knapper', 'email_settings': 'E-mail-indstillinger', 'templates_and_reminders': 'Templates & Reminders', - 'credit_cards_and_banks': 'Credit Cards & Banks', + 'credit_cards_and_banks': 'Kreditkort og banker', 'data_visualizations': 'Datavisualisering', - 'price': 'Price', - 'email_sign_up': 'Email Sign Up', - 'google_sign_up': 'Google Sign Up', - 'thank_you_for_your_purchase': 'Thank you for your purchase!', - 'redeem': 'Redeem', - 'back': 'Back', - 'past_purchases': 'Past Purchases', - 'annual_subscription': 'Annual Subscription', + 'price': 'Pris', + 'email_sign_up': 'e-mail Tilmeld dig', + 'google_sign_up': 'Google Tilmeld dig', + 'thank_you_for_your_purchase': 'Tak for dit køb!', + 'redeem': 'Indløs', + 'back': 'Tilbage', + 'past_purchases': 'Tidligere køb', + 'annual_subscription': 'Årligt abonnement', 'pro_plan': 'Pro Plan', 'enterprise_plan': 'Enterprise Plan', - 'count_users': ':count users', - 'upgrade': 'Upgrade', - 'please_enter_a_first_name': 'Please enter a first name', - 'please_enter_a_last_name': 'Please enter a last name', + 'count_users': ':count brugere', + 'upgrade': 'Opgrader', + 'please_enter_a_first_name': 'Indtast venligst et fornavn', + 'please_enter_a_last_name': 'Indtast venligst et efternavn', 'please_agree_to_terms_and_privacy': - 'Please agree to the terms of service and privacy policy to create an account.', - 'i_agree_to_the': 'I agree to the', + 'Acceptér venligst Betingelser af service og privatlivspolitik for at Opret en konto.', + 'i_agree_to_the': 'Jeg er enig i', 'terms_of_service': 'Vilkår for brug', 'privacy_policy': 'Privatlivspolitik', 'sign_up': 'Registrer dig', 'account_login': 'Konto Log ind', - 'view_website': 'View Website', - 'create_account': 'Create Account', - 'email_login': 'Email Login', + 'view_website': 'Vis hjemmeside', + 'create_account': 'Opret konto', + 'email_login': 'e-mail Login', 'create_new': 'Opret ny', - 'no_record_selected': 'No record selected', - 'error_unsaved_changes': 'Please save or cancel your changes', + 'no_record_selected': 'Ingen post valgt', + 'error_unsaved_changes': 'Venligst Gem eller Afbryd dine ændringer', 'download': 'Hent', - 'requires_an_enterprise_plan': 'Requires an enterprise plan', - 'take_picture': 'Take Picture', - 'upload_files': 'Upload Files', - 'document': 'Document', + 'requires_an_enterprise_plan': 'Kræver en virksomhedsplan', + 'take_picture': 'Tage billede', + 'upload_files': 'Upload filer', + 'document': 'Dokument', 'documents': 'Documents', - 'new_document': 'New Document', - 'edit_document': 'Edit Document', - 'uploaded_document': 'Successfully uploaded document', - 'updated_document': 'Successfully updated document', - 'archived_document': 'Successfully archived document', - 'deleted_document': 'Successfully deleted document', - 'restored_document': 'Successfully restored document', - 'archived_documents': 'Successfully archived :value documents', - 'deleted_documents': 'Successfully deleted :value documents', - 'restored_documents': 'Successfully restored :value documents', - 'no_history': 'No History', + 'new_document': 'Nyt dokument', + 'edit_document': 'Redigér Dokument', + 'uploaded_document': 'Succesfuldt uploadet dokument', + 'updated_document': 'Succesfuldt opdateret dokument', + 'archived_document': 'Succesfuldt arkiveret dokument', + 'deleted_document': 'Succesfuldt slettet dokument', + 'restored_document': 'Succesfuldt genskabt dokument', + 'archived_documents': 'Succesfuldt arkiveret :value dokumenter', + 'deleted_documents': 'Succesfuldt slettet :value dokumenter', + 'restored_documents': 'Succesfuldt genskabt :value dokumenter', + 'no_history': 'Ingen historie', 'expense_date': 'Expense Date', 'pending': 'Afventer', - 'expense_status_1': 'Logged', - 'expense_status_2': 'Pending', - 'expense_status_3': 'Invoiced', + 'expense_status_1': 'Logget', + 'expense_status_2': 'Verserende', + 'expense_status_3': 'Faktureret', 'converted': 'Konverteret', - 'add_documents_to_invoice': 'Add Documents to Invoice', + 'add_documents_to_invoice': 'Tilføj dokumenter til Faktura', 'exchange_rate': 'Exchange Rate', 'convert_currency': 'Convert currency', 'mark_paid': 'Markér som betalt', @@ -20004,7 +20103,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_vendor': 'Genskabelse af sælger gennemført', 'archived_vendors': 'Gennemførte arkivering af :count sælgere', 'deleted_vendors': 'Gennemførte sletning af :count sælgere', - 'restored_vendors': 'Successfully restored :value vendors', + 'restored_vendors': 'Succesfuldt genskabt :value sælgere', 'new_expense': 'Indtast udgift', 'created_expense': 'Successfully created expense', 'updated_expense': 'Successfully updated expense', @@ -20013,11 +20112,11 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_expense': 'Successfully restored expense', 'archived_expenses': 'Successfully archived expenses', 'deleted_expenses': 'Successfully deleted expenses', - 'restored_expenses': 'Successfully restored :value expenses', - 'copy_shipping': 'Copy Shipping', - 'copy_billing': 'Copy Billing', + 'restored_expenses': 'Succesfuldt genskabt :value udgifter', + 'copy_shipping': 'Kopi Forsendelse', + 'copy_billing': 'Kopier fakturering', 'design': 'Design', - 'failed_to_find_record': 'Failed to find record', + 'failed_to_find_record': 'Det lykkedes ikke at finde posten', 'invoiced': 'Faktureret', 'logged': 'Ajourført', 'running': 'Kører', @@ -20025,14 +20124,14 @@ mixin LocalizationsProvider on LocaleCodeAware { 'task_errors': 'Ret venligst de overlappende tider', 'start': 'Start', 'stop': 'Stop', - 'started_task': 'Successfully started task', + 'started_task': 'Succesfuldt startede Opgave', 'stopped_task': 'Opgave stoppet', - 'resumed_task': 'Successfully resumed task', + 'resumed_task': 'Succesfuldt genoptog Opgave', 'now': 'Nu', - 'auto_start_tasks': 'Auto Start Tasks', + 'auto_start_tasks': 'Autostart opgaver', 'timer': 'Tidtager', 'manual': 'Manuelt', - 'budgeted': 'Budgeted', + 'budgeted': 'Budgetteret', 'start_time': 'Start Tidspunkt', 'end_time': 'Slut tidspunkt', 'date': 'Dato', @@ -20046,9 +20145,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_task': 'Opgave genskabt', 'archived_tasks': 'Antal arkiverede opgaver: :count', 'deleted_tasks': 'Antal opgaver slettet: :count', - 'restored_tasks': 'Successfully restored :value tasks', - 'please_enter_a_name': 'Please enter a name', - 'budgeted_hours': 'Budgeted Hours', + 'restored_tasks': 'Succesfuldt genskabt :value opgaver', + 'please_enter_a_name': 'Indtast venligst et navn', + 'budgeted_hours': 'Budgetterede timer', 'created_project': 'Projektet blev oprettet', 'updated_project': 'Projektet blev opdateret', 'archived_project': 'Projektet blev arktiveret', @@ -20056,51 +20155,51 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_project': 'Projektet blev genskabt', 'archived_projects': ':count projekter blev arkiveret', 'deleted_projects': ':count projekter blev slettet', - 'restored_projects': 'Successfully restored :value projects', + 'restored_projects': 'Succesfuldt genskabt :value projekter', 'new_project': 'Nyt projekt', - 'thank_you_for_using_our_app': 'Thank you for using our app!', - 'if_you_like_it': 'If you like it please', + 'thank_you_for_using_our_app': 'Tak fordi du bruger vores app!', + 'if_you_like_it': 'Hvis du kan lide det venligst', 'click_here': 'Klik her', - 'click_here_capital': 'Click here', - 'to_rate_it': 'to rate it.', - 'average': 'Average', - 'unapproved': 'Unapproved', + 'click_here_capital': 'Klik her', + 'to_rate_it': 'at bedømme det.', + 'average': 'Gennemsnit', + 'unapproved': 'Ikke godkendt', 'authenticate_to_change_setting': - 'Please authenticate to change this setting', - 'locked': 'Locked', - 'authenticate': 'Authenticate', - 'please_authenticate': 'Please authenticate', - 'biometric_authentication': 'Biometric Authentication', + 'Godkend venligst for at ændre denne indstilling', + 'locked': 'Låst', + 'authenticate': 'Godkend', + 'please_authenticate': 'Godkend venligst', + 'biometric_authentication': 'Biometrisk autentificering', 'footer': 'Fod', - 'compare': 'Compare', - 'hosted_login': 'Hosted Login', + 'compare': 'Sammenligne', + 'hosted_login': 'Hostet login', 'selfhost_login': 'Selfhost Login', - 'google_sign_in': 'Sign in with Google', - 'today': 'Today', + 'google_sign_in': 'Log ind med Google', + 'today': 'I dag', 'custom_range': 'Valgfri periode', 'date_range': 'Dato område', - 'current': 'Current', - 'previous': 'Previous', - 'current_period': 'Current Period', - 'comparison_period': 'Comparison Period', - 'previous_period': 'Previous Period', - 'previous_year': 'Previous Year', - 'compare_to': 'Compare to', - 'last7_days': 'Last 7 Days', - 'last_week': 'Last Week', - 'last30_days': 'Last 30 Days', + 'current': 'Nuværende', + 'previous': 'Tidligere', + 'current_period': 'Nuværende periode', + 'comparison_period': 'Sammenligningsperiode', + 'previous_period': 'Tidligere periode', + 'previous_year': 'Foregående år', + 'compare_to': 'Sammenligne med', + 'last7_days': 'Sidste 7 dage', + 'last_week': 'Sidste uge', + 'last30_days': 'Sidste 30 dage', 'this_month': 'Denne måned', 'last_month': 'Forrige måned', 'this_year': 'Dette år', 'last_year': 'Forrige år', - 'all_time': 'All Time', + 'all_time': 'Hele tiden', 'custom': 'Brugertilpasset', - 'clone_to_invoice': 'Clone to Invoice', - 'clone_to_quote': 'Clone to Quote', - 'clone_to_credit': 'Clone to Credit', + 'clone_to_invoice': 'Klon til Faktura', + 'clone_to_quote': 'Klon at citere', + 'clone_to_credit': 'Klon til kredit', 'view_invoice': 'Se faktura', - 'convert': 'Convert', - 'more': 'More', + 'convert': 'Konvertere', + 'more': 'Mere', 'edit_client': 'Rediger kunde', 'edit_product': 'Rediger produkt', 'edit_invoice': 'Rediger faktura', @@ -20110,9 +20209,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'edit_expense': 'Edit Expense', 'edit_vendor': 'Redigér sælger', 'edit_project': 'Redigér projekt', - 'edit_recurring_quote': 'Edit Recurring Quote', + 'edit_recurring_quote': 'Redigér Gentagen citat', 'billing_address': 'Faktura adresse', - 'shipping_address': 'Shipping Address', + 'shipping_address': 'Forsendelsesadresse', 'total_revenue': 'Samlede indtægter', 'average_invoice': 'Gennemsnitlig fakturaer', 'outstanding': 'Forfaldne', @@ -20127,7 +20226,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'logout': 'Log ud', 'login': 'Log ind', 'filter': 'Filter', - 'sort': 'Sort', + 'sort': 'Sortere', 'search': 'Søg', 'active': 'Aktiv', 'archived': 'Archived', @@ -20136,38 +20235,38 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archive': 'Arkiv', 'delete': 'Slet', 'restore': 'Genskab', - 'refresh_complete': 'Refresh Complete', - 'please_enter_your_email': 'Please enter your email', - 'please_enter_your_password': 'Please enter your password', - 'please_enter_your_url': 'Please enter your URL', - 'please_enter_a_product_key': 'Please enter a product key', - 'ascending': 'Ascending', - 'descending': 'Descending', + 'refresh_complete': 'Opdater fuldført', + 'please_enter_your_email': 'Indtast venligst din e-mail', + 'please_enter_your_password': 'Indtast venligst din adgangskode', + 'please_enter_your_url': 'Indtast venligst din URL', + 'please_enter_a_product_key': 'Indtast venligst en produktnøgle', + 'ascending': 'Stigende', + 'descending': 'Aftagende', 'save': 'Gem', - 'an_error_occurred': 'An error occurred', + 'an_error_occurred': 'En fejl opstod', 'paid_to_date': 'Betalt pr. d.d.', 'balance_due': 'Udestående beløb', 'balance': 'Balance', - 'overview': 'Overview', + 'overview': 'Oversigt', 'details': 'Detaljer', 'phone': 'Telefon', 'website': 'Hjemmeside', 'vat_number': 'CVR/SE-nummer', 'id_number': 'CVR/SE-nummer', 'create': 'Opret', - 'copied_to_clipboard': 'Copied :value to the clipboard', - 'error': 'Error', - 'could_not_launch': 'Could not launch', + 'copied_to_clipboard': 'Kopierede :value til udklipsholderen', + 'error': 'Fejl', + 'could_not_launch': 'Kunne ikke starte', 'contacts': 'Kontakter', - 'additional': 'Additional', + 'additional': 'Ekstra', 'first_name': 'Fornavn', 'last_name': 'Efternavn', 'add_contact': 'Tilføj kontakt', 'are_you_sure': 'Er du sikker?', 'cancel': 'Annuller', - 'ok': 'Ok', + 'ok': 'Okay', 'remove': 'Fjern', - 'email_is_invalid': 'Email is invalid', + 'email_is_invalid': 'e-mail er ugyldig', 'product': 'Produkt', 'products': 'Produkter', 'new_product': 'New Product', @@ -20176,9 +20275,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'archived_product': 'Produkt arkiveret', 'deleted_product': 'Sletning af produkt gennemført', 'restored_product': 'Genskabelse af produkt gennemført', - 'archived_products': 'Successfully archived :count products', + 'archived_products': 'Succesfuldt arkiveret :count produkter', 'deleted_products': 'Sletning af :count produkter gennemført', - 'restored_products': 'Successfully restored :value products', + 'restored_products': 'Succesfuldt genskabt :value produkter', 'product_key': 'Produkt', 'notes': 'Notes', 'cost': 'Cost', @@ -20192,7 +20291,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'deleted_client': 'Kunde slettet', 'deleted_clients': 'Slettede :count kunder', 'restored_client': 'Kunde genskabt', - 'restored_clients': 'Successfully restored :value clients', + 'restored_clients': 'Succesfuldt genskabt :value Klienter', 'address1': 'Gade', 'address2': 'Nummer', 'city': 'By', @@ -20209,9 +20308,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_invoice': 'Faktura genskabt', 'archived_invoices': 'Arkiverede :count fakturaer', 'deleted_invoices': 'Slettede :count fakturaer', - 'restored_invoices': 'Successfully restored :value invoices', + 'restored_invoices': 'Succesfuldt genskabt :value Fakturaer', 'emailed_invoice': 'E-mail faktura sendt', - 'emailed_payment': 'Successfully emailed payment', + 'emailed_payment': 'Succesfuldt mailet Betaling', 'amount': 'Beløb', 'invoice_number': 'Fakturanummer', 'invoice_date': 'Faktureringsdato', @@ -20226,105 +20325,105 @@ mixin LocalizationsProvider on LocaleCodeAware { 'quote_number': 'Tilbuds nummer', 'quote_date': 'Tilbuds dato', 'valid_until': 'Gyldig indtil', - 'items': 'Items', - 'partial_deposit': 'Partial/Deposit', + 'items': 'genstande', + 'partial_deposit': 'Delvis/Depositum', 'description': 'Beskrivelse', 'unit_cost': 'Enhedspris', 'quantity': 'Stk.', - 'add_item': 'Add Item', + 'add_item': 'Tilføj vare', 'contact': 'Kontakt', 'work_phone': 'Telefon', - 'total_amount': 'Total Amount', + 'total_amount': 'Total Beløb', 'pdf': 'PDF', 'due_date': 'Betalingsfrist', - 'partial_due_date': 'Partial Due Date', - 'paid_date': 'Paid Date', + 'partial_due_date': 'Delvis forfaldsdato', + 'paid_date': 'Betalt dato', 'status': 'Status', - 'invoice_status_id': 'Invoice Status', - 'quote_status': 'Quote Status', - 'click_plus_to_add_item': 'Click + to add an item', - 'click_plus_to_add_time': 'Click + to add time', - 'count_selected': ':count selected', + 'invoice_status_id': 'Faktura Status', + 'quote_status': 'Citatstatus', + 'click_plus_to_add_item': 'Klik på + for at Tilføj et element', + 'click_plus_to_add_time': 'Klik på + for at Tilføj tid', + 'count_selected': ':count valgt', 'total': 'Total', 'percent': 'Procent', 'edit': 'Rediger', - 'dismiss': 'Dismiss', - 'please_select_a_date': 'Please select a date', - 'please_select_a_client': 'Please select a client', - 'please_select_an_invoice': 'Please select an invoice', - 'task_rate': 'Task Rate', + 'dismiss': 'Afskedige', + 'please_select_a_date': 'Vælg venligst en dato', + 'please_select_a_client': 'Vælg venligst en Klient', + 'please_select_an_invoice': 'Vælg venligst en Faktura', + 'task_rate': 'Opgave', 'settings': 'Indstillinger', - 'language': 'Language', - 'currency': 'Currency', + 'language': 'Sprog', + 'currency': 'betalingsmiddel', 'created_at': 'Oprettelsesdato', - 'created_on': 'Created On', + 'created_on': 'oprettet On', 'updated_at': 'Opdateret', 'tax': 'Moms', - 'please_enter_an_invoice_number': 'Please enter an invoice number', - 'please_enter_a_quote_number': 'Please enter a quote number', - 'past_due': 'Past Due', + 'please_enter_an_invoice_number': 'Indtast venligst et Faktura nummer', + 'please_enter_a_quote_number': 'Indtast venligst et tilbudsnummer', + 'past_due': 'Ikke betalt til tiden', 'draft': 'Kladde', 'sent': 'Sendt', - 'viewed': 'Viewed', - 'approved': 'Approved', + 'viewed': 'har set', + 'approved': 'Godkendt', 'partial': 'Udbetaling', 'paid': 'Betalt', 'mark_sent': 'Markér som sendt', - 'marked_invoice_as_sent': 'Successfully marked invoice as sent', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', - 'marked_invoices_as_sent': 'Successfully marked invoices as sent', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoice_as_sent': 'Succesfuldt markeret Faktura som sendt', + 'marked_invoice_as_paid': 'Succesfuldt markeret Faktura som betalt', + 'marked_invoices_as_sent': 'Succesfuldt markeret Fakturaer som sendt', + 'marked_invoices_as_paid': 'Succesfuldt mærkede Fakturaer som betalt', 'done': 'Færdig', 'please_enter_a_client_or_contact_name': - 'Please enter a client or contact name', + 'Indtast et Klient eller kontakt', 'dark_mode': 'Mørk tilstand', - 'restart_app_to_apply_change': 'Restart the app to apply the change', - 'refresh_data': 'Refresh Data', - 'blank_contact': 'Blank Contact', + 'restart_app_to_apply_change': 'Genstart appen for at anvende ændringen', + 'refresh_data': 'Opdater data', + 'blank_contact': 'Blank kontakt', 'activity': 'Aktivitet', - 'no_records_found': 'No records found', + 'no_records_found': 'Ingen registreringer fundet', 'clone': 'Kopiér', - 'loading': 'Loading', - 'industry': 'Industry', - 'size': 'Size', + 'loading': 'Indlæser', + 'industry': 'Industri', + 'size': 'Størrelse', 'payment_terms': 'Betalingsvilkår', 'payment_date': 'Betalingsdato', - 'payment_status': 'Payment Status', - 'payment_status_1': 'Pending', - 'payment_status_2': 'Voided', - 'payment_status_3': 'Failed', - 'payment_status_4': 'Completed', - 'payment_status_5': 'Partially Refunded', - 'payment_status_6': 'Refunded', - 'payment_status_-1': 'Unapplied', - 'payment_status_-2': 'Partially Unapplied', + 'payment_status': 'Betaling Status', + 'payment_status_1': 'Verserende', + 'payment_status_2': 'annulleret', + 'payment_status_3': 'mislykkedes', + 'payment_status_4': 'Afsluttet', + 'payment_status_5': 'Delvist refunderet', + 'payment_status_6': 'Refunderet', + 'payment_status_-1': 'Ikke anvendt', + 'payment_status_-2': 'Delvis ikke anvendt', 'net': 'Net', 'client_portal': 'Client Portal', - 'show_tasks': 'Show tasks', - 'email_reminders': 'Email Reminders', + 'show_tasks': 'Vis opgaver', + 'email_reminders': 'e-mail påmindelser', 'enabled': 'Aktiveret', 'recipients': 'Modtagere', 'initial_email': 'Indledende e-mail', 'first_reminder': 'First Reminder', 'second_reminder': 'Second Reminder', 'third_reminder': 'Third Reminder', - 'reminder1': 'First Reminder', - 'reminder2': 'Second Reminder', - 'reminder3': 'Third Reminder', + 'reminder1': 'Første påmindelse', + 'reminder2': 'Anden påmindelse', + 'reminder3': 'Tredje påmindelse', 'template': 'Skabelon', - 'send': 'Send', + 'send': 'Sende', 'subject': 'Subject', 'body': 'Body', 'send_email': 'Send e-mail', 'email_receipt': 'Send e-mail kvittering til kunden', - 'auto_billing': 'Auto billing', - 'button': 'Button', + 'auto_billing': 'Automatisk fakturering', + 'button': 'Knap', 'preview': 'Preview', 'customize': 'Customize', 'history': 'Historie', 'payment': 'Betaling', 'payments': 'Betalinger', - 'refunded': 'Refunded', + 'refunded': 'Refunderet', 'payment_type': 'Betalingstype', 'transaction_reference': 'Transaktionsreference', 'enter_payment': 'Tilføj betaling', @@ -20336,7 +20435,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_payment': 'Betaling genskabt', 'archived_payments': 'Arkiverede :count betalinger', 'deleted_payments': 'Slettede :count betalinger', - 'restored_payments': 'Successfully restored :value payments', + 'restored_payments': 'Succesfuldt genskabt :value Betalinger', 'quote': 'Pristilbud', 'quotes': 'Pristilbud', 'new_quote': 'Nyt tilbud', @@ -20347,7 +20446,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'restored_quote': 'Tilbud genskabt', 'archived_quotes': 'Arkiverede :count tilbud', 'deleted_quotes': 'Slettede :count tilbud', - 'restored_quotes': 'Successfully restored :value quotes', + 'restored_quotes': 'Succesfuldt genskabt :value citater', 'expense': 'Expense', 'expenses': 'Udgifter', 'vendor': 'Sælger', @@ -20367,7 +20466,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_8': ':user arkiverede faktura :invoice', 'activity_9': ':user slettede faktura :invoice', 'activity_10': - ':user entered payment :payment for :payment_amount on invoice :invoice for :client', + ':user indtastet Betaling :payment for :payment _beløb på Faktura :invoice for :client', 'activity_11': ':user ajourførte betaling :payment', 'activity_12': ':user arkiverede betaling :payment', 'activity_13': ':user slettede betaling :payment', @@ -20405,139 +20504,165 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_45': ':user slettede opgave :task', 'activity_46': ':user genoprettede opgave :task', 'activity_47': ':user ajourførte udgift :expense', - 'activity_48': ':user created user :user', - 'activity_49': ':user updated user :user', - 'activity_50': ':user archived user :user', - 'activity_51': ':user deleted user :user', - 'activity_52': ':user restored user :user', - 'activity_53': ':user marked sent :invoice', - 'activity_54': ':user paid invoice :invoice', + 'activity_48': ':user oprettet Bruger :user', + 'activity_49': ':user opdateret Bruger :user', + 'activity_50': ':user arkiveret Bruger :user', + 'activity_51': ':user slettet Bruger :user', + 'activity_52': ':user genskabt Bruger :user', + 'activity_53': ':user markeret sendt :invoice', + 'activity_54': ':user betalt Faktura :invoice', 'activity_55': ':contact besvarede sagen :ticket', 'activity_56': ':user læste sagen :ticket', - 'activity_57': 'System failed to email invoice :invoice', - 'activity_58': ':user reversed invoice :invoice', - 'activity_59': ':user cancelled invoice :invoice', - 'activity_60': ':contact viewed quote :quote', - 'activity_61': ':user updated client :client', - 'activity_62': ':user updated vendor :vendor', + 'activity_57': 'Systemet kunne ikke sende e-mail til Faktura :invoice', + 'activity_58': ':user omvendt Faktura :invoice', + 'activity_59': ':user annulleret Faktura :invoice', + 'activity_60': ':contact set citat :quote', + 'activity_61': ':user opdateret Klient :client', + 'activity_62': ':user opdateret Sælger :vendor', 'activity_63': - ':user emailed first reminder for invoice :invoice to :contact', + ':user e-mailede den første påmindelse for Faktura :invoice til :contact', 'activity_64': - ':user emailed second reminder for invoice :invoice to :contact', + ':user e-mailede anden påmindelse for Faktura :invoice til :contact', 'activity_65': - ':user emailed third reminder for invoice :invoice to :contact', + ':user har sendt en tredje påmindelse til Faktura :invoice via e-mail til :contact', 'activity_66': - ':user emailed endless reminder for invoice :invoice to :contact', - 'activity_80': ':user created subscription :subscription', - 'activity_81': ':user updated subscription :subscription', - 'activity_82': ':user archived subscription :subscription', - 'activity_83': ':user deleted subscription :subscription', - 'activity_84': ':user restored subscription :subscription', - 'one_time_password': 'One Time Password', + ':user e-mailede en endeløs påmindelse om Faktura :invoice til :contact', + 'activity_80': ':user oprettet abonnement :subscription', + 'activity_81': ':user opdateret abonnement :subscription', + 'activity_82': ':user arkiveret abonnement :subscription', + 'activity_83': ':user slettet abonnement :subscription', + 'activity_84': ':user genskabt abonnement :subscription', + 'one_time_password': 'Engangskodeord', 'emailed_quote': 'Tilbud sendt som e-mail', - 'emailed_credit': 'Successfully emailed credit', - 'marked_quote_as_sent': 'Successfully marked quote as sent', - 'marked_credit_as_sent': 'Successfully marked credit as sent', + 'emailed_credit': 'Succesfuldt emailet kredit', + 'marked_quote_as_sent': 'Succesfuldt markeret tilbud som sendt', + 'marked_credit_as_sent': 'Succesfuldt markeret kredit som sendt', 'expired': 'Expired', 'all': 'Alle', 'select': 'Vælg', - 'long_press_multiselect': 'Long-press Multiselect', - 'custom_value1': 'Custom Value 1', - 'custom_value2': 'Custom Value 2', - 'custom_value3': 'Custom Value 3', - 'custom_value4': 'Custom Value 4', - 'email_style_custom': 'Custom Email Style', - 'custom_message_dashboard': 'Custom Dashboard Message', - 'custom_message_unpaid_invoice': 'Custom Unpaid Invoice Message', - 'custom_message_paid_invoice': 'Custom Paid Invoice Message', - 'custom_message_unapproved_quote': 'Custom Unapproved Quote Message', - 'lock_invoices': 'Lock Invoices', - 'translations': 'Translations', - 'task_number_pattern': 'Task Number Pattern', - 'task_number_counter': 'Task Number Counter', - 'expense_number_pattern': 'Expense Number Pattern', - 'expense_number_counter': 'Expense Number Counter', - 'vendor_number_pattern': 'Vendor Number Pattern', - 'vendor_number_counter': 'Vendor Number Counter', - 'ticket_number_pattern': 'Ticket Number Pattern', - 'ticket_number_counter': 'Ticket Number Counter', - 'payment_number_pattern': 'Payment Number Pattern', - 'payment_number_counter': 'Payment Number Counter', - 'invoice_number_pattern': 'Invoice Number Pattern', + 'long_press_multiselect': 'Tryk længe på Multiselect', + 'custom_value1': 'Speciel 1', + 'custom_value2': 'Speciel 2', + 'custom_value3': 'Speciel 3', + 'custom_value4': 'Speciel 4', + 'email_style_custom': 'Speciel e-mail stil', + 'custom_message_dashboard': 'Speciel Dashboard Besked', + 'custom_message_unpaid_invoice': 'Speciel Ubetalt Faktura Besked', + 'custom_message_paid_invoice': 'Speciel Paid Faktura Besked', + 'custom_message_unapproved_quote': 'Speciel Ugodkendt Citat Besked', + 'lock_invoices': 'Lock Fakturaer', + 'translations': 'Oversættelser', + 'task_number_pattern': 'Opgave nummermønster', + 'task_number_counter': 'Opgave nummertæller', + 'expense_number_pattern': 'Udgift Nummermønster', + 'expense_number_counter': 'Udgift Antal Tæller', + 'vendor_number_pattern': 'Sælger Talmønster', + 'vendor_number_counter': 'Sælger Taltæller', + 'ticket_number_pattern': 'Sag nummer mønster', + 'ticket_number_counter': 'Sag nummer tæller', + 'payment_number_pattern': 'Betaling', + 'payment_number_counter': 'Betaling', + 'invoice_number_pattern': 'Faktura nummermønster', 'invoice_number_counter': 'Fakturanummer-tæller', - 'quote_number_pattern': 'Quote Number Pattern', + 'quote_number_pattern': 'Citatnummermønster', 'quote_number_counter': 'Tilbuds nummer-tæller', - 'client_number_pattern': 'Credit Number Pattern', - 'client_number_counter': 'Credit Number Counter', - 'credit_number_pattern': 'Credit Number Pattern', - 'credit_number_counter': 'Credit Number Counter', - 'reset_counter_date': 'Reset Counter Date', - 'counter_padding': 'Counter Padding', - 'shared_invoice_quote_counter': 'Share Invoice Quote Counter', - 'default_tax_name_1': 'Default Tax Name 1', - 'default_tax_rate_1': 'Default Tax Rate 1', - 'default_tax_name_2': 'Default Tax Name 2', - 'default_tax_rate_2': 'Default Tax Rate 2', - 'default_tax_name_3': 'Default Tax Name 3', - 'default_tax_rate_3': 'Default Tax Rate 3', - 'email_subject_invoice': 'Email Invoice Subject', - 'email_subject_quote': 'Email Quote Subject', - 'email_subject_payment': 'Email Payment Subject', - 'email_subject_payment_partial': 'Email Partial Payment Subject', - 'show_table': 'Show Table', - 'show_list': 'Show List', - 'client_city': 'Client City', - 'client_state': 'Client State', - 'client_country': 'Client Country', - 'client_is_active': 'Client is Active', - 'client_balance': 'Client Balance', - 'client_address1': 'Client Street', - 'client_address2': 'Client Apt/Suite', - 'vendor_address1': 'Vendor Street', - 'vendor_address2': 'Vendor Apt/Suite', - 'client_shipping_address1': 'Client Shipping Street', - 'client_shipping_address2': 'Client Shipping Apt/Suite', + 'client_number_pattern': 'Kreditnummermønster', + 'client_number_counter': 'Kreditnummertæller', + 'credit_number_pattern': 'Kreditnummermønster', + 'credit_number_counter': 'Kreditnummertæller', + 'reset_counter_date': 'Nulstil tællerdato', + 'counter_padding': 'Bordpolstring', + 'shared_invoice_quote_counter': 'Del Faktura Citat tæller', + 'default_tax_name_1': 'Standard skattenavn 1', + 'default_tax_rate_1': 'Standardafgiftssats 1', + 'default_tax_name_2': 'Standard skattenavn 2', + 'default_tax_rate_2': 'Standardafgiftssats 2', + 'default_tax_name_3': 'Standard skattenavn 3', + 'default_tax_rate_3': 'Standardafgiftssats 3', + 'email_subject_invoice': 'e-mail Faktura Emne', + 'email_subject_quote': 'e-mail Citat Emne', + 'email_subject_payment': 'e-mail Betaling Emne', + 'email_subject_payment_partial': 'e-mail Betaling Emne', + 'show_table': 'Vis tabel', + 'show_list': 'Vis liste', + 'client_city': 'Klient City', + 'client_state': 'Klient', + 'client_country': 'Klient', + 'client_is_active': 'Klient er aktiv', + 'client_balance': 'Klient balance', + 'client_address1': 'Klient Street', + 'client_address2': 'Klient Apt/Suite', + 'vendor_address1': 'Sælger Gade', + 'vendor_address2': 'Sælger Apt/Suite', + 'client_shipping_address1': 'Klient Shipping Street', + 'client_shipping_address2': 'Klient Shipping Apt/Suite', 'type': 'Type', 'invoice_amount': 'Invoice Amount', 'invoice_due_date': 'Due Date', - 'tax_rate1': 'Tax Rate 1', - 'tax_rate2': 'Tax Rate 2', - 'tax_rate3': 'Tax Rate 3', + 'tax_rate1': 'Skattesats 1', + 'tax_rate2': 'Skattesats 2', + 'tax_rate3': 'Skattesats 3', 'auto_bill': 'Auto Bill', - 'archived_at': 'Archived At', - 'has_expenses': 'Has Expenses', - 'custom_taxes1': 'Custom Taxes 1', - 'custom_taxes2': 'Custom Taxes 2', - 'custom_taxes3': 'Custom Taxes 3', - 'custom_taxes4': 'Custom Taxes 4', - 'custom_surcharge1': 'Custom Surcharge 1', - 'custom_surcharge2': 'Custom Surcharge 2', - 'custom_surcharge3': 'Custom Surcharge 3', - 'custom_surcharge4': 'Custom Surcharge 4', - 'is_deleted': 'Is Deleted', - 'vendor_city': 'Vendor City', - 'vendor_state': 'Vendor State', - 'vendor_country': 'Vendor Country', - 'is_approved': 'Is Approved', + 'archived_at': 'arkiveret Kl', + 'has_expenses': 'Har Udgifter', + 'custom_taxes1': 'Speciel 1', + 'custom_taxes2': 'Speciel 2', + 'custom_taxes3': 'Speciel 3', + 'custom_taxes4': 'Speciel 4', + 'custom_surcharge1': 'Speciel 1', + 'custom_surcharge2': 'Speciel 2', + 'custom_surcharge3': 'Speciel 3', + 'custom_surcharge4': 'Speciel 4', + 'is_deleted': 'Er slettet', + 'vendor_city': 'Sælger By', + 'vendor_state': 'Sælger Stat', + 'vendor_country': 'Sælger Land', + 'is_approved': 'Er Godkendt', 'tax_name': 'Tax Name', - 'tax_amount': 'Tax Amount', - 'tax_paid': 'Tax Paid', + 'tax_amount': 'Skat Beløb', + 'tax_paid': 'Skat betalt', 'payment_amount': 'Beløb', 'age': 'Alder', - 'is_running': 'Is Running', + 'is_running': 'Løber', 'time_log': 'Tids log', 'bank_id': 'bank', - 'expense_category_id': 'Expense Category ID', + 'expense_category_id': 'Udgift Kategori ID', 'expense_category': 'Udgiftskategori', - 'invoice_currency_id': 'Invoice Currency ID', - 'tax_name1': 'Tax Name 1', - 'tax_name2': 'Tax Name 2', - 'tax_name3': 'Tax Name 3', - 'transaction_id': 'Transaction ID', - 'status_color_theme': 'Status Color Theme', - 'load_color_theme': 'Load Color Theme', + 'invoice_currency_id': 'Faktura Valuta ID', + 'tax_name1': 'Skattenavn 1', + 'tax_name2': 'Skattenavn 2', + 'tax_name3': 'Skattenavn 3', + 'transaction_id': 'Transaktions ID', + 'status_color_theme': 'Status farvetema', + 'load_color_theme': 'Indlæs farvetema', }, 'nl': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Laatste login', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Terugkerend', @@ -23154,6 +23279,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Kleurthema laden', }, 'en_GB': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Last Login', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Recurring', @@ -25718,6 +25869,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'et': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Viimane Sisselogimine', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Perioodilisus', @@ -28285,6 +28462,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Laadige värviteema', }, 'fi': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Viimeinen kirjautuminen', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Toistuvat', @@ -30853,24 +31056,50 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'fr': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Exécuter le modèle', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Dernière connexion', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Contact client', + 'expense_status_4': 'Non payé', + 'expense_status_5': 'Payé', 'recurring': 'Récurrent', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', + 'Remarque : cette fonctionnalité nécessite une clé API Zip-Tax pour rechercher la taxe de vente américaine par adresse.', + 'cache_data': 'Données en cache', + 'unknown': 'Inconnu', + 'webhook_failure': 'Échec du webhook', + 'email_opened': 'E-mail ouvert', + 'email_delivered': 'E-mail livré', + 'log': 'Enregistrer', + 'individual': 'Individuel', + 'partnership': 'Partenariat', + 'trust': 'Confiance', + 'charity': 'Charité', + 'government': 'Gouvernement', 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', + 'click_or_drop_files_here': 'Cliquez ou déposez les fichiers ici', 'public': 'Publique', 'private': 'Privé', 'image': 'Image', @@ -31611,7 +31840,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'include_drafts_help': 'Inclure les brouillons d\'enregistrements dans les rapports', 'is_invoiced': 'Est facturé', - 'change_plan': 'Manage Plan', + 'change_plan': 'Gérer le forfait', 'persist_data': 'Mémoriser les données', 'customer_count': 'Nombre de clients', 'verify_customers': 'Vérifier les clients', @@ -32092,10 +32321,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Montant minimum de sous-paiement', 'profit': 'Profit', 'line_item': 'Ligne d\'article', - 'allow_over_payment': 'Accepter Sur-paiement', + 'allow_over_payment': 'Autoriser le trop-payé', 'allow_over_payment_help': 'Accepter le paiement supplémentaire pour pourboire', - 'allow_under_payment': 'Accepter Sous-paiement', + 'allow_under_payment': 'Autoriser le sous-paiement', 'allow_under_payment_help': 'Supporter le paiement au minimum du montant de l\'acompte', 'test_mode': 'Mode test', @@ -32554,7 +32783,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent': 'Ajuster le pourcentage de frais', 'adjust_fee_percent_help': 'Ajuster le frais de pourcentage au compte', 'configure_settings': 'Modifier les paramètres', - 'support_forum': 'Support Forums', + 'support_forum': 'Forums d'assistance', 'about': 'À propos', 'documentation': 'Documentation', 'contact_us': 'Nous joindre', @@ -33253,9 +33482,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'paid': 'Payé', 'mark_sent': 'Marquer comme envoyé', 'marked_invoice_as_sent': 'Facture marquee comme envoyee avec succes', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', + 'marked_invoice_as_paid': 'Facture marquée avec succès comme payée', 'marked_invoices_as_sent': 'Les factures ont été marquées envoyées', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoices_as_paid': 'Factures marquées avec succès comme payées', 'done': 'Terminé', 'please_enter_a_client_or_contact_name': 'Veuillez introduire un nom de client', @@ -33524,22 +33753,48 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Charger le thème de couleur', }, 'fr_CA': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Exécuter le modèle', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Dernière connexion', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Contact client', + 'expense_status_4': 'Impayé', + 'expense_status_5': 'Payé', 'recurring': 'Récurrente', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', + 'Note: Cette fonctionnalité requiert une clé API Zip-Tax pour obtenir les taux de taxes de vente par adresse pour les États-Unis', + 'cache_data': 'Données en cache', + 'unknown': 'Inconnu', + 'webhook_failure': 'Échec du webhook', + 'email_opened': 'Courriel ouvert', + 'email_delivered': 'Courriel livré', + 'log': 'Journal', + 'individual': 'Individuel', + 'partnership': 'partenaire', + 'trust': 'Fiducie', + 'charity': 'Organisation caritative', + 'government': 'Gouvernement', 'classification': 'Classification', 'click_or_drop_files_here': 'Cliquez ou déposez les fichiers ici', 'public': 'Public', @@ -34743,10 +34998,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Montant minimum de sous-paiement', 'profit': 'Profit', 'line_item': 'Ligne d\'article', - 'allow_over_payment': 'Accepter Sur-paiement', + 'allow_over_payment': 'Autoriser le surpaiement', 'allow_over_payment_help': 'Accepter paiement supplémentaire pour pourboire', - 'allow_under_payment': 'Accepter Sous-paiement', + 'allow_under_payment': 'Autoriser le souspaiement', 'allow_under_payment_help': 'Accepter paiement au minimum le montant partiel/dépôt', 'test_mode': 'Mode test', @@ -36166,46 +36421,72 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Charger le thème de couleurs', }, 'fr_CH': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Exécuter le modèle', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Dernière connexion', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Contact client', + 'expense_status_4': 'Non payé', + 'expense_status_5': 'Payé', 'recurring': 'Récurrente', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', + 'Remarque : cette fonctionnalité nécessite une clé API Zip-Tax pour rechercher la taxe de vente américaine par adresse.', + 'cache_data': 'Données en cache', + 'unknown': 'Inconnu', + 'webhook_failure': 'Échec du webhook', + 'email_opened': 'E-mail ouvert', + 'email_delivered': 'E-mail livré', + 'log': 'Enregistrer', + 'individual': 'Individuel', + 'partnership': 'partenaire', + 'trust': 'Confiance', + 'charity': 'Charité', + 'government': 'Gouvernement', 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', - 'public': 'Public', - 'private': 'Private', + 'click_or_drop_files_here': 'Cliquez ou déposez les fichiers ici', + 'public': 'Publique', + 'private': 'Privé', 'image': 'Image', - 'other': 'Other', + 'other': 'Autre', 'hash': 'Hash', - 'linked_to': 'Linked To', - 'file_saved_in_path': 'The file has been saved in :path', - 'unlinked_transactions': 'Successfully unlinked :count transactions', - 'unlinked_transaction': 'Successfully unlinked transaction', + 'linked_to': 'Lié à', + 'file_saved_in_path': 'Le fichier a été enregistré dans :path', + 'unlinked_transactions': 'Transactions :count dissociées avec succès', + 'unlinked_transaction': 'Transaction dissociée avec succès', 'unlink': 'Dissocié', 'view_dashboard_permission': - 'Allow user to access the dashboard, data is limited to available permissions', - 'is_tax_exempt': 'Tax Exempt', - 'district': 'District', - 'region': 'Region', - 'county': 'County', - 'tax_details': 'Tax Details', + 'Autoriser l'utilisateur à accéder au tableau de bord, les données sont limitées aux autorisations disponibles', + 'is_tax_exempt': 'TVA non applicable', + 'district': 'Canton', + 'region': 'Région', + 'county': 'Pays', + 'tax_details': 'Détails de la TVA', 'activity_10_online': - ':contact entered payment :payment for invoice :invoice for :client', + ':contact paiement saisi :payment pour facture :invoice pour :client', 'activity_10_manual': - ':user entered payment :payment for invoice :invoice for :client', - 'default_payment_type': 'Default Payment Type', + ':user paiement saisi :payment pour facture :invoice pour :client', + 'default_payment_type': 'Type de paiement par défaut', 'admin_initiated_payments': 'Paiements initiés par l'administrateur', 'admin_initiated_payments_help': 'Prise en charge de la saisie d'un paiement dans le portail d'administration sans facture', @@ -36893,7 +37174,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'include_drafts': 'Include Drafts', 'include_drafts_help': 'Include draft records in reports', 'is_invoiced': 'Is Invoiced', - 'change_plan': 'Manage Plan', + 'change_plan': 'Gérer le forfait', 'persist_data': 'Persist Data', 'customer_count': 'Customer Count', 'verify_customers': 'Verify Customers', @@ -37380,10 +37661,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Montant minimum de sous-paiement', 'profit': 'Profit', 'line_item': 'Ligne d\'article', - 'allow_over_payment': 'Accepter Sur-paiement', + 'allow_over_payment': 'Autoriser le surpaiement', 'allow_over_payment_help': 'Accepter paiement supplémentaire pour pourboire', - 'allow_under_payment': 'Accepter Sous-paiement', + 'allow_under_payment': 'Autoriser le souspaiement', 'allow_under_payment_help': 'Accepter paiement au minimum le montant partiel/dépôt', 'test_mode': 'Mode test', @@ -37845,7 +38126,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent': 'Ajuster le pourcentage de frais', 'adjust_fee_percent_help': 'Ajuster le frais de pourcentage au compte', 'configure_settings': 'Configurer les paramètres', - 'support_forum': 'Support Forums', + 'support_forum': 'Forums d'assistance', 'about': 'À propos', 'documentation': 'Documentation', 'contact_us': 'Nous joindre', @@ -38240,7 +38521,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'download': 'Télécharger', 'requires_an_enterprise_plan': 'Le plan Entreprise est requis', 'take_picture': 'Prendre un photo', - 'upload_files': 'Upload Files', + 'upload_files': 'Téléverser les fichiers', 'document': 'Justificatifs', 'documents': 'Documents', 'new_document': 'Nouveau document', @@ -38545,10 +38826,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'mark_sent': 'Marquer comme envoyé', 'marked_invoice_as_sent': 'La facture a été marquée comme envoyée avec succès', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', + 'marked_invoice_as_paid': 'La facture a été marquée comme payée', 'marked_invoices_as_sent': 'Les factures ont été marquées comme envoyées avec succès', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoices_as_paid': 'Les factures ont été marquées comme payées', 'done': 'Finalisé', 'please_enter_a_client_or_contact_name': 'Veuillez saisir un nom de client ou de contact', @@ -38820,61 +39101,89 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'de': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Template anwenden', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Letzter Login', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Kundenkontakt', + 'expense_status_4': 'Unbezahlt', + 'expense_status_5': 'Bezahlt', 'recurring': 'Wiederkehrend', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', + 'Hinweis: Für diese Funktion ist ein \'Zip-Tax\'-API-Schlüssel erforderlich, um die US-Umsatzsteuer anhand der Adresse zu ermitteln', + 'cache_data': 'Cache Daten', + 'unknown': 'Unbekannt', + 'webhook_failure': 'Webhook-Fehler', + 'email_opened': 'E-Mail geöffnet', + 'email_delivered': 'E-Mail zugestellt', 'log': 'Log', - 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', + 'individual': 'Indiviuell', + 'partnership': 'Partnerschaft', + 'trust': 'Treuhand/Stiftung', + 'charity': 'Wohltätigkeitsorganisation', + 'government': 'Regierungsbehörde', + 'classification': 'Klassifizierung', + 'click_or_drop_files_here': 'Hier klicken oder Dateien ablegen', 'public': 'Öffentlich', 'private': 'Privat', - 'image': 'Image', + 'image': 'Bild', 'other': 'Andere', 'hash': 'Hash', - 'linked_to': 'Linked To', - 'file_saved_in_path': 'The file has been saved in :path', - 'unlinked_transactions': 'Successfully unlinked :count transactions', - 'unlinked_transaction': 'Successfully unlinked transaction', + 'linked_to': 'Verknüpft mit', + 'file_saved_in_path': 'Die Datei wurde unter :path gespeichert', + 'unlinked_transactions': + 'Verknüpfung zu :count Transaktionen wurde erfolgreich entfernt', + 'unlinked_transaction': + 'Verknüpfung zu einer Transaktion wurde erfolgreich entfernt', 'unlink': 'Trennen', 'view_dashboard_permission': - 'Allow user to access the dashboard, data is limited to available permissions', - 'is_tax_exempt': 'Tax Exempt', - 'district': 'District', + 'Nutzern erlauben, auf das Dashboard zuzugreifen. Die Berechtigungen der Nutzer limitieren die angezeigten Daten.', + 'is_tax_exempt': 'Steuerbefreit', + 'district': 'Bezirk', 'region': 'Region', - 'county': 'County', + 'county': 'Landkreis', 'tax_details': 'Steuerdetails', 'activity_10_online': - ':contact entered payment :payment for invoice :invoice for :client', + ':contact hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben', 'activity_10_manual': - ':user entered payment :payment for invoice :invoice for :client', + ':user hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben', 'default_payment_type': 'Standard Zahlungsart', - 'admin_initiated_payments': 'Admin Initiated Payments', + 'admin_initiated_payments': 'Administrator-initiierte Zahlungen', 'admin_initiated_payments_help': - 'Support entering a payment in the admin portal without an invoice', + 'Aktivieren von Zahlungen ohne Rechnung im Admin-Portal', 'use_mobile_to_manage_plan': - 'Use your phone subscription settings to manage your plan', + 'Verwenden der Telefon-Abonnementeinstellungen, um Ihren Tarif zu verwalten', 'show_task_billable': 'Abrechenbare Aufgaben anzeigen', 'credit_item': 'Gutschriftsposition', 'files': 'Dateien', 'camera': 'Kamera', 'gallery': 'Gallerie', 'email_count_invoices': ':count Rechnungen versenden', - 'project_location': 'Projektstandort', + 'project_location': 'Feld, in dem das Projekt genannt wird', 'invoice_task_item_description': 'Rechnungspositionsbeschreibung', 'invoice_task_item_description_help': - 'Add the item description to the invoice line items', + 'Element-Beschreibung zu den Rechnungs-Positionen hinzufügen', 'next_send_time': 'Nächster Versandzeitpunkt', 'uploaded_certificate': 'Das Zertifikat wurde erfolgreich hochgeladen', 'certificate_set': 'Zertifikat hochgeladen', @@ -39043,9 +39352,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'hour': 'Stunde', 'emailed_statement': 'Erfolgreich in die Versandwarteschlange eingereiht', 'show_email_footer': 'E-Mail Fußzeile anzeigen', - 'invoice_task_hours': 'Aufgabenstunden in Rechnung stellen', + 'invoice_task_hours': + 'In Aufgabe erfasste Stunden in Rechnungen ausweisen', 'invoice_task_hours_help': - 'Fügen Sie die Stunden zu den Rechnungspositionen hinzu.', + 'Zeigt die Stunden in den Rechnungspositionen an', 'auto_bill_standard_invoices': 'Auto Bill Standardrechnungen', 'auto_bill_recurring_invoices': 'Wiederkehrende Rechnungen automatisch abrechnen', @@ -39207,9 +39517,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'mark_paid_payment_email': 'E-Mail bei Zahlungsmarkierung', 'convert_to_project': 'In Projekt umwandeln', 'client_email': 'Kunden E-Mail', - 'invoice_task_project': 'Rechnung Aufgabe Projekt', + 'invoice_task_project': + 'In Aufgabe erfasstes Projekt in Rechnungen ausweisen', 'invoice_task_project_help': - 'Fügen Sie das Projekt zu den Rechnungspositionen hinzu', + 'Zeigt den Projektnamen in den Rechnungspositionen an', 'field': 'Feld', 'period': 'Zeitraum', 'fields_per_row': 'Felder pro Reihe', @@ -39249,7 +39560,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'invalid_phone_number': 'Ungültige Telefonnummer', 'verify_phone_number': 'Telefonnummer verifizieren', 'verify_phone_number_help': - 'Bitte verifiziere deine Telefonnummer, um E-Mails versenden zu können.', + 'Bitte verifizieren Sie Ihre Telefonnummer, um E-Mails versenden zu können.', 'verify_phone_number_2fa_help': 'Bitte die Telefonnummer mit 2FA bestätigen', 'merged_clients': 'Erfolgreich Kunden zusammengefasst', @@ -39365,7 +39676,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'set_default_design': 'Standard-Design festlegen', 'add_gateway': 'Zahlungsanbieter hinzufügen', 'add_gateway_help_message': - 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', + 'Payment-Gateway hinzufügen (z. B. Stripe, WePay oder PayPal), um Online-Zahlungen anbieten zu können', 'left': 'Links', 'right': 'Rechts', 'center': 'Mittig', @@ -39415,7 +39726,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'tax_amount3': 'Steuerhöhe 3', 'create_project': 'Projekt erstellen', 'update_project': 'Projekt aktualisieren', - 'view_task': 'Aufgabe anzeugen', + 'view_task': 'Aufgabe anzeigen', 'cancel_invoice': 'Stornieren', 'changed_status': 'Erfolgreich Aufgabenstatus geändert', 'change_status': 'Status ändern', @@ -39432,7 +39743,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'json_help': 'Achtung: JSON-Dateien, die mit v4 der App erstellt wurden, werden nicht unterstützt', 'release_notes': 'Versionshinweise', - 'upgrade_to_view_reports': 'Upgrade deinen Tarif um Berichte anzusehen', + 'upgrade_to_view_reports': + 'Wechseln Sie Ihren Tarif, um Berichte ansehen zu können', 'started_tasks': ':value Aufgaben erfolgreich gestartet', 'stopped_tasks': ':value Aufgaben erfolgreich angehalten', 'approved_quote': 'Angebot erfolgreich angenommen', @@ -39458,7 +39770,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'custom_emails_disabled_help': 'Um Spam zu verhindern braucht es ein Upgrade zu einem bezahlten Account um das E-Mail anzupassen.', 'upgrade_to_add_company': - 'Upgrade deinen Tarif um weitere Firmen hinzuzufügen', + 'Wechseln Sie Ihren Tarif, um weitere Firmen hinzufügen zu können', 'small': 'Klein', 'marked_credit_as_paid': 'Gutschrift erfolgreich als bezahlt markiert', 'marked_credits_as_paid': 'Erfolgreich Kredite als bezahlt markiert', @@ -39567,7 +39879,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'include_drafts_help': 'Entwürfe von Aufzeichnungen in Berichte einbeziehen', 'is_invoiced': 'Ist in Rechnung gestellt', - 'change_plan': 'Manage Plan', + 'change_plan': 'Tarif verwalten', 'persist_data': 'Daten aufbewahren', 'customer_count': 'Kundenzahl', 'verify_customers': 'Kunden überprüfen', @@ -39767,7 +40079,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut.', 'please_first_set_a_password': 'Bitte vergeben Sie zuerst ein Passwort.', 'changing_phone_disables_two_factor': - 'Achtung: Das Ändern deiner Telefonnummer wird die Zwei-Faktor-Authentifizierung deaktivieren', + 'Achtung: Das Ändern Ihrer Telefonnummer wird die Zwei-Faktor-Authentifizierung deaktivieren', 'help_translate': 'Hilf mit beim Übersetzen', 'please_select_a_country': 'Bitte wählen Sie ein Land', 'resend_invite': 'Einladung erneut versenden', @@ -39878,14 +40190,14 @@ mixin LocalizationsProvider on LocaleCodeAware { 'Vorschau von Aktualisierungen schneller, aber weniger genau', 'view_licenses': 'Lizenzen anzeigen', 'webhook_url': 'Webhook URL', - 'fullscreen_editor': 'Vollbild Editor', - 'sidebar_editor': 'Seitenmenü Editor', + 'fullscreen_editor': 'Vollbild-Editor', + 'sidebar_editor': 'Seitenmenü-Editor', 'please_type_to_confirm': 'Bitte geben Sie \':value\' zur Bestätigung ein', 'purge': 'Bereinigen', 'service': 'Leistung', 'clone_to': 'Duplizieren zu', - 'clone_to_other': 'Zu anderen duplizieren', + 'clone_to_other': 'Als anderen Typ duplizieren', 'labels': 'Beschriftung', 'add_custom': 'Beschriftung hinzufügen', 'payment_tax': 'Steuer-Zahlung', @@ -39920,7 +40232,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'client_phone': 'Kunden Telefon', 'required_fields': 'Benötigte Felder', 'calculated_rate': 'Berechneter Satz', - 'default_task_rate': 'Standard Stundenlohn', + 'default_task_rate': 'Standard-Stundenlohn', 'clear_cache': 'Zwischenspeicher leeren', 'sort_order': 'Sortierreihenfolge', 'task_status': 'Status', @@ -39933,21 +40245,23 @@ mixin LocalizationsProvider on LocaleCodeAware { 'deleted_task_status': 'Aufgaben Status erfolgreich gelöscht', 'removed_task_status': 'Aufgaben Status erfolgreich entfernt', 'restored_task_status': 'Aufgaben Status erfolgreich wiederhergestellt', - 'archived_task_statuses': ':value Aufgaben Stati erfolgreich archiviert', - 'deleted_task_statuses': ':value Aufgaben Stati erfolgreich gelöscht', + 'archived_task_statuses': ':value Aufgaben-Status erfolgreich archiviert', + 'deleted_task_statuses': ':value Aufgaben-Status erfolgreich gelöscht', 'restored_task_statuses': - ':value Aufgaben Stati erfolgreich wiederhergestellt', + ':value Aufgaben-Status erfolgreich wiederhergestellt', 'search_task_status': 'Suche 1 Aufgaben Status', 'search_task_statuses': 'Suche :count Aufgaben Status', 'show_tasks_table': 'Zeige Aufgaben Tabelle', 'show_tasks_table_help': 'Beim Erstellen von Rechnungen immer die Aufgabenauswahl anzeigen', - 'invoice_task_timelog': 'Aufgaben Zeiterfassung in Rechnung stellen', + 'invoice_task_timelog': + 'In Aufgabe erfasste Zeiten in Rechnungen ausweisen', 'invoice_task_timelog_help': - 'Zeitdetails in der Rechnungsposition ausweisen', - 'invoice_task_datelog': 'Aufgabenzeiterfassung in Rechnung stellen', + 'Zeigt Zeitdetails in den Rechnungspositionen an', + 'invoice_task_datelog': + 'In Aufgabe erfasste Daten in Rechnungen ausweisen', 'invoice_task_datelog_help': - 'Datumsdetails zu den Rechnungsposten hinzufügen', + 'Zeigt Datumsdetails in den Rechnungspositionen an', 'auto_start_tasks_help': 'Beginne Aufgabe vor dem Speichern', 'configure_statuses': 'Status bearbeiten', 'task_settings': 'Aufgaben-Einstellungen', @@ -40049,10 +40363,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Minimaler Unterzahlungsbetrag', 'profit': 'Profit', 'line_item': 'Posten', - 'allow_over_payment': 'Überzahlung zulassen', + 'allow_over_payment': 'Überbezahlung erlauben', 'allow_over_payment_help': 'Überzahlungen zulassen, beispielsweise Trinkgelder', - 'allow_under_payment': 'Unterzahlung zulassen', + 'allow_under_payment': 'Unterbezahlung erlauben', 'allow_under_payment_help': 'Teilzahlungen zulassen', 'test_mode': 'Test Modus', 'opened': 'Geöffnet', @@ -40334,7 +40648,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'apply_license': 'Lizenz anwenden', 'cancel_account': 'Konto kündigen', 'cancel_account_message': - 'Warnung: Diese Aktion wird dein Konto unwiderruflich löschen.', + 'Warnung: Diese Aktion wird Ihr Konto unwiderruflich löschen.', 'delete_company': 'Firma löschen', 'delete_company_message': 'Achtung: Dadurch wird Ihre Firma unwiderruflich gelöscht. Es gibt kein Zurück.', @@ -40510,7 +40824,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent': 'Anpassungszuschlag Prozent', 'adjust_fee_percent_help': 'Gebühren Prozentsatz an das Konto anpassen', 'configure_settings': 'Einstellungen bearbeiten', - 'support_forum': 'Support Forums', + 'support_forum': 'Support-Foren', 'about': 'Über', 'documentation': 'Dokumentation', 'contact_us': 'Kontaktieren Sie uns', @@ -40568,7 +40882,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'default_tax_rate': 'Standard-Steuersatz', 'user': 'Benutzer', 'invoice_tax': 'Rechnungssteuer', - 'line_item_tax': 'Belegposition Steuer', + 'line_item_tax': 'Belegpositions-Steuer', 'inclusive_taxes': 'Inklusive Steuern', 'invoice_tax_rates': 'Rechnungs-Steuersätze', 'item_tax_rates': 'Element-Steuersätze', @@ -41169,7 +41483,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'pdf': 'PDF', 'due_date': 'Fälligkeitsdatum', 'partial_due_date': 'Teilzahlungsziel', - 'paid_date': 'Paid Date', + 'paid_date': 'Zahlungsdatum', 'status': 'Status', 'invoice_status_id': 'Rechnungs Status', 'quote_status': 'Angebotsstatus', @@ -41303,7 +41617,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'activity_8': ':user archivierte Rechnung :invoice', 'activity_9': ':user löschte Rechnung :invoice', 'activity_10': - ':user entered payment :payment for :payment_amount on invoice :invoice for :client', + ':user hat die Zahlung :payment für :payment _amount der Rechnung :invoice für Kunde :client eingegeben', 'activity_11': ':user aktualisierte Zahlung :payment', 'activity_12': ':user archivierte Zahlung :payment', 'activity_13': ':user löschte Zahlung :payment', @@ -41480,6 +41794,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'lade Farbschema', }, 'el': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Τελευταία Είσοδος', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Επαναλαμβανόμενο', @@ -44093,6 +44433,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'he': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'התחברות אחרונה', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'מחזורי', @@ -46609,6 +46975,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'טען ערכת נושא צבע', }, 'hu': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Legutóbbi belépés', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Ismétlődő', @@ -49145,6 +49537,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Szín téma betöltése', }, 'it': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Ultimo Accesso', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Ricorrenti', @@ -50360,9 +50778,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Importo minimo sotto pagamento', 'profit': 'Utile', 'line_item': 'Riga articolo', - 'allow_over_payment': 'Consenti pagamento in eccesso', + 'allow_over_payment': 'Allow Overpayment', 'allow_over_payment_help': 'Accetta il pagamento di un extra', - 'allow_under_payment': 'Consenti pagamento ridotto', + 'allow_under_payment': 'Allow Underpayment', 'allow_under_payment_help': 'Accetta il pagamento parziale o di cauzione', 'test_mode': 'Modalità di test', 'opened': 'Aperto', @@ -51510,10 +51928,12 @@ mixin LocalizationsProvider on LocaleCodeAware { 'mark_sent': 'Contrassegna come inviato', 'marked_invoice_as_sent': 'Fattura contrassegnata con successo come inviata', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', + 'marked_invoice_as_paid': + 'Fattura contrassegnata con successo come inviata', 'marked_invoices_as_sent': 'Fatture contrassegnate con successo come inviate', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoices_as_paid': + 'Fatture contrassegnate con successo come inviate', 'done': 'Completato', 'please_enter_a_client_or_contact_name': 'Si prega di inserire un cliente o nome del contatto', @@ -51688,8 +52108,8 @@ mixin LocalizationsProvider on LocaleCodeAware { 'all': 'Tutti', 'select': 'Seleziona', 'long_press_multiselect': 'Premi a lungo Selezione multipla', - 'custom_value1': 'Custom Value 1', - 'custom_value2': 'Custom Value 2', + 'custom_value1': 'Valore Personalizzato 1', + 'custom_value2': 'Valore Personalizzato 2', 'custom_value3': 'Valore Personalizzato 3', 'custom_value4': 'Valore Personalizzato 4', 'email_style_custom': 'Stile e-mail personalizzato', @@ -51788,6 +52208,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Carica tema colore', }, 'ja': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': '最終ログイン', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': '繰り返し', @@ -54335,6 +54781,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'km_KH': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'ការចូលចុងក្រោយ', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'កើតឡើងម្តងទៀត', @@ -56926,6 +57398,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'ផ្ទុកស្បែកពណ៌', }, 'lv_LV': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Pēdējais pieteikšanās', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Atkārtojošie', @@ -59491,6 +59989,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'lt': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Paskutinis prisijungimas', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Debetinės', @@ -62056,6 +62580,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'mk_MK': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Последна Најава', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Повторувачки', @@ -64625,6 +65175,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'nb_NO': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Siste Pålogging', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Gjentakende', @@ -67190,6 +67766,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'fa': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Last Login', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Recurring', @@ -69754,6 +70356,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'pl': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Ostatnie logowanie', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Odnawialne', @@ -72324,6 +72952,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'pt_BR': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Último Acesso', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Recorrente', @@ -74942,6 +75596,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Carregar tema de cores', }, 'pt_PT': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Último Início de Sessão', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Recorrente', @@ -77567,6 +78247,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Carregar tema de cores', }, 'ro': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Ultima autentificare', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Recurent', @@ -80219,6 +80925,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Schemă de culori încărcare', }, 'ru_RU': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Последний вход', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Повторяющийся', @@ -82784,6 +83516,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'sr': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Zadnja prijava', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Ponavljajući računi', @@ -85357,6 +86115,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'sk': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Posledné prihlásenie', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Opakované', @@ -87952,6 +88736,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Načítať farebný motív', }, 'sl': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Zadnja prijava', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Ponavlj. računi', @@ -90522,36 +91332,63 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Naloži barvno shemo', }, 'es': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Ejecutar plantilla', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Último Acceso', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Contacto con el cliente', + 'expense_status_4': 'No pagado', + 'expense_status_5': 'Pagado', 'recurring': 'Recurrente', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', + 'Nota: esta función requiere una clave API Zip-Tax para buscar impuestos sobre las ventas de EE. UU. por dirección', + 'cache_data': 'Datos de caché', + 'unknown': 'Desconocido', + 'webhook_failure': 'Fallo del webhook', + 'email_opened': 'Correo electrónico abierto', + 'email_delivered': 'Correo electrónico entregado', + 'log': 'Registro', 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', - 'public': 'Public', - 'private': 'Private', - 'image': 'Image', - 'other': 'Other', + 'partnership': 'camaradería', + 'trust': 'Confianza', + 'charity': 'Caridad', + 'government': 'Gobierno', + 'classification': 'Clasificación', + 'click_or_drop_files_here': 'Haga clic o suelte archivos aquí', + 'public': 'Público', + 'private': 'Privado', + 'image': 'Imagen', + 'other': 'Otro', 'hash': 'Picadillo', - 'linked_to': 'Linked To', - 'file_saved_in_path': 'The file has been saved in :path', - 'unlinked_transactions': 'Successfully unlinked :count transactions', - 'unlinked_transaction': 'Successfully unlinked transaction', + 'linked_to': 'Vinculado a', + 'file_saved_in_path': 'El archivo se ha guardado en: ruta', + 'unlinked_transactions': + 'Transacciones :count desvinculadas correctamente', + 'unlinked_transaction': 'Transacción desvinculada exitosamente', 'unlink': 'Desconectar', 'view_dashboard_permission': - 'Allow user to access the dashboard, data is limited to available permissions', + 'Permitir que el usuario acceda al panel, los datos están limitados a los permisos disponibles', 'is_tax_exempt': 'Exento de Impuestos', 'district': 'Distrito', 'region': 'Región', @@ -91263,7 +92100,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'include_drafts': 'Incluir borradores', 'include_drafts_help': 'Incluir borradores de registros en informes', 'is_invoiced': 'es facturado', - 'change_plan': 'Manage Plan', + 'change_plan': 'Gestionar plan', 'persist_data': 'Persistir datos', 'customer_count': 'Número de clientes', 'verify_customers': 'Verificar clientes', @@ -91732,9 +92569,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Cantidad mínima de pago inferior', 'profit': 'Ganancia', 'line_item': 'Item de Linea', - 'allow_over_payment': 'Permitir sobrepago', + 'allow_over_payment': 'Permitir pago en exceso', 'allow_over_payment_help': 'Admite pagar extra para aceptar propinas', - 'allow_under_payment': 'Permitir bajo pago', + 'allow_under_payment': 'Permitir pago insuficiente', 'allow_under_payment_help': 'Soporte pagando como mínimo el monto parcial/depósito', 'test_mode': 'Modo de prueba', @@ -92194,7 +93031,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent_help': 'Ajustar el porcentaje para tener en cuenta la tarifa', 'configure_settings': 'Configurar ajustes', - 'support_forum': 'Support Forums', + 'support_forum': 'Foros de soporte', 'about': 'Acerca de', 'documentation': 'Documentación', 'contact_us': 'Contáctenos', @@ -92887,10 +93724,10 @@ mixin LocalizationsProvider on LocaleCodeAware { 'paid': 'Pagado', 'mark_sent': 'Marcar como enviado', 'marked_invoice_as_sent': 'Factura marcada correctamente como enviada', - 'marked_invoice_as_paid': 'Successfully marked invoice as paid', + 'marked_invoice_as_paid': 'Factura marcada correctamente como pagada', 'marked_invoices_as_sent': 'Facturas marcadas correctamente como enviadas', - 'marked_invoices_as_paid': 'Successfully marked invoices as paid', + 'marked_invoices_as_paid': 'Facturas marcadas correctamente como pagadas', 'done': 'Hecho', 'please_enter_a_client_or_contact_name': 'Por favor ingrese un nombre de cliente o contacto', @@ -93164,24 +94001,50 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Cargar tema de color', }, 'es_ES': { - 'expense_status_4': 'Unpaid', - 'expense_status_5': 'Paid', + 'run_template': 'Ejecutar plantilla', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Último Acceso', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Contacto del cliente', + 'expense_status_4': 'No pagado', + 'expense_status_5': 'Pagado', 'recurring': 'Facturas Recurrentes', 'ziptax_help': - 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', - 'cache_data': 'Cache Data', - 'unknown': 'Unknown', - 'webhook_failure': 'Webhook Failure', - 'email_opened': 'Email Opened', - 'email_delivered': 'Email Delivered', - 'log': 'Log', + 'Nota: esta función requiere una clave API Zip-Tax para buscar impuestos sobre las ventas de EE. UU. por dirección', + 'cache_data': 'Datos de caché', + 'unknown': 'Desconocido', + 'webhook_failure': 'Fallo del webhook', + 'email_opened': 'Email abierto', + 'email_delivered': 'Email entregado', + 'log': 'Registro', 'individual': 'Individual', - 'partnership': 'partnership', - 'trust': 'Trust', - 'charity': 'Charity', - 'government': 'Government', - 'classification': 'Classification', - 'click_or_drop_files_here': 'Click or drop files here', + 'partnership': 'asociación', + 'trust': 'Confianza', + 'charity': 'Caridad', + 'government': 'Gobierno', + 'classification': 'Clasificación', + 'click_or_drop_files_here': 'Haga clic o suelte archivos aquí', 'public': 'Público', 'private': 'Privado', 'image': 'Imagen', @@ -93910,7 +94773,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'include_drafts': 'Incluir borradores', 'include_drafts_help': 'Incluir borradores de registros en informes', 'is_invoiced': 'Es facturado', - 'change_plan': 'Manage Plan', + 'change_plan': 'Gestionar plan', 'persist_data': 'Persistir datos', 'customer_count': 'Número de clientes', 'verify_customers': 'Verificar clientes', @@ -94393,9 +95256,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'minimum_under_payment_amount': 'Cantidad Mínima de Pago', 'profit': 'Beneficio', 'line_item': 'Linea de Concepto', - 'allow_over_payment': 'Permitir Sobrepago', + 'allow_over_payment': 'Permitir pago en exceso', 'allow_over_payment_help': 'Permitir pagos extra para aceptar propinas', - 'allow_under_payment': 'Permitir Pago de Menos', + 'allow_under_payment': 'Permitir pago insuficiente', 'allow_under_payment_help': 'Permitir pagar como mínimo la cantidad parcial/depósito', 'test_mode': 'Modo Test', @@ -94852,7 +95715,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'adjust_fee_percent_help': 'Ajustar el porcentaje para dar cuenta de la tarifa', 'configure_settings': 'Configurar Opciones', - 'support_forum': 'Support Forums', + 'support_forum': 'Foros de soporte', 'about': 'Acerca de', 'documentation': 'Documentación', 'contact_us': 'Contácte con Nosotros', @@ -95816,6 +96679,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Cargar color del tema', }, 'sv': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Senast inloggad', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Återkommande', @@ -98395,6 +99284,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'th': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'ล็อกอินล่าล่าสุด', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'ทำประจำ', @@ -100957,6 +101872,32 @@ mixin LocalizationsProvider on LocaleCodeAware { 'load_color_theme': 'Load Color Theme', }, 'tr_TR': { + 'run_template': 'Run template', + 'task_extension_banner': 'Add the Chrome extension to manage your tasks', + 'watch_video': 'Watch Video', + 'view_extension': 'View Extension', + 'reactivate_email': 'Reactivate Email', + 'email_reactivated': 'Successfully reactivated email', + 'template_help': 'Enable using the design as a template', + 'delivery_note_design': 'Delivery Note Design', + 'statement_design': 'Statement Design', + 'payment_receipt_design': 'Payment Receipt Design', + 'payment_refund_design': 'Payment Refund Design', + 'quarter': 'Quarter', + 'item_description': 'Item Description', + 'task_item': 'Task Item', + 'record_state': 'Record State', + 'last_login': 'Son Giriş', + 'save_files_to_this_folder': 'Save files to this folder', + 'downloads_folder': 'Downloads Folder', + 'total_invoiced_quotes': 'Invoiced Quotes', + 'total_invoice_paid_quotes': 'Invoice Paid Quotes', + 'downloads_folder_does_not_exist': + 'The downloads folder does not exist :value', + 'user_logged_in_notification': 'User Logged in Notification', + 'user_logged_in_notification_help': + 'Send an email when logging in from a new location', + 'client_contact': 'Client Contact', 'expense_status_4': 'Unpaid', 'expense_status_5': 'Paid', 'recurring': 'Tekrar eden', From 290224a4c9e573d4d79d321e9f1f9f1073187ab4 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 21 Nov 2023 13:11:08 +0200 Subject: [PATCH 13/31] Add run_template action --- lib/data/models/payment_model.dart | 11 +++++++++++ lib/data/models/project_model.dart | 11 +++++++++++ lib/data/models/task_model.dart | 9 +++++++++ lib/redux/payment/payment_actions.dart | 13 ++++++++++++- lib/redux/project/project_actions.dart | 10 +++++++++- lib/redux/task/task_actions.dart | 9 +++++++++ 6 files changed, 61 insertions(+), 2 deletions(-) diff --git a/lib/data/models/payment_model.dart b/lib/data/models/payment_model.dart index f93308f91f3..cebaba49565 100644 --- a/lib/data/models/payment_model.dart +++ b/lib/data/models/payment_model.dart @@ -5,10 +5,13 @@ import 'package:built_value/serializer.dart'; // Project imports: import 'package:collection/collection.dart' show IterableExtension; +import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_selectors.dart'; +import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; @@ -441,6 +444,14 @@ abstract class PaymentEntity extends Object } } + if (!isDeleted!) { + final store = StoreProvider.of(navigatorKey.currentContext!); + if (hasDesignTemplatesForEntityType( + store.state.designState.map, entityType)) { + actions.add(EntityAction.runTemplate); + } + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/project_model.dart b/lib/data/models/project_model.dart index 72cf8272f1c..a3a3d795a2a 100644 --- a/lib/data/models/project_model.dart +++ b/lib/data/models/project_model.dart @@ -3,10 +3,13 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:diacritic/diacritic.dart'; +import 'package:flutter_redux/flutter_redux.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; @@ -201,6 +204,14 @@ abstract class ProjectEntity extends Object actions.add(EntityAction.documents); } + if (!isDeleted!) { + final store = StoreProvider.of(navigatorKey.currentContext!); + if (hasDesignTemplatesForEntityType( + store.state.designState.map, entityType)) { + actions.add(EntityAction.runTemplate); + } + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index 1b4f3629517..fc26bac0578 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -14,6 +14,7 @@ import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/design/design_selectors.dart'; import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; @@ -692,6 +693,14 @@ abstract class TaskEntity extends Object actions.add(EntityAction.documents); } + if (!isDeleted!) { + final store = StoreProvider.of(navigatorKey.currentContext!); + if (hasDesignTemplatesForEntityType( + store.state.designState.map, entityType)) { + actions.add(EntityAction.runTemplate); + } + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/redux/payment/payment_actions.dart b/lib/redux/payment/payment_actions.dart index a0417243397..38e6065b118 100644 --- a/lib/redux/payment/payment_actions.dart +++ b/lib/redux/payment/payment_actions.dart @@ -3,7 +3,6 @@ import 'dart:async'; // Flutter imports: import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; // Package imports: import 'package:built_collection/built_collection.dart'; @@ -15,6 +14,7 @@ import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; +import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class ViewPaymentList implements PersistUI { @@ -411,5 +411,16 @@ void handlePaymentAction( entities: [payment], ); break; + case EntityAction.runTemplate: + showDialog( + context: context, + builder: (context) => RunTemplateDialog( + entityType: EntityType.payment, + entities: payments, + ), + ); + break; + default: + print('## Error: action $action not handled in client_actions'); } } diff --git a/lib/redux/project/project_actions.dart b/lib/redux/project/project_actions.dart index be5b05cca8f..ebbc7a04e99 100644 --- a/lib/redux/project/project_actions.dart +++ b/lib/redux/project/project_actions.dart @@ -3,7 +3,6 @@ import 'dart:async'; // Flutter imports: import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; // Package imports: import 'package:built_collection/built_collection.dart'; @@ -390,6 +389,15 @@ void handleProjectAction( ); } break; + case EntityAction.runTemplate: + showDialog( + context: context, + builder: (context) => RunTemplateDialog( + entityType: EntityType.project, + entities: projects, + ), + ); + break; default: print('## Error: action $action not handled in project_actions'); } diff --git a/lib/redux/task/task_actions.dart b/lib/redux/task/task_actions.dart index cba789d696b..47c975b3612 100644 --- a/lib/redux/task/task_actions.dart +++ b/lib/redux/task/task_actions.dart @@ -543,6 +543,15 @@ void handleTaskAction( ); } break; + case EntityAction.runTemplate: + showDialog( + context: context, + builder: (context) => RunTemplateDialog( + entityType: EntityType.task, + entities: tasks, + ), + ); + break; default: print('## ERROR: unhandled action $action in task_actions'); break; From 30b5295639722145bf2a74b9b0d63febd98a1d0f Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 21 Nov 2023 16:49:40 +0200 Subject: [PATCH 14/31] Add run_template action --- lib/main_app.dart | 2 +- lib/utils/dialogs.dart | 60 +++++++++++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/lib/main_app.dart b/lib/main_app.dart index a8599afd220..4e687d4fe9a 100644 --- a/lib/main_app.dart +++ b/lib/main_app.dart @@ -353,7 +353,7 @@ class InvoiceNinjaAppState extends State { return StyledToast( locale: locale, - duration: Duration(seconds: 3), + duration: Duration(seconds: 4), backgroundColor: state.prefState.enableDarkMode ? Colors.white : Colors.black, textStyle: TextStyle( diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index afaeb2089c3..ed922ce72a3 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; +import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:invoiceninja_flutter/data/web_client.dart'; import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; @@ -628,6 +629,7 @@ class RunTemplateDialog extends StatefulWidget { class _RunTemplateDialogState extends State { String _designId = ''; bool _sendEmail = false; + bool _isLoading = false; @override Widget build(BuildContext context) { @@ -660,12 +662,22 @@ class _RunTemplateDialogState extends State { }; print('## DATA: $data'); + + setState(() => _isLoading = true); + WebClient() .post(url, credentials.token, data: jsonEncode(data)) .then((response) { print('## RESPONSE: $response'); + setState(() => _isLoading = false); + + if (_sendEmail) { + Navigator.of(navigatorKey.currentContext!).pop(); + showToast(localization.exportedData); + } }).catchError((error) { print('## ERROR: $error'); + setState(() => _isLoading = false); }); }, child: Text(localization.start.toUpperCase()), @@ -685,28 +697,34 @@ class _RunTemplateDialogState extends State { ...widget.entities .map((entity) => Text(entity.listDisplayName)) .toList(), - SizedBox(height: 8), - DesignPicker( - autofocus: true, - entityType: widget.entityType, - onSelected: (design) { - setState(() { - _designId = design?.id ?? ''; - }); - }, - ), - SizedBox(height: 16), - SwitchListTile( - value: _sendEmail, - title: Text( - localization.sendEmail, + if (_isLoading) ...[ + SizedBox(height: 30), + LinearProgressIndicator() + ] else ...[ + SizedBox(height: 8), + DesignPicker( + autofocus: true, + entityType: widget.entityType, + initialValue: _designId, + onSelected: (design) { + setState(() { + _designId = design?.id ?? ''; + }); + }, ), - onChanged: (value) { - setState(() { - _sendEmail = value; - }); - }, - ), + SizedBox(height: 16), + SwitchListTile( + value: _sendEmail, + title: Text( + localization.sendEmail, + ), + onChanged: (value) { + setState(() { + _sendEmail = value; + }); + }, + ), + ], ], ), ), From bf9ef98a7a674b41efac0296d38093e129a27577 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 21 Nov 2023 18:05:36 +0200 Subject: [PATCH 15/31] Add run_template action --- lib/utils/dialogs.dart | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index ed922ce72a3..2424cea39d9 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -631,6 +631,29 @@ class _RunTemplateDialogState extends State { bool _sendEmail = false; bool _isLoading = false; + Future loadTemplate(String jobHash) async { + final store = StoreProvider.of(context); + final state = store.state; + final credentials = state.credentials; + final url = '${credentials.url}/templates/preview/$jobHash'; + + Uint8List? data; + + while (data == null) { + await Future.delayed(Duration(seconds: 3)); + + try { + final response = + await WebClient().post(url, credentials.token, rawResponse: true); + data = response.bodyBytes; + } catch (error) { + print('## CATCH ERROR: $error'); + } + } + + return data; + } + @override Widget build(BuildContext context) { final store = StoreProvider.of(context); @@ -667,13 +690,18 @@ class _RunTemplateDialogState extends State { WebClient() .post(url, credentials.token, data: jsonEncode(data)) - .then((response) { + .then((response) async { print('## RESPONSE: $response'); - setState(() => _isLoading = false); if (_sendEmail) { + setState(() => _isLoading = false); Navigator.of(navigatorKey.currentContext!).pop(); showToast(localization.exportedData); + } else { + final jobHash = response['message']; + final data = await loadTemplate(jobHash); + print('## DATA LENGTH: ${data.length}'); + setState(() => _isLoading = false); } }).catchError((error) { print('## ERROR: $error'); From 1b20ab8174c27552160b6599eb0d117c30d33ec2 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 22 Nov 2023 12:33:37 +0200 Subject: [PATCH 16/31] Add run_template action --- lib/redux/client/client_actions.dart | 1 + lib/redux/invoice/invoice_actions.dart | 1 + lib/redux/payment/payment_actions.dart | 1 + lib/redux/project/project_actions.dart | 1 + lib/redux/task/task_actions.dart | 1 + lib/utils/dialogs.dart | 113 ++++++++++++++----------- 6 files changed, 67 insertions(+), 51 deletions(-) diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index 6057f5002df..35fa0a4036f 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -543,6 +543,7 @@ void handleClientAction(BuildContext? context, List clients, case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.client, entities: clients, diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index dd38f0f341f..6bdc3f7aa19 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -862,6 +862,7 @@ void handleInvoiceAction(BuildContext? context, List invoices, case EntityAction.runTemplate: showDialog( context: navigatorKey.currentContext!, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.invoice, entities: invoices, diff --git a/lib/redux/payment/payment_actions.dart b/lib/redux/payment/payment_actions.dart index 38e6065b118..28b9ef05be8 100644 --- a/lib/redux/payment/payment_actions.dart +++ b/lib/redux/payment/payment_actions.dart @@ -414,6 +414,7 @@ void handlePaymentAction( case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.payment, entities: payments, diff --git a/lib/redux/project/project_actions.dart b/lib/redux/project/project_actions.dart index ebbc7a04e99..33f96ddac64 100644 --- a/lib/redux/project/project_actions.dart +++ b/lib/redux/project/project_actions.dart @@ -392,6 +392,7 @@ void handleProjectAction( case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.project, entities: projects, diff --git a/lib/redux/task/task_actions.dart b/lib/redux/task/task_actions.dart index 47c975b3612..65b441cefe6 100644 --- a/lib/redux/task/task_actions.dart +++ b/lib/redux/task/task_actions.dart @@ -546,6 +546,7 @@ void handleTaskAction( case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.task, entities: tasks, diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 2424cea39d9..1cd3d115b73 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -34,6 +34,7 @@ import 'package:invoiceninja_flutter/utils/oauth.dart'; import 'package:invoiceninja_flutter/utils/web_stub.dart' if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart'; +import 'package:printing/printing.dart'; void showRefreshDataDialog( {required BuildContext context, bool includeStatic = false}) async { @@ -630,28 +631,27 @@ class _RunTemplateDialogState extends State { String _designId = ''; bool _sendEmail = false; bool _isLoading = false; + Uint8List? _data; - Future loadTemplate(String jobHash) async { + Future loadTemplate(String jobHash) async { final store = StoreProvider.of(context); final state = store.state; final credentials = state.credentials; final url = '${credentials.url}/templates/preview/$jobHash'; - Uint8List? data; - - while (data == null) { + while (_data == null) { await Future.delayed(Duration(seconds: 3)); try { final response = await WebClient().post(url, credentials.token, rawResponse: true); - data = response.bodyBytes; + _data = response.bodyBytes; } catch (error) { print('## CATCH ERROR: $error'); } } - return data; + return _data != null; } @override @@ -699,8 +699,7 @@ class _RunTemplateDialogState extends State { showToast(localization.exportedData); } else { final jobHash = response['message']; - final data = await loadTemplate(jobHash); - print('## DATA LENGTH: ${data.length}'); + await loadTemplate(jobHash); setState(() => _isLoading = false); } }).catchError((error) { @@ -711,51 +710,63 @@ class _RunTemplateDialogState extends State { child: Text(localization.start.toUpperCase()), ), ], - content: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - localization.lookup(widget.entities.length == 1 - ? widget.entityType.snakeCase - : widget.entityType.plural), - style: Theme.of(context).textTheme.bodySmall, - ), - SizedBox(height: 8), - ...widget.entities - .map((entity) => Text(entity.listDisplayName)) - .toList(), - if (_isLoading) ...[ - SizedBox(height: 30), - LinearProgressIndicator() - ] else ...[ - SizedBox(height: 8), - DesignPicker( - autofocus: true, - entityType: widget.entityType, - initialValue: _designId, - onSelected: (design) { - setState(() { - _designId = design?.id ?? ''; - }); - }, + content: _data != null + ? SizedBox( + width: 600, + child: PdfPreview( + build: (format) => _data!, + canChangeOrientation: false, + canChangePageFormat: false, + allowPrinting: false, + allowSharing: false, + canDebug: false, ), - SizedBox(height: 16), - SwitchListTile( - value: _sendEmail, - title: Text( - localization.sendEmail, - ), - onChanged: (value) { - setState(() { - _sendEmail = value; - }); - }, + ) + : SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + localization.lookup(widget.entities.length == 1 + ? widget.entityType.snakeCase + : widget.entityType.plural), + style: Theme.of(context).textTheme.bodySmall, + ), + SizedBox(height: 8), + ...widget.entities + .map((entity) => Text(entity.listDisplayName)) + .toList(), + if (_isLoading) ...[ + SizedBox(height: 32), + LinearProgressIndicator() + ] else ...[ + SizedBox(height: 16), + DesignPicker( + autofocus: true, + entityType: widget.entityType, + initialValue: _designId, + onSelected: (design) { + setState(() { + _designId = design?.id ?? ''; + }); + }, + ), + SizedBox(height: 16), + SwitchListTile( + value: _sendEmail, + title: Text( + localization.sendEmail, + ), + onChanged: (value) { + setState(() { + _sendEmail = value; + }); + }, + ), + ], + ], ), - ], - ], - ), - ), + ), ); } } From 81119d5f373f72ff144b19419ab2f885218d80aa Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 22 Nov 2023 15:18:03 +0200 Subject: [PATCH 17/31] Support for templates --- lib/utils/dialogs.dart | 101 +++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 40 deletions(-) diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 1cd3d115b73..40ea7dd0824 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -12,6 +12,7 @@ import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/forms/design_picker.dart'; +import 'package:invoiceninja_flutter/utils/files.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; @@ -639,7 +640,7 @@ class _RunTemplateDialogState extends State { final credentials = state.credentials; final url = '${credentials.url}/templates/preview/$jobHash'; - while (_data == null) { + while (_data == null && mounted) { await Future.delayed(Duration(seconds: 3)); try { @@ -669,46 +670,66 @@ class _RunTemplateDialogState extends State { }, child: Text(localization.close.toUpperCase()), ), - TextButton( - onPressed: _designId.isEmpty - ? null - : () { - final credentials = state.credentials; - final url = - '${credentials.url}/${widget.entityType.pluralApiValue}/bulk'; - final data = { - 'ids': widget.entities.map((entity) => entity.id).toList(), - 'entity': widget.entityType.apiValue, - 'template_id': _designId, - 'send_email': _sendEmail, - 'action': EntityAction.runTemplate.toApiParam(), - }; - - print('## DATA: $data'); - - setState(() => _isLoading = true); - - WebClient() - .post(url, credentials.token, data: jsonEncode(data)) - .then((response) async { - print('## RESPONSE: $response'); - - if (_sendEmail) { - setState(() => _isLoading = false); - Navigator.of(navigatorKey.currentContext!).pop(); - showToast(localization.exportedData); - } else { - final jobHash = response['message']; - await loadTemplate(jobHash); + if (_data != null) ...[ + TextButton( + onPressed: () { + setState(() { + _data = null; + }); + }, + child: Text( + localization.reset.toUpperCase(), + ), + ), + TextButton( + child: Text(localization.download.toUpperCase()), + onPressed: () { + final design = state.designState.map[_designId]!; + saveDownloadedFile(_data!, design.name); + }, + ), + ] else + TextButton( + onPressed: _designId.isEmpty || _isLoading + ? null + : () { + final credentials = state.credentials; + final url = + '${credentials.url}/${widget.entityType.pluralApiValue}/bulk'; + final data = { + 'ids': + widget.entities.map((entity) => entity.id).toList(), + 'entity': widget.entityType.apiValue, + 'template_id': _designId, + 'send_email': _sendEmail, + 'action': EntityAction.runTemplate.toApiParam(), + }; + + print('## DATA: $data'); + + setState(() => _isLoading = true); + + WebClient() + .post(url, credentials.token, data: jsonEncode(data)) + .then((response) async { + print('## RESPONSE: $response'); + + if (_sendEmail) { + setState(() => _isLoading = false); + Navigator.of(navigatorKey.currentContext!).pop(); + showToast(localization.exportedData); + } else { + final jobHash = response['message']; + await loadTemplate(jobHash); + setState(() => _isLoading = false); + } + }).catchError((error) { + print('## ERROR: $error'); setState(() => _isLoading = false); - } - }).catchError((error) { - print('## ERROR: $error'); - setState(() => _isLoading = false); - }); - }, - child: Text(localization.start.toUpperCase()), - ), + }); + }, + child: Text(localization.start.toUpperCase()), + ), ], content: _data != null ? SizedBox( From 894f1a81d918cf209581c834134707aaa1555882 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 22 Nov 2023 15:26:12 +0200 Subject: [PATCH 18/31] Support for templates --- lib/utils/dialogs.dart | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 40ea7dd0824..89575c69b5d 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -668,13 +668,15 @@ class _RunTemplateDialogState extends State { onPressed: () { Navigator.of(context).pop(); }, - child: Text(localization.close.toUpperCase()), + child: Text((_isLoading ? localization.cancel : localization.close) + .toUpperCase()), ), if (_data != null) ...[ TextButton( onPressed: () { setState(() { _data = null; + _designId = ''; }); }, child: Text( @@ -685,12 +687,12 @@ class _RunTemplateDialogState extends State { child: Text(localization.download.toUpperCase()), onPressed: () { final design = state.designState.map[_designId]!; - saveDownloadedFile(_data!, design.name); + saveDownloadedFile(_data!, '${design.name}.pdf'); }, ), - ] else + ] else if (!_isLoading) TextButton( - onPressed: _designId.isEmpty || _isLoading + onPressed: _designId.isEmpty ? null : () { final credentials = state.credentials; @@ -750,7 +752,8 @@ class _RunTemplateDialogState extends State { Text( localization.lookup(widget.entities.length == 1 ? widget.entityType.snakeCase - : widget.entityType.plural), + : widget.entityType.plural + + ' (${widget.entities.length})'), style: Theme.of(context).textTheme.bodySmall, ), SizedBox(height: 8), From 909df788e39af5132f41cec0eb61f525b9bfcc0f Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 22 Nov 2023 15:31:51 +0200 Subject: [PATCH 19/31] Support for templates --- lib/utils/dialogs.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 89575c69b5d..ff707b633b3 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -672,6 +672,7 @@ class _RunTemplateDialogState extends State { .toUpperCase()), ), if (_data != null) ...[ + /* TextButton( onPressed: () { setState(() { @@ -683,6 +684,7 @@ class _RunTemplateDialogState extends State { localization.reset.toUpperCase(), ), ), + */ TextButton( child: Text(localization.download.toUpperCase()), onPressed: () { From 0135bc3518a693e04721f646374136cfecf579bf Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 27 Nov 2023 15:50:01 +0200 Subject: [PATCH 20/31] Test update --- lib/constants.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/constants.dart b/lib/constants.dart index 5dca654516f..ff658af38bc 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -8,7 +8,7 @@ const String kClientVersion = '5.0.141'; const String kMinServerVersion = '5.0.4'; const String kAppName = 'Invoice Ninja'; -const String kSiteUrl = 'https://invoiceninja.com'; +const String kSiteUrl = 'https://invoiceninja.com/'; const String kAppProductionUrl = 'https://invoicing.co'; const String kAppReactUrl = 'https://app.invoicing.co'; const String kAppStagingUrl = 'https://staging.invoicing.co'; From edda7d68bc18ec3f0eb27c94486d08207b9194a5 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 27 Nov 2023 16:19:24 +0200 Subject: [PATCH 21/31] Add fvm to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e52ebb87f69..b19c4e21896 100644 --- a/.gitignore +++ b/.gitignore @@ -82,3 +82,4 @@ google-services.json GoogleService-Info.plist android/app/build.gradle android/app/release/ +.fvm \ No newline at end of file From be09f0f514b23d9bbe81243f57d38c5b22b48532 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 27 Nov 2023 16:32:30 +0200 Subject: [PATCH 22/31] Update macOS to latest Flutter --- macos/Podfile.lock | 46 +++++++++++++------ macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index bbd80f04bb2..4eabd58bf1c 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,6 +1,10 @@ PODS: - desktop_drop (0.0.1): - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) @@ -21,11 +25,13 @@ PODS: - FlutterMacOS - screen_retriever (0.0.1): - FlutterMacOS - - Sentry/HybridSDK (7.31.5) + - Sentry/HybridSDK (8.14.2): + - SentryPrivate (= 8.14.2) - sentry_flutter (0.0.1): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 7.31.5) + - Sentry/HybridSDK (= 8.14.2) + - SentryPrivate (8.14.2) - share_plus (0.0.1): - FlutterMacOS - shared_preferences_foundation (0.0.1): @@ -47,17 +53,19 @@ PODS: DEPENDENCIES: - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - - in_app_purchase_storekit (from `Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/macos`) + - in_app_purchase_storekit (from `Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin`) - in_app_review (from `Flutter/ephemeral/.symlinks/plugins/in_app_review/macos`) - package_info (from `Flutter/ephemeral/.symlinks/plugins/package_info/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - printing (from `Flutter/ephemeral/.symlinks/plugins/printing/macos`) - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) - sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sign_in_with_apple (from `Flutter/ephemeral/.symlinks/plugins/sign_in_with_apple/macos`) - smart_auth (from `Flutter/ephemeral/.symlinks/plugins/smart_auth/macos`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) @@ -69,14 +77,19 @@ SPEC REPOS: trunk: - FMDB - Sentry + - SentryPrivate EXTERNAL SOURCES: desktop_drop: :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos FlutterMacOS: :path: Flutter/ephemeral in_app_purchase_storekit: - :path: Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/macos + :path: Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin in_app_review: :path: Flutter/ephemeral/.symlinks/plugins/in_app_review/macos package_info: @@ -84,7 +97,7 @@ EXTERNAL SOURCES: package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin printing: :path: Flutter/ephemeral/.symlinks/plugins/printing/macos screen_retriever: @@ -94,7 +107,7 @@ EXTERNAL SOURCES: share_plus: :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos shared_preferences_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sign_in_with_apple: :path: Flutter/ephemeral/.symlinks/plugins/sign_in_with_apple/macos smart_auth: @@ -110,26 +123,29 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43 in_app_review: a850789fad746e89bce03d4aeee8078b45a53fd0 package_info: 6eba2fd8d3371dda2d85c8db6fe97488f24b74b2 package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce - path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 - printing: e4b7e232ff3d5d50a70b20d959aa71035a5c31f9 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + printing: 1dd6a1fce2209ec240698e2439a4adbb9b427637 screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 - Sentry: 4c9babff9034785067c896fd580b1f7de44da020 - sentry_flutter: b10ae7a5ddcbc7f04648eeb2672b5747230172f1 + Sentry: e0ea366f95ebb68f26d6030d8c22d6b2e6d23dd0 + sentry_flutter: 9a04c51c373d76ee22167bf1e65bc468c0a91fed + SentryPrivate: 949a21fa59872427edc73b524c3ec8456761d97f share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 - shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sign_in_with_apple: a9e97e744e8edc36aefc2723111f652102a7a727 smart_auth: b38e3ab4bfe089eacb1e233aca1a2340f96c28e9 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451 + url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 widget_kit_plugin: 9658611f1ba5faaaa9e8221d94fce53733a6911c window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 PODFILE CHECKSUM: 8d40c19d3cbdb380d870685c3a564c989f1efa52 -COCOAPODS: 1.11.3 +COCOAPODS: 1.14.3 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index f5c22cbbf7f..9715076a496 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -336,7 +336,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1420; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 85fb3112baf..4a0fcf5869f 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Mon, 27 Nov 2023 16:52:04 +0200 Subject: [PATCH 23/31] Update iOS to latest Flutter --- ios/Podfile.lock | 86 +++++++++++-------- ios/Runner.xcodeproj/project.pbxproj | 3 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- 3 files changed, 54 insertions(+), 37 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1b71de94991..32aac8f519e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,12 +1,14 @@ PODS: - - AppAuth (1.6.0): - - AppAuth/Core (= 1.6.0) - - AppAuth/ExternalUserAgent (= 1.6.0) - - AppAuth/Core (1.6.0) - - AppAuth/ExternalUserAgent (1.6.0): + - AppAuth (1.6.2): + - AppAuth/Core (= 1.6.2) + - AppAuth/ExternalUserAgent (= 1.6.2) + - AppAuth/Core (1.6.2) + - AppAuth/ExternalUserAgent (1.6.2): - AppAuth/Core - contacts_service (0.2.2): - Flutter + - device_info_plus (0.0.1): + - Flutter - DKImagePickerController/Core (4.3.4): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource @@ -75,18 +77,20 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - permission_handler_apple (9.0.4): + - permission_handler_apple (9.1.1): - Flutter - printing (1.0.0): - Flutter - - SDWebImage (5.15.5): - - SDWebImage/Core (= 5.15.5) - - SDWebImage/Core (5.15.5) - - Sentry/HybridSDK (7.31.5) + - SDWebImage (5.18.5): + - SDWebImage/Core (= 5.18.5) + - SDWebImage/Core (5.18.5) + - Sentry/HybridSDK (8.14.2): + - SentryPrivate (= 8.14.2) - sentry_flutter (0.0.1): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 7.31.5) + - Sentry/HybridSDK (= 8.14.2) + - SentryPrivate (8.14.2) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -96,7 +100,7 @@ PODS: - Flutter - smart_auth (0.0.1): - Flutter - - sqflite (0.0.2): + - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) - SwiftyGif (5.4.4) @@ -105,30 +109,34 @@ PODS: - Flutter - webview_flutter_wkwebview (0.0.1): - Flutter + - widget_kit_plugin (0.0.1): + - Flutter DEPENDENCIES: - contacts_service (from `.symlinks/plugins/contacts_service/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`) - image_cropper (from `.symlinks/plugins/image_cropper/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/ios`) + - in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`) - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`) - package_info (from `.symlinks/plugins/package_info/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - printing (from `.symlinks/plugins/printing/ios`) - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) - smart_auth (from `.symlinks/plugins/smart_auth/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) + - widget_kit_plugin (from `.symlinks/plugins/widget_kit_plugin/ios`) SPEC REPOS: trunk: @@ -141,12 +149,15 @@ SPEC REPOS: - GTMSessionFetcher - SDWebImage - Sentry + - SentryPrivate - SwiftyGif - TOCropViewController EXTERNAL SOURCES: contacts_service: :path: ".symlinks/plugins/contacts_service/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" file_picker: :path: ".symlinks/plugins/file_picker/ios" Flutter: @@ -158,7 +169,7 @@ EXTERNAL SOURCES: image_picker_ios: :path: ".symlinks/plugins/image_picker_ios/ios" in_app_purchase_storekit: - :path: ".symlinks/plugins/in_app_purchase_storekit/ios" + :path: ".symlinks/plugins/in_app_purchase_storekit/darwin" in_app_review: :path: ".symlinks/plugins/in_app_review/ios" local_auth_ios: @@ -168,7 +179,7 @@ EXTERNAL SOURCES: package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/ios" + :path: ".symlinks/plugins/path_provider_foundation/darwin" permission_handler_apple: :path: ".symlinks/plugins/permission_handler_apple/ios" printing: @@ -178,7 +189,7 @@ EXTERNAL SOURCES: share_plus: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/ios" + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sign_in_with_apple: :path: ".symlinks/plugins/sign_in_with_apple/ios" smart_auth: @@ -189,42 +200,47 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/url_launcher_ios/ios" webview_flutter_wkwebview: :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" + widget_kit_plugin: + :path: ".symlinks/plugins/widget_kit_plugin/ios" SPEC CHECKSUMS: - AppAuth: 8fca6b5563a5baef2c04bee27538025e4ceb2add + AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570 contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca + device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: ce3938a0df3cc1ef404671531facef740d03f920 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - google_sign_in_ios: 63e49658400eb806dd30054dc56f8baee3025508 + google_sign_in_ios: 1256ff9d941db546373826966720b0c24804bcdd GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2 - image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98 - image_picker_ios: 58b9c4269cb176f89acea5e5d043c9358f2d25f8 + image_cropper: a3291c624a953049bc6a02e1f8c8ceb162a24b25 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43 in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d - local_auth_ios: ceb207b594b48c075f1065f97b61e3ffa00d686b + local_auth_ios: c6cf091ded637a88f24f86a8875d8b0f526e2605 package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e - path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 - permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce - printing: eafa00acb682c0ca029d4d98d0798f55a1e27102 - SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe - Sentry: 4c9babff9034785067c896fd580b1f7de44da020 - sentry_flutter: b10ae7a5ddcbc7f04648eeb2672b5747230172f1 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472 + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + printing: 233e1b73bd1f4a05615548e9b5a324c98588640b + SDWebImage: 7ac2b7ddc5e8484c79aa90fc4e30b149d6a2c88f + Sentry: e0ea366f95ebb68f26d6030d8c22d6b2e6d23dd0 + sentry_flutter: 9a04c51c373d76ee22167bf1e65bc468c0a91fed + SentryPrivate: 949a21fa59872427edc73b524c3ec8456761d97f + share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 smart_auth: 4bedbc118723912d0e45a07e8ab34039c19e04f2 - sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 - webview_flutter_wkwebview: b7e70ef1ddded7e69c796c7390ee74180182971f + webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a + widget_kit_plugin: a245a5248f0cd2bde580285ebe6bee5c6f1f6ce1 PODFILE CHECKSUM: 3005ff604479ae2d844823dff36ae514d2c44ab9 -COCOAPODS: 1.11.3 +COCOAPODS: 1.14.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index fb0249c96db..a40620ba19c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -160,7 +160,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -210,6 +210,7 @@ files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a3352..a6b826db27d 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Tue, 28 Nov 2023 12:26:33 +0200 Subject: [PATCH 24/31] Code clean up --- lib/constants.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/constants.dart b/lib/constants.dart index ff658af38bc..5dca654516f 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -8,7 +8,7 @@ const String kClientVersion = '5.0.141'; const String kMinServerVersion = '5.0.4'; const String kAppName = 'Invoice Ninja'; -const String kSiteUrl = 'https://invoiceninja.com/'; +const String kSiteUrl = 'https://invoiceninja.com'; const String kAppProductionUrl = 'https://invoicing.co'; const String kAppReactUrl = 'https://app.invoicing.co'; const String kAppStagingUrl = 'https://staging.invoicing.co'; From c5de8fe72001e2364a2b200c616a547f22be91bb Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 16:35:37 +0200 Subject: [PATCH 25/31] Update readme --- README.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d90fd1dabf8..77b0760bc59 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ Client application for [Invoice Ninja](https://github.com/invoiceninja/invoiceni #### Desktop Apps - [Windows](https://apps.microsoft.com/store/detail/invoice-ninja/9N3F2BBCFDR6) - [macOS](https://apps.apple.com/app/id1503970375?platform=mac) -- [Linux](https://snapcraft.io/invoiceninja) +- [Linux - Snap](https://snapcraft.io/invoiceninja) +- [Linux - Flatpak](https://flathub.org/apps/com.invoiceninja.InvoiceNinja) #### Mobile Apps - [iOS](https://apps.apple.com/app/id1503970375?platform=iphone) @@ -125,21 +126,10 @@ For additional information on [Redux architecture](https://blog.logrocket.com/fl ## Tests - Run `flutter drive --target=test_driver/all_it.dart` to run the tests -## Code Signing -- Run `cp android/app/build.gradle.prod android/app/build.gradle` to support running the code signed -- Run `cp android/key.properties.example android/key.properties` to create the keys file -- Run `keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias invoiceninja` to generate a key to be able to sign the android application. -- Update `android/key.properties` according to the parameters you entered in previous command when you generated the key -- Open a new Firebase project from your console. Firebase is used for authentication. - - Inside the project go to Authentication and enable at least one method. - - After go to add a new Android application. For the package name add `com.invoiceninja.flutter` - - Press "Register App" button. - - Download "google-services.json" and put it in `android/app` directory. - ## Credits [https://github.com/invoiceninja/invoiceninja#credits](https://github.com/invoiceninja/invoiceninja/tree/v5-develop#credits) ## Contributions -We gladly accept contributions! If you'd like to get involved with development please join our [Slack group](http://slack.invoiceninja.com/). +We gladly accept contributions! If you'd like to get involved with development please join our [Slack group](http://slack.invoiceninja.com/) or [Discord Server](https://discord.gg/ZwEdtfCwXA). From e41a5ea0b626bd13346fb4d789a39478be5f439f Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 16:41:24 +0200 Subject: [PATCH 26/31] Update Flathub logo --- assets/images/com.invoiceninja.InvoiceNinja.svg | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/assets/images/com.invoiceninja.InvoiceNinja.svg b/assets/images/com.invoiceninja.InvoiceNinja.svg index 8e838c8f887..072bcbcff39 100644 --- a/assets/images/com.invoiceninja.InvoiceNinja.svg +++ b/assets/images/com.invoiceninja.InvoiceNinja.svg @@ -1,2 +1,11 @@ - -Invoice Ninja icon \ No newline at end of file + + + + + + + + + + + From f5be5b3f339b34109aa70e75e27b25b6c0ef799a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 16:49:44 +0200 Subject: [PATCH 27/31] Flutter UI: Rows per page no selection possible #612 --- lib/ui/app/tables/app_paginated_data_table.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/ui/app/tables/app_paginated_data_table.dart b/lib/ui/app/tables/app_paginated_data_table.dart index 99aaf19223e..5a8e1a96423 100644 --- a/lib/ui/app/tables/app_paginated_data_table.dart +++ b/lib/ui/app/tables/app_paginated_data_table.dart @@ -434,8 +434,7 @@ class AppPaginatedDataTableState extends State { math.min(_rowCount, _firstRowIndex + widget.rowsPerPage); if (widget.onRowsPerPageChanged != null) { final List availableRowsPerPage = widget.availableRowsPerPage - .where( - (int value) => value <= _rowCount || value == widget.rowsPerPage) + //.where((int value) => value <= _rowCount || value == widget.rowsPerPage) .map>((int value) { return DropdownMenuItem( value: value, From f9e7ce39b54b25625366c43396c48a1d03332f57 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 16:55:26 +0200 Subject: [PATCH 28/31] PDF preview is too small in web app on edit invoice --- lib/ui/client/client_pdf.dart | 2 +- lib/ui/design/edit/design_edit.dart | 2 +- lib/ui/invoice/edit/invoice_edit_desktop.dart | 4 ++-- lib/ui/invoice/edit/invoice_edit_pdf.dart | 2 +- lib/ui/invoice/invoice_pdf.dart | 2 +- lib/ui/settings/invoice_design.dart | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/ui/client/client_pdf.dart b/lib/ui/client/client_pdf.dart index 8eaa3e08dc5..600e2adb047 100644 --- a/lib/ui/client/client_pdf.dart +++ b/lib/ui/client/client_pdf.dart @@ -504,7 +504,7 @@ class _ClientPdfViewState extends State { canChangeOrientation: false, canChangePageFormat: false, canDebug: false, - maxPageWidth: 600, + maxPageWidth: 800, pdfFileName: localization.statement + '_' + client.number + '.pdf', ), diff --git a/lib/ui/design/edit/design_edit.dart b/lib/ui/design/edit/design_edit.dart index dfd8900f0ea..8dfddb77566 100644 --- a/lib/ui/design/edit/design_edit.dart +++ b/lib/ui/design/edit/design_edit.dart @@ -683,7 +683,7 @@ class _PdfDesignPreviewState extends State { allowPrinting: false, allowSharing: false, canDebug: false, - maxPageWidth: 600, + maxPageWidth: 800, ) else SizedBox(), diff --git a/lib/ui/invoice/edit/invoice_edit_desktop.dart b/lib/ui/invoice/edit/invoice_edit_desktop.dart index 6ac976ffe5c..2684fec94dd 100644 --- a/lib/ui/invoice/edit/invoice_edit_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_desktop.dart @@ -1297,7 +1297,7 @@ class __PdfPreviewState extends State<_PdfPreview> { final state = store.state; return Container( - height: state.prefState.showPdfPreviewSideBySide ? 800 : 1200, + height: state.prefState.showPdfPreviewSideBySide ? 800 : 1150, child: Stack( alignment: Alignment.topCenter, children: [ @@ -1352,7 +1352,7 @@ class __PdfPreviewState extends State<_PdfPreview> { allowSharing: false, canDebug: false, pages: [_currentPage - 1], - maxPageWidth: 600, + maxPageWidth: 800, ), ), ], diff --git a/lib/ui/invoice/edit/invoice_edit_pdf.dart b/lib/ui/invoice/edit/invoice_edit_pdf.dart index 02e7bc0eade..c029e72f386 100644 --- a/lib/ui/invoice/edit/invoice_edit_pdf.dart +++ b/lib/ui/invoice/edit/invoice_edit_pdf.dart @@ -115,7 +115,7 @@ class InvoiceEditPDFState extends State { allowPrinting: false, allowSharing: false, canDebug: false, - maxPageWidth: 600, + maxPageWidth: 800, ), ); } diff --git a/lib/ui/invoice/invoice_pdf.dart b/lib/ui/invoice/invoice_pdf.dart index b168a15d034..ad811469f29 100644 --- a/lib/ui/invoice/invoice_pdf.dart +++ b/lib/ui/invoice/invoice_pdf.dart @@ -283,7 +283,7 @@ class _InvoicePdfViewState extends State { canChangeOrientation: false, canChangePageFormat: false, canDebug: false, - maxPageWidth: 600, + maxPageWidth: 800, pdfFileName: localization.lookup(invoice.entityType!.snakeCase) + '_' + diff --git a/lib/ui/settings/invoice_design.dart b/lib/ui/settings/invoice_design.dart index c25d4497271..3770241bbf5 100644 --- a/lib/ui/settings/invoice_design.dart +++ b/lib/ui/settings/invoice_design.dart @@ -1380,7 +1380,7 @@ class _PdfPreviewState extends State<_PdfPreview> { canChangeOrientation: false, canChangePageFormat: false, canDebug: false, - maxPageWidth: 600, + maxPageWidth: 800, allowPrinting: false, allowSharing: false, ), From 2ebbb8a7087cc0e24499e30d03e0b0802a2f11ce Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 16:59:15 +0200 Subject: [PATCH 29/31] Add payment receipt UI --- lib/ui/settings/invoice_design.dart | 2 -- lib/ui/settings/settings_list.dart | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/ui/settings/invoice_design.dart b/lib/ui/settings/invoice_design.dart index 3770241bbf5..69808df2b3a 100644 --- a/lib/ui/settings/invoice_design.dart +++ b/lib/ui/settings/invoice_design.dart @@ -449,7 +449,6 @@ class _InvoiceDesignState extends State value?.id)); }, ), - /* DesignPicker( showBlank: true, label: localization.paymentRefundDesign, @@ -461,7 +460,6 @@ class _InvoiceDesignState extends State value?.id)); }, ), - */ ], ], ), diff --git a/lib/ui/settings/settings_list.dart b/lib/ui/settings/settings_list.dart index 475c0ecfeb7..1c95a9940dc 100644 --- a/lib/ui/settings/settings_list.dart +++ b/lib/ui/settings/settings_list.dart @@ -556,7 +556,7 @@ class SettingsSearch extends StatelessWidget { 'delivery_note_design#2023-11-06', 'statement_design#2023-11-06', 'payment_receipt_design#2023-11-06', - //'payment_refund_design#2023-11-06', + 'payment_refund_design#2023-11-06', ], ], ], From 2f9844e96f4f0d41107751aefa93062232eab56e Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 17:01:53 +0200 Subject: [PATCH 30/31] Add new einvoice types --- lib/constants.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/constants.dart b/lib/constants.dart index 5dca654516f..89e2fb48b35 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -241,6 +241,8 @@ const kTaxClassifications = [ ]; const String kEInvoiceTypeEN16931 = 'EN16931'; +const String kEInvoiceTypeXInvoice_3_0 = 'XInvoice_3_0'; +const String kEInvoiceTypeXInvoice_2_3 = 'XInvoice_2_3'; const String kEInvoiceTypeXInvoice_2_2 = 'XInvoice_2_2'; const String kEInvoiceTypeXInvoice_2_1 = 'XInvoice_2_1'; const String kEInvoiceTypeXInvoice_2_0 = 'XInvoice_2_0'; @@ -254,6 +256,8 @@ const String kEInvoiceTypeFacturae_3_2_2 = 'Facturae_3.2.2'; const kEInvoiceTypes = [ kEInvoiceTypeEN16931, + kEInvoiceTypeXInvoice_3_0, + kEInvoiceTypeXInvoice_2_3, kEInvoiceTypeXInvoice_2_2, kEInvoiceTypeXInvoice_2_1, kEInvoiceTypeXInvoice_2_0, From 8b2ce466e47b5b3343b7c97d81e8d3219ab0ffee Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 28 Nov 2023 17:03:10 +0200 Subject: [PATCH 31/31] Update version --- .github/workflows/flatpak.yml | 2 +- flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml | 1 + lib/constants.dart | 2 +- pubspec.foss.yaml | 2 +- pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml index 3539586175e..e49fded9e81 100644 --- a/.github/workflows/flatpak.yml +++ b/.github/workflows/flatpak.yml @@ -86,7 +86,7 @@ jobs: draft: false prerelease: false title: "Latest Release" - automatic_release_tag: "v5.0.141" + automatic_release_tag: "v5.0.142" files: | ${{ github.workspace }}/artifacts/Invoice-Ninja-Archive ${{ github.workspace }}/artifacts/Invoice-Ninja-Hash diff --git a/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml b/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml index 6bdd8587421..992653a24af 100644 --- a/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml +++ b/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml @@ -50,6 +50,7 @@ + diff --git a/lib/constants.dart b/lib/constants.dart index 89e2fb48b35..7732bc8510f 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -4,7 +4,7 @@ class Constants { } // TODO remove version once #46609 is fixed -const String kClientVersion = '5.0.141'; +const String kClientVersion = '5.0.142'; const String kMinServerVersion = '5.0.4'; const String kAppName = 'Invoice Ninja'; diff --git a/pubspec.foss.yaml b/pubspec.foss.yaml index 5cb3aa6d437..260b9bb0bb5 100644 --- a/pubspec.foss.yaml +++ b/pubspec.foss.yaml @@ -1,6 +1,6 @@ name: invoiceninja_flutter description: Client for Invoice Ninja -version: 5.0.141+141 +version: 5.0.142+142 homepage: https://invoiceninja.com documentation: https://invoiceninja.github.io publish_to: none diff --git a/pubspec.yaml b/pubspec.yaml index d269b03c59d..1d1284e6019 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: invoiceninja_flutter description: Client for Invoice Ninja -version: 5.0.141+141 +version: 5.0.142+142 homepage: https://invoiceninja.com documentation: https://invoiceninja.github.io publish_to: none diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 2cd33b1cb63..de896e3aaea 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: invoiceninja -version: '5.0.141' +version: '5.0.142' summary: Create invoices, accept payments, track expenses & time tasks description: "### Note: if the app fails to run using `snap run invoiceninja` it may help to run `/snap/invoiceninja/current/bin/invoiceninja` instead