diff --git a/.sandstorm/changelog.md b/.sandstorm/changelog.md index 5e8bcd510b..7cef1b27c5 100644 --- a/.sandstorm/changelog.md +++ b/.sandstorm/changelog.md @@ -1,5 +1,24 @@ -# 4.6.1.1 +# 4.6.12 +- Support for Indonesian. +- New report, see [issue 384](https://github.com/firefly-iii/firefly-iii/issues/384) +- [Issue 964](https://github.com/firefly-iii/firefly-iii/issues/964) as suggested by [gavu](https://github.com/gavu) +- Greatly improved Docker support and documentation. +- [Issue 1046](https://github.com/firefly-iii/firefly-iii/issues/1046), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1047](https://github.com/firefly-iii/firefly-iii/issues/1047), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1048](https://github.com/firefly-iii/firefly-iii/issues/1048), as reported by [webence](https://github.com/webence) +- [Issue 1049](https://github.com/firefly-iii/firefly-iii/issues/1049), as reported by [nicoschreiner](https://github.com/nicoschreiner) +- [Issue 1015](https://github.com/firefly-iii/firefly-iii/issues/1015), as reporterd by a user on Tweakers.net +- [Issue 1056](https://github.com/firefly-iii/firefly-iii/issues/1056), as reported by [repercussion](https://github.com/repercussion) +- [Issue 1061](https://github.com/firefly-iii/firefly-iii/issues/1061), as reported by [Meizikyn](https://github.com/Meizikyn) +- [Issue 1045](https://github.com/firefly-iii/firefly-iii/issues/1045), as reported by [gavu](https://github.com/gavu) +- First code for [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040) ([simonsmiley](https://github.com/simonsmiley)) +- [Issue 1059](https://github.com/firefly-iii/firefly-iii/issues/1059), as reported by [4oo4](https://github.com/4oo4) +- [Issue 1063](https://github.com/firefly-iii/firefly-iii/issues/1063), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1064](https://github.com/firefly-iii/firefly-iii/issues/1064), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1066](https://github.com/firefly-iii/firefly-iii/issues/1066), reported by [wtercato](https://github.com/wtercato) + +# 4.6.1.1 - Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) - Import will no longer scan for rules, this has become optional. Originally suggested in [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) by [gavu](https://github.com/gavu) - [Issue 1033](https://github.com/firefly-iii/firefly-iii/issues/1033), as reported by [Jumanjii](https://github.com/Jumanjii) diff --git a/.sandstorm/sandstorm-files.list b/.sandstorm/sandstorm-files.list index f2dd05a521..04910192cc 100644 --- a/.sandstorm/sandstorm-files.list +++ b/.sandstorm/sandstorm-files.list @@ -208,14 +208,6 @@ opt/app/.env.heroku opt/app/.env.sandstorm opt/app/.gitattributes opt/app/.sandstorm/.gitattributes -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/action_provision -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/id -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/private_key -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders -opt/app/.sandstorm/.vagrant/machines/default/virtualbox/vagrant_cwd opt/app/.sandstorm/Vagrantfile opt/app/.sandstorm/app-graphics/firefly-iii-128.png opt/app/.sandstorm/app-graphics/firefly-iii-150.png @@ -260,6 +252,7 @@ opt/app/app/Events/AdminRequestedTestMessage.php opt/app/app/Events/Event.php opt/app/app/Events/RegisteredUser.php opt/app/app/Events/RequestedNewPassword.php +opt/app/app/Events/RequestedVersionCheckStatus.php opt/app/app/Events/StoredTransactionJournal.php opt/app/app/Events/UpdatedTransactionJournal.php opt/app/app/Events/UserChangedEmail.php @@ -279,6 +272,9 @@ opt/app/app/Export/Exporter/ExporterInterface.php opt/app/app/Export/ProcessorInterface.php opt/app/app/Generator/Chart/Basic/ChartJsGenerator.php opt/app/app/Generator/Chart/Basic/GeneratorInterface.php +opt/app/app/Generator/Report/Account/MonthReportGenerator.php +opt/app/app/Generator/Report/Account/MultiYearReportGenerator.php +opt/app/app/Generator/Report/Account/YearReportGenerator.php opt/app/app/Generator/Report/Audit/MonthReportGenerator.php opt/app/app/Generator/Report/Audit/MultiYearReportGenerator.php opt/app/app/Generator/Report/Audit/YearReportGenerator.php @@ -301,6 +297,7 @@ opt/app/app/Handlers/Events/AdminEventHandler.php opt/app/app/Handlers/Events/StoredJournalEventHandler.php opt/app/app/Handlers/Events/UpdatedJournalEventHandler.php opt/app/app/Handlers/Events/UserEventHandler.php +opt/app/app/Handlers/Events/VersionCheckEventHandler.php opt/app/app/Helpers/Attachments/AttachmentHelper.php opt/app/app/Helpers/Attachments/AttachmentHelperInterface.php opt/app/app/Helpers/Chart/MetaPieChart.php @@ -339,6 +336,7 @@ opt/app/app/Http/Controllers/AccountController.php opt/app/app/Http/Controllers/Admin/ConfigurationController.php opt/app/app/Http/Controllers/Admin/HomeController.php opt/app/app/Http/Controllers/Admin/LinkController.php +opt/app/app/Http/Controllers/Admin/UpdateController.php opt/app/app/Http/Controllers/Admin/UserController.php opt/app/app/Http/Controllers/AttachmentController.php opt/app/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -355,6 +353,7 @@ opt/app/app/Http/Controllers/Chart/BudgetController.php opt/app/app/Http/Controllers/Chart/BudgetReportController.php opt/app/app/Http/Controllers/Chart/CategoryController.php opt/app/app/Http/Controllers/Chart/CategoryReportController.php +opt/app/app/Http/Controllers/Chart/ExpenseReportController.php opt/app/app/Http/Controllers/Chart/PiggyBankController.php opt/app/app/Http/Controllers/Chart/ReportController.php opt/app/app/Http/Controllers/Chart/TagReportController.php @@ -363,9 +362,10 @@ opt/app/app/Http/Controllers/CurrencyController.php opt/app/app/Http/Controllers/ExportController.php opt/app/app/Http/Controllers/HelpController.php opt/app/app/Http/Controllers/HomeController.php -opt/app/app/Http/Controllers/Import/BankController.php -opt/app/app/Http/Controllers/Import/FileController.php -opt/app/app/Http/Controllers/ImportController.php +opt/app/app/Http/Controllers/Import/ConfigurationController.php +opt/app/app/Http/Controllers/Import/IndexController.php +opt/app/app/Http/Controllers/Import/PrerequisitesController.php +opt/app/app/Http/Controllers/Import/StatusController.php opt/app/app/Http/Controllers/JavascriptController.php opt/app/app/Http/Controllers/Json/AutoCompleteController.php opt/app/app/Http/Controllers/Json/BoxController.php @@ -382,6 +382,7 @@ opt/app/app/Http/Controllers/Report/AccountController.php opt/app/app/Http/Controllers/Report/BalanceController.php opt/app/app/Http/Controllers/Report/BudgetController.php opt/app/app/Http/Controllers/Report/CategoryController.php +opt/app/app/Http/Controllers/Report/ExpenseController.php opt/app/app/Http/Controllers/Report/OperationsController.php opt/app/app/Http/Controllers/ReportController.php opt/app/app/Http/Controllers/RuleController.php @@ -400,7 +401,8 @@ opt/app/app/Http/Middleware/AuthenticateTwoFactor.php opt/app/app/Http/Middleware/Binder.php opt/app/app/Http/Middleware/EncryptCookies.php opt/app/app/Http/Middleware/IsAdmin.php -opt/app/app/Http/Middleware/IsLimitedUser.php +opt/app/app/Http/Middleware/IsDemoUser.php +opt/app/app/Http/Middleware/IsSandStormUser.php opt/app/app/Http/Middleware/Range.php opt/app/app/Http/Middleware/RedirectIfAuthenticated.php opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php @@ -420,7 +422,6 @@ opt/app/app/Http/Requests/CurrencyFormRequest.php opt/app/app/Http/Requests/DeleteAccountFormRequest.php opt/app/app/Http/Requests/EmailFormRequest.php opt/app/app/Http/Requests/ExportFormRequest.php -opt/app/app/Http/Requests/ImportUploadRequest.php opt/app/app/Http/Requests/JournalFormRequest.php opt/app/app/Http/Requests/JournalLinkRequest.php opt/app/app/Http/Requests/LinkTypeFormRequest.php @@ -441,15 +442,15 @@ opt/app/app/Http/Requests/TestRuleFormRequest.php opt/app/app/Http/Requests/TokenFormRequest.php opt/app/app/Http/Requests/UserFormRequest.php opt/app/app/Http/Requests/UserRegistrationRequest.php -opt/app/app/Http/breadcrumbs.php -opt/app/app/Import/Configurator/ConfiguratorInterface.php -opt/app/app/Import/Configurator/CsvConfigurator.php +opt/app/app/Import/Configuration/ConfiguratorInterface.php +opt/app/app/Import/Configuration/FileConfigurator.php +opt/app/app/Import/Configuration/SpectreConfigurator.php opt/app/app/Import/Converter/Amount.php opt/app/app/Import/Converter/AmountCredit.php -opt/app/app/Import/Converter/AmountDebet.php +opt/app/app/Import/Converter/AmountDebit.php opt/app/app/Import/Converter/ConverterInterface.php -opt/app/app/Import/Converter/INGDebetCredit.php -opt/app/app/Import/Converter/RabobankDebetCredit.php +opt/app/app/Import/Converter/INGDebitCredit.php +opt/app/app/Import/Converter/RabobankDebitCredit.php opt/app/app/Import/FileProcessor/CsvProcessor.php opt/app/app/Import/FileProcessor/FileProcessorInterface.php opt/app/app/Import/Logging/CommandHandler.php @@ -472,7 +473,13 @@ opt/app/app/Import/Object/ImportBudget.php opt/app/app/Import/Object/ImportCategory.php opt/app/app/Import/Object/ImportCurrency.php opt/app/app/Import/Object/ImportJournal.php -opt/app/app/Import/Routine/ImportRoutine.php +opt/app/app/Import/Prerequisites/BunqPrerequisites.php +opt/app/app/Import/Prerequisites/FilePrerequisites.php +opt/app/app/Import/Prerequisites/PrerequisitesInterface.php +opt/app/app/Import/Prerequisites/SpectrePrerequisites.php +opt/app/app/Import/Routine/FileRoutine.php +opt/app/app/Import/Routine/RoutineInterface.php +opt/app/app/Import/Routine/SpectreRoutine.php opt/app/app/Import/Specifics/AbnAmroDescription.php opt/app/app/Import/Specifics/IngDescription.php opt/app/app/Import/Specifics/PresidentsChoice.php @@ -612,8 +619,18 @@ opt/app/app/Services/Bunq/Token/InstallationToken.php opt/app/app/Services/Bunq/Token/SessionToken.php opt/app/app/Services/Currency/ExchangeRateInterface.php opt/app/app/Services/Currency/FixerIO.php +opt/app/app/Services/Github/Object/GithubObject.php +opt/app/app/Services/Github/Object/Release.php +opt/app/app/Services/Github/Request/GithubRequest.php +opt/app/app/Services/Github/Request/UpdateRequest.php opt/app/app/Services/Password/PwndVerifier.php opt/app/app/Services/Password/Verifier.php +opt/app/app/Services/Spectre/Object/Customer.php +opt/app/app/Services/Spectre/Object/SpectreObject.php +opt/app/app/Services/Spectre/Object/Token.php +opt/app/app/Services/Spectre/Request/CreateTokenRequest.php +opt/app/app/Services/Spectre/Request/NewCustomerRequest.php +opt/app/app/Services/Spectre/Request/SpectreRequest.php opt/app/app/Support/Amount.php opt/app/app/Support/Binder/AccountList.php opt/app/app/Support/Binder/BinderInterface.php @@ -637,13 +654,12 @@ opt/app/app/Support/Facades/Preferences.php opt/app/app/Support/Facades/Steam.php opt/app/app/Support/FireflyConfig.php opt/app/app/Support/Import/Configuration/ConfigurationInterface.php -opt/app/app/Support/Import/Configuration/Csv/Initial.php -opt/app/app/Support/Import/Configuration/Csv/Map.php -opt/app/app/Support/Import/Configuration/Csv/Roles.php +opt/app/app/Support/Import/Configuration/File/Initial.php +opt/app/app/Support/Import/Configuration/File/Map.php +opt/app/app/Support/Import/Configuration/File/Roles.php +opt/app/app/Support/Import/Configuration/File/Upload.php opt/app/app/Support/Import/Information/BunqInformation.php opt/app/app/Support/Import/Information/InformationInterface.php -opt/app/app/Support/Import/Prerequisites/BunqPrerequisites.php -opt/app/app/Support/Import/Prerequisites/PrerequisitesInterface.php opt/app/app/Support/Models/TransactionJournalTrait.php opt/app/app/Support/Navigation.php opt/app/app/Support/Preferences.php @@ -730,12 +746,15 @@ opt/app/composer.lock opt/app/composer.phar opt/app/config/app.php opt/app/config/auth.php +opt/app/config/breadcrumbs.php opt/app/config/broadcasting.php opt/app/config/cache.php opt/app/config/csv.php opt/app/config/database.php opt/app/config/filesystems.php opt/app/config/firefly.php +opt/app/config/google2fa.php +opt/app/config/import.php opt/app/config/intro.php opt/app/config/mail.php opt/app/config/queue.php @@ -766,9 +785,6 @@ opt/app/database/seeds/LinkTypeSeeder.php opt/app/database/seeds/PermissionSeeder.php opt/app/database/seeds/TransactionCurrencySeeder.php opt/app/database/seeds/TransactionTypeSeeder.php -opt/app/docker-compose.dockerhub.yml -opt/app/docker-compose.override.yml -opt/app/docker-compose.prod.yml opt/app/docker-compose.yml opt/app/nginx_app.conf opt/app/phpunit.coverage.xml @@ -850,6 +866,10 @@ opt/app/public/images/image.png opt/app/public/images/loading-small.gif opt/app/public/images/loading-wide.gif opt/app/public/images/logos/bunq.png +opt/app/public/images/logos/csv.png +opt/app/public/images/logos/file.png +opt/app/public/images/logos/plaid.png +opt/app/public/images/logos/spectre.png opt/app/public/images/page_green.png opt/app/public/images/page_white_acrobat.png opt/app/public/index.php @@ -858,6 +878,7 @@ opt/app/public/js/ff/accounts/edit-reconciliation.js opt/app/public/js/ff/accounts/edit.js opt/app/public/js/ff/accounts/reconcile.js opt/app/public/js/ff/accounts/show.js +opt/app/public/js/ff/admin/update/index.js opt/app/public/js/ff/bills/create.js opt/app/public/js/ff/bills/edit.js opt/app/public/js/ff/bills/show.js @@ -880,17 +901,16 @@ opt/app/public/js/ff/piggy-banks/edit.js opt/app/public/js/ff/piggy-banks/index.js opt/app/public/js/ff/piggy-banks/show.js opt/app/public/js/ff/preferences/index.js +opt/app/public/js/ff/reports/account/month.js +opt/app/public/js/ff/reports/all.js opt/app/public/js/ff/reports/audit/all.js -opt/app/public/js/ff/reports/budget/all.js opt/app/public/js/ff/reports/budget/month.js -opt/app/public/js/ff/reports/category/all.js opt/app/public/js/ff/reports/category/month.js opt/app/public/js/ff/reports/default/all.js opt/app/public/js/ff/reports/default/month.js opt/app/public/js/ff/reports/default/multi-year.js opt/app/public/js/ff/reports/default/year.js opt/app/public/js/ff/reports/index.js -opt/app/public/js/ff/reports/tag/all.js opt/app/public/js/ff/reports/tag/month.js opt/app/public/js/ff/rules/create-edit.js opt/app/public/js/ff/rules/index.js @@ -975,6 +995,7 @@ opt/app/resources/lang/de_DE/demo.php opt/app/resources/lang/de_DE/firefly.php opt/app/resources/lang/de_DE/form.php opt/app/resources/lang/de_DE/help.php +opt/app/resources/lang/de_DE/import.php opt/app/resources/lang/de_DE/intro.php opt/app/resources/lang/de_DE/list.php opt/app/resources/lang/de_DE/pagination.php @@ -988,6 +1009,7 @@ opt/app/resources/lang/en_US/csv.php opt/app/resources/lang/en_US/demo.php opt/app/resources/lang/en_US/firefly.php opt/app/resources/lang/en_US/form.php +opt/app/resources/lang/en_US/import.php opt/app/resources/lang/en_US/intro.php opt/app/resources/lang/en_US/list.php opt/app/resources/lang/en_US/pagination.php @@ -1002,11 +1024,26 @@ opt/app/resources/lang/fr_FR/demo.php opt/app/resources/lang/fr_FR/firefly.php opt/app/resources/lang/fr_FR/form.php opt/app/resources/lang/fr_FR/help.php +opt/app/resources/lang/fr_FR/import.php opt/app/resources/lang/fr_FR/intro.php opt/app/resources/lang/fr_FR/list.php opt/app/resources/lang/fr_FR/pagination.php opt/app/resources/lang/fr_FR/passwords.php opt/app/resources/lang/fr_FR/validation.php +opt/app/resources/lang/id_ID/auth.php +opt/app/resources/lang/id_ID/bank.php +opt/app/resources/lang/id_ID/breadcrumbs.php +opt/app/resources/lang/id_ID/config.php +opt/app/resources/lang/id_ID/csv.php +opt/app/resources/lang/id_ID/demo.php +opt/app/resources/lang/id_ID/firefly.php +opt/app/resources/lang/id_ID/form.php +opt/app/resources/lang/id_ID/import.php +opt/app/resources/lang/id_ID/intro.php +opt/app/resources/lang/id_ID/list.php +opt/app/resources/lang/id_ID/pagination.php +opt/app/resources/lang/id_ID/passwords.php +opt/app/resources/lang/id_ID/validation.php opt/app/resources/lang/nl_NL/auth.php opt/app/resources/lang/nl_NL/bank.php opt/app/resources/lang/nl_NL/breadcrumbs.php @@ -1016,6 +1053,7 @@ opt/app/resources/lang/nl_NL/demo.php opt/app/resources/lang/nl_NL/firefly.php opt/app/resources/lang/nl_NL/form.php opt/app/resources/lang/nl_NL/help.php +opt/app/resources/lang/nl_NL/import.php opt/app/resources/lang/nl_NL/intro.php opt/app/resources/lang/nl_NL/list.php opt/app/resources/lang/nl_NL/pagination.php @@ -1030,6 +1068,7 @@ opt/app/resources/lang/pl_PL/demo.php opt/app/resources/lang/pl_PL/firefly.php opt/app/resources/lang/pl_PL/form.php opt/app/resources/lang/pl_PL/help.php +opt/app/resources/lang/pl_PL/import.php opt/app/resources/lang/pl_PL/intro.php opt/app/resources/lang/pl_PL/list.php opt/app/resources/lang/pl_PL/pagination.php @@ -1057,6 +1096,7 @@ opt/app/resources/views/admin/link/delete.twig opt/app/resources/views/admin/link/edit.twig opt/app/resources/views/admin/link/index.twig opt/app/resources/views/admin/link/show.twig +opt/app/resources/views/admin/update/index.twig opt/app/resources/views/admin/users/delete.twig opt/app/resources/views/admin/users/edit.twig opt/app/resources/views/admin/users/index.twig @@ -1151,13 +1191,17 @@ opt/app/resources/views/form/text.twig opt/app/resources/views/form/textarea.twig opt/app/resources/views/import/bank/form.twig opt/app/resources/views/import/bunq/prerequisites.twig -opt/app/resources/views/import/csv/initial.twig -opt/app/resources/views/import/csv/map.twig -opt/app/resources/views/import/csv/roles.twig -opt/app/resources/views/import/file/finished.twig -opt/app/resources/views/import/file/index.twig -opt/app/resources/views/import/file/status.twig +opt/app/resources/views/import/file/initial.twig +opt/app/resources/views/import/file/map.twig +opt/app/resources/views/import/file/roles.twig +opt/app/resources/views/import/file/upload.twig opt/app/resources/views/import/index.twig +opt/app/resources/views/import/spectre/input-fields.twig +opt/app/resources/views/import/spectre/prerequisites.twig +opt/app/resources/views/import/spectre/redirect.twig +opt/app/resources/views/import/spectre/select-country.twig +opt/app/resources/views/import/spectre/select-provider.twig +opt/app/resources/views/import/status.twig opt/app/resources/views/index.twig opt/app/resources/views/javascript/accounts.twig opt/app/resources/views/javascript/currencies.twig @@ -1204,6 +1248,7 @@ opt/app/resources/views/profile/change-email.twig opt/app/resources/views/profile/change-password.twig opt/app/resources/views/profile/delete-account.twig opt/app/resources/views/profile/index.twig +opt/app/resources/views/reports/account/report.twig opt/app/resources/views/reports/audit/report.twig opt/app/resources/views/reports/budget/month.twig opt/app/resources/views/reports/category/month.twig @@ -1211,6 +1256,7 @@ opt/app/resources/views/reports/default/month.twig opt/app/resources/views/reports/default/multi-year.twig opt/app/resources/views/reports/default/year.twig opt/app/resources/views/reports/index.twig +opt/app/resources/views/reports/options/account.twig opt/app/resources/views/reports/options/budget.twig opt/app/resources/views/reports/options/category.twig opt/app/resources/views/reports/options/no-options.twig @@ -1222,10 +1268,14 @@ opt/app/resources/views/reports/partials/budget-period.twig opt/app/resources/views/reports/partials/budgets.twig opt/app/resources/views/reports/partials/categories.twig opt/app/resources/views/reports/partials/category-period.twig +opt/app/resources/views/reports/partials/exp-budgets.twig +opt/app/resources/views/reports/partials/exp-categories.twig +opt/app/resources/views/reports/partials/exp-not-grouped.twig opt/app/resources/views/reports/partials/income-expenses.twig opt/app/resources/views/reports/partials/journals-audit.twig opt/app/resources/views/reports/partials/operations.twig opt/app/resources/views/reports/partials/tags.twig +opt/app/resources/views/reports/partials/top-transactions.twig opt/app/resources/views/reports/tag/month.twig opt/app/resources/views/rules/index.twig opt/app/resources/views/rules/partials/action.twig @@ -1246,6 +1296,7 @@ opt/app/resources/views/tags/delete.twig opt/app/resources/views/tags/edit.twig opt/app/resources/views/tags/index.twig opt/app/resources/views/tags/show.twig +opt/app/resources/views/test/test.twig opt/app/resources/views/transactions/convert.twig opt/app/resources/views/transactions/index.twig opt/app/resources/views/transactions/links/delete.twig @@ -1257,6 +1308,7 @@ opt/app/resources/views/transactions/single/delete.twig opt/app/resources/views/transactions/single/edit.twig opt/app/resources/views/transactions/split/edit.twig opt/app/routes/api.php +opt/app/routes/breadcrumbs.php opt/app/routes/channels.php opt/app/routes/console.php opt/app/routes/web.php @@ -1325,14 +1377,6 @@ opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php opt/app/vendor/bin/commonmark opt/app/vendor/bin/doctrine-dbal -opt/app/vendor/christian-riesen/base32/LICENSE -opt/app/vendor/christian-riesen/base32/README.md -opt/app/vendor/christian-riesen/base32/build.xml -opt/app/vendor/christian-riesen/base32/composer.json -opt/app/vendor/christian-riesen/base32/phpunit.xml.dist -opt/app/vendor/christian-riesen/base32/src/Base32.php -opt/app/vendor/christian-riesen/base32/tests/Base32Test.php -opt/app/vendor/christian-riesen/base32/tests/bootstrap.php opt/app/vendor/composer/ClassLoader.php opt/app/vendor/composer/LICENSE opt/app/vendor/composer/autoload_classmap.php @@ -1342,37 +1386,24 @@ opt/app/vendor/composer/autoload_psr4.php opt/app/vendor/composer/autoload_real.php opt/app/vendor/composer/autoload_static.php opt/app/vendor/composer/installed.json -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/.editorconfig -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/README.md -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/RELEASE-CHECKLIST.md opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Generator.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Manager.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/ServiceProvider.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/View.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/TestCase.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/bootstrap.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/CustomServiceProvider.html -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/DependantServiceProvider.html -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/bootstrap2.html -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/bootstrap3.html -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/integration.html -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/CustomServiceProviderTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/DependantServiceProviderErrorTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/DependantServiceProviderTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/IntegrationTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/CurrentRouteTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/FacadeTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/GeneratorTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/ManagerTest.php -opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/ViewTest.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsException.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsGenerator.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsManager.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsServiceProvider.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/DuplicateBreadcrumbException.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/InvalidBreadcrumbException.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/UnnamedRouteException.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/ViewNotSetException.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facades/Breadcrumbs.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap2.blade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap3.blade.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap4.blade.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bulma.blade.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/foundation6.blade.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/json-ld.php +opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/materialize.blade.php opt/app/vendor/doctrine/annotations/CHANGELOG.md opt/app/vendor/doctrine/annotations/LICENSE opt/app/vendor/doctrine/annotations/README.md @@ -2188,6 +2219,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php opt/app/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php opt/app/vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php opt/app/vendor/laravel/framework/src/Illuminate/Events/composer.json +opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/Cache.php opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php @@ -2663,6 +2695,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Support/MessageBag.php opt/app/vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Optional.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php +opt/app/vendor/laravel/framework/src/Illuminate/Support/ProcessUtils.php opt/app/vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Str.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/BusFake.php @@ -2865,23 +2898,29 @@ opt/app/vendor/league/commonmark/src/Util/Html5Entities.php opt/app/vendor/league/commonmark/src/Util/LinkParserHelper.php opt/app/vendor/league/commonmark/src/Util/RegexHelper.php opt/app/vendor/league/commonmark/src/Util/UrlEncoder.php +opt/app/vendor/league/commonmark/src/Util/Xml.php opt/app/vendor/league/csv/LICENSE opt/app/vendor/league/csv/autoload.php opt/app/vendor/league/csv/composer.json opt/app/vendor/league/csv/src/AbstractCsv.php -opt/app/vendor/league/csv/src/Config/Controls.php -opt/app/vendor/league/csv/src/Config/Output.php -opt/app/vendor/league/csv/src/Exception/InvalidRowException.php -opt/app/vendor/league/csv/src/Modifier/MapIterator.php -opt/app/vendor/league/csv/src/Modifier/QueryFilter.php -opt/app/vendor/league/csv/src/Modifier/RowFilter.php -opt/app/vendor/league/csv/src/Modifier/StreamFilter.php -opt/app/vendor/league/csv/src/Modifier/StreamIterator.php -opt/app/vendor/league/csv/src/Plugin/ColumnConsistencyValidator.php -opt/app/vendor/league/csv/src/Plugin/ForbiddenNullValuesValidator.php -opt/app/vendor/league/csv/src/Plugin/SkipNullValuesFormatter.php +opt/app/vendor/league/csv/src/ByteSequence.php +opt/app/vendor/league/csv/src/CannotInsertRecord.php +opt/app/vendor/league/csv/src/CharsetConverter.php +opt/app/vendor/league/csv/src/ColumnConsistency.php +opt/app/vendor/league/csv/src/EncloseField.php +opt/app/vendor/league/csv/src/EscapeFormula.php +opt/app/vendor/league/csv/src/Exception.php +opt/app/vendor/league/csv/src/HTMLConverter.php +opt/app/vendor/league/csv/src/MapIterator.php +opt/app/vendor/league/csv/src/RFC4180Field.php opt/app/vendor/league/csv/src/Reader.php +opt/app/vendor/league/csv/src/ResultSet.php +opt/app/vendor/league/csv/src/Statement.php +opt/app/vendor/league/csv/src/Stream.php opt/app/vendor/league/csv/src/Writer.php +opt/app/vendor/league/csv/src/XMLConverter.php +opt/app/vendor/league/csv/src/functions.php +opt/app/vendor/league/csv/src/functions_include.php opt/app/vendor/league/flysystem/LICENSE opt/app/vendor/league/flysystem/composer.json opt/app/vendor/league/flysystem/docs/CNAME @@ -3229,6 +3268,31 @@ opt/app/vendor/nesbot/carbon/src/Carbon/Lang/uz.php opt/app/vendor/nesbot/carbon/src/Carbon/Lang/vi.php opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh.php opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php +opt/app/vendor/paragonie/constant_time_encoding/LICENSE.txt +opt/app/vendor/paragonie/constant_time_encoding/README.md +opt/app/vendor/paragonie/constant_time_encoding/composer.json +opt/app/vendor/paragonie/constant_time_encoding/phpunit.xml.dist +opt/app/vendor/paragonie/constant_time_encoding/psalm.xml +opt/app/vendor/paragonie/constant_time_encoding/src/Base32.php +opt/app/vendor/paragonie/constant_time_encoding/src/Base32Hex.php +opt/app/vendor/paragonie/constant_time_encoding/src/Base64.php +opt/app/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php +opt/app/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php +opt/app/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php +opt/app/vendor/paragonie/constant_time_encoding/src/Binary.php +opt/app/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php +opt/app/vendor/paragonie/constant_time_encoding/src/Encoding.php +opt/app/vendor/paragonie/constant_time_encoding/src/Hex.php +opt/app/vendor/paragonie/constant_time_encoding/src/RFC4648.php +opt/app/vendor/paragonie/constant_time_encoding/tests/Base32HexTest.php +opt/app/vendor/paragonie/constant_time_encoding/tests/Base32Test.php +opt/app/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashOrderedTest.php +opt/app/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashTest.php +opt/app/vendor/paragonie/constant_time_encoding/tests/Base64Test.php +opt/app/vendor/paragonie/constant_time_encoding/tests/Base64UrlSafeTest.php +opt/app/vendor/paragonie/constant_time_encoding/tests/EncodingTest.php +opt/app/vendor/paragonie/constant_time_encoding/tests/HexTest.php +opt/app/vendor/paragonie/constant_time_encoding/tests/RFC4648Test.php opt/app/vendor/paragonie/random_compat/LICENSE opt/app/vendor/paragonie/random_compat/build-phar.sh opt/app/vendor/paragonie/random_compat/composer.json @@ -3247,19 +3311,45 @@ opt/app/vendor/paragonie/random_compat/lib/random_int.php opt/app/vendor/paragonie/random_compat/other/build_phar.php opt/app/vendor/paragonie/random_compat/psalm-autoload.php opt/app/vendor/paragonie/random_compat/psalm.xml +opt/app/vendor/pragmarx/google2fa-laravel/LICENSE +opt/app/vendor/pragmarx/google2fa-laravel/changelog.md +opt/app/vendor/pragmarx/google2fa-laravel/composer.json +opt/app/vendor/pragmarx/google2fa-laravel/docs/middleware.jpg +opt/app/vendor/pragmarx/google2fa-laravel/phpspec.yml +opt/app/vendor/pragmarx/google2fa-laravel/readme.md +opt/app/vendor/pragmarx/google2fa-laravel/src/Events/OneTimePasswordRequested.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Exceptions/InvalidOneTimePassword.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Exceptions/InvalidSecretKey.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Facade.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Middleware.php +opt/app/vendor/pragmarx/google2fa-laravel/src/ServiceProvider.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Auth.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Authenticator.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Config.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Constants.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/ErrorBag.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Input.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Request.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Response.php +opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Session.php +opt/app/vendor/pragmarx/google2fa-laravel/src/config/config.php +opt/app/vendor/pragmarx/google2fa-laravel/tests/spec/Support/AuthenticatorSpec.php +opt/app/vendor/pragmarx/google2fa-laravel/upgrading.md opt/app/vendor/pragmarx/google2fa/LICENSE opt/app/vendor/pragmarx/google2fa/changelog.md opt/app/vendor/pragmarx/google2fa/composer.json -opt/app/vendor/pragmarx/google2fa/phpspec.yml +opt/app/vendor/pragmarx/google2fa/docs/playground.jpg opt/app/vendor/pragmarx/google2fa/readme.md -opt/app/vendor/pragmarx/google2fa/src/Contracts/Google2FA.php +opt/app/vendor/pragmarx/google2fa/src/Exceptions/IncompatibleWithGoogleAuthenticatorException.php opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php opt/app/vendor/pragmarx/google2fa/src/Exceptions/SecretKeyTooShortException.php opt/app/vendor/pragmarx/google2fa/src/Google2FA.php +opt/app/vendor/pragmarx/google2fa/src/Support/Base32.php +opt/app/vendor/pragmarx/google2fa/src/Support/Constants.php +opt/app/vendor/pragmarx/google2fa/src/Support/QRCode.php opt/app/vendor/pragmarx/google2fa/src/Support/Url.php -opt/app/vendor/pragmarx/google2fa/src/Vendor/Laravel/Facade.php -opt/app/vendor/pragmarx/google2fa/src/Vendor/Laravel/ServiceProvider.php -opt/app/vendor/pragmarx/google2fa/tests/spec/Google2FASpec.php +opt/app/vendor/pragmarx/google2fa/tests/Google2FATest.php +opt/app/vendor/pragmarx/google2fa/tests/bootstrap.php opt/app/vendor/pragmarx/google2fa/upgrading.md opt/app/vendor/psr/container/LICENSE opt/app/vendor/psr/container/README.md @@ -4245,10 +4335,11 @@ opt/app/vendor/symfony/debug/Tests/Fixtures/reallyNotPsr0.php opt/app/vendor/symfony/debug/Tests/Fixtures2/RequiredTwice.php opt/app/vendor/symfony/debug/Tests/HeaderMock.php opt/app/vendor/symfony/debug/Tests/MockExceptionHandler.php +opt/app/vendor/symfony/debug/Tests/phpt/exception_rethrown.phpt +opt/app/vendor/symfony/debug/Tests/phpt/fatal_with_nested_handlers.phpt opt/app/vendor/symfony/debug/composer.json opt/app/vendor/symfony/debug/phpunit.xml.dist opt/app/vendor/symfony/event-dispatcher/CHANGELOG.md -opt/app/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php opt/app/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php opt/app/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php opt/app/vendor/symfony/event-dispatcher/Debug/WrappedListener.php @@ -4262,7 +4353,6 @@ opt/app/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php opt/app/vendor/symfony/event-dispatcher/LICENSE opt/app/vendor/symfony/event-dispatcher/README.md opt/app/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php -opt/app/vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php opt/app/vendor/symfony/event-dispatcher/Tests/EventDispatcherTest.php @@ -4453,6 +4543,8 @@ opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/st opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.expected opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php +opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected +opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php @@ -4529,9 +4621,12 @@ opt/app/vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueRe opt/app/vendor/symfony/http-kernel/DependencyInjection/Extension.php opt/app/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php +opt/app/vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php +opt/app/vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php +opt/app/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php opt/app/vendor/symfony/http-kernel/Event/FilterControllerArgumentsEvent.php opt/app/vendor/symfony/http-kernel/Event/FilterControllerEvent.php opt/app/vendor/symfony/http-kernel/Event/FilterResponseEvent.php @@ -4600,11 +4695,14 @@ opt/app/vendor/symfony/http-kernel/KernelEvents.php opt/app/vendor/symfony/http-kernel/KernelInterface.php opt/app/vendor/symfony/http-kernel/LICENSE opt/app/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php +opt/app/vendor/symfony/http-kernel/Log/Logger.php opt/app/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php opt/app/vendor/symfony/http-kernel/Profiler/Profile.php opt/app/vendor/symfony/http-kernel/Profiler/Profiler.php opt/app/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php opt/app/vendor/symfony/http-kernel/README.md +opt/app/vendor/symfony/http-kernel/RebootableInterface.php +opt/app/vendor/symfony/http-kernel/Resources/welcome.html.php opt/app/vendor/symfony/http-kernel/TerminableInterface.php opt/app/vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php opt/app/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php @@ -4614,11 +4712,13 @@ opt/app/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php opt/app/vendor/symfony/http-kernel/Tests/ClientTest.php opt/app/vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php opt/app/vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php +opt/app/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolver/ServiceValueResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php opt/app/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php +opt/app/vendor/symfony/http-kernel/Tests/DataCollector/Compiler.log opt/app/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php opt/app/vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php opt/app/vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php @@ -4634,9 +4734,13 @@ opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/AddAnnotatedClasses opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php +opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/LoggerPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php +opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ResettableServicePassTest.php +opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ServicesResetterTest.php +opt/app/vendor/symfony/http-kernel/Tests/Event/FilterControllerArgumentsEventTest.php opt/app/vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php @@ -4676,6 +4780,7 @@ opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt +opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ClearableService.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php @@ -4694,6 +4799,7 @@ opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Extensi opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php +opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ResettableService.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt @@ -4716,6 +4822,7 @@ opt/app/vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php opt/app/vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php opt/app/vendor/symfony/http-kernel/Tests/HttpKernelTest.php opt/app/vendor/symfony/http-kernel/Tests/KernelTest.php +opt/app/vendor/symfony/http-kernel/Tests/Log/LoggerTest.php opt/app/vendor/symfony/http-kernel/Tests/Logger.php opt/app/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php opt/app/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php @@ -5297,6 +5404,7 @@ opt/app/vendor/twig/twig/lib/Twig/Cache/Null.php opt/app/vendor/twig/twig/lib/Twig/CacheInterface.php opt/app/vendor/twig/twig/lib/Twig/Compiler.php opt/app/vendor/twig/twig/lib/Twig/CompilerInterface.php +opt/app/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php opt/app/vendor/twig/twig/lib/Twig/Environment.php opt/app/vendor/twig/twig/lib/Twig/Error.php opt/app/vendor/twig/twig/lib/Twig/Error/Loader.php @@ -5417,6 +5525,7 @@ opt/app/vendor/twig/twig/lib/Twig/Node/SetTemp.php opt/app/vendor/twig/twig/lib/Twig/Node/Spaceless.php opt/app/vendor/twig/twig/lib/Twig/Node/Text.php opt/app/vendor/twig/twig/lib/Twig/Node/With.php +opt/app/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php opt/app/vendor/twig/twig/lib/Twig/NodeInterface.php opt/app/vendor/twig/twig/lib/Twig/NodeOutputInterface.php opt/app/vendor/twig/twig/lib/Twig/NodeTraverser.php @@ -5427,6 +5536,7 @@ opt/app/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php opt/app/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php opt/app/vendor/twig/twig/lib/Twig/Parser.php opt/app/vendor/twig/twig/lib/Twig/ParserInterface.php +opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php @@ -5486,15 +5596,188 @@ opt/app/vendor/twig/twig/lib/Twig/TokenStream.php opt/app/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php opt/app/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php opt/app/vendor/twig/twig/phpunit.xml.dist +opt/app/vendor/twig/twig/src/Cache/CacheInterface.php +opt/app/vendor/twig/twig/src/Cache/FilesystemCache.php +opt/app/vendor/twig/twig/src/Cache/NullCache.php +opt/app/vendor/twig/twig/src/Compiler.php +opt/app/vendor/twig/twig/src/Environment.php +opt/app/vendor/twig/twig/src/Error/Error.php +opt/app/vendor/twig/twig/src/Error/LoaderError.php +opt/app/vendor/twig/twig/src/Error/RuntimeError.php +opt/app/vendor/twig/twig/src/Error/SyntaxError.php +opt/app/vendor/twig/twig/src/ExpressionParser.php +opt/app/vendor/twig/twig/src/Extension/AbstractExtension.php +opt/app/vendor/twig/twig/src/Extension/CoreExtension.php +opt/app/vendor/twig/twig/src/Extension/DebugExtension.php +opt/app/vendor/twig/twig/src/Extension/EscaperExtension.php +opt/app/vendor/twig/twig/src/Extension/ExtensionInterface.php +opt/app/vendor/twig/twig/src/Extension/GlobalsInterface.php +opt/app/vendor/twig/twig/src/Extension/InitRuntimeInterface.php +opt/app/vendor/twig/twig/src/Extension/OptimizerExtension.php +opt/app/vendor/twig/twig/src/Extension/ProfilerExtension.php +opt/app/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php +opt/app/vendor/twig/twig/src/Extension/SandboxExtension.php +opt/app/vendor/twig/twig/src/Extension/StagingExtension.php +opt/app/vendor/twig/twig/src/Extension/StringLoaderExtension.php +opt/app/vendor/twig/twig/src/FileExtensionEscapingStrategy.php +opt/app/vendor/twig/twig/src/Lexer.php +opt/app/vendor/twig/twig/src/Loader/ArrayLoader.php +opt/app/vendor/twig/twig/src/Loader/ChainLoader.php +opt/app/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php +opt/app/vendor/twig/twig/src/Loader/FilesystemLoader.php +opt/app/vendor/twig/twig/src/Loader/LoaderInterface.php +opt/app/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php +opt/app/vendor/twig/twig/src/Markup.php +opt/app/vendor/twig/twig/src/Node/AutoEscapeNode.php +opt/app/vendor/twig/twig/src/Node/BlockNode.php +opt/app/vendor/twig/twig/src/Node/BlockReferenceNode.php +opt/app/vendor/twig/twig/src/Node/BodyNode.php +opt/app/vendor/twig/twig/src/Node/CheckSecurityNode.php +opt/app/vendor/twig/twig/src/Node/DoNode.php +opt/app/vendor/twig/twig/src/Node/EmbedNode.php +opt/app/vendor/twig/twig/src/Node/Expression/AbstractExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/ArrayExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php +opt/app/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/CallExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/ConstantExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php +opt/app/vendor/twig/twig/src/Node/Expression/FilterExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/FunctionExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/NameExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/ParentExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/TempNameExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/NullTest.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/OddTest.php +opt/app/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php +opt/app/vendor/twig/twig/src/Node/Expression/TestExpression.php +opt/app/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php +opt/app/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php +opt/app/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php +opt/app/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php +opt/app/vendor/twig/twig/src/Node/FlushNode.php +opt/app/vendor/twig/twig/src/Node/ForLoopNode.php +opt/app/vendor/twig/twig/src/Node/ForNode.php +opt/app/vendor/twig/twig/src/Node/IfNode.php +opt/app/vendor/twig/twig/src/Node/ImportNode.php +opt/app/vendor/twig/twig/src/Node/IncludeNode.php +opt/app/vendor/twig/twig/src/Node/MacroNode.php +opt/app/vendor/twig/twig/src/Node/ModuleNode.php +opt/app/vendor/twig/twig/src/Node/Node.php +opt/app/vendor/twig/twig/src/Node/NodeCaptureInterface.php +opt/app/vendor/twig/twig/src/Node/NodeOutputInterface.php +opt/app/vendor/twig/twig/src/Node/PrintNode.php +opt/app/vendor/twig/twig/src/Node/SandboxNode.php +opt/app/vendor/twig/twig/src/Node/SandboxedPrintNode.php +opt/app/vendor/twig/twig/src/Node/SetNode.php +opt/app/vendor/twig/twig/src/Node/SetTempNode.php +opt/app/vendor/twig/twig/src/Node/SpacelessNode.php +opt/app/vendor/twig/twig/src/Node/TextNode.php +opt/app/vendor/twig/twig/src/Node/WithNode.php +opt/app/vendor/twig/twig/src/NodeTraverser.php +opt/app/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php +opt/app/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php +opt/app/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php +opt/app/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php +opt/app/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php +opt/app/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php +opt/app/vendor/twig/twig/src/Parser.php +opt/app/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php +opt/app/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php +opt/app/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php +opt/app/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php +opt/app/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php +opt/app/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php +opt/app/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php +opt/app/vendor/twig/twig/src/Profiler/Profile.php +opt/app/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php +opt/app/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php +opt/app/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityError.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityPolicy.php +opt/app/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php +opt/app/vendor/twig/twig/src/Source.php +opt/app/vendor/twig/twig/src/Template.php +opt/app/vendor/twig/twig/src/TemplateWrapper.php +opt/app/vendor/twig/twig/src/Test/IntegrationTestCase.php +opt/app/vendor/twig/twig/src/Test/NodeTestCase.php +opt/app/vendor/twig/twig/src/Token.php +opt/app/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/BlockTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/DoTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/FilterTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/FlushTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/ForTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/FromTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/IfTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/ImportTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/MacroTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/SetTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/TokenParserInterface.php +opt/app/vendor/twig/twig/src/TokenParser/UseTokenParser.php +opt/app/vendor/twig/twig/src/TokenParser/WithTokenParser.php +opt/app/vendor/twig/twig/src/TokenStream.php +opt/app/vendor/twig/twig/src/TwigFilter.php +opt/app/vendor/twig/twig/src/TwigFunction.php +opt/app/vendor/twig/twig/src/TwigTest.php +opt/app/vendor/twig/twig/src/Util/DeprecationCollector.php +opt/app/vendor/twig/twig/src/Util/TemplateDirIterator.php opt/app/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php opt/app/vendor/twig/twig/test/Twig/Tests/CompilerTest.php +opt/app/vendor/twig/twig/test/Twig/Tests/ContainerRuntimeLoaderTest.php opt/app/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php opt/app/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php opt/app/vendor/twig/twig/test/Twig/Tests/ErrorTest.php opt/app/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php +opt/app/vendor/twig/twig/test/Twig/Tests/FactoryRuntimeLoaderTest.php opt/app/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php opt/app/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php opt/app/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php @@ -5561,6 +5844,7 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test +opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_javascript.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test @@ -5751,6 +6035,7 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test +opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test @@ -5851,12 +6136,11 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php -opt/app/vendor/twig/twig/test/Twig/Tests/RuntimeFactoryLoaderTest.php opt/app/vendor/twig/twig/test/Twig/Tests/TemplateTest.php opt/app/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php opt/app/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php +opt/app/vendor/twig/twig/test/Twig/Tests/Util/DeprecationCollectorTest.php opt/app/vendor/twig/twig/test/Twig/Tests/escapingTest.php -opt/app/vendor/twig/twig/test/bootstrap.php opt/app/vendor/vlucas/phpdotenv/LICENSE.txt opt/app/vendor/vlucas/phpdotenv/composer.json opt/app/vendor/vlucas/phpdotenv/src/Dotenv.php @@ -6010,6 +6294,8 @@ usr/lib/x86_64-linux-gnu/libxml2.so.2 usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1 usr/lib/x86_64-linux-gnu/libxslt.so.1 usr/lib/x86_64-linux-gnu/libxslt.so.1.1.28 +usr/lib/x86_64-linux-gnu/libzip.so.5 +usr/lib/x86_64-linux-gnu/libzip.so.5.0.0 usr/sbin/mysqld usr/sbin/nginx usr/sbin/php-fpm7.1 diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 85220dd1bf..fd65c7f0cd 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = ( manifest = ( appTitle = (defaultText = "Firefly III"), - appVersion = 5, - appMarketingVersion = (defaultText = "4.6.11.1"), + appVersion = 6, + appMarketingVersion = (defaultText = "4.6.12"), actions = [ # Define your "new document" handlers here. diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c9fc0a77a..46aee1a99b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,31 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.6.12] - 2017-12-31 +### Added +- Support for Indonesian. +- New report, see [issue 384](https://github.com/firefly-iii/firefly-iii/issues/384) +- [Issue 964](https://github.com/firefly-iii/firefly-iii/issues/964) as suggested by [gavu](https://github.com/gavu) + +### Changed +- Greatly improved Docker support and documentation. + +### Fixed +- [Issue 1046](https://github.com/firefly-iii/firefly-iii/issues/1046), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1047](https://github.com/firefly-iii/firefly-iii/issues/1047), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1048](https://github.com/firefly-iii/firefly-iii/issues/1048), as reported by [webence](https://github.com/webence) +- [Issue 1049](https://github.com/firefly-iii/firefly-iii/issues/1049), as reported by [nicoschreiner](https://github.com/nicoschreiner) +- [Issue 1015](https://github.com/firefly-iii/firefly-iii/issues/1015), as reporterd by a user on Tweakers.net +- [Issue 1056](https://github.com/firefly-iii/firefly-iii/issues/1056), as reported by [repercussion](https://github.com/repercussion) +- [Issue 1061](https://github.com/firefly-iii/firefly-iii/issues/1061), as reported by [Meizikyn](https://github.com/Meizikyn) +- [Issue 1045](https://github.com/firefly-iii/firefly-iii/issues/1045), as reported by [gavu](https://github.com/gavu) +- First code for [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040) ([simonsmiley](https://github.com/simonsmiley)) +- [Issue 1059](https://github.com/firefly-iii/firefly-iii/issues/1059), as reported by [4oo4](https://github.com/4oo4) +- [Issue 1063](https://github.com/firefly-iii/firefly-iii/issues/1063), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1064](https://github.com/firefly-iii/firefly-iii/issues/1064), as reported by [pkoziol](https://github.com/pkoziol) +- [Issue 1066](https://github.com/firefly-iii/firefly-iii/issues/1066), reported by [wtercato](https://github.com/wtercato) + + ## [4.6.11.1] - 2017-12-08 ### Added - Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) diff --git a/app/Console/Commands/CreateImport.php b/app/Console/Commands/CreateImport.php index b29d83e291..bfb52735e2 100644 --- a/app/Console/Commands/CreateImport.php +++ b/app/Console/Commands/CreateImport.php @@ -150,7 +150,9 @@ class CreateImport extends Command $this->error(sprintf('Error importing line #%d: %s', $index, $error)); } $this->line( - sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->lines) + sprintf( + 'The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines() + ) ); } diff --git a/app/Console/Commands/Import.php b/app/Console/Commands/Import.php index 5f156c3e1f..65ae256332 100644 --- a/app/Console/Commands/Import.php +++ b/app/Console/Commands/Import.php @@ -85,8 +85,8 @@ class Import extends Command $monolog->pushHandler($handler); // actually start job: - $type = 'csv' === $job->file_type ? 'file' : $job->file_type; - $key = sprintf('import.routine.%s', $type); + $type = 'csv' === $job->file_type ? 'file' : $job->file_type; + $key = sprintf('import.routine.%s', $type); $className = config($key); if (null === $className || !class_exists($className)) { throw new FireflyException(sprintf('Cannot find import routine class for job of type "%s".', $type)); // @codeCoverageIgnore @@ -98,11 +98,13 @@ class Import extends Command $routine->run(); /** @var MessageBag $error */ - foreach ($routine->errors as $index => $error) { + foreach ($routine->getErrors() as $index => $error) { $this->error(sprintf('Error importing line #%d: %s', $index, $error)); } - $this->line(sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->journals->count(), $routine->lines)); + $this->line( + sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines()) + ); return; } diff --git a/app/Console/Commands/UseEncryption.php b/app/Console/Commands/UseEncryption.php index 8516a9bcf4..0809ec08b2 100644 --- a/app/Console/Commands/UseEncryption.php +++ b/app/Console/Commands/UseEncryption.php @@ -57,6 +57,12 @@ class UseEncryption extends Command */ public function handle() { + if (config('firefly.encryption') === true) { + $this->info('Firefly III configuration calls for encrypted data.'); + } + if (config('firefly.encryption') === false) { + $this->info('Firefly III configuration calls for unencrypted data.'); + } $this->handleObjects('Account', 'name', 'encrypted'); $this->handleObjects('Bill', 'name', 'name_encrypted'); $this->handleObjects('Bill', 'match', 'match_encrypted'); @@ -76,7 +82,7 @@ class UseEncryption extends Command public function handleObjects(string $class, string $field, string $indicator) { $fqn = sprintf('FireflyIII\Models\%s', $class); - $encrypt = config('firefly.encryption') ? 0 : 1; + $encrypt = config('firefly.encryption') === true ? 0 : 1; $set = $fqn::where($indicator, $encrypt)->get(); foreach ($set as $entry) { diff --git a/app/Services/Spectre/Object/Login.php b/app/Events/RequestedVersionCheckStatus.php similarity index 58% rename from app/Services/Spectre/Object/Login.php rename to app/Events/RequestedVersionCheckStatus.php index 6de8bed874..c87a0b35b8 100644 --- a/app/Services/Spectre/Object/Login.php +++ b/app/Events/RequestedVersionCheckStatus.php @@ -1,6 +1,6 @@ user = $user; + } } \ No newline at end of file diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 8819b726fc..63f0c5ea43 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -203,7 +203,7 @@ final class Entry $entry->description = $transaction->transaction_description . '(' . $transaction->description . ')'; } $entry->currency_code = $transaction->transactionCurrency->code; - $entry->amount = round($transaction->transaction_amount, $transaction->transactionCurrency->decimal_places); + $entry->amount = strval(round($transaction->transaction_amount, $transaction->transactionCurrency->decimal_places)); $entry->foreign_currency_code = null === $transaction->foreign_currency_id ? null : $transaction->foreignCurrency->code; $entry->foreign_amount = null === $transaction->foreign_currency_id @@ -216,14 +216,14 @@ final class Entry ); $entry->transaction_type = $transaction->transaction_type_type; - $entry->asset_account_id = $transaction->account_id; + $entry->asset_account_id = strval($transaction->account_id); $entry->asset_account_name = app('steam')->tryDecrypt($transaction->account_name); $entry->asset_account_iban = $transaction->account_iban; $entry->asset_account_number = $transaction->account_number; $entry->asset_account_bic = $transaction->account_bic; $entry->asset_currency_code = $transaction->account_currency_code; - $entry->opposing_account_id = $transaction->opposing_account_id; + $entry->opposing_account_id = strval($transaction->opposing_account_id); $entry->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name); $entry->opposing_account_iban = $transaction->opposing_account_iban; $entry->opposing_account_number = $transaction->opposing_account_number; @@ -231,7 +231,7 @@ final class Entry $entry->opposing_currency_code = $transaction->opposing_currency_code; // budget - $entry->budget_id = $transaction->transaction_budget_id; + $entry->budget_id = strval($transaction->transaction_budget_id); $entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name); if (null === $transaction->transaction_budget_id) { $entry->budget_id = $transaction->transaction_journal_budget_id; @@ -239,7 +239,7 @@ final class Entry } // category - $entry->category_id = $transaction->transaction_category_id; + $entry->category_id = strval($transaction->transaction_category_id); $entry->category_name = app('steam')->tryDecrypt($transaction->transaction_category_name); if (null === $transaction->transaction_category_id) { $entry->category_id = $transaction->transaction_journal_category_id; @@ -247,7 +247,7 @@ final class Entry } // budget - $entry->bill_id = $transaction->bill_id; + $entry->bill_id = strval($transaction->bill_id); $entry->bill_name = app('steam')->tryDecrypt($transaction->bill_name); $entry->tags = $transaction->tags; diff --git a/app/Export/Exporter/CsvExporter.php b/app/Export/Exporter/CsvExporter.php index e2703b0d20..012e4d6e2b 100644 --- a/app/Export/Exporter/CsvExporter.php +++ b/app/Export/Exporter/CsvExporter.php @@ -24,8 +24,6 @@ namespace FireflyIII\Export\Exporter; use FireflyIII\Export\Entry\Entry; use League\Csv\Writer; -use SplFileObject; -use SplTempFileObject; use Storage; /** @@ -66,12 +64,9 @@ class CsvExporter extends BasicExporter implements ExporterInterface $fullPath = storage_path('export') . DIRECTORY_SEPARATOR . $this->fileName; - //we create the CSV into memory - //$writer = Writer::createFromFileObject(new SplTempFileObject()); $writer = Writer::createFromPath($fullPath); - //$writer = Writer::createFromPath(new SplFileObject($fullPath, 'a+'), 'w'); - $rows = []; + $rows = []; // get field names for header row: $first = $this->getEntries()->first(); @@ -91,8 +86,6 @@ class CsvExporter extends BasicExporter implements ExporterInterface $rows[] = $line; } $writer->insertAll($rows); - //$writer->output($fullPath); - //$writer-> return true; } @@ -102,6 +95,6 @@ class CsvExporter extends BasicExporter implements ExporterInterface $this->fileName = $this->job->key . '-records.csv'; // touch file in export directory: $disk = Storage::disk('export'); - $disk->put($this->fileName,''); + $disk->put($this->fileName, ''); } } diff --git a/app/Generator/Report/Tag/MonthReportGenerator.php b/app/Generator/Report/Tag/MonthReportGenerator.php index 43a6899482..e1cdc808fc 100644 --- a/app/Generator/Report/Tag/MonthReportGenerator.php +++ b/app/Generator/Report/Tag/MonthReportGenerator.php @@ -65,6 +65,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface /** * @return string + * @throws \Throwable */ public function generate(): string { diff --git a/app/Handlers/Events/UserEventHandler.php b/app/Handlers/Events/UserEventHandler.php index 6fcb3428eb..23f09fbfeb 100644 --- a/app/Handlers/Events/UserEventHandler.php +++ b/app/Handlers/Events/UserEventHandler.php @@ -76,6 +76,7 @@ class UserEventHandler { Log::debug('In checkSingleUserIsAdmin'); + /** @var User $user */ $user = $event->user; $count = User::count(); diff --git a/app/Handlers/Events/VersionCheckEventHandler.php b/app/Handlers/Events/VersionCheckEventHandler.php index e22655c65c..6753f1d9a6 100644 --- a/app/Handlers/Events/VersionCheckEventHandler.php +++ b/app/Handlers/Events/VersionCheckEventHandler.php @@ -23,20 +23,21 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Events; +use FireflyConfig; +use FireflyIII\Events\RequestedVersionCheckStatus; use FireflyIII\User; -use Illuminate\Auth\Events\Login; use Log; -use Preferences; /** * Class VersionCheckEventHandler */ class VersionCheckEventHandler { + /** - * @param Login $event + * @param RequestedVersionCheckStatus $event */ - public function checkForUpdates(Login $event) + public function checkForUpdates(RequestedVersionCheckStatus $event) { // in Sandstorm, cannot check for updates: $sandstorm = 1 === intval(getenv('SANDSTORM')); @@ -45,9 +46,13 @@ class VersionCheckEventHandler } /** @var User $user */ - $user = $event->user; - $permission = Preferences::getForUser($user, 'permission_update_check', -1); - $lastCheckTime = Preferences::getForUser($user, 'last_update_check', time()); + $user = $event->user; + if (!$user->hasRole('owner')) { + return; + } + + $permission = FireflyConfig::get('permission_update_check', -1); + $lastCheckTime = FireflyConfig::get('last_update_check', time()); $now = time(); if ($now - $lastCheckTime->data < 604800) { Log::debug('Checked for updates less than a week ago.'); @@ -66,6 +71,8 @@ class VersionCheckEventHandler return; } + // actually check for update and inform the user. + } } \ No newline at end of file diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 8ef77b6326..421425a835 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -101,13 +101,12 @@ class AccountController extends Controller } /** - * @param Request $request * @param AccountRepositoryInterface $repository * @param Account $account * * @return View */ - public function delete(Request $request, AccountRepositoryInterface $repository, Account $account) + public function delete(AccountRepositoryInterface $repository, Account $account) { $typeName = config('firefly.shortNamesByFullName.' . $account->accountType->type); $subTitle = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]); diff --git a/app/Http/Controllers/Admin/UpdateController.php b/app/Http/Controllers/Admin/UpdateController.php index 28127c4530..f8208d659f 100644 --- a/app/Http/Controllers/Admin/UpdateController.php +++ b/app/Http/Controllers/Admin/UpdateController.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Admin; +use FireflyConfig; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Middleware\IsDemoUser; @@ -30,7 +31,6 @@ use FireflyIII\Services\Github\Object\Release; use FireflyIII\Services\Github\Request\UpdateRequest; use Illuminate\Http\Request; use Log; -use Preferences; use Response; use Session; @@ -67,7 +67,7 @@ class UpdateController extends Controller { $subTitle = trans('firefly.update_check_title'); $subTitleIcon = 'fa-star'; - $permission = app('preferences')->get('permission_update_check', -1); + $permission = app('fireflyconfig')->get('permission_update_check', -1); $selected = $permission->data; $options = [ '-1' => trans('firefly.updates_ask_me_later'), @@ -86,9 +86,9 @@ class UpdateController extends Controller public function post(Request $request) { $checkForUpdates = intval($request->get('check_for_updates')); - Preferences::set('permission_update_check', $checkForUpdates); + FireflyConfig::set('permission_update_check', $checkForUpdates); + FireflyConfig::set('last_update_check', time()); Session::flash('success', strval(trans('firefly.configuration_updated'))); - Preferences::mark(); return redirect(route('admin.update-check')); } @@ -99,17 +99,19 @@ class UpdateController extends Controller public function updateCheck() { $current = config('firefly.version'); - $request = new UpdateRequest(); + /** @var UpdateRequest $request */ + $request = app(UpdateRequest::class); $check = -2; + $first = new Release(['id' => '0', 'title' => '0', 'updated' => '2017-01-01', 'content' => '']); + $string = ''; try { $request->call(); $releases = $request->getReleases(); // first entry should be the latest entry: /** @var Release $first */ - $first = reset($releases); - $string = ''; - $check = version_compare($current, $first->getTitle()); - Preferences::set('last_update_check', time()); + $first = reset($releases); + $check = version_compare($current, $first->getTitle()); + FireflyConfig::set('last_update_check', time()); } catch (FireflyException $e) { Log::error(sprintf('Could not check for updates: %s', $e->getMessage())); } @@ -119,7 +121,12 @@ class UpdateController extends Controller if ($check === -1) { // there is a new FF version! - $string = strval(trans('firefly.update_new_version_alert', ['your_version' => $current, 'new_version' => $first->getTitle()])); + $string = strval( + trans( + 'firefly.update_new_version_alert', + ['your_version' => $current, 'new_version' => $first->getTitle(), 'date' => $first->getUpdated()->formatLocalized($this->monthAndDayFormat)] + ) + ); } if ($check === 0) { // you are running the current version! diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 6407760e55..8937027dfd 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -59,12 +59,11 @@ class AttachmentController extends Controller } /** - * @param Request $request * @param Attachment $attachment * * @return View */ - public function delete(Request $request, Attachment $attachment) + public function delete(Attachment $attachment) { $subTitle = trans('firefly.delete_attachment', ['name' => $attachment->filename]); diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 46f24a243f..e6a4bfcc9b 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -64,7 +64,7 @@ class LoginController extends Controller * * @param Request $request * - * @return \Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response|void + * @return \Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response * * @throws \Illuminate\Validation\ValidationException */ @@ -102,7 +102,7 @@ class LoginController extends Controller * @param Request $request * @param CookieJar $cookieJar * - * @return $this + * @return $this|\Illuminate\Http\RedirectResponse */ public function logout(Request $request, CookieJar $cookieJar) { diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index e867c87b95..391749489a 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -91,12 +91,11 @@ class BillController extends Controller } /** - * @param Request $request - * @param Bill $bill + * @param Bill $bill * * @return View */ - public function delete(Request $request, Bill $bill) + public function delete(Bill $bill) { // put previous url in session $this->rememberPreviousUri('bills.delete.uri'); @@ -194,7 +193,7 @@ class BillController extends Controller } ); // paginate bills - $bills= new LengthAwarePaginator($collection, $total, $pageSize, $page); + $bills = new LengthAwarePaginator($collection, $total, $pageSize, $page); $bills->setPath(route('bills.index')); return view('bills.index', compact('bills')); diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 50c21f95d3..cf5a41bc6f 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -118,12 +118,11 @@ class BudgetController extends Controller } /** - * @param Request $request - * @param Budget $budget + * @param Budget $budget * * @return View */ - public function delete(Request $request, Budget $budget) + public function delete(Budget $budget) { $subTitle = trans('firefly.delete_budget', ['name' => $budget->name]); diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 61f1c9980f..0e3013f88a 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -80,12 +80,11 @@ class CategoryController extends Controller } /** - * @param Request $request * @param Category $category * * @return View */ - public function delete(Request $request, Category $category) + public function delete(Category $category) { $subTitle = trans('firefly.delete_category', ['name' => $category->name]); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index b077674fa4..32c2c63a24 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -25,6 +25,8 @@ namespace FireflyIII\Http\Controllers; use Artisan; use Carbon\Carbon; use DB; +use Exception; +use FireflyIII\Events\RequestedVersionCheckStatus; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Middleware\IsDemoUser; @@ -38,7 +40,6 @@ use Illuminate\Support\Collection; use Log; use Monolog\Handler\RotatingFileHandler; use Preferences; -use ReflectionException; use Response; use Route as RouteFacade; use View; @@ -185,7 +186,7 @@ class HomeController extends Controller Log::debug('Call twig:clean...'); try { Artisan::call('twig:clean'); - } catch (ReflectionException $e) { + } catch (Exception $e) { // dont care } Log::debug('Call view:clear...'); @@ -234,6 +235,9 @@ class HomeController extends Controller $transactions[] = [$set, $account]; } + // fire check update event: + event(new RequestedVersionCheckStatus(auth()->user())); + return view( 'index', compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount', 'start', 'end', 'today') diff --git a/app/Http/Controllers/Import/PrerequisitesController.php b/app/Http/Controllers/Import/PrerequisitesController.php index 9d0755fdbc..42a7b3d243 100644 --- a/app/Http/Controllers/Import/PrerequisitesController.php +++ b/app/Http/Controllers/Import/PrerequisitesController.php @@ -60,7 +60,7 @@ class PrerequisitesController extends Controller * * @param string $bank * - * @return \Illuminate\Http\RedirectResponse|null + * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse * * @throws FireflyException */ diff --git a/app/Http/Controllers/Import/StatusController.php b/app/Http/Controllers/Import/StatusController.php index 267ba7f5e4..fd54229a95 100644 --- a/app/Http/Controllers/Import/StatusController.php +++ b/app/Http/Controllers/Import/StatusController.php @@ -108,8 +108,6 @@ class StatusController extends Controller $result['running'] = true; } - // TODO cannot handle 'error' - return Response::json($result); } } diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php index 3381500649..6e28443d54 100644 --- a/app/Http/Controllers/Json/AutoCompleteController.php +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -29,7 +29,6 @@ use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Support\CacheProperties; -use Log; use Response; /** diff --git a/app/Http/Controllers/Json/IntroController.php b/app/Http/Controllers/Json/IntroController.php index 986a3b103e..ace783ae57 100644 --- a/app/Http/Controllers/Json/IntroController.php +++ b/app/Http/Controllers/Json/IntroController.php @@ -46,6 +46,7 @@ class IntroController $specificSteps = $this->getSpecificSteps($route, $specificPage); if (0 === count($specificSteps)) { Log::debug(sprintf('No specific steps for route "%s" and page "%s"', $route, $specificPage)); + return Response::json($steps); } if ($this->hasOutroStep($route)) { diff --git a/app/Http/Controllers/Popup/ReportController.php b/app/Http/Controllers/Popup/ReportController.php index 0a27cdb2f2..b7d3fc7654 100644 --- a/app/Http/Controllers/Popup/ReportController.php +++ b/app/Http/Controllers/Popup/ReportController.php @@ -238,7 +238,7 @@ class ReportController extends Controller private function parseAttributes(array $attributes): array { $attributes['location'] = $attributes['location'] ?? ''; - $attributes['accounts'] = AccountList::routeBinder($attributes['accounts'] ?? '', new Route('get','',[])); + $attributes['accounts'] = AccountList::routeBinder($attributes['accounts'] ?? '', new Route('get', '', [])); try { $attributes['startDate'] = Carbon::createFromFormat('Ymd', $attributes['startDate']); } catch (InvalidArgumentException $e) { diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 608cb1e6c4..75e3a70a50 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -26,8 +26,8 @@ use FireflyIII\Http\Requests\TokenFormRequest; use FireflyIII\Models\AccountType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface; -use Illuminate\Http\Request; use Google2FA; +use Illuminate\Http\Request; use Preferences; use Session; use View; diff --git a/app/Http/Controllers/Report/ExpenseController.php b/app/Http/Controllers/Report/ExpenseController.php index eea0e638b6..90dc90a2ea 100644 --- a/app/Http/Controllers/Report/ExpenseController.php +++ b/app/Http/Controllers/Report/ExpenseController.php @@ -231,7 +231,7 @@ class ExpenseController extends Controller $cache->addProperty($accounts->pluck('id')->toArray()); $cache->addProperty($expense->pluck('id')->toArray()); if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } $combined = $this->combineAccounts($expense); $all = new Collection; diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index ae111b3827..d93e431df7 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -59,12 +59,10 @@ class SplitController extends Controller /** @var CurrencyRepositoryInterface */ private $currencies; - - /** @var JournalTaskerInterface */ - private $tasker; - /** @var JournalRepositoryInterface */ private $repository; + /** @var JournalTaskerInterface */ + private $tasker; /** * @@ -81,7 +79,7 @@ class SplitController extends Controller $this->tasker = app(JournalTaskerInterface::class); $this->attachments = app(AttachmentHelperInterface::class); $this->currencies = app(CurrencyRepositoryInterface::class); - $this->repository = app(JournalRepositoryInterface::class); + $this->repository = app(JournalRepositoryInterface::class); app('view')->share('mainTitleIcon', 'fa-share-alt'); app('view')->share('title', trans('firefly.split-transactions')); @@ -145,8 +143,8 @@ class SplitController extends Controller } /** - * @param SplitJournalFormRequest $request - * @param TransactionJournal $journal + * @param SplitJournalFormRequest $request + * @param TransactionJournal $journal * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ diff --git a/app/Import/Configuration/SpectreConfigurator.php b/app/Import/Configuration/SpectreConfigurator.php index a2875487a5..125d7e2bd5 100644 --- a/app/Import/Configuration/SpectreConfigurator.php +++ b/app/Import/Configuration/SpectreConfigurator.php @@ -22,13 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Import\Configuration; -use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\ImportJob; -use FireflyIII\Support\Import\Configuration\ConfigurationInterface; -use FireflyIII\Support\Import\Configuration\Spectre\InputMandatory; -use FireflyIII\Support\Import\Configuration\Spectre\SelectCountry; -use FireflyIII\Support\Import\Configuration\Spectre\SelectProvider; -use Log; /** * Class SpectreConfigurator. @@ -54,58 +48,35 @@ class SpectreConfigurator implements ConfiguratorInterface * @param array $data * * @return bool - * - * @throws FireflyException */ public function configureJob(array $data): bool { - $class = $this->getConfigurationClass(); - $job = $this->job; - /** @var ConfigurationInterface $object */ - $object = new $class($this->job); - $object->setJob($job); - $result = $object->storeConfiguration($data); - $this->warning = $object->getWarningMessage(); - - return $result; + die('cannot store config'); } /** * Return the data required for the next step in the job configuration. * * @return array - * - * @throws FireflyException */ public function getNextData(): array { - $class = $this->getConfigurationClass(); - $job = $this->job; - /** @var ConfigurationInterface $object */ - $object = app($class); - $object->setJob($job); + // update config to tell Firefly we've redirected the user. + $config = $this->job->configuration; + $config['is-redirected'] = true; + $this->job->configuration = $config; + $this->job->status = 'configured'; + $this->job->save(); - return $object->getData(); + return $this->job->configuration; } /** * @return string - * - * @throws FireflyException */ public function getNextView(): string { - if (!$this->job->configuration['selected-country']) { - return 'import.spectre.select-country'; - } - if (!$this->job->configuration['selected-provider']) { - return 'import.spectre.select-provider'; - } - if (!$this->job->configuration['has-input-mandatory']) { - return 'import.spectre.input-fields'; - } - - throw new FireflyException('No view for state'); + return 'import.spectre.redirect'; } /** @@ -123,16 +94,9 @@ class SpectreConfigurator implements ConfiguratorInterface */ public function isJobConfigured(): bool { - $config = $this->job->configuration; - $config['selected-country'] = $config['selected-country'] ?? false; - $config['selected-provider'] = $config['selected-provider'] ?? false; - $config['has-input-mandatory'] = $config['has-input-mandatory'] ?? false; - $config['has-input-interactive'] = $config['has-input-interactive'] ?? true; // defaults to true. - $this->job->configuration = $config; - $this->job->save(); - - if ($config['selected-country'] && $config['selected-provider'] && $config['has-input-mandatory'] && $config['has-input-interactive']) { - // give job another status + // job is configured (and can start) when token is empty: + $config = $this->job->configuration; + if ($config['has-token'] === false) { return true; } @@ -144,45 +108,19 @@ class SpectreConfigurator implements ConfiguratorInterface */ public function setJob(ImportJob $job) { + $defaultConfig = [ + 'has-token' => false, + 'token' => '', + 'token-expires' => 0, + 'token-url' => '', + 'is-redirected' => false, + + ]; + + $config = $job->configuration; + $finalConfig = array_merge($defaultConfig, $config); + $job->configuration = $finalConfig; + $job->save(); $this->job = $job; - if (null === $this->job->configuration || 0 === count($this->job->configuration)) { - Log::debug(sprintf('Gave import job %s initial configuration.', $this->job->key)); - $this->job->configuration = [ - 'selected-country' => false, - ]; - $this->job->save(); - } - } - - /** - * @return string - * - * @throws FireflyException - */ - private function getConfigurationClass(): string - { - $class = false; - switch (true) { - case !$this->job->configuration['selected-country']: - $class = SelectCountry::class; - break; - case !$this->job->configuration['selected-provider']: - $class = SelectProvider::class; - break; - case !$this->job->configuration['has-input-mandatory']: - $class = InputMandatory::class; - // no break - default: - break; - } - - if (false === $class || 0 === strlen($class)) { - throw new FireflyException('Cannot handle current job state in getConfigurationClass().'); - } - if (!class_exists($class)) { - throw new FireflyException(sprintf('Class %s does not exist in getConfigurationClass().', $class)); - } - - return $class; } } diff --git a/app/Import/FileProcessor/CsvProcessor.php b/app/Import/FileProcessor/CsvProcessor.php index 1608c4e7bf..1ad9d6b973 100644 --- a/app/Import/FileProcessor/CsvProcessor.php +++ b/app/Import/FileProcessor/CsvProcessor.php @@ -72,6 +72,7 @@ class CsvProcessor implements FileProcessorInterface * @return bool * * @throws \League\Csv\Exception + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ public function run(): bool { diff --git a/app/Import/Object/ImportAccount.php b/app/Import/Object/ImportAccount.php index b122aee8c0..ba9330e8f3 100644 --- a/app/Import/Object/ImportAccount.php +++ b/app/Import/Object/ImportAccount.php @@ -359,7 +359,7 @@ class ImportAccount 'name' => $this->accountName['value'] ?? '(no name)', 'iban' => $this->accountIban['value'] ?? null, 'active' => true, - 'virtualBalance' => null, + 'virtualBalance' => '0', ]; $this->account = $this->repository->store($data); diff --git a/app/Import/Object/ImportJournal.php b/app/Import/Object/ImportJournal.php index b7f8e3ca89..a903ffe7e1 100644 --- a/app/Import/Object/ImportJournal.php +++ b/app/Import/Object/ImportJournal.php @@ -330,6 +330,7 @@ class ImportJournal */ private function selectAmountInput() { + $info = []; $converterClass = ''; if (!is_null($this->amount)) { Log::debug('Amount value is not NULL, assume this is the correct value.'); diff --git a/app/Import/Prerequisites/SpectrePrerequisites.php b/app/Import/Prerequisites/SpectrePrerequisites.php index f9a1102def..e59e102ecc 100644 --- a/app/Import/Prerequisites/SpectrePrerequisites.php +++ b/app/Import/Prerequisites/SpectrePrerequisites.php @@ -22,7 +22,6 @@ declare(strict_types=1); namespace FireflyIII\Import\Prerequisites; -use FireflyIII\Jobs\GetSpectreProviders; use FireflyIII\Models\Preference; use FireflyIII\User; use Illuminate\Http\Request; @@ -86,10 +85,6 @@ class SpectrePrerequisites implements PrerequisitesInterface } Log::debug('All prerequisites are here!'); - // at this point, check if all providers are present. Providers are shared amongst - // users in a multi-user environment. - GetSpectreProviders::dispatch($this->user); - return false; } diff --git a/app/Import/Routine/SpectreRoutine.php b/app/Import/Routine/SpectreRoutine.php index fd9f0c6e03..fbd12ae9c7 100644 --- a/app/Import/Routine/SpectreRoutine.php +++ b/app/Import/Routine/SpectreRoutine.php @@ -22,11 +22,11 @@ declare(strict_types=1); namespace FireflyIII\Import\Routine; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\ImportJob; -use FireflyIII\Models\SpectreProvider; use FireflyIII\Services\Spectre\Object\Customer; -use FireflyIII\Services\Spectre\Request\CreateLoginRequest; -use FireflyIII\Services\Spectre\Request\ListLoginsRequest; +use FireflyIII\Services\Spectre\Object\Token; +use FireflyIII\Services\Spectre\Request\CreateTokenRequest; use FireflyIII\Services\Spectre\Request\NewCustomerRequest; use Illuminate\Support\Collection; use Log; @@ -90,31 +90,48 @@ class SpectreRoutine implements RoutineInterface return false; } - set_time_limit(0); Log::info(sprintf('Start with import job %s using Spectre.', $this->job->key)); - // create customer if user does not have one: - $customer = $this->getCustomer(); + set_time_limit(0); - // list all logins present at Spectre - $logins = $this->listLogins($customer); + // check if job has token first! + $config = $this->job->configuration; + $hasToken = $config['has-token'] ?? false; + if ($hasToken === false) { + Log::debug('Job has no token'); + // create customer if user does not have one: + $customer = $this->getCustomer(); + Log::debug(sprintf('Customer ID is %s', $customer->getId())); + // use customer to request a token: + $uri = route('import.status', [$this->job->key]); + $token = $this->getToken($customer, $uri); + Log::debug(sprintf('Token is %s', $token->getToken())); - // use latest (depending on status, and if login exists for selected country + provider) - $country = $this->job->configuration['country']; - $providerId = $this->job->configuration['provider']; - $login = $this->filterLogins($logins, $country, $providerId); + // update job, give it the token: + $config = $this->job->configuration; + $config['has-token'] = true; + $config['token'] = $token->getToken(); + $config['token-expires'] = $token->getExpiresAt()->format('U'); + $config['token-url'] = $token->getConnectUrl(); + $this->job->configuration = $config; - // create new login if list is empty or no login exists. - if (is_null($login)) { - $login = $this->createLogin($customer); - var_dump($login); - exit; + Log::debug('Job config is now', $config); + + // update job, set status to "configuring". + $this->job->status = 'configuring'; + $this->job->save(); + Log::debug(sprintf('Job status is now %s', $this->job->status)); + + return true; + } + $isRedirected = $config['is-redirected'] ?? false; + if ($isRedirected === true) { + // assume user has "used" the token. + // ... + // now what? + throw new FireflyException('Application cannot handle this.'); } - echo '
';
-        print_r($logins);
-        exit;
-
-        return true;
+        throw new FireflyException('Application cannot handle this.');
     }
 
     /**
@@ -135,49 +152,12 @@ class SpectreRoutine implements RoutineInterface
         $newCustomerRequest->call();
         $customer = $newCustomerRequest->getCustomer();
 
-        // store customer. Not sure where. User preference? TODO
+        Preferences::setForUser($this->job->user, 'spectre_customer', $customer->toArray());
+
         return $customer;
 
     }
 
-    /**
-     * @param Customer $customer
-     */
-    protected function createLogin(Customer $customer)
-    {
-
-        $providerId = intval($this->job->configuration['provider']);
-        $provider   = $this->findProvider($providerId);
-
-
-        $createLoginRequest = new CreateLoginRequest($this->job->user);
-        $createLoginRequest->setCustomer($customer);
-        $createLoginRequest->setProvider($provider);
-        $createLoginRequest->setMandatoryFields($this->decrypt($this->job->configuration['mandatory-fields']));
-        $createLoginRequest->call();
-        echo '123';
-        // country code, provider code (find by spectre ID)
-        // credentials
-        // daily_refresh=true
-        // fetch_type=recent
-        // include_fake_providers=true
-        // store_credentials=true
-
-
-        var_dump($this->job->configuration);
-        exit;
-    }
-
-    /**
-     * @param int $providerId
-     *
-     * @return SpectreProvider|null
-     */
-    protected function findProvider(int $providerId): ?SpectreProvider
-    {
-        return SpectreProvider::where('spectre_id', $providerId)->first();
-    }
-
     /**
      * @return Customer
      * @throws \FireflyIII\Exceptions\FireflyException
@@ -188,61 +168,27 @@ class SpectreRoutine implements RoutineInterface
         if (is_null($preference)) {
             return $this->createCustomer();
         }
-        var_dump($preference->data);
-        exit;
+        $customer = new Customer($preference->data);
+
+        return $customer;
     }
 
     /**
      * @param Customer $customer
+     * @param string   $returnUri
      *
-     * @return array
+     * @return Token
      * @throws \FireflyIII\Exceptions\FireflyException
      */
-    protected function listLogins(Customer $customer): array
+    protected function getToken(Customer $customer, string $returnUri): Token
     {
-        $listLoginRequest = new ListLoginsRequest($this->job->user);
-        $listLoginRequest->setCustomer($customer);
-        $listLoginRequest->call();
+        $request = new CreateTokenRequest($this->job->user);
+        $request->setUri($returnUri);
+        $request->setCustomer($customer);
+        $request->call();
+        Log::debug('Call to get token is finished');
 
-        $logins = $listLoginRequest->getLogins();
+        return $request->getToken();
 
-        return $logins;
-    }
-
-    /**
-     * @param array $configuration
-     *
-     * @return array
-     */
-    private function decrypt(array $configuration): array
-    {
-        $new = [];
-        foreach ($configuration as $key => $value) {
-            $new[$key] = app('steam')->tryDecrypt($value);
-        }
-
-        return $new;
-    }
-
-    /**
-     * Return login belonging to country and provider
-     * TODO must return Login object, not array
-     *
-     * @param array  $logins
-     * @param string $country
-     * @param int    $providerId
-     *
-     * @return array|null
-     */
-    private function filterLogins(array $logins, string $country, int $providerId): ?array
-    {
-        if (count($logins) === 0) {
-            return null;
-        }
-        foreach ($logins as $login) {
-            die('do some filter');
-        }
-
-        return null;
     }
 }
diff --git a/app/Import/Storage/ImportStorage.php b/app/Import/Storage/ImportStorage.php
index 4b0823fbba..f548ae0068 100644
--- a/app/Import/Storage/ImportStorage.php
+++ b/app/Import/Storage/ImportStorage.php
@@ -236,7 +236,6 @@ class ImportStorage
 
         // match bills if config calls for it.
         if (true === $this->matchBills) {
-            //$this->/applyRules($journal);
             Log::info('Cannot match bills (yet).');
             $this->matchBills($journal);
         }
diff --git a/app/Jobs/GetSpectreProviders.php b/app/Jobs/GetSpectreProviders.php
deleted file mode 100644
index d29da378fd..0000000000
--- a/app/Jobs/GetSpectreProviders.php
+++ /dev/null
@@ -1,109 +0,0 @@
-.
- */
-
-namespace FireflyIII\Jobs;
-
-use FireflyIII\Models\Configuration;
-use FireflyIII\Models\SpectreProvider;
-use FireflyIII\Services\Spectre\Request\ListProvidersRequest;
-use FireflyIII\User;
-use Illuminate\Bus\Queueable;
-use Illuminate\Contracts\Queue\ShouldQueue;
-use Illuminate\Foundation\Bus\Dispatchable;
-use Illuminate\Queue\InteractsWithQueue;
-use Illuminate\Queue\SerializesModels;
-use Log;
-
-/**
- * Class GetSpectreProviders
- */
-class GetSpectreProviders implements ShouldQueue
-{
-    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
-
-    /**
-     * @var User
-     */
-    protected $user;
-
-    /**
-     * Create a new job instance.
-     *
-     * @param User $user
-     */
-    public function __construct(User $user)
-    {
-        $this->user = $user;
-        Log::debug('Constructed job GetSpectreProviders');
-    }
-
-    /**
-     * Execute the job.
-     *
-     * @throws \Illuminate\Container\EntryNotFoundException
-     * @throws \Exception
-     */
-    public function handle()
-    {
-        /** @var Configuration $configValue */
-        $configValue = app('fireflyconfig')->get('spectre_provider_download', 0);
-        $now         = time();
-        if ($now - intval($configValue->data) < 86400) {
-            Log::debug(sprintf('Difference is %d, so will NOT execute job.', ($now - intval($configValue->data))));
-
-            return;
-        }
-        Log::debug(sprintf('Difference is %d, so will execute job.', ($now - intval($configValue->data))));
-
-        // get user
-
-        // fire away!
-        $request = new ListProvidersRequest($this->user);
-        $request->call();
-
-        // store all providers:
-        $providers = $request->getProviders();
-        foreach ($providers as $provider) {
-            // find provider?
-            $dbProvider = SpectreProvider::where('spectre_id', $provider['id'])->first();
-            if (is_null($dbProvider)) {
-                $dbProvider = new SpectreProvider;
-            }
-            // update fields:
-            $dbProvider->spectre_id      = $provider['id'];
-            $dbProvider->code            = $provider['code'];
-            $dbProvider->mode            = $provider['mode'];
-            $dbProvider->status          = $provider['status'];
-            $dbProvider->interactive     = 1 === $provider['interactive'];
-            $dbProvider->automatic_fetch = 1 === $provider['automatic_fetch'];
-            $dbProvider->country_code    = $provider['country_code'];
-            $dbProvider->data            = $provider;
-            $dbProvider->save();
-            Log::debug(sprintf('Stored provider #%d under ID #%d', $provider['id'], $dbProvider->id));
-        }
-
-        app('fireflyconfig')->set('spectre_provider_download', time());
-
-        return;
-    }
-}
diff --git a/app/Models/Account.php b/app/Models/Account.php
index c4e523a886..11a1061320 100644
--- a/app/Models/Account.php
+++ b/app/Models/Account.php
@@ -189,6 +189,7 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $fieldName
      *
      * @return string
@@ -206,6 +207,7 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -299,6 +301,7 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param array           $types
      */
@@ -313,6 +316,7 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param string          $name
      * @param string          $value
@@ -331,7 +335,9 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
+     *
      * @codeCoverageIgnore
      */
     public function setIbanAttribute($value)
@@ -341,6 +347,7 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setNameAttribute($value)
@@ -352,7 +359,9 @@ class Account extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
+     *
      * @codeCoverageIgnore
      */
     public function setVirtualBalanceAttribute($value)
diff --git a/app/Models/AccountMeta.php b/app/Models/AccountMeta.php
index f70953f3be..c98e4780da 100644
--- a/app/Models/AccountMeta.php
+++ b/app/Models/AccountMeta.php
@@ -69,6 +69,7 @@ class AccountMeta extends Model
 
     /**
      * @param $value
+     *
      * @codeCoverageIgnore
      */
     public function setDataAttribute($value)
diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php
index 957996968e..f78478dde8 100644
--- a/app/Models/Attachment.php
+++ b/app/Models/Attachment.php
@@ -70,6 +70,7 @@ class Attachment extends Model
 
     /**
      * Get all of the owning attachable models.
+     *
      * @codeCoverageIgnore
      *
      * @return MorphTo
@@ -81,7 +82,8 @@ class Attachment extends Model
 
     /**
      * Returns the expected filename for this attachment.
-     *@codeCoverageIgnore
+     *
+     * @codeCoverageIgnore
      * @return string
      */
     public function fileName(): string
@@ -91,7 +93,8 @@ class Attachment extends Model
 
     /**
      * @param $value
-     *@codeCoverageIgnore
+     *
+     * @codeCoverageIgnore
      * @return null|string
      */
     public function getDescriptionAttribute($value)
@@ -105,7 +108,8 @@ class Attachment extends Model
 
     /**
      * @param $value
-     *@codeCoverageIgnore
+     *
+     * @codeCoverageIgnore
      * @return null|string
      */
     public function getFilenameAttribute($value)
@@ -119,7 +123,8 @@ class Attachment extends Model
 
     /**
      * @param $value
-     *@codeCoverageIgnore
+     *
+     * @codeCoverageIgnore
      * @return null|string
      */
     public function getMimeAttribute($value)
@@ -133,7 +138,8 @@ class Attachment extends Model
 
     /**
      * @param $value
-     *@codeCoverageIgnore
+     *
+     * @codeCoverageIgnore
      * @return null|string
      */
     public function getNotesAttribute($value)
@@ -147,7 +153,8 @@ class Attachment extends Model
 
     /**
      * @param $value
-     *@codeCoverageIgnore
+     *
+     * @codeCoverageIgnore
      * @return null|string
      */
     public function getTitleAttribute($value)
@@ -161,6 +168,7 @@ class Attachment extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $value
      */
     public function setDescriptionAttribute(string $value)
@@ -170,6 +178,7 @@ class Attachment extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $value
      */
     public function setFilenameAttribute(string $value)
@@ -179,6 +188,7 @@ class Attachment extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $value
      */
     public function setMimeAttribute(string $value)
@@ -188,6 +198,7 @@ class Attachment extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $value
      */
     public function setNotesAttribute(string $value)
@@ -197,6 +208,7 @@ class Attachment extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $value
      */
     public function setTitleAttribute(string $value)
diff --git a/app/Models/Bill.php b/app/Models/Bill.php
index 68121c947c..b7dcb125cd 100644
--- a/app/Models/Bill.php
+++ b/app/Models/Bill.php
@@ -96,6 +96,7 @@ class Bill extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -111,6 +112,7 @@ class Bill extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -135,6 +137,7 @@ class Bill extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setAmountMaxAttribute($value)
@@ -144,6 +147,7 @@ class Bill extends Model
 
     /**
      * @param $value
+     *
      * @codeCoverageIgnore
      */
     public function setAmountMinAttribute($value)
@@ -153,6 +157,7 @@ class Bill extends Model
 
     /**
      * @param $value
+     *
      * @codeCoverageIgnore
      */
     public function setMatchAttribute($value)
@@ -164,6 +169,7 @@ class Bill extends Model
 
     /**
      * @param $value
+     *
      * @codeCoverageIgnore
      */
     public function setNameAttribute($value)
diff --git a/app/Models/Budget.php b/app/Models/Budget.php
index a47b9e9176..ba013701ea 100644
--- a/app/Models/Budget.php
+++ b/app/Models/Budget.php
@@ -84,7 +84,7 @@ class Budget extends Model
     }
 
     /**
-     * @param Budget $value
+     * @param string $value
      *
      * @return Budget
      */
@@ -111,6 +111,7 @@ class Budget extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -126,6 +127,7 @@ class Budget extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setNameAttribute($value)
diff --git a/app/Models/BudgetLimit.php b/app/Models/BudgetLimit.php
index 6d5ebad901..ddab3dfab0 100644
--- a/app/Models/BudgetLimit.php
+++ b/app/Models/BudgetLimit.php
@@ -77,6 +77,7 @@ class BudgetLimit extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setAmountAttribute($value)
diff --git a/app/Models/Category.php b/app/Models/Category.php
index c5b3b741ae..38f6e3712d 100644
--- a/app/Models/Category.php
+++ b/app/Models/Category.php
@@ -83,7 +83,7 @@ class Category extends Model
     }
 
     /**
-     * @param Category $value
+     * @param string $value
      *
      * @return Category
      */
@@ -101,6 +101,7 @@ class Category extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -116,6 +117,7 @@ class Category extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setNameAttribute($value)
diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php
index bf36775c52..6a2b97c9bf 100644
--- a/app/Models/Configuration.php
+++ b/app/Models/Configuration.php
@@ -49,6 +49,7 @@ class Configuration extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return mixed
@@ -60,6 +61,7 @@ class Configuration extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setDataAttribute($value)
diff --git a/app/Models/ExportJob.php b/app/Models/ExportJob.php
index 65bcd1820b..1c019919e6 100644
--- a/app/Models/ExportJob.php
+++ b/app/Models/ExportJob.php
@@ -61,6 +61,7 @@ class ExportJob extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $status
      */
     public function change($status)
diff --git a/app/Models/ImportJob.php b/app/Models/ImportJob.php
index b9256ea25a..57015f946b 100644
--- a/app/Models/ImportJob.php
+++ b/app/Models/ImportJob.php
@@ -127,6 +127,7 @@ class ImportJob extends Model
     public function change(string $status): void
     {
         if (in_array($status, $this->validStatus)) {
+            Log::debug(sprintf('Job status set (in model) to "%s"', $status));
             $this->status = $status;
             $this->save();
 
@@ -169,6 +170,7 @@ class ImportJob extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setConfigurationAttribute($value)
@@ -178,6 +180,7 @@ class ImportJob extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setExtendedStatusAttribute($value)
diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php
index c4bf040c6c..51904e9f9d 100644
--- a/app/Models/PiggyBank.php
+++ b/app/Models/PiggyBank.php
@@ -69,9 +69,9 @@ class PiggyBank extends Model
     {
         if (auth()->check()) {
             $piggyBankId = intval($value);
-            $piggyBank   = PiggyBank::where('piggy_banks.id', $piggyBankId)
-                                    ->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')
-                                    ->where('accounts.user_id', auth()->user()->id)->first(['piggy_banks.*']);
+            $piggyBank   = self::where('piggy_banks.id', $piggyBankId)
+                               ->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')
+                               ->where('accounts.user_id', auth()->user()->id)->first(['piggy_banks.*']);
             if (!is_null($piggyBank)) {
                 return $piggyBank;
             }
@@ -111,6 +111,7 @@ class PiggyBank extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -196,6 +197,7 @@ class PiggyBank extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setNameAttribute($value)
@@ -207,6 +209,7 @@ class PiggyBank extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setTargetamountAttribute($value)
diff --git a/app/Models/PiggyBankEvent.php b/app/Models/PiggyBankEvent.php
index 683f2b7b9e..4bd7753aa9 100644
--- a/app/Models/PiggyBankEvent.php
+++ b/app/Models/PiggyBankEvent.php
@@ -62,6 +62,7 @@ class PiggyBankEvent extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setAmountAttribute($value)
diff --git a/app/Models/PiggyBankRepetition.php b/app/Models/PiggyBankRepetition.php
index 77e09eadbc..af65867865 100644
--- a/app/Models/PiggyBankRepetition.php
+++ b/app/Models/PiggyBankRepetition.php
@@ -60,6 +60,7 @@ class PiggyBankRepetition extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param Carbon          $start
      * @param Carbon          $target
@@ -73,6 +74,7 @@ class PiggyBankRepetition extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param Carbon          $date
      *
@@ -96,6 +98,7 @@ class PiggyBankRepetition extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setCurrentamountAttribute($value)
diff --git a/app/Models/Preference.php b/app/Models/Preference.php
index d85c3323ba..e59f68148d 100644
--- a/app/Models/Preference.php
+++ b/app/Models/Preference.php
@@ -80,6 +80,7 @@ class Preference extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setDataAttribute($value)
diff --git a/app/Models/SpectreProvider.php b/app/Models/SpectreProvider.php
deleted file mode 100644
index a1d056f93c..0000000000
--- a/app/Models/SpectreProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Models;
-
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * Class SpectreProvider
- */
-class SpectreProvider extends Model
-{
-    /**
-     * The attributes that should be casted to native types.
-     *
-     * @var array
-     */
-    protected $casts
-        = [
-            'spectre_id'      => 'int',
-            'created_at'      => 'datetime',
-            'updated_at'      => 'datetime',
-            'deleted_at'      => 'datetime',
-            'interactive'     => 'boolean',
-            'automatic_fetch' => 'boolean',
-            'data'            => 'array',
-        ];
-
-    /**
-     * @var array
-     */
-    protected $fillable = ['spectre_id', 'code', 'mode', 'name', 'status', 'interactive', 'automatic_fetch', 'country_code', 'data'];
-}
diff --git a/app/Models/Tag.php b/app/Models/Tag.php
index f7d6351642..5f70bee39e 100644
--- a/app/Models/Tag.php
+++ b/app/Models/Tag.php
@@ -123,6 +123,7 @@ class Tag extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -138,6 +139,7 @@ class Tag extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -171,6 +173,7 @@ class Tag extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setDescriptionAttribute($value)
@@ -180,6 +183,7 @@ class Tag extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setTagAttribute($value)
diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php
index 0378477c4b..35d388ad99 100644
--- a/app/Models/Transaction.php
+++ b/app/Models/Transaction.php
@@ -108,6 +108,7 @@ class Transaction extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param Builder $query
      * @param string  $table
      *
@@ -168,6 +169,7 @@ class Transaction extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return float|int
@@ -179,6 +181,7 @@ class Transaction extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param Builder $query
      * @param Carbon  $date
      */
@@ -192,6 +195,7 @@ class Transaction extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param Builder $query
      * @param Carbon  $date
      */
@@ -205,6 +209,7 @@ class Transaction extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param Builder $query
      * @param array   $types
      */
@@ -222,6 +227,7 @@ class Transaction extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setAmountAttribute($value)
diff --git a/app/Models/TransactionCurrency.php b/app/Models/TransactionCurrency.php
index beacb01102..708fc36217 100644
--- a/app/Models/TransactionCurrency.php
+++ b/app/Models/TransactionCurrency.php
@@ -59,7 +59,7 @@ class TransactionCurrency extends Model
     {
         if (auth()->check()) {
             $currencyId = intval($value);
-            $currency   = TransactionCurrency::find($currencyId);
+            $currency   = self::find($currencyId);
             if (!is_null($currency)) {
                 return $currency;
             }
diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php
index 4ba5ae9283..74fc1fd07a 100644
--- a/app/Models/TransactionJournal.php
+++ b/app/Models/TransactionJournal.php
@@ -141,6 +141,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $name
      *
      * @return bool
@@ -163,6 +164,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return string
@@ -214,6 +216,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param string $name
      *
      * @return bool
@@ -311,6 +314,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param Carbon          $date
      *
@@ -323,6 +327,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param Carbon          $date
      *
@@ -335,6 +340,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      */
     public function scopeSortCorrectly(EloquentBuilder $query)
@@ -346,6 +352,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param EloquentBuilder $query
      * @param array           $types
      */
@@ -361,6 +368,7 @@ class TransactionJournal extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setDescriptionAttribute($value)
diff --git a/app/Models/TransactionJournalLink.php b/app/Models/TransactionJournalLink.php
index f8f625d645..36ec286341 100644
--- a/app/Models/TransactionJournalLink.php
+++ b/app/Models/TransactionJournalLink.php
@@ -72,6 +72,7 @@ class TransactionJournalLink extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return null|string
@@ -96,6 +97,7 @@ class TransactionJournalLink extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setCommentAttribute($value): void
diff --git a/app/Models/TransactionJournalMeta.php b/app/Models/TransactionJournalMeta.php
index 827d3f7301..3e87d48d0b 100644
--- a/app/Models/TransactionJournalMeta.php
+++ b/app/Models/TransactionJournalMeta.php
@@ -50,6 +50,7 @@ class TransactionJournalMeta extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      *
      * @return mixed
@@ -61,6 +62,7 @@ class TransactionJournalMeta extends Model
 
     /**
      * @codeCoverageIgnore
+     *
      * @param $value
      */
     public function setDataAttribute($value)
diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index 3ad80238f7..9cd5f2d8d5 100644
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -23,6 +23,7 @@ declare(strict_types=1);
 namespace FireflyIII\Providers;
 
 use FireflyIII\Events\RegisteredUser;
+use FireflyIII\Events\RequestedVersionCheckStatus;
 use FireflyIII\Models\Account;
 use FireflyIII\Models\PiggyBank;
 use FireflyIII\Models\PiggyBankRepetition;
@@ -54,6 +55,9 @@ class EventServiceProvider extends ServiceProvider
             // is a User related event.
             Login::class                                  => [
                 'FireflyIII\Handlers\Events\UserEventHandler@checkSingleUserIsAdmin',
+
+            ],
+            RequestedVersionCheckStatus::class            => [
                 'FireflyIII\Handlers\Events\VersionCheckEventHandler@checkForUpdates',
             ],
 
diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php
index d7f9d48757..3c404fdf88 100644
--- a/app/Repositories/Account/AccountRepository.php
+++ b/app/Repositories/Account/AccountRepository.php
@@ -190,7 +190,7 @@ class AccountRepository implements AccountRepositoryInterface
         // update the account:
         $account->name            = $data['name'];
         $account->active          = $data['active'];
-        $account->virtual_balance = $data['virtualBalance'];
+        $account->virtual_balance = trim($data['virtualBalance']) === '' ? '0' : $data['virtualBalance'];
         $account->iban            = $data['iban'];
         $account->save();
 
@@ -424,7 +424,7 @@ class AccountRepository implements AccountRepositoryInterface
             'name'           => $name . ' initial balance',
             'active'         => false,
             'iban'           => '',
-            'virtualBalance' => 0,
+            'virtualBalance' => '0',
         ];
         Log::debug('Going to create an opening balance opposing account.');
 
diff --git a/app/Repositories/Account/FindAccountsTrait.php b/app/Repositories/Account/FindAccountsTrait.php
index 95f43af9d0..8214dd1157 100644
--- a/app/Repositories/Account/FindAccountsTrait.php
+++ b/app/Repositories/Account/FindAccountsTrait.php
@@ -252,7 +252,7 @@ trait FindAccountsTrait
             'accountType'    => 'reconcile',
             'name'           => $name,
             'iban'           => null,
-            'virtualBalance' => null,
+            'virtualBalance' => '0',
             'active'         => true,
         ];
         $account = $this->storeAccount($data);
diff --git a/app/Repositories/Journal/JournalRepositoryInterface.php b/app/Repositories/Journal/JournalRepositoryInterface.php
index a895e03833..1e765722c0 100644
--- a/app/Repositories/Journal/JournalRepositoryInterface.php
+++ b/app/Repositories/Journal/JournalRepositoryInterface.php
@@ -26,7 +26,6 @@ use FireflyIII\Models\Account;
 use FireflyIII\Models\Note;
 use FireflyIII\Models\Transaction;
 use FireflyIII\Models\TransactionJournal;
-use FireflyIII\Models\TransactionJournalLink;
 use FireflyIII\Models\TransactionType;
 use FireflyIII\User;
 use Illuminate\Support\Collection;
@@ -54,13 +53,6 @@ interface JournalRepositoryInterface
      */
     public function countTransactions(TransactionJournal $journal): int;
 
-    /**
-     * @param TransactionJournal $journal
-     *
-     * @return Note|null
-     */
-    public function getNote(TransactionJournal $journal): ?Note;
-
     /**
      * Deletes a journal.
      *
@@ -107,6 +99,13 @@ interface JournalRepositoryInterface
      */
     public function getAssetTransaction(TransactionJournal $journal): ?Transaction;
 
+    /**
+     * @param TransactionJournal $journal
+     *
+     * @return Note|null
+     */
+    public function getNote(TransactionJournal $journal): ?Note;
+
     /**
      * @return Collection
      */
diff --git a/app/Repositories/LinkType/LinkTypeRepositoryInterface.php b/app/Repositories/LinkType/LinkTypeRepositoryInterface.php
index a94ed251b2..19ae1c8846 100644
--- a/app/Repositories/LinkType/LinkTypeRepositoryInterface.php
+++ b/app/Repositories/LinkType/LinkTypeRepositoryInterface.php
@@ -95,7 +95,7 @@ interface LinkTypeRepositoryInterface
     /**
      * Store link between two journals.
      *
-     * @param array $information
+     * @param array              $information
      * @param TransactionJournal $left
      * @param TransactionJournal $right
      *
diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php
index 1588696677..f3a76efcd4 100644
--- a/app/Repositories/User/UserRepositoryInterface.php
+++ b/app/Repositories/User/UserRepositoryInterface.php
@@ -37,20 +37,6 @@ interface UserRepositoryInterface
      */
     public function all(): Collection;
 
-    /**
-     * Returns the first user in the DB. Generally only works when there is just one.
-     *
-     * @return null|User
-     */
-    public function first(): ?User;
-
-    /**
-     * @param array $data
-     *
-     * @return User
-     */
-    public function store(array $data): User;
-
     /**
      * Gives a user a role.
      *
@@ -119,6 +105,13 @@ interface UserRepositoryInterface
      */
     public function findByEmail(string $email): ?User;
 
+    /**
+     * Returns the first user in the DB. Generally only works when there is just one.
+     *
+     * @return null|User
+     */
+    public function first(): ?User;
+
     /**
      * Return basic user information.
      *
@@ -136,6 +129,13 @@ interface UserRepositoryInterface
      */
     public function hasRole(User $user, string $role): bool;
 
+    /**
+     * @param array $data
+     *
+     * @return User
+     */
+    public function store(array $data): User;
+
     /**
      * @param User $user
      */
diff --git a/app/Services/Spectre/Object/Customer.php b/app/Services/Spectre/Object/Customer.php
index 53d046a6d9..755dcfc38d 100644
--- a/app/Services/Spectre/Object/Customer.php
+++ b/app/Services/Spectre/Object/Customer.php
@@ -93,4 +93,16 @@ class Customer extends SpectreObject
     {
         $this->secret = $secret;
     }
+
+    /**
+     * @return array
+     */
+    public function toArray(): array
+    {
+        return [
+            'id'         => $this->id,
+            'identifier' => $this->identifier,
+            'secret'     => $this->secret,
+        ];
+    }
 }
diff --git a/app/Services/Spectre/Object/Token.php b/app/Services/Spectre/Object/Token.php
new file mode 100644
index 0000000000..d2e51d3c18
--- /dev/null
+++ b/app/Services/Spectre/Object/Token.php
@@ -0,0 +1,76 @@
+.
+ */
+
+declare(strict_types=1);
+
+namespace FireflyIII\Services\Spectre\Object;
+
+use Carbon\Carbon;
+
+/**
+ * Class Token
+ */
+class Token extends SpectreObject
+{
+    /** @var string */
+    private $connectUrl;
+    /** @var Carbon */
+    private $expiresAt;
+    /** @var string */
+    private $token;
+
+    /**
+     * Token constructor.
+     *
+     * @param array $data
+     */
+    public function __construct(array $data)
+    {
+        $this->token      = $data['token'];
+        $this->expiresAt  = new Carbon($data['expires_at']);
+        $this->connectUrl = $data['connect_url'];
+    }
+
+    /**
+     * @return string
+     */
+    public function getConnectUrl(): string
+    {
+        return $this->connectUrl;
+    }
+
+    /**
+     * @return Carbon
+     */
+    public function getExpiresAt(): Carbon
+    {
+        return $this->expiresAt;
+    }
+
+    /**
+     * @return string
+     */
+    public function getToken(): string
+    {
+        return $this->token;
+    }
+
+}
\ No newline at end of file
diff --git a/app/Services/Spectre/Request/CreateLoginRequest.php b/app/Services/Spectre/Request/CreateLoginRequest.php
deleted file mode 100644
index 1b0e3e6b79..0000000000
--- a/app/Services/Spectre/Request/CreateLoginRequest.php
+++ /dev/null
@@ -1,109 +0,0 @@
-.
- */
-
-declare(strict_types=1);
-
-namespace FireflyIII\Services\Spectre\Request;
-
-use FireflyIII\Exceptions\FireflyException;
-use FireflyIII\Models\SpectreProvider;
-use FireflyIII\Services\Spectre\Object\Customer;
-
-/**
- * Class CreateLoginRequest
- */
-class CreateLoginRequest extends SpectreRequest
-{
-    /** @var Customer */
-    private $customer;
-    /** @var array */
-    private $mandatoryFields = [];
-    /** @var SpectreProvider */
-    private $provider;
-
-    /**
-     *
-     * @throws FireflyException
-     */
-    public function call(): void
-    {
-        // add mandatory fields to login object
-        $data = [
-            'customer_id'            => $this->customer->getId(),
-            'country_code'           => $this->provider->country_code,
-            'provider_code'          => $this->provider->code,
-            'credentials'            => $this->buildCredentials(),
-            'daily_refresh'          => true,
-            'fetch_type'             => 'recent',
-            'include_fake_providers' => true,
-        ];
-        $uri  = '/api/v3/logins';
-        $response = $this->sendSignedSpectrePost($uri, $data);
-        echo '
';
-        print_r($response);
-        exit;
-    }
-
-    /**
-     * @param Customer $customer
-     */
-    public function setCustomer(Customer $customer): void
-    {
-        $this->customer = $customer;
-    }
-
-    /**
-     * @param array $mandatoryFields
-     */
-    public function setMandatoryFields(array $mandatoryFields): void
-    {
-        $this->mandatoryFields = $mandatoryFields;
-    }
-
-    /**
-     * @param SpectreProvider $provider
-     */
-    public function setProvider(SpectreProvider $provider): void
-    {
-        $this->provider = $provider;
-    }
-
-    /**
-     * @return array
-     * @throws FireflyException
-     */
-    private function buildCredentials(): array
-    {
-        $return = [];
-        /** @var array $requiredField */
-        foreach ($this->provider->data['required_fields'] as $requiredField) {
-            $fieldName = $requiredField['name'];
-            if (!isset($this->mandatoryFields[$fieldName])) {
-                throw new FireflyException(sprintf('Mandatory field "%s" is missing from job.', $fieldName));
-            }
-            $return[$fieldName] = $this->mandatoryFields[$fieldName];
-        }
-
-        return $return;
-    }
-
-
-}
\ No newline at end of file
diff --git a/app/Services/Spectre/Request/CreateTokenRequest.php b/app/Services/Spectre/Request/CreateTokenRequest.php
new file mode 100644
index 0000000000..adacab4ae8
--- /dev/null
+++ b/app/Services/Spectre/Request/CreateTokenRequest.php
@@ -0,0 +1,94 @@
+.
+ */
+
+declare(strict_types=1);
+
+namespace FireflyIII\Services\Spectre\Request;
+
+use FireflyIII\Services\Spectre\Object\Customer;
+use FireflyIII\Services\Spectre\Object\Token;
+
+
+/**
+ * Class CreateTokenRequest
+ */
+class CreateTokenRequest extends SpectreRequest
+{
+    /** @var Customer */
+    private $customer;
+
+    /** @var Token */
+    private $token;
+
+    /** @var string */
+    private $uri;
+
+    /**
+     *
+     * @throws \FireflyIII\Exceptions\FireflyException
+     */
+    public function call(): void
+    {
+        // add mandatory fields to login object
+        $data        = [
+            'data' => [
+                'customer_id'               => $this->customer->getId(),
+                'fetch_type'                => 'recent',
+                'daily_refresh'             => true,
+                'include_fake_providers'    => true,
+                'show_consent_confirmation' => true,
+                'credentials_strategy'      => 'ask',
+                'return_to'                 => $this->uri,
+            ],
+        ];
+        $uri         = '/api/v3/tokens/create';
+        $response    = $this->sendSignedSpectrePost($uri, $data);
+        $this->token = new Token($response['data']);
+
+        return;
+    }
+
+    /**
+     * @return Token
+     */
+    public function getToken(): Token
+    {
+        return $this->token;
+    }
+
+    /**
+     * @param Customer $customer
+     */
+    public function setCustomer(Customer $customer): void
+    {
+        $this->customer = $customer;
+    }
+
+    /**
+     * @param string $uri
+     */
+    public function setUri(string $uri): void
+    {
+        $this->uri = $uri;
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/Services/Spectre/Request/ListLoginsRequest.php b/app/Services/Spectre/Request/ListLoginsRequest.php
deleted file mode 100644
index d69af2a026..0000000000
--- a/app/Services/Spectre/Request/ListLoginsRequest.php
+++ /dev/null
@@ -1,101 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Services\Spectre\Request;
-
-use FireflyIII\Services\Spectre\Object\Customer;
-use Log;
-
-/**
- * Class ListLoginsRequest
- */
-class ListLoginsRequest extends SpectreRequest
-{
-    /** @var Customer */
-    protected $customer;
-
-    /** @var array */
-    protected $logins = [];
-
-    /**
-     *
-     * @throws \FireflyIII\Exceptions\FireflyException
-     */
-    public function call(): void
-    {
-        $hasNextPage = true;
-        $nextId      = 0;
-        while ($hasNextPage) {
-            Log::debug(sprintf('Now calling list-logins for next_id %d', $nextId));
-            $parameters = ['customer_id' => $this->customer->getId(), 'from_id' => $nextId];
-            $uri        = '/api/v3/logins?' . http_build_query($parameters);
-            $response   = $this->sendSignedSpectreGet($uri, []);
-
-            // count entries:
-            Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
-
-            // extract next ID
-            $hasNextPage = false;
-            if (isset($response['meta']['next_id']) && intval($response['meta']['next_id']) > $nextId) {
-                $hasNextPage = true;
-                $nextId      = $response['meta']['next_id'];
-                Log::debug(sprintf('Next ID is now %d.', $nextId));
-            } else {
-                Log::debug('No next page.');
-            }
-
-            // store providers:
-            foreach ($response['data'] as $loginArray) {
-                var_dump($loginArray);
-                exit;
-            }
-        }
-
-        return;
-    }
-
-    /**
-     * @return Customer
-     */
-    public function getCustomer(): Customer
-    {
-        return $this->customer;
-    }
-
-    /**
-     * @param Customer $customer
-     */
-    public function setCustomer(Customer $customer): void
-    {
-        $this->customer = $customer;
-    }
-
-    /**
-     * @return array
-     */
-    public function getLogins(): array
-    {
-        return $this->logins;
-    }
-
-
-}
diff --git a/app/Services/Spectre/Request/ListProvidersRequest.php b/app/Services/Spectre/Request/ListProvidersRequest.php
deleted file mode 100644
index 966023904c..0000000000
--- a/app/Services/Spectre/Request/ListProvidersRequest.php
+++ /dev/null
@@ -1,81 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Services\Spectre\Request;
-
-use Log;
-
-/**
- * Class ListProvidersRequest
- */
-class ListProvidersRequest extends SpectreRequest
-{
-    /**
-     * @var array
-     */
-    protected $providers = [];
-
-    /**
-     * @throws \Exception
-     */
-    public function call(): void
-    {
-        $hasNextPage = true;
-        $nextId      = 0;
-        while ($hasNextPage) {
-            Log::debug(sprintf('Now calling for next_id %d', $nextId));
-            $parameters = ['include_fake_providers' => 'true', 'include_provider_fields' => 'true', 'from_id' => $nextId];
-            $uri        = '/api/v3/providers?' . http_build_query($parameters);
-            $response   = $this->sendSignedSpectreGet($uri, []);
-
-            // count entries:
-            Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
-
-            // extract next ID
-            $hasNextPage = false;
-            if (isset($response['meta']['next_id']) && intval($response['meta']['next_id']) > $nextId) {
-                $hasNextPage = true;
-                $nextId      = $response['meta']['next_id'];
-                Log::debug(sprintf('Next ID is now %d.', $nextId));
-            } else {
-                Log::debug('No next page.');
-            }
-
-            // store providers:
-            foreach ($response['data'] as $providerArray) {
-                $providerId                   = $providerArray['id'];
-                $this->providers[$providerId] = $providerArray;
-                Log::debug(sprintf('Stored provider #%d', $providerId));
-            }
-        }
-
-        return;
-    }
-
-    /**
-     * @return array
-     */
-    public function getProviders(): array
-    {
-        return $this->providers;
-    }
-}
diff --git a/app/Services/Spectre/Request/NewCustomerRequest.php b/app/Services/Spectre/Request/NewCustomerRequest.php
index ff36919d70..0c6960be90 100644
--- a/app/Services/Spectre/Request/NewCustomerRequest.php
+++ b/app/Services/Spectre/Request/NewCustomerRequest.php
@@ -37,19 +37,13 @@ class NewCustomerRequest extends SpectreRequest
      */
     public function call(): void
     {
-        $data = [
+        $data     = [
             'data' => [
                 'identifier' => 'default_ff3_customer',
             ],
         ];
-        $uri  = '/api/v3/customers/';
-        //$response = $this->sendSignedSpectrePost($uri, $data);
-        $response = ['data' => [
-            'id'         => 527858,
-            'identifier' => 'default_ff3_customer',
-            'secret'     => 'qpZjRPJRTb6mMcQgwDkssZ3fQVVDPIH04zBlkKC6MvI',
-        ],
-        ];
+        $uri      = '/api/v3/customers/';
+        $response = $this->sendSignedSpectrePost($uri, $data);
         // create customer:
         $this->customer = new Customer($response['data']);
 
diff --git a/app/Services/Spectre/Request/SpectreRequest.php b/app/Services/Spectre/Request/SpectreRequest.php
index 8d87297829..8db025b6ba 100644
--- a/app/Services/Spectre/Request/SpectreRequest.php
+++ b/app/Services/Spectre/Request/SpectreRequest.php
@@ -40,8 +40,6 @@ abstract class SpectreRequest
      * @var int
      */
     protected $expiresAt = 0;
-    /** @var ServerPublicKey */
-    protected $serverPublicKey;
     /** @var string */
     protected $serviceSecret = '';
     /** @var string */
@@ -104,22 +102,6 @@ abstract class SpectreRequest
         return $this->server;
     }
 
-    /**
-     * @return ServerPublicKey
-     */
-    public function getServerPublicKey(): ServerPublicKey
-    {
-        return $this->serverPublicKey;
-    }
-
-    /**
-     * @param ServerPublicKey $serverPublicKey
-     */
-    public function setServerPublicKey(ServerPublicKey $serverPublicKey)
-    {
-        $this->serverPublicKey = $serverPublicKey;
-    }
-
     /**
      * @return string
      */
@@ -144,14 +126,6 @@ abstract class SpectreRequest
         $this->privateKey = $privateKey;
     }
 
-    /**
-     * @param string $secret
-     */
-    public function setSecret(string $secret)
-    {
-        $this->secret = $secret;
-    }
-
     /**
      * @param string $method
      * @param string $uri
@@ -169,8 +143,6 @@ abstract class SpectreRequest
         if ('get' === strtolower($method) || 'delete' === strtolower($method)) {
             $data = '';
         }
-        // base64(sha1_signature(private_key, "Expires-at|request_method|original_url|post_body|md5_of_uploaded_file|")))
-        // Prepare the signature
         $toSign = $this->expiresAt . '|' . strtoupper($method) . '|' . $uri . '|' . $data . ''; // no file so no content there.
         Log::debug(sprintf('String to sign: "%s"', $toSign));
         $signature = '';
diff --git a/app/Support/Amount.php b/app/Support/Amount.php
index 8d79402963..a9d066e557 100644
--- a/app/Support/Amount.php
+++ b/app/Support/Amount.php
@@ -202,7 +202,7 @@ class Amount
     /**
      * @return \FireflyIII\Models\TransactionCurrency
      *
-     * @throws FireflyException
+     * @throws \FireflyIII\Exceptions\FireflyException
      */
     public function getDefaultCurrency(): TransactionCurrency
     {
@@ -216,7 +216,7 @@ class Amount
      *
      * @return \FireflyIII\Models\TransactionCurrency
      *
-     * @throws FireflyException
+     * @throws \FireflyIII\Exceptions\FireflyException
      */
     public function getDefaultCurrencyByUser(User $user): TransactionCurrency
     {
diff --git a/app/Support/Binder/Date.php b/app/Support/Binder/Date.php
index 7622b5d8b0..5b04cfbd54 100644
--- a/app/Support/Binder/Date.php
+++ b/app/Support/Binder/Date.php
@@ -24,7 +24,6 @@ namespace FireflyIII\Support\Binder;
 
 use Carbon\Carbon;
 use Exception;
-use FireflyIII\Helpers\FiscalHelper;
 use FireflyIII\Helpers\FiscalHelperInterface;
 use Illuminate\Routing\Route;
 use Log;
diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php
index 02e3775377..04ce257ebb 100644
--- a/app/Support/ExpandedForm.php
+++ b/app/Support/ExpandedForm.php
@@ -25,6 +25,7 @@ namespace FireflyIII\Support;
 use Amount as Amt;
 use Carbon\Carbon;
 use Eloquent;
+use FireflyIII\Exceptions\FireflyException;
 use Illuminate\Support\Collection;
 use Illuminate\Support\MessageBag;
 use RuntimeException;
@@ -36,11 +37,12 @@ use Session;
 class ExpandedForm
 {
     /**
-     * @param       $name
-     * @param null  $value
-     * @param array $options
+     * @param string $name
+     * @param null   $value
+     * @param array  $options
      *
      * @return string
+     * @throws \FireflyIII\Exceptions\FireflyException
      */
     public function amount(string $name, $value = null, array $options = []): string
     {
@@ -53,6 +55,7 @@ class ExpandedForm
      * @param array $options
      *
      * @return string
+     * @throws \FireflyIII\Exceptions\FireflyException
      */
     public function amountSmall(string $name, $value = null, array $options = []): string
     {
@@ -65,6 +68,8 @@ class ExpandedForm
      * @param array $options
      *
      * @return string
+     * @throws \FireflyIII\Exceptions\FireflyException
+     *
      */
     public function balance(string $name, $value = null, array $options = []): string
     {
@@ -594,8 +599,7 @@ class ExpandedForm
      *
      * @return string
      *
-     * @throws \Throwable
-     * @throws Facades\FireflyException
+     * @throws \FireflyIII\Exceptions\FireflyException
      */
     private function currencyField(string $name, string $view, $value = null, array $options = []): string
     {
diff --git a/app/Support/Import/Configuration/Spectre/InputMandatory.php b/app/Support/Import/Configuration/Spectre/InputMandatory.php
deleted file mode 100644
index c6182ff53a..0000000000
--- a/app/Support/Import/Configuration/Spectre/InputMandatory.php
+++ /dev/null
@@ -1,121 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Support\Import\Configuration\Spectre;
-
-use Crypt;
-use FireflyIII\Exceptions\FireflyException;
-use FireflyIII\Models\ImportJob;
-use FireflyIII\Models\SpectreProvider;
-use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
-
-/**
- * Class InputMandatory
- */
-class InputMandatory implements ConfigurationInterface
-{
-    /** @var ImportJob */
-    private $job;
-
-    /**
-     * Get the data necessary to show the configuration screen.
-     *
-     * @return array
-     *
-     * @throws FireflyException
-     */
-    public function getData(): array
-    {
-        $config     = $this->job->configuration;
-        $providerId = $config['provider'];
-        $provider   = SpectreProvider::where('spectre_id', $providerId)->first();
-        if (is_null($provider)) {
-            throw new FireflyException(sprintf('Cannot find Spectre provider with ID #%d', $providerId));
-        }
-        $fields    = $provider->data['required_fields'] ?? [];
-        $positions = [];
-        // Obtain a list of columns
-        foreach ($fields as $key => $row) {
-            $positions[$key] = $row['position'];
-        }
-        array_multisort($positions, SORT_ASC, $fields);
-        $country = SelectCountry::$allCountries[$config['country']] ?? $config['country'];
-
-        return compact('provider', 'country', 'fields');
-    }
-
-    /**
-     * Return possible warning to user.
-     *
-     * @return string
-     */
-    public function getWarningMessage(): string
-    {
-        return '';
-    }
-
-    /**
-     * @param ImportJob $job
-     */
-    public function setJob(ImportJob $job)
-    {
-        $this->job = $job;
-    }
-
-    /**
-     * Store the result.
-     *
-     * @param array $data
-     *
-     * @return bool
-     *
-     * @throws FireflyException
-     */
-    public function storeConfiguration(array $data): bool
-    {
-        $config     = $this->job->configuration;
-        $providerId = $config['provider'];
-        $provider   = SpectreProvider::where('spectre_id', $providerId)->first();
-        if (is_null($provider)) {
-            throw new FireflyException(sprintf('Cannot find Spectre provider with ID #%d', $providerId));
-        }
-        $mandatory = [];
-        $fields    = $provider->data['required_fields'] ?? [];
-        foreach ($fields as $field) {
-            $name             = $field['name'];
-            $mandatory[$name] = Crypt::encrypt($data[$name]) ?? null;
-        }
-
-        // store in config of job:
-        $config['mandatory-fields']    = $mandatory;
-        $config['has-input-mandatory'] = true;
-        $this->job->configuration      = $config;
-        $this->job->save();
-
-        // try to grab login for this job. See what happens?
-        // fire job that creates login object. user is redirected to "wait here" page (status page). Page should
-        // refresh and go back to interactive when user is supposed to enter SMS code or something.
-        // otherwise start downloading stuff
-
-        return true;
-    }
-}
diff --git a/app/Support/Import/Configuration/Spectre/SelectCountry.php b/app/Support/Import/Configuration/Spectre/SelectCountry.php
deleted file mode 100644
index eec76e8e54..0000000000
--- a/app/Support/Import/Configuration/Spectre/SelectCountry.php
+++ /dev/null
@@ -1,348 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Support\Import\Configuration\Spectre;
-
-use FireflyIII\Models\ImportJob;
-use FireflyIII\Models\SpectreProvider;
-use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
-
-/**
- * Class SelectCountry
- */
-class SelectCountry implements ConfigurationInterface
-{
-    /**
-     * @var array
-     */
-    public static $allCountries
-        = [
-            'AF' => 'Afghanistan',
-            'AX' => 'Aland Islands',
-            'AL' => 'Albania',
-            'DZ' => 'Algeria',
-            'AS' => 'American Samoa',
-            'AD' => 'Andorra',
-            'AO' => 'Angola',
-            'AI' => 'Anguilla',
-            'AQ' => 'Antarctica',
-            'AG' => 'Antigua and Barbuda',
-            'AR' => 'Argentina',
-            'AM' => 'Armenia',
-            'AW' => 'Aruba',
-            'AU' => 'Australia',
-            'AT' => 'Austria',
-            'AZ' => 'Azerbaijan',
-            'BS' => 'Bahamas',
-            'BH' => 'Bahrain',
-            'BD' => 'Bangladesh',
-            'BB' => 'Barbados',
-            'BY' => 'Belarus',
-            'BE' => 'Belgium',
-            'BZ' => 'Belize',
-            'BJ' => 'Benin',
-            'BM' => 'Bermuda',
-            'BT' => 'Bhutan',
-            'BO' => 'Bolivia',
-            'BQ' => 'Bonaire, Saint Eustatius and Saba',
-            'BA' => 'Bosnia and Herzegovina',
-            'BW' => 'Botswana',
-            'BV' => 'Bouvet Island',
-            'BR' => 'Brazil',
-            'IO' => 'British Indian Ocean Territory',
-            'VG' => 'British Virgin Islands',
-            'BN' => 'Brunei',
-            'BG' => 'Bulgaria',
-            'BF' => 'Burkina Faso',
-            'BI' => 'Burundi',
-            'KH' => 'Cambodia',
-            'CM' => 'Cameroon',
-            'CA' => 'Canada',
-            'CV' => 'Cape Verde',
-            'KY' => 'Cayman Islands',
-            'CF' => 'Central African Republic',
-            'TD' => 'Chad',
-            'CL' => 'Chile',
-            'CN' => 'China',
-            'CX' => 'Christmas Island',
-            'CC' => 'Cocos Islands',
-            'CO' => 'Colombia',
-            'KM' => 'Comoros',
-            'CK' => 'Cook Islands',
-            'CR' => 'Costa Rica',
-            'HR' => 'Croatia',
-            'CU' => 'Cuba',
-            'CW' => 'Curacao',
-            'CY' => 'Cyprus',
-            'CZ' => 'Czech Republic',
-            'CD' => 'Democratic Republic of the Congo',
-            'DK' => 'Denmark',
-            'DJ' => 'Djibouti',
-            'DM' => 'Dominica',
-            'DO' => 'Dominican Republic',
-            'TL' => 'East Timor',
-            'EC' => 'Ecuador',
-            'EG' => 'Egypt',
-            'SV' => 'El Salvador',
-            'GQ' => 'Equatorial Guinea',
-            'ER' => 'Eritrea',
-            'EE' => 'Estonia',
-            'ET' => 'Ethiopia',
-            'FK' => 'Falkland Islands',
-            'FO' => 'Faroe Islands',
-            'FJ' => 'Fiji',
-            'FI' => 'Finland',
-            'FR' => 'France',
-            'GF' => 'French Guiana',
-            'PF' => 'French Polynesia',
-            'TF' => 'French Southern Territories',
-            'GA' => 'Gabon',
-            'GM' => 'Gambia',
-            'GE' => 'Georgia',
-            'DE' => 'Germany',
-            'GH' => 'Ghana',
-            'GI' => 'Gibraltar',
-            'GR' => 'Greece',
-            'GL' => 'Greenland',
-            'GD' => 'Grenada',
-            'GP' => 'Guadeloupe',
-            'GU' => 'Guam',
-            'GT' => 'Guatemala',
-            'GG' => 'Guernsey',
-            'GN' => 'Guinea',
-            'GW' => 'Guinea-Bissau',
-            'GY' => 'Guyana',
-            'HT' => 'Haiti',
-            'HM' => 'Heard Island and McDonald Islands',
-            'HN' => 'Honduras',
-            'HK' => 'Hong Kong',
-            'HU' => 'Hungary',
-            'IS' => 'Iceland',
-            'IN' => 'India',
-            'ID' => 'Indonesia',
-            'IR' => 'Iran',
-            'IQ' => 'Iraq',
-            'IE' => 'Ireland',
-            'IM' => 'Isle of Man',
-            'IL' => 'Israel',
-            'IT' => 'Italy',
-            'CI' => 'Ivory Coast',
-            'JM' => 'Jamaica',
-            'JP' => 'Japan',
-            'JE' => 'Jersey',
-            'JO' => 'Jordan',
-            'KZ' => 'Kazakhstan',
-            'KE' => 'Kenya',
-            'KI' => 'Kiribati',
-            'XK' => 'Kosovo',
-            'KW' => 'Kuwait',
-            'KG' => 'Kyrgyzstan',
-            'LA' => 'Laos',
-            'LV' => 'Latvia',
-            'LB' => 'Lebanon',
-            'LS' => 'Lesotho',
-            'LR' => 'Liberia',
-            'LY' => 'Libya',
-            'LI' => 'Liechtenstein',
-            'LT' => 'Lithuania',
-            'LU' => 'Luxembourg',
-            'MO' => 'Macao',
-            'MK' => 'Macedonia',
-            'MG' => 'Madagascar',
-            'MW' => 'Malawi',
-            'MY' => 'Malaysia',
-            'MV' => 'Maldives',
-            'ML' => 'Mali',
-            'MT' => 'Malta',
-            'MH' => 'Marshall Islands',
-            'MQ' => 'Martinique',
-            'MR' => 'Mauritania',
-            'MU' => 'Mauritius',
-            'YT' => 'Mayotte',
-            'MX' => 'Mexico',
-            'FM' => 'Micronesia',
-            'MD' => 'Moldova',
-            'MC' => 'Monaco',
-            'MN' => 'Mongolia',
-            'ME' => 'Montenegro',
-            'MS' => 'Montserrat',
-            'MA' => 'Morocco',
-            'MZ' => 'Mozambique',
-            'MM' => 'Myanmar',
-            'NA' => 'Namibia',
-            'NR' => 'Nauru',
-            'NP' => 'Nepal',
-            'NL' => 'Netherlands',
-            'NC' => 'New Caledonia',
-            'NZ' => 'New Zealand',
-            'NI' => 'Nicaragua',
-            'NE' => 'Niger',
-            'NG' => 'Nigeria',
-            'NU' => 'Niue',
-            'NF' => 'Norfolk Island',
-            'KP' => 'North Korea',
-            'MP' => 'Northern Mariana Islands',
-            'NO' => 'Norway',
-            'OM' => 'Oman',
-            'PK' => 'Pakistan',
-            'PW' => 'Palau',
-            'PS' => 'Palestinian Territory',
-            'PA' => 'Panama',
-            'PG' => 'Papua New Guinea',
-            'PY' => 'Paraguay',
-            'PE' => 'Peru',
-            'PH' => 'Philippines',
-            'PN' => 'Pitcairn',
-            'PL' => 'Poland',
-            'PT' => 'Portugal',
-            'PR' => 'Puerto Rico',
-            'QA' => 'Qatar',
-            'CG' => 'Republic of the Congo',
-            'RE' => 'Reunion',
-            'RO' => 'Romania',
-            'RU' => 'Russia',
-            'RW' => 'Rwanda',
-            'BL' => 'Saint Barthelemy',
-            'SH' => 'Saint Helena',
-            'KN' => 'Saint Kitts and Nevis',
-            'LC' => 'Saint Lucia',
-            'MF' => 'Saint Martin',
-            'PM' => 'Saint Pierre and Miquelon',
-            'VC' => 'Saint Vincent and the Grenadines',
-            'WS' => 'Samoa',
-            'SM' => 'San Marino',
-            'ST' => 'Sao Tome and Principe',
-            'SA' => 'Saudi Arabia',
-            'SN' => 'Senegal',
-            'RS' => 'Serbia',
-            'SC' => 'Seychelles',
-            'SL' => 'Sierra Leone',
-            'SG' => 'Singapore',
-            'SX' => 'Sint Maarten',
-            'SK' => 'Slovakia',
-            'SI' => 'Slovenia',
-            'SB' => 'Solomon Islands',
-            'SO' => 'Somalia',
-            'ZA' => 'South Africa',
-            'GS' => 'South Georgia and the South Sandwich Islands',
-            'KR' => 'South Korea',
-            'SS' => 'South Sudan',
-            'ES' => 'Spain',
-            'LK' => 'Sri Lanka',
-            'SD' => 'Sudan',
-            'SR' => 'Suriname',
-            'SJ' => 'Svalbard and Jan Mayen',
-            'SZ' => 'Swaziland',
-            'SE' => 'Sweden',
-            'CH' => 'Switzerland',
-            'SY' => 'Syria',
-            'TW' => 'Taiwan',
-            'TJ' => 'Tajikistan',
-            'TZ' => 'Tanzania',
-            'TH' => 'Thailand',
-            'TG' => 'Togo',
-            'TK' => 'Tokelau',
-            'TO' => 'Tonga',
-            'TT' => 'Trinidad and Tobago',
-            'TN' => 'Tunisia',
-            'TR' => 'Turkey',
-            'TM' => 'Turkmenistan',
-            'TC' => 'Turks and Caicos Islands',
-            'TV' => 'Tuvalu',
-            'VI' => 'U.S. Virgin Islands',
-            'UG' => 'Uganda',
-            'UA' => 'Ukraine',
-            'AE' => 'United Arab Emirates',
-            'GB' => 'United Kingdom',
-            'US' => 'United States',
-            'UM' => 'United States Minor Outlying Islands',
-            'UY' => 'Uruguay',
-            'UZ' => 'Uzbekistan',
-            'VU' => 'Vanuatu',
-            'VA' => 'Vatican',
-            'VE' => 'Venezuela',
-            'VN' => 'Vietnam',
-            'WF' => 'Wallis and Futuna',
-            'EH' => 'Western Sahara',
-            'YE' => 'Yemen',
-            'ZM' => 'Zambia',
-            'ZW' => 'Zimbabwe',
-            'XF' => 'Fake Country (for testing)',
-            'XO' => 'Other financial applications',
-        ];
-    /** @var ImportJob */
-    private $job;
-
-    /**
-     * Get the data necessary to show the configuration screen.
-     *
-     * @return array
-     */
-    public function getData(): array
-    {
-        $providers = SpectreProvider::get();
-        $countries = [];
-        /** @var SpectreProvider $provider */
-        foreach ($providers as $provider) {
-            $countries[$provider->country_code] = self::$allCountries[$provider->country_code] ?? $provider->country_code;
-        }
-        asort($countries);
-
-        return compact('countries');
-    }
-
-    /**
-     * Return possible warning to user.
-     *
-     * @return string
-     */
-    public function getWarningMessage(): string
-    {
-        return '';
-    }
-
-    /**
-     * @param ImportJob $job
-     */
-    public function setJob(ImportJob $job)
-    {
-        $this->job = $job;
-    }
-
-    /**
-     * Store the result.
-     *
-     * @param array $data
-     *
-     * @return bool
-     */
-    public function storeConfiguration(array $data): bool
-    {
-        $config                     = $this->job->configuration;
-        $config['country']          = $data['country_code'] ?? 'XF'; // default to fake country.
-        $config['selected-country'] = true;
-        $this->job->configuration   = $config;
-        $this->job->save();
-
-        return true;
-    }
-}
diff --git a/app/Support/Import/Configuration/Spectre/SelectProvider.php b/app/Support/Import/Configuration/Spectre/SelectProvider.php
deleted file mode 100644
index 843a722c04..0000000000
--- a/app/Support/Import/Configuration/Spectre/SelectProvider.php
+++ /dev/null
@@ -1,93 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Support\Import\Configuration\Spectre;
-
-use FireflyIII\Models\ImportJob;
-use FireflyIII\Models\SpectreProvider;
-use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
-
-/**
- * Class SelectProvider
- */
-class SelectProvider implements ConfigurationInterface
-{
-    /** @var ImportJob */
-    private $job;
-
-    /**
-     * Get the data necessary to show the configuration screen.
-     *
-     * @return array
-     */
-    public function getData(): array
-    {
-        $config    = $this->job->configuration;
-        $selection = SpectreProvider::where('country_code', $config['country'])->where('status', 'active')->get();
-        $providers = [];
-        /** @var SpectreProvider $provider */
-        foreach ($selection as $provider) {
-            $providerId             = $provider->spectre_id;
-            $name                   = $provider->data['name'];
-            $providers[$providerId] = $name;
-        }
-        $country = SelectCountry::$allCountries[$config['country']] ?? $config['country'];
-
-        return compact('providers', 'country');
-    }
-
-    /**
-     * Return possible warning to user.
-     *
-     * @return string
-     */
-    public function getWarningMessage(): string
-    {
-        return '';
-    }
-
-    /**
-     * @param ImportJob $job
-     */
-    public function setJob(ImportJob $job)
-    {
-        $this->job = $job;
-    }
-
-    /**
-     * Store the result.
-     *
-     * @param array $data
-     *
-     * @return bool
-     */
-    public function storeConfiguration(array $data): bool
-    {
-        $config                      = $this->job->configuration;
-        $config['provider']          = intval($data['provider_code']) ?? 0; // default to fake country.
-        $config['selected-provider'] = true;
-        $this->job->configuration    = $config;
-        $this->job->save();
-
-        return true;
-    }
-}
diff --git a/app/Support/Import/Information/BunqInformation.php b/app/Support/Import/Information/BunqInformation.php
index 851cafb2af..ab12faf500 100644
--- a/app/Support/Import/Information/BunqInformation.php
+++ b/app/Support/Import/Information/BunqInformation.php
@@ -63,6 +63,7 @@ class BunqInformation implements InformationInterface
      * @return array
      *
      * @throws FireflyException
+     * @throws \Exception
      */
     public function getAccounts(): array
     {
diff --git a/app/Support/Import/Information/SpectreInformation.php b/app/Support/Import/Information/SpectreInformation.php
deleted file mode 100644
index 0cc93f8992..0000000000
--- a/app/Support/Import/Information/SpectreInformation.php
+++ /dev/null
@@ -1,217 +0,0 @@
-.
- */
-declare(strict_types=1);
-
-namespace FireflyIII\Support\Import\Information;
-
-use FireflyIII\Exceptions\FireflyException;
-use FireflyIII\Services\Bunq\Object\Alias;
-use FireflyIII\Services\Bunq\Object\MonetaryAccountBank;
-use FireflyIII\Services\Bunq\Request\DeleteDeviceSessionRequest;
-use FireflyIII\Services\Bunq\Request\DeviceSessionRequest;
-use FireflyIII\Services\Bunq\Request\ListMonetaryAccountRequest;
-use FireflyIII\Services\Bunq\Request\ListUserRequest;
-use FireflyIII\Services\Bunq\Token\SessionToken;
-use FireflyIII\Support\CacheProperties;
-use FireflyIII\User;
-use Illuminate\Support\Collection;
-use Log;
-use Preferences;
-
-/**
- * Class SpectreInformation
- */
-class SpectreInformation implements InformationInterface
-{
-    /** @var User */
-    private $user;
-
-    /**
-     * Returns a collection of accounts. Preferrably, these follow a uniform Firefly III format so they can be managed over banks.
-     *
-     * The format for these bank accounts is basically this:
-     *
-     * id: bank specific id
-     * name: bank appointed name
-     * number: account number (usually IBAN)
-     * currency: ISO code of currency
-     * balance: current balance
-     *
-     *
-     * any other fields are optional but can be useful:
-     * image: logo or account specific thing
-     * color: any associated color.
-     *
-     * @return array
-     *
-     * @throws FireflyException
-     * @throws \Exception
-     */
-    public function getAccounts(): array
-    {
-        // cache for an hour:
-        $cache = new CacheProperties;
-        $cache->addProperty('bunq.get-accounts');
-        $cache->addProperty(date('dmy h'));
-        if ($cache->has()) {
-            return $cache->get(); // @codeCoverageIgnore
-        }
-        Log::debug('Now in getAccounts()');
-        $sessionToken = $this->startSession();
-        $userId       = $this->getUserInformation($sessionToken);
-        // get list of Bunq accounts:
-        $accounts = $this->getMonetaryAccounts($sessionToken, $userId);
-        $return   = [];
-        /** @var MonetaryAccountBank $account */
-        foreach ($accounts as $account) {
-            $current = [
-                'id'       => $account->getId(),
-                'name'     => $account->getDescription(),
-                'currency' => $account->getCurrency(),
-                'balance'  => $account->getBalance()->getValue(),
-                'color'    => $account->getSetting()->getColor(),
-            ];
-            /** @var Alias $alias */
-            foreach ($account->getAliases() as $alias) {
-                if ('IBAN' === $alias->getType()) {
-                    $current['number'] = $alias->getValue();
-                }
-            }
-            $return[] = $current;
-        }
-        $cache->store($return);
-
-        $this->closeSession($sessionToken);
-
-        return $return;
-    }
-
-    /**
-     * Set the user for this Prerequisites-routine. Class is expected to implement and save this.
-     *
-     * @param User $user
-     */
-    public function setUser(User $user): void
-    {
-        $this->user = $user;
-    }
-
-    /**
-     * @param SessionToken $sessionToken
-     *
-     * @throws \Exception
-     */
-    private function closeSession(SessionToken $sessionToken): void
-    {
-        Log::debug('Going to close session');
-        $apiKey          = Preferences::getForUser($this->user, 'bunq_api_key')->data;
-        $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
-        $privateKey      = Preferences::getForUser($this->user, 'bunq_private_key')->data;
-        $request         = new DeleteDeviceSessionRequest();
-        $request->setSecret($apiKey);
-        $request->setPrivateKey($privateKey);
-        $request->setServerPublicKey($serverPublicKey);
-        $request->setSessionToken($sessionToken);
-        $request->call();
-
-        return;
-    }
-
-    /**
-     * @param SessionToken $sessionToken
-     * @param int          $userId
-     *
-     * @return Collection
-     *
-     * @throws \Exception
-     */
-    private function getMonetaryAccounts(SessionToken $sessionToken, int $userId): Collection
-    {
-        $apiKey          = Preferences::getForUser($this->user, 'bunq_api_key')->data;
-        $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
-        $privateKey      = Preferences::getForUser($this->user, 'bunq_private_key')->data;
-        $request         = new ListMonetaryAccountRequest;
-
-        $request->setSessionToken($sessionToken);
-        $request->setSecret($apiKey);
-        $request->setServerPublicKey($serverPublicKey);
-        $request->setPrivateKey($privateKey);
-        $request->setUserId($userId);
-        $request->call();
-
-        return $request->getMonetaryAccounts();
-    }
-
-    /**
-     * @param SessionToken $sessionToken
-     *
-     * @return int
-     *
-     * @throws FireflyException
-     * @throws \Exception
-     */
-    private function getUserInformation(SessionToken $sessionToken): int
-    {
-        $apiKey          = Preferences::getForUser($this->user, 'bunq_api_key')->data;
-        $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
-        $privateKey      = Preferences::getForUser($this->user, 'bunq_private_key')->data;
-        $request         = new ListUserRequest;
-        $request->setSessionToken($sessionToken);
-        $request->setSecret($apiKey);
-        $request->setServerPublicKey($serverPublicKey);
-        $request->setPrivateKey($privateKey);
-        $request->call();
-        // return the first that isn't null?
-        $company = $request->getUserCompany();
-        if ($company->getId() > 0) {
-            return $company->getId();
-        }
-        $user = $request->getUserPerson();
-        if ($user->getId() > 0) {
-            return $user->getId();
-        }
-        throw new FireflyException('Expected user or company from Bunq, but got neither.');
-    }
-
-    /**
-     * @return SessionToken
-     *
-     * @throws \Exception
-     */
-    private function startSession(): SessionToken
-    {
-        Log::debug('Now in startSession.');
-        $apiKey            = Preferences::getForUser($this->user, 'bunq_api_key')->data;
-        $serverPublicKey   = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
-        $privateKey        = Preferences::getForUser($this->user, 'bunq_private_key')->data;
-        $installationToken = Preferences::getForUser($this->user, 'bunq_installation_token')->data;
-        $request           = new DeviceSessionRequest();
-        $request->setSecret($apiKey);
-        $request->setServerPublicKey($serverPublicKey);
-        $request->setPrivateKey($privateKey);
-        $request->setInstallationToken($installationToken);
-        $request->call();
-        $sessionToken = $request->getSessionToken();
-        Log::debug(sprintf('Now have got session token: %s', serialize($sessionToken)));
-
-        return $sessionToken;
-    }
-}
diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php
index ebc33e78bc..59de0f956d 100644
--- a/app/Support/Navigation.php
+++ b/app/Support/Navigation.php
@@ -473,6 +473,7 @@ class Navigation
             $date->subMonths($subtract);
             Log::debug(sprintf('%s is in modifier map with value %d, execute subMonths with argument %d', $repeatFreq, $modifierMap[$repeatFreq], $subtract));
             Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d')));
+
             return $date;
         }
         // a custom range requires the session start
diff --git a/app/TransactionRules/Triggers/AbstractTrigger.php b/app/TransactionRules/Triggers/AbstractTrigger.php
index 201bcbad57..0177db9860 100644
--- a/app/TransactionRules/Triggers/AbstractTrigger.php
+++ b/app/TransactionRules/Triggers/AbstractTrigger.php
@@ -29,6 +29,7 @@ use FireflyIII\Models\TransactionJournal;
  * This class will be magical!
  *
  * Class AbstractTrigger
+ * @method triggered
  */
 class AbstractTrigger
 {
@@ -43,15 +44,6 @@ class AbstractTrigger
     /** @var string Trigger value */
     protected $triggerValue;
 
-    /**
-     * AbstractTrigger constructor.
-     *
-     * @codeCoverageIgnore
-     */
-    private function __construct()
-    {
-    }
-
     /**
      * Make a new trigger from the value given in the string.
      *
diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php
index a7f73f4b9e..b50b3b4659 100644
--- a/app/Validation/FireflyValidator.php
+++ b/app/Validation/FireflyValidator.php
@@ -340,7 +340,7 @@ class FireflyValidator extends Validator
      *
      * @return bool
      */
-    public function validateUniqueAccountNumberForUser($attribute, $value, $parameters): bool
+    public function validateUniqueAccountNumberForUser($attribute, $value): bool
     {
         $accountId = $this->data['id'] ?? 0;
 
diff --git a/composer.lock b/composer.lock
index a2d3bac8c7..88046c0b2d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -748,16 +748,16 @@
         },
         {
             "name": "laravel/framework",
-            "version": "v5.5.27",
+            "version": "v5.5.28",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "b4fb6eeb227b7327b4ca7f92263b693ec9ac9875"
+                "reference": "cfafae1f2043208390a7c984e3070696f4969605"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/b4fb6eeb227b7327b4ca7f92263b693ec9ac9875",
-                "reference": "b4fb6eeb227b7327b4ca7f92263b693ec9ac9875",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/cfafae1f2043208390a7c984e3070696f4969605",
+                "reference": "cfafae1f2043208390a7c984e3070696f4969605",
                 "shasum": ""
             },
             "require": {
@@ -878,7 +878,7 @@
                 "framework",
                 "laravel"
             ],
-            "time": "2017-12-20T15:43:48+00:00"
+            "time": "2017-12-26T16:24:40+00:00"
         },
         {
             "name": "laravelcollective/html",
diff --git a/database/migrations/2017_12_09_111046_changes_for_spectre.php b/database/migrations/2017_12_09_111046_changes_for_spectre.php
deleted file mode 100644
index ce907194ce..0000000000
--- a/database/migrations/2017_12_09_111046_changes_for_spectre.php
+++ /dev/null
@@ -1,67 +0,0 @@
-.
- */
-
-use Illuminate\Database\Migrations\Migration;
-use Illuminate\Database\Schema\Blueprint;
-use Illuminate\Support\Facades\Schema;
-
-/**
- * Class ChangesForSpectre
- */
-class ChangesForSpectre extends Migration
-{
-    /**
-     * Reverse the migrations.
-     */
-    public function down()
-    {
-    }
-
-    /**
-     * Run the migrations.
-     */
-    public function up()
-    {
-        // create provider table:
-        if (!Schema::hasTable('spectre_providers')) {
-            Schema::create(
-                'spectre_providers',
-                function (Blueprint $table) {
-                    $table->increments('id');
-                    $table->timestamps();
-                    $table->softDeletes();
-                    //'spectre_id', 'code', 'mode', 'name', 'status', 'interactive', 'automatic_fetch', 'country_code', 'data'
-                    $table->integer('spectre_id', false, true);
-                    $table->string('code', 100);
-                    $table->string('mode', 20);
-                    $table->string('status', 20);
-                    $table->boolean('interactive')->default(0);
-                    $table->boolean('automatic_fetch')->default(0);
-                    $table->string('country_code', 3);
-                    $table->text('data');
-                }
-            );
-        }
-    }
-}
diff --git a/public/js/ff/accounts/reconcile.js b/public/js/ff/accounts/reconcile.js
index 98ddc523e0..4f1b46666d 100644
--- a/public/js/ff/accounts/reconcile.js
+++ b/public/js/ff/accounts/reconcile.js
@@ -92,7 +92,6 @@ function storeReconcile() {
         transactions: ids,
         cleared: cleared,
     };
-    console.log
     var uri = overviewUri.replace('%start%', $('input[name="start_date"]').val()).replace('%end%', $('input[name="end_date"]').val());
 
 
diff --git a/public/js/ff/accounts/show.js b/public/js/ff/accounts/show.js
index 3b1ca6ce87..ba77ebff95 100644
--- a/public/js/ff/accounts/show.js
+++ b/public/js/ff/accounts/show.js
@@ -18,7 +18,7 @@
  * along with Firefly III. If not, see .
  */
 
-/** global: chartUri, incomeCategoryUri, expenseCategoryUri, expenseBudgetUri */
+/** global: chartUri, incomeCategoryUri, expenseCategoryUri, expenseBudgetUri, token */
 
 var fixHelper = function (e, tr) {
     "use strict";
diff --git a/public/js/ff/admin/update/index.js b/public/js/ff/admin/update/index.js
index 39a427e77e..d02d0ad23f 100644
--- a/public/js/ff/admin/update/index.js
+++ b/public/js/ff/admin/update/index.js
@@ -18,6 +18,8 @@
  * along with Firefly III. If not, see .
  */
 
+/** global: updateCheckUri */
+
 $(function () {
     "use strict";
 
@@ -31,7 +33,7 @@ function checkUpdate() {
     // do post update check:
     $.post(updateCheckUri).done(function (data) {
         alert(data.result);
-    }).fail(function() {
+    }).fail(function () {
         alert('Error while checking.');
     });
 
diff --git a/public/js/ff/budgets/index.js b/public/js/ff/budgets/index.js
index db07e9088d..6a36dae5a0 100644
--- a/public/js/ff/budgets/index.js
+++ b/public/js/ff/budgets/index.js
@@ -18,7 +18,7 @@
  * along with Firefly III. If not, see .
  */
 
-/** global: infoIncomeUri, spent, budgeted, available, currencySymbol, budgetIndexUri, updateIncomeUri, periodStart, periodEnd, budgetAmountUri, accounting */
+/** global: infoIncomeUri, token, spent, budgeted, available, currencySymbol, budgetIndexUri, updateIncomeUri, periodStart, periodEnd, budgetAmountUri, accounting */
 /**
  *
  */
@@ -104,7 +104,7 @@ function updateBudgetedAmounts(e) {
     var target = $(e.target);
     var id = target.data('id');
     var leftCell = $('td[class$="left"][data-id="' + id + '"]');
-    var link = $('a[data-id="'+id+'"][class="budget-link"]');
+    var link = $('a[data-id="' + id + '"][class="budget-link"]');
     var value = target.val();
     var original = target.data('original');
 
@@ -112,7 +112,7 @@ function updateBudgetedAmounts(e) {
     target.prop('disabled', true);
 
     // replace link (for now)
-    link.attr('href','#');
+    link.attr('href', '#');
 
     // replace "left" with spinner.
     leftCell.empty().html('');
diff --git a/public/js/ff/charts.defaults.js b/public/js/ff/charts.defaults.js
index 21c5852877..e2764d5567 100644
--- a/public/js/ff/charts.defaults.js
+++ b/public/js/ff/charts.defaults.js
@@ -29,40 +29,37 @@
  * @param maxwidth
  * @returns {Array}
  */
-function formatLabel(str, maxwidth){
+function formatLabel(str, maxwidth) {
     var sections = [];
     var words = str.split(" ");
     var temp = "";
 
-    words.forEach(function(item, index){
-        if(temp.length > 0)
-        {
+    words.forEach(function (item, index) {
+        if (temp.length > 0) {
             var concat = temp + ' ' + item;
 
-            if(concat.length > maxwidth){
+            if (concat.length > maxwidth) {
                 sections.push(temp);
                 temp = "";
             }
-            else{
-                if(index === (words.length-1))
-                {
+            else {
+                if (index === (words.length - 1)) {
                     sections.push(concat);
                     return;
                 }
-                else{
+                else {
                     temp = concat;
                     return;
                 }
             }
         }
 
-        if(index === (words.length-1))
-        {
+        if (index === (words.length - 1)) {
             sections.push(item);
             return;
         }
 
-        if(item.length < maxwidth) {
+        if (item.length < maxwidth) {
             temp = item;
         }
         else {
diff --git a/public/js/ff/help.js b/public/js/ff/help.js
index 9894563e66..9e7280b1c0 100644
--- a/public/js/ff/help.js
+++ b/public/js/ff/help.js
@@ -17,7 +17,7 @@
  * You should have received a copy of the GNU General Public License
  * along with Firefly III. If not, see .
  */
-
+/** global: token */
 $(function () {
     "use strict";
     $('#help').click(showHelp);
diff --git a/public/js/ff/import/status.js b/public/js/ff/import/status.js
index 0f65e71b60..c05560cafd 100644
--- a/public/js/ff/import/status.js
+++ b/public/js/ff/import/status.js
@@ -18,7 +18,7 @@
  * along with Firefly III. If not, see .
  */
 
-/** global: langImportSingleError, langImportMultiError, jobStartUrl, langImportTimeOutError, langImportFinished, langImportFatalError */
+/** global: job, langImportSingleError, langImportMultiError, jobStartUrl, langImportTimeOutError, langImportFinished, langImportFatalError */
 
 var timeOutId;
 var startInterval = 1000;
@@ -34,10 +34,12 @@ var knownErrors = 0;
 
 $(function () {
     "use strict";
+    console.log('in start');
     timeOutId = setTimeout(checkJobStatus, startInterval);
 
     $('.start-job').click(startJob);
     if (job.configuration['auto-start']) {
+        console.log('Called startJob()!');
         startJob();
     }
 });
@@ -46,6 +48,7 @@ $(function () {
  * Downloads some JSON and responds to its content to see what the status is of the current import.
  */
 function checkJobStatus() {
+    console.log('in checkJobStatus');
     $.getJSON(jobStatusUri).done(reportOnJobStatus).fail(reportFailedJob);
 }
 
@@ -53,6 +56,7 @@ function checkJobStatus() {
  * This method is called when the JSON query returns an error. If possible, this error is relayed to the user.
  */
 function reportFailedJob(jqxhr, textStatus, error) {
+    console.log('in reportFailedJob');
     // hide all possible boxes:
     $('.statusbox').hide();
 
@@ -72,6 +76,7 @@ function reportFailedJob(jqxhr, textStatus, error) {
  * @param data
  */
 function reportOnJobStatus(data) {
+    console.log('in reportOnJobStatus: ' + data.status);
 
     switch (data.status) {
         case "configured":
@@ -80,6 +85,10 @@ function reportOnJobStatus(data) {
                 $('.statusbox').hide();
                 $('.status_configured').show();
             }
+            if (job.configuration['auto-start']) {
+                console.log('Job is auto start. Check status again in 500ms.');
+                timeOutId = setTimeout(checkJobStatus, interval);
+            }
             break;
         case "running":
             // job is running! Show the running box:
@@ -122,7 +131,13 @@ function reportOnJobStatus(data) {
             // show the fatal error box:
             $('.fatal_error').show();
             break;
+        case "configuring":
+            // redirect back to configure screen.
+            console.log('Will now redirect to ' + jobConfigureUri);
+            window.location = jobConfigureUri;
+            break;
         default:
+            console.error('Cannot handle job status ' + data.status);
             break;
 
     }
diff --git a/public/js/ff/piggy-banks/index.js b/public/js/ff/piggy-banks/index.js
index 72f128a2a0..292d7f7f7d 100644
--- a/public/js/ff/piggy-banks/index.js
+++ b/public/js/ff/piggy-banks/index.js
@@ -17,7 +17,7 @@
  * You should have received a copy of the GNU General Public License
  * along with Firefly III. If not, see .
  */
-
+/** global: token */
 var fixHelper = function (e, tr) {
     "use strict";
     var $originals = tr.children();
diff --git a/public/js/ff/reports/account/month.js b/public/js/ff/reports/account/month.js
index a8d2129875..6aba68d1b0 100644
--- a/public/js/ff/reports/account/month.js
+++ b/public/js/ff/reports/account/month.js
@@ -1,4 +1,3 @@
-
 /*
  * month.js
  * Copyright (c) 2017 thegrumpydictator@gmail.com
@@ -18,10 +17,10 @@
  * You should have received a copy of the GNU General Public License
  * along with Firefly III. If not, see .
  */
-
+/** global: spentUri, categoryUri, budgetUri, expenseUri, incomeUri, mainUri  */
 $(function () {
     "use strict";
-    drawChart();
+    doubleYChart(mainUri, 'in-out-chart');
 
     loadAjaxPartial('inOutAccounts', spentUri);
     loadAjaxPartial('inOutCategory', categoryUri);
@@ -31,9 +30,3 @@ $(function () {
 
 });
 
-function drawChart() {
-    "use strict";
-
-    // month view:
-    doubleYChart(mainUri, 'in-out-chart');
-}
\ No newline at end of file
diff --git a/public/js/ff/reports/all.js b/public/js/ff/reports/all.js
index 3c34cb9a35..912539796c 100644
--- a/public/js/ff/reports/all.js
+++ b/public/js/ff/reports/all.js
@@ -17,7 +17,7 @@
  * You should have received a copy of the GNU General Public License
  * along with Firefly III. If not, see .
  */
-
+/** global: startDate, endDate, accountIds */
 function loadAjaxPartial(holder, uri) {
     "use strict";
     $.get(uri).done(function (data) {
diff --git a/public/js/ff/reports/index.js b/public/js/ff/reports/index.js
index dfea1c9fc0..9e9562e947 100644
--- a/public/js/ff/reports/index.js
+++ b/public/js/ff/reports/index.js
@@ -139,7 +139,6 @@ function setOptionalFromCookies() {
     $('#inputExpRevAccounts').multiselect(defaultMultiSelect);
 
 
-
 }
 
 function catchSubmit() {
@@ -161,7 +160,7 @@ function catchSubmit() {
     createCookie('report-categories', categories, 365);
     createCookie('report-budgets', budgets, 365);
     createCookie('report-tags', tags, 365);
-    createCookie('report-exp-rev', expRev   , 365);
+    createCookie('report-exp-rev', expRev, 365);
     createCookie('report-start', moment(picker.startDate).format("YYYYMMDD"), 365);
     createCookie('report-end', moment(picker.endDate).format("YYYYMMDD"), 365);
 
diff --git a/public/js/ff/rules/index.js b/public/js/ff/rules/index.js
index 5c58468fa1..27ef2fb053 100644
--- a/public/js/ff/rules/index.js
+++ b/public/js/ff/rules/index.js
@@ -17,7 +17,7 @@
  * You should have received a copy of the GNU General Public License
  * along with Firefly III. If not, see .
  */
-
+/** global: token */
 var fixHelper = function (e, tr) {
     "use strict";
     var $originals = tr.children();
diff --git a/public/js/ff/search/index.js b/public/js/ff/search/index.js
index 8b8cea4304..70615ae476 100644
--- a/public/js/ff/search/index.js
+++ b/public/js/ff/search/index.js
@@ -18,7 +18,7 @@
  * along with Firefly III. If not, see .
  */
 
-/** global: searchQuery,searchUri */
+/** global: searchQuery,searchUri,token */
 
 
 
diff --git a/public/js/ff/tags/show.js b/public/js/ff/tags/show.js
index e2b5f75922..b199393bbe 100644
--- a/public/js/ff/tags/show.js
+++ b/public/js/ff/tags/show.js
@@ -48,7 +48,7 @@ $(function () {
         }).addTo(mymap);
 
         if (doPlaceMarker) {
-            var marker = L.marker([latitude, longitude]).addTo(mymap);
+            L.marker([latitude, longitude]).addTo(mymap);
         }
     }
 });
diff --git a/public/js/ff/transactions/list.js b/public/js/ff/transactions/list.js
index 4f013541ba..4af8b7ce1e 100644
--- a/public/js/ff/transactions/list.js
+++ b/public/js/ff/transactions/list.js
@@ -18,7 +18,7 @@
  * along with Firefly III. If not, see .
  */
 
-/** global: edit_selected_txt, edit_bulk_selected_txt, delete_selected_txt */
+/** global: edit_selected_txt, edit_bulk_selected_txt, delete_selected_txt, token */
 
 /**
  *
diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php
index 11a0e6461c..220e0b6c84 100644
--- a/resources/lang/de_DE/demo.php
+++ b/resources/lang/de_DE/demo.php
@@ -27,7 +27,7 @@ return [
     'accounts-index'                 => 'Vermögenskonten sind Ihre persönlichen Bank-Konten. Aufwandskonten sind Konten, denen Sie Geld zahlen, z. B. Läden und Freunde. Einnahmekonten sind Konten von denen Sie Geld erhalten, z. B. Ihr Arbeitgeber und andere Einkommensquellen. Auf dieser Seite können Sie diese bearbeiten oder entfernen.',
     'budgets-index'                  => 'Diese Seite zeigt Ihnen einen Überblick über Ihre Budgets. Die obere Leiste zeigt den Betrag, der zur Verfügung steht. Dieser kann für einen Zeitraum angepasst werden, indem Sie auf den Betrag auf der rechten Seite klicken. Wie viel bisher ausgegeben wurde wird darunter angezeigt. Darunter sind die Aufwendungen pro Haushalt und wie viel dafür veranschlagt ist.',
     'reports-index-start'            => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.',
-    'reports-index-examples'         => 'Sehen Sie sich auch diese Beispiele an:  eine monatliche Finanzübersicht,  eine jährliche Finanzübersicht und  eine Haushaltsübersicht.',
+    'reports-index-examples'         => 'Sehen Sie sich auch diese Beispiele an: eine monatliche Finanzübersicht, eine jährliche Finanzübersicht und eine Haushaltsübersicht.',
     'currencies-index'               => 'Firefly III unterstützt mehrere Währungen. Obwohl es den Euro standardmäßig nutzt, ist es möglich US-Dollar oder viele andere Währungen zu verwenden. Wie Sie sehen können, ist eine kleine Auswahl an Währungen aufgenommen worden, aber Sie können Ihre eigenen hinzufügen. Die Standardwährung zu ändern, wird die Währung der vorhandenen Buchungen jedoch nicht ändern: Firefly III unterstützt die Verwendung mehrerer Währungen zur gleichen Zeit.',
     'transactions-index'             => 'Diese Aufwendungen, Einzahlungen und Überweisungen sind nicht besonders einfallsreich. Sie wurden automatisch generiert.',
     'piggy-banks-index'              => 'Wie Sie sehen können, gibt es drei Sparschweine. Benutzen die Plus- und Minusknöpfe um die Menge des Geldes in den Sparschweinen zu beeinflussen. Klicken Sie auf den Namen des Sparschweins um Details einzusehen.',
diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php
index c6e298e9d9..f5aa95a21d 100644
--- a/resources/lang/de_DE/firefly.php
+++ b/resources/lang/de_DE/firefly.php
@@ -142,6 +142,22 @@ return [
     'invalid_locale_settings'                    => 'Firefly III kann keine Geldbeträge formatieren, da auf Ihrem Server die erforderlichen Pakete fehlen. Es gibt eine Anleitung, wie dies behoben werden kann.',
     'quickswitch'                                => 'Schnellauswahl',
 
+    // check for updates:
+    'update_check_title'                         => 'Check for updates',
+    'admin_update_check_title'                   => 'Automatically check for update',
+    'admin_update_check_explain'                 => 'Firefly III can check for updates automatically. When you enable this setting, it will contact Github to see if a new version of Firefly III is available. When it is, you will get a notification. You can test this notification using the button on the right. Please indicate below if you want Firefly III to check for updates.',
+    'check_for_updates_permission'               => 'Firefly III can check for updates, but it needs your permission to do so. Please go to the administration to indicate if you would like this feature to be enabled.',
+    'updates_ask_me_later'                       => 'Ask me later',
+    'updates_do_not_check'                       => 'Do not check for updates',
+    'updates_enable_check'                       => 'Enable the check for updates',
+    'admin_update_check_now_title'               => 'Check for updates now',
+    'admin_update_check_now_explain'             => 'If you press the button, Firefly III will see if your current version is the latest.',
+    'check_for_updates_button'                   => 'Check now!',
+    'update_new_version_alert'                   => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
+    'update_current_version_alert'               => 'You are running v:version, which is the latest available release.',
+    'update_newer_version_alert'                 => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
+    'update_check_error'                         => 'An error occurred while checking for updates. Please view the log files.',
+
     // search
     'search'                                     => 'Suche',
     'search_query'                               => 'Abfrage',
@@ -242,14 +258,14 @@ return [
     'warning_transaction_subset'                 => 'Aus Performancegründen ist diese Liste auf :max_num_transactions Überweisungen limitiert und zeigt möglicherweise nur einen Teil dieser an',
     'warning_no_matching_transactions'           => 'Keine übereinstimmenden Überweisungen gefunden. Aus Kapazitätsgründen werden nur die letzten :num_transactions Überweisungen überprüft.',
     'warning_no_valid_triggers'                  => 'Keine gültigen Trigger gefunden.',
-    'apply_rule_selection'                       => 'Übernehmen Sie die Regel ": title" auf eine Auswahl Ihrer Transaktionen',
-    'apply_rule_selection_intro'                 => 'Regeln wie ": title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Regel auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Regel aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.',
+    'apply_rule_selection'                       => 'Übernehmen Sie die Regel ":title" auf eine Auswahl Ihrer Transaktionen',
+    'apply_rule_selection_intro'                 => 'Regeln wie ":title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Regel auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Regel aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.',
     'include_transactions_from_accounts'         => 'Überweisungen von diesem Konto einbeziehen',
-    'applied_rule_selection'                     => 'Regel ": Titel" wurde auf Ihre Auswahl angewendet.',
+    'applied_rule_selection'                     => 'Regel ":title" wurde auf Ihre Auswahl angewendet.',
     'execute'                                    => 'Ausführen',
-    'apply_rule_group_selection'                 => 'Anwenden der Regelgruppe ": title" auf eine Auswahl Ihrer Transaktionen',
-    'apply_rule_group_selection_intro'           => 'Regelgruppen wie ": title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Gruppe auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Gruppe aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.',
-    'applied_rule_group_selection'               => 'Regelgruppe ": title" wurde auf Ihre Auswahl angewendet.',
+    'apply_rule_group_selection'                 => 'Anwenden der Regelgruppe ":title" auf eine Auswahl Ihrer Transaktionen',
+    'apply_rule_group_selection_intro'           => 'Regelgruppen wie ":title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Gruppe auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Gruppe aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.',
+    'applied_rule_group_selection'               => 'Regelgruppe ":title" wurde auf Ihre Auswahl angewendet.',
 
     // actions and triggers
     'rule_trigger_user_action'                   => 'Die Nutzeraktion ist ":trigger_value"',
@@ -270,7 +286,7 @@ return [
     'rule_trigger_to_account_contains_choice'    => 'Zielkonto enthält..',
     'rule_trigger_to_account_contains'           => 'Zielkonto enthält ":trigger_value"',
     'rule_trigger_transaction_type_choice'       => 'Überweisung ist vom Typ..',
-    'rule_trigger_transaction_type'              => 'Transaktion ist vom Typ ": Trigger_value"',
+    'rule_trigger_transaction_type'              => 'Transaktion ist vom Typ ":trigger_value"',
     'rule_trigger_category_is_choice'            => 'Kategorie ist..',
     'rule_trigger_category_is'                   => 'Kategorie ist ":trigger_value"',
     'rule_trigger_amount_less_choice'            => 'Betrag ist geringer als..',
@@ -450,7 +466,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
     'secure_pw_history'                        => 'Im August 2017 veröffentlichte die bekannte Sicherheitsforscherin Troy Hunt eine Liste von 306 Millionen gestohlenen Passwörtern. Diese Passwörter wurden während der Einbrüche bei Firmen wie LinkedIn, Adobe und NeoPets (und vielen mehr) gestohlen.',
     'secure_pw_check_box'                      => 'Wenn Sie das Kontrollkästchen aktivieren, wird Firefly III den SHA1-Hash Ihres Passworts an die Website von Troy Hunt senden, um zu sehen, ob es auf der Liste steht. Dies verhindert, dass Sie unsichere Passwörter verwenden, was in der aktuellen NIST-Sonderveröffentlichung zu diesem Thema empfohlen wird.',
     'secure_pw_sha1'                           => 'Aber ich dachte, dass SHA1 schon geknackt wurde?',
-    'secure_pw_hash_speed'                     => 'Ja, aber nicht in diesem Zusammenhang. Wie Sie auf  auf der Website, die erklärt, wie SHA1 gebrochen wurde, lesen können, ist es jetzt etwas leichter, eine "Kollision" zu finden: eine andere Zeichenfolge, die zu demselben SHA1-Hash führt. Es dauert nur mehr 10.000 Jahre mit einer Single-GPU-Maschine.',
+    'secure_pw_hash_speed'                     => 'Ja, aber nicht in diesem Zusammenhang. Wie Sie auf auf der Website, die erklärt, wie SHA1 gebrochen wurde, lesen können, ist es jetzt etwas leichter, eine "Kollision" zu finden: eine andere Zeichenfolge, die zu demselben SHA1-Hash führt. Es dauert nur mehr 10.000 Jahre mit einer Single-GPU-Maschine.',
     'secure_pw_hash_security'                  => 'Diese Kollision wäre nicht gleich Ihrem Passwort, noch wäre es nützlich auf (einer Seite wie) Firefly III. Diese Anwendung verwendet SHA1 nicht zur Passwortüberprüfung. Es ist also sicher, dieses Kästchen zu aktivieren. Ihr Passwort wird gehasht und über HTTPS übertragen.',
     'secure_pw_should'                         => 'Soll ich die Box ankreuzen?',
     'secure_pw_long_password'                  => 'Wenn Sie gerade ein langes, Single-Use-Passwort für Firefly III mit einem Kennwortgenerator generiert haben: Nein.',
diff --git a/resources/lang/de_DE/form.php b/resources/lang/de_DE/form.php
index 2284ef57e1..43728aa0a2 100644
--- a/resources/lang/de_DE/form.php
+++ b/resources/lang/de_DE/form.php
@@ -169,6 +169,7 @@ return [
     'budget_keep_transactions'   => 'Die eine Überweisung, die mit diesem Budget verknüpft ist, wird nicht gelöscht. | Keines der :count Budgets, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
     'category_keep_transactions' => 'Die eine Überweisungen, die mit dieser Kategorie verknüpft ist, wird nicht gelöscht. | Keine der :count Kategorien, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
     'tag_keep_transactions'      => 'Die einzige Überweisung, die mit diesem Tag verknüpft ist, wird nicht gelöscht. | Keiner der :count Tags, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
+    'check_for_updates'          => 'Check for updates',
 
     'email'                 => 'E-Mail Adresse',
     'password'              => 'Passwort',
diff --git a/resources/lang/de_DE/import.php b/resources/lang/de_DE/import.php
index 1605cae104..8ed4cc8d53 100644
--- a/resources/lang/de_DE/import.php
+++ b/resources/lang/de_DE/import.php
@@ -49,10 +49,10 @@ return [
     'status_bread_crumb'              => 'Importstatus',
     'status_sub_title'                => 'Importstatus',
     'config_sub_title'                => 'Import einrichten',
-    'status_finished_job'             => 'Die importierten Transaktionen finden Sie im Tag : tag.',
+    'status_finished_job'             => 'Die importierten Transaktionen finden Sie im Tag :tag.',
     'import_with_key'                 => 'Import mit Schlüssel \':key\'',
 
-    // file: upload something:
+    // file, upload something
     'file_upload_title'               => 'Import-Setup (1/4) - Laden Sie Ihre Datei hoch',
     'file_upload_text'                => 'Dieser Assistent hilft Ihnen, Dateien von Ihrer Bank in Firefly III zu importieren. Bitte sehen Sie sich die Hilfeseiten in der oberen rechten Ecke an.',
     'file_upload_fields'              => 'Felder',
@@ -61,10 +61,10 @@ return [
     'file_upload_type_help'           => 'Wählen Sie den Typ der hochzuladenden Datei',
     'file_upload_submit'              => 'Dateien hochladen',
 
-    // file: upload types
+    // file, upload types
     'import_file_type_csv'            => 'CSV (Kommagetrennte Werte)',
 
-    // file: initial config for CSV
+    // file, initial config for CSV
     'csv_initial_title'               => 'Import Einrichten (2/4) - Grundlegende Einstellungen',
     'csv_initial_text'                => 'Um Ihre Datei korrekt importieren zu können, überprüfen Sie bitte die folgenden Optionen.',
     'csv_initial_box'                 => 'Standard CSV Importeinstellungen',
@@ -75,13 +75,13 @@ return [
     'csv_initial_import_account_help' => 'Wenn ihre CSV-Datei KEINE Informationen über ihre Girokonten enthält, nutzen Sie bitte diese Dropdown-Liste um anzugeben, zu welchem Girokonto die Transaktionen in der CSV-Datei gehören.',
     'csv_initial_submit'              => 'Fortfahren mit Schritt 3/4',
 
-    // file: new options:
+    // file, new options:
     'file_apply_rules_title'          => 'Regeln anwenden',
     'file_apply_rules_description'    => 'Regeln anwenden. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.',
     'file_match_bills_title'          => 'Rechnungen zuordnen',
     'file_match_bills_description'    => 'Ordnen Sie Ihre Rechnungen den neu erstellten Ausgaben zu. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.',
 
-    // file: roles config
+    // file, roles config
     'csv_roles_title'                 => 'Import Einrichten (3/4) - Jeder Spalte eine Rolle zuordnen',
     'csv_roles_text'                  => 'Jede Spalte in Ihrer CSV-Datei enthält bestimmte Daten. Bitte geben Sie an, welche Art von Daten enthalten sind. Die Option "Daten zuordnen" bedeutet, dass jeder Eintrag in der Spalte mit einem Wert aus Ihrer der Datenbank ersetzt wird. Eine oft zugeordnete Spalte ist die Spalte, welche die IBAN des fremden Kontos enthält. Diese können leicht mit bereits angelegten IBANs in Ihrer Datenbank verglichen werden.',
     'csv_roles_table'                 => 'Tabelle',
@@ -94,7 +94,7 @@ return [
     'csv_roles_submit'                => 'Fortfahren mit Schritt 4/4',
     'csv_roles_warning'               => 'Markieren Sie zumindest eine Spalte als Betragsspalte. Es empfiehlt sich auch, eine Spalte für die Beschreibung, das Datum und das Gegenkonto auszuwählen.',
 
-    // file: map data
+    // file, map data
     'file_map_title'                  => 'Import Einrichten (4/4) - Import mit bereits vorhandenen Daten verknüpfen',
     'file_map_text'                   => 'In den folgenden Tabellen zeigt der linke Wert Informationen, die sich in Ihrer hochgeladenen Datei befinden. Es ist Ihre Aufgabe, diesen Wert, wenn möglich, einem bereits in der Datenbank vorhandenen zuzuordnen. Firefly wird sich an diese Zuordnung halten. Wenn kein Wert für die Zuordnung vorhanden ist oder Sie den bestimmten Wert nicht abbilden möchten, wählen Sie nichts aus.',
     'file_map_field_value'            => 'Feldwert',
@@ -141,11 +141,14 @@ return [
     'column_opposing-number'          => 'Zielkonto (Kontonr.)',
     'column_note'                     => 'Notiz(en)',
 
+    // prerequisites
+    'prerequisites'                   => 'Prerequisites',
+
     // bunq
     'bunq_prerequisites_title'        => 'Voraussetzungen für einen Import von bunq',
     'bunq_prerequisites_text'         => 'Um aus bunq importieren zu können, benötigen Sie einen API-Schlüssel. Sie können diesen in der App bekommen.',
 
-    // Spectre:
+    // Spectre
     'spectre_title'                   => 'Importieren mit Spectre',
     'spectre_prerequisites_title'     => 'Voraussetzungen für einen Import von Spectre',
     'spectre_prerequisites_text'      => 'Um Daten mithilfe der Spectre-API zu importieren, müssen Sie einige Daten angeben. Sie sind auf der secrets-Seite zu finden.',
diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php
index 888950eaa6..ad207ed562 100644
--- a/resources/lang/en_US/firefly.php
+++ b/resources/lang/en_US/firefly.php
@@ -153,7 +153,7 @@ return [
     'admin_update_check_now_title'               => 'Check for updates now',
     'admin_update_check_now_explain'             => 'If you press the button, Firefly III will see if your current version is the latest.',
     'check_for_updates_button'                   => 'Check now!',
-    'update_new_version_alert'                   => 'A new version is available. You are running v:your_version, the latest version is v:new_version.',
+    'update_new_version_alert'                   => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
     'update_current_version_alert'               => 'You are running v:version, which is the latest available release.',
     'update_newer_version_alert'                 => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
     'update_check_error'                         => 'An error occurred while checking for updates. Please view the log files.',
diff --git a/resources/lang/en_US/import.php b/resources/lang/en_US/import.php
index c38b44a9ac..a73f185e19 100644
--- a/resources/lang/en_US/import.php
+++ b/resources/lang/en_US/import.php
@@ -52,7 +52,7 @@ return [
     'status_finished_job'             => 'The transactions imported can be found in tag :tag.',
     'import_with_key'                 => 'Import with key \':key\'',
 
-    // file: upload something:
+    // file, upload something
     'file_upload_title'               => 'Import setup (1/4) - Upload your file',
     'file_upload_text'                => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.',
     'file_upload_fields'              => 'Fields',
@@ -61,10 +61,10 @@ return [
     'file_upload_type_help'           => 'Select the type of file you will upload',
     'file_upload_submit'              => 'Upload files',
 
-    // file: upload types
+    // file, upload types
     'import_file_type_csv'            => 'CSV (comma separated values)',
 
-    // file: initial config for CSV
+    // file, initial config for CSV
     'csv_initial_title'               => 'Import setup (2/4) - Basic CSV import setup',
     'csv_initial_text'                => 'To be able to import your file correctly, please validate the options below.',
     'csv_initial_box'                 => 'Basic CSV import setup',
@@ -75,13 +75,13 @@ return [
     'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.',
     'csv_initial_submit'              => 'Continue with step 3/4',
 
-    // file: new options:
+    // file, new options:
     'file_apply_rules_title'          => 'Apply rules',
     'file_apply_rules_description'    => 'Apply your rules. Note that this slows the import significantly.',
     'file_match_bills_title'          => 'Match bills',
     'file_match_bills_description'    => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.',
 
-    // file: roles config
+    // file, roles config
     'csv_roles_title'                 => 'Import setup (3/4) - Define each column\'s role',
     'csv_roles_text'                  => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.',
     'csv_roles_table'                 => 'Table',
@@ -94,7 +94,7 @@ return [
     'csv_roles_submit'                => 'Continue with step 4/4',
     'csv_roles_warning'               => 'At the very least, mark one column as the amount-column. It is advisable to also select a column for the description, date and the opposing account.',
 
-    // file: map data
+    // file, map data
     'file_map_title'                  => 'Import setup (4/4) - Connect import data to Firefly III data',
     'file_map_text'                   => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
     'file_map_field_value'            => 'Field value',
@@ -148,7 +148,7 @@ return [
     'bunq_prerequisites_title'        => 'Prerequisites for an import from bunq',
     'bunq_prerequisites_text'         => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.',
 
-    // Spectre:
+    // Spectre
     'spectre_title'                   => 'Import using Spectre',
     'spectre_prerequisites_title'     => 'Prerequisites for an import using Spectre',
     'spectre_prerequisites_text'      => 'In order to import data using the Spectre API, you need to prove some secrets. They can be found on the secrets page.',
diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php
index 1c248da28a..0fc2018806 100644
--- a/resources/lang/fr_FR/demo.php
+++ b/resources/lang/fr_FR/demo.php
@@ -21,13 +21,13 @@
 declare(strict_types=1);
 
 return [
-    'no_demo_text'                   => 'Désolé, il n’y a aucun texte supplémentaire de démonstration ou d\'explication pour  cette page.',
+    'no_demo_text'                   => 'Désolé, il n’y a aucun texte supplémentaire de démonstration ou d\'explication pour cette page.',
     'see_help_icon'                  => 'Cependant, l\'icône  située dans le coin supérieur droit peut vous en dire plus.',
-    'index'                          => 'Bienvenue chez Firefly III ! Sur cette page, vous obtenez un aperçu rapide de vos finances. Pour plus d’informations, consultez comptes →  Comptes d’actif et, bien sûr, les pages des  Budgets et des  rapports. Ou juste jetez un coup d’œil et voyez où vous vous retrouvez.',
+    'index'                          => 'Bienvenue chez Firefly III ! Sur cette page, vous obtenez un aperçu rapide de vos finances. Pour plus d’informations, consultez comptes → Comptes d’actif et, bien sûr, les pages des Budgets et des rapports. Ou juste jetez un coup d’œil et voyez où vous vous retrouvez.',
     'accounts-index'                 => 'Les comptes d’actifs sont vos comptes bancaires personnels. Les comptes de dépenses sont des comptes où vous dépensez de l’argent, comme les magasins et les amis. Les comptes de recettes sont des comptes où vous recevez de l’argent, comme votre travail, le gouvernement ou d’autres sources de revenu. Sur cette page, vous pouvez les modifier ou les supprimer.',
     'budgets-index'                  => 'Cette page vous présente un aperçu de vos budgets. La barre du haut affiche le montant disponible à budgétiser. Cela peut être personnalisé pour toute période en cliquant sur le montant sur la droite. Le montant que vous avez réellement dépensé s’affiche dans la barre ci-dessous. Visualisez ainsi les dépenses budgétisées et votre prévisionnel.',
-    'reports-index-start'            => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.',
-    'reports-index-examples'         => 'N’oubliez pas de consultez ces exemples :  un aperçu financier mensuel,  une vue d’ensemble financière annuelle ainsi  qu’une présentation du budget.',
+    'reports-index-start'            => 'Firefly III prend en charge un certain nombre de types de rapports. Lisez-les en cliquant sur l\'icône  dans le coin supérieur droit.',
+    'reports-index-examples'         => 'N’oubliez pas de consultez ces exemples : un aperçu financier mensuel, une vue d’ensemble financière annuelle ainsi qu’une présentation du budget.',
     'currencies-index'               => 'Firefly III prend en charge plusieurs devises. Bien que l\'Euro soit la devise par défaut, cette dernière peut être changée pour le Dollar américain et de nombreuses autres devises. Comme vous pouvez le remarquer une petite sélection des monnaies a été incluse, mais vous pouvez ajouter vos propres devises si vous le souhaitez. Gardez à l\'esprit que la modification de la devise par défaut ne modifie pas la monnaie des transactions existantes : Firefly III prend en charge l’utilisation de plusieurs devises en même temps.',
     'transactions-index'             => 'Ces dépenses, dépôts et transferts ne sont pas particulièrement imaginatifs. Ils ont été générés automatiquement.',
     'piggy-banks-index'              => 'Comme vous pouvez le voir, il y a trois tirelires. Utilisez les boutons plus et moins pour influer sur le montant d’argent dans chaque tirelire. Cliquez sur le nom de la tirelire pour voir l’administration pour chaque tirelire.',
diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php
index 5bdb391708..7b6ae27046 100644
--- a/resources/lang/fr_FR/firefly.php
+++ b/resources/lang/fr_FR/firefly.php
@@ -142,6 +142,22 @@ return [
     'invalid_locale_settings'                    => 'Firefly III ne parvient pas à formater les montants monétaires car il manque des paquets logiciels sur votre serveur. Voici des instructions sur comment procéder.',
     'quickswitch'                                => 'Changement rapide',
 
+    // check for updates:
+    'update_check_title'                         => 'Check for updates',
+    'admin_update_check_title'                   => 'Automatically check for update',
+    'admin_update_check_explain'                 => 'Firefly III can check for updates automatically. When you enable this setting, it will contact Github to see if a new version of Firefly III is available. When it is, you will get a notification. You can test this notification using the button on the right. Please indicate below if you want Firefly III to check for updates.',
+    'check_for_updates_permission'               => 'Firefly III can check for updates, but it needs your permission to do so. Please go to the administration to indicate if you would like this feature to be enabled.',
+    'updates_ask_me_later'                       => 'Ask me later',
+    'updates_do_not_check'                       => 'Do not check for updates',
+    'updates_enable_check'                       => 'Enable the check for updates',
+    'admin_update_check_now_title'               => 'Check for updates now',
+    'admin_update_check_now_explain'             => 'If you press the button, Firefly III will see if your current version is the latest.',
+    'check_for_updates_button'                   => 'Check now!',
+    'update_new_version_alert'                   => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
+    'update_current_version_alert'               => 'You are running v:version, which is the latest available release.',
+    'update_newer_version_alert'                 => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
+    'update_check_error'                         => 'An error occurred while checking for updates. Please view the log files.',
+
     // search
     'search'                                     => 'Rechercher',
     'search_query'                               => 'Requête',
@@ -202,7 +218,7 @@ return [
     'rule_priority_down'                         => 'Donner à la règle moins de priorité',
     'make_new_rule_group'                        => 'Créer un nouveau groupe de règles',
     'store_new_rule_group'                       => 'Créer un nouveau groupe de règles',
-    'created_new_rule_group'                     => 'Le nouveau groupe de règles ": titre" est créé !',
+    'created_new_rule_group'                     => 'Le nouveau groupe de règles ":title" est créé !',
     'updated_rule_group'                         => 'Groupe de règles ":title" mis à jour avec succès.',
     'edit_rule_group'                            => 'Modifier le groupe de règles ":title"',
     'delete_rule_group'                          => 'Supprimer le groupe de règles ":title"',
@@ -235,8 +251,8 @@ return [
     'action_value'                               => 'Valeur de l’action',
     'stop_executing_other_actions'               => 'Arrêter l’exécution des autres actions',
     'add_rule_action'                            => 'Ajouter une nouvelle action',
-    'edit_rule'                                  => 'Modifier la règle ": titre"',
-    'delete_rule'                                => 'Supprimer la règle ":titre"',
+    'edit_rule'                                  => 'Modifier la règle ":title"',
+    'delete_rule'                                => 'Supprimer la règle ":title"',
     'update_rule'                                => 'Mettre à jour la règle',
     'test_rule_triggers'                         => 'Voir les opérations correspondantes',
     'warning_transaction_subset'                 => 'Pour des raisons de performance cette liste est limitée à :max_num_transactions et peut n\'afficher qu\'une partie des opérations correspondantes',
@@ -252,7 +268,7 @@ return [
     'applied_rule_group_selection'               => 'Le groupe de règles ":title" a été appliqué à votre sélection.',
 
     // actions and triggers
-    'rule_trigger_user_action'                   => 'L\'action de l’utilisateur est ": trigger_value"',
+    'rule_trigger_user_action'                   => 'L\'action de l’utilisateur est ":trigger_value"',
     'rule_trigger_from_account_starts_choice'    => 'Le compte source commence par..',
     'rule_trigger_from_account_starts'           => 'Le compte source commence par ":trigger_value"',
     'rule_trigger_from_account_ends_choice'      => 'Le compte source se termine par..',
@@ -449,7 +465,7 @@ return [
     'secure_pw_history'                        => 'En août 2017, le réputé chercheur en sécurité Troy Hunt a publié une liste de 306 millions de mots de passe volés. Ces mots de passe ont été volés lors de cambriolages d\'entreprises comme LinkedIn, Adobe ou NeoPets (et bien d’autres).',
     'secure_pw_check_box'                      => 'En cochant la case, Firefly III enverra l\'empreinte SHA1 de votre mot de passe au site Web de Troy Hunt pour voir si c’est sur la liste. Cela vous empêchera d\'utiliser des mots de passe dangereux comme cela est recommandé dans les dernières NIST Special Publication à ce sujet.',
     'secure_pw_sha1'                           => 'Mais je pensais que SHA1 était cassé ?',
-    'secure_pw_hash_speed'                     => 'Oui, mais pas dans ce contexte. Comme vous pouvez le lire sur  le site web détaillant comment ils ont cassé SHA1, c’est maintenant légèrement plus facile de trouver une « collision » : une autre chaîne qui aboutit à la même empreinte SHA1. Maintenant, cela prend seulement 10 000 ans, à l’aide d’une machine mono-GPU.',
+    'secure_pw_hash_speed'                     => 'Oui, mais pas dans ce contexte. Comme vous pouvez le lire sur le site web détaillant comment ils ont cassé SHA1, c’est maintenant légèrement plus facile de trouver une « collision » : une autre chaîne qui aboutit à la même empreinte SHA1. Maintenant, cela prend seulement 10 000 ans, à l’aide d’une machine mono-GPU.',
     'secure_pw_hash_security'                  => 'Cette collision ne serait pas égale à votre mot de passe, et ne serait pas utile sur (un site comme) Firefly III. Cette application n\'utilise pas SHA1 pour la vérification du mot de passe. Il est donc sûr de cocher cette case. Votre mot de passe est haché et envoyé par HTTPS.',
     'secure_pw_should'                         => 'Dois-je cocher la case ?',
     'secure_pw_long_password'                  => 'Si vous venez de générer un long mot de passe unique pour Firefly III à l\'aide d\'un type de générateur de mot de passe : non.',
@@ -506,10 +522,10 @@ return [
     'convert_please_set_expense_destination'   => 'Veuillez choisir le compte de dépenses sur lequel l\'argent sera versé.',
     'convert_please_set_asset_source'          => 'Veuillez choisir le compte d’actifs d\'où proviendra l’argent.',
     'convert_explanation_withdrawal_deposit'   => 'Si vous convertissez ce retrait en dépôt, :amount sera déposé dans :sourceName au lieu de le retirer.',
-    'convert_explanation_withdrawal_transfer'  => 'Si vous convertissez ce retrait en transfert, :amount sera transféré de :sourceName vers un nouveau compte d\'actif, au lieu d\'être payé à :DestinationName .',
+    'convert_explanation_withdrawal_transfer'  => 'Si vous convertissez ce retrait en transfert, :amount sera transféré de :sourceName vers un nouveau compte d\'actif, au lieu d\'être payé à :destinationName.',
     'convert_explanation_deposit_withdrawal'   => 'Si vous convertissez ce dépôt dans un retrait :amount sera supprimé de :destinationName au lieu d\'y être ajouté.',
-    'convert_explanation_deposit_transfer'     => 'Si vous convertissez ce dépôt en transfert, :amount sera transféré d\'un compte d\'actif de votre choix en : destinationName.',
-    'convert_explanation_transfer_withdrawal'  => 'Si vous convertissez ce transfert en retrait, le montant passera de :sourceName à une nouvelle destination comme une dépense, au lieu de :destinationName  en tant que transfert.',
+    'convert_explanation_deposit_transfer'     => 'Si vous convertissez ce dépôt en transfert, :amount sera transféré d\'un compte d\'actif de votre choix en :destinationName.',
+    'convert_explanation_transfer_withdrawal'  => 'Si vous convertissez ce transfert en retrait, le montant passera de :sourceName à une nouvelle destination comme une dépense, au lieu de :destinationName en tant que transfert.',
     'convert_explanation_transfer_deposit'     => 'Si vous convertissez ce transfert en dépôt, :amount sera déposé dans le compte :destinationName au lieu d\'y être transféré.',
     'converted_to_Withdrawal'                  => 'La transaction a été convertie en retrait',
     'converted_to_Deposit'                     => 'La transaction a été convertie en dépôt',
@@ -821,9 +837,9 @@ return [
     'difference'                               => 'Différence',
     'money_flowing_in'                         => 'In',
     'money_flowing_out'                        => 'Out',
-    'topX'                                     => 'en haut :number',
+    'topX'                                     => ':number premiers',
     'show_full_list'                           => 'Afficher la liste complète',
-    'show_only_top'                            => 'Afficher uniquement en haut :number',
+    'show_only_top'                            => 'Afficher uniquement :number premiers',
     'report_type'                              => 'Type de rapport',
     'report_type_default'                      => 'Rapport financier par défaut',
     'report_type_audit'                        => 'Historique des transactions',
@@ -1056,7 +1072,7 @@ return [
     'split_this_transfer'                   => 'Scinder ce transfert',
     'cannot_edit_multiple_source'           => 'Vous ne pouvez pas modifier la transaction scindée #:id avec la description ":description" car elle contient plusieurs comptes sources.',
     'cannot_edit_multiple_dest'             => 'Vous ne pouvez pas modifier la transaction scindée #:id avec la description ":description" car elle contient plusieurs comptes de destination.',
-    'cannot_edit_reconciled'                => 'Vous ne pouvez pas modifier transaction #: id avec la description ": description" car elle a été marquée comme rapprochée.',
+    'cannot_edit_reconciled'                => 'Vous ne pouvez pas modifier transaction #:id avec la description ":description" car elle a été marquée comme rapprochée.',
     'cannot_edit_opening_balance'           => 'Vous ne pouvez pas modifier le solde d\'ouverture d\'un compte.',
     'no_edit_multiple_left'                 => 'Vous n\'avez sélectionné aucune transaction valide à éditer.',
     'cannot_convert_split_journal'          => 'Vous ne pouvez pas convertir une transaction ventilée',
diff --git a/resources/lang/fr_FR/form.php b/resources/lang/fr_FR/form.php
index 91ccf9dc49..e4bc3de2ff 100644
--- a/resources/lang/fr_FR/form.php
+++ b/resources/lang/fr_FR/form.php
@@ -144,7 +144,7 @@ return [
     'delete_user'                => 'Supprimer l\'utilisateur ":email"',
     'user_areYouSure'            => 'Si vous supprimez l\'utilisateur ":email", tout disparaitra. Il n\'y a pas d\'annulation, de "dé-suppression" ou quoi que ce soit de la sorte. Si vous supprimez votre propre compte, vous n\'aurez plus accès à cette instance de Firefly III.',
     'attachment_areYouSure'      => 'Êtes-vous sûr de vouloir supprimer la pièce jointe nommée ":name" ?',
-    'account_areYouSure'         => 'Êtes-vous sûr de vouloir supprimer le compte nommé ": ame" ?',
+    'account_areYouSure'         => 'Êtes-vous sûr de vouloir supprimer le compte nommé ":name" ?',
     'bill_areYouSure'            => 'Êtes-vous sûr de vouloir supprimer la facture nommée ":name" ?',
     'rule_areYouSure'            => 'Êtes-vous sûr de vouloir supprimer la règle intitulée ":title" ?',
     'ruleGroup_areYouSure'       => 'Êtes-vous sûr de vouloir supprimer le groupe de règles intitulé ":title" ?',
@@ -169,6 +169,7 @@ return [
     'budget_keep_transactions'   => 'La seule opération liée à ce budget ne sera pas supprimée.|Les :count opérations liées à ce budget ne seront pas supprimées.',
     'category_keep_transactions' => 'La seule opération liée à cette catégorie ne sera pas supprimée.|Les :count opérations liées à cette catégorie ne seront pas supprimées.',
     'tag_keep_transactions'      => 'La seule opération liée à ce tag ne sera pas supprimée.|Les :count opérations liées à ce tag ne seront pas supprimées.',
+    'check_for_updates'          => 'Check for updates',
 
     'email'                 => 'Adresse Email',
     'password'              => 'Mot de passe',
diff --git a/resources/lang/fr_FR/import.php b/resources/lang/fr_FR/import.php
index fc6b00fcc6..a9d043eccb 100644
--- a/resources/lang/fr_FR/import.php
+++ b/resources/lang/fr_FR/import.php
@@ -50,9 +50,9 @@ return [
     'status_sub_title'                => 'Statut d\'importation',
     'config_sub_title'                => 'Configurez votre importation',
     'status_finished_job'             => 'Les transactions importées peuvent être trouvées avec le mot-clé :tag.',
-    'import_with_key'                 => 'Importer avec la clé \': key\'',
+    'import_with_key'                 => 'Importer avec la clé \':key\'',
 
-    // file: upload something:
+    // file, upload something
     'file_upload_title'               => 'Configuration de l\'importation (1/4) - Téléchargez votre fichier',
     'file_upload_text'                => 'Ce traitement vous aidera à importer des fichiers de votre banque dans Firefly III. Consultez les pages d\'aide en haut à droite.',
     'file_upload_fields'              => 'Champs',
@@ -61,10 +61,10 @@ return [
     'file_upload_type_help'           => 'Sélectionnez le type de fichier que vous allez télécharger',
     'file_upload_submit'              => 'Envoyer des fichiers',
 
-    // file: upload types
+    // file, upload types
     'import_file_type_csv'            => 'CSV (valeurs séparées par des virgules)',
 
-    // file: initial config for CSV
+    // file, initial config for CSV
     'csv_initial_title'               => 'Configuration d\'importation (2/4) - Configuration d\'importation CSV',
     'csv_initial_text'                => 'To be able to import your file correctly, please validate the options below.',
     'csv_initial_box'                 => 'Basic CSV import setup',
@@ -75,13 +75,13 @@ return [
     'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.',
     'csv_initial_submit'              => 'Continue with step 3/4',
 
-    // file: new options:
+    // file, new options:
     'file_apply_rules_title'          => 'Apply rules',
     'file_apply_rules_description'    => 'Apply your rules. Note that this slows the import significantly.',
     'file_match_bills_title'          => 'Match bills',
     'file_match_bills_description'    => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.',
 
-    // file: roles config
+    // file, roles config
     'csv_roles_title'                 => 'Import setup (3/4) - Define each column\'s role',
     'csv_roles_text'                  => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.',
     'csv_roles_table'                 => 'Table',
@@ -94,7 +94,7 @@ return [
     'csv_roles_submit'                => 'Continue with step 4/4',
     'csv_roles_warning'               => 'At the very least, mark one column as the amount-column. It is advisable to also select a column for the description, date and the opposing account.',
 
-    // file: map data
+    // file, map data
     'file_map_title'                  => 'Import setup (4/4) - Connect import data to Firefly III data',
     'file_map_text'                   => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
     'file_map_field_value'            => 'Field value',
@@ -141,11 +141,14 @@ return [
     'column_opposing-number'          => 'Opposing account (account number)',
     'column_note'                     => 'Note(s)',
 
+    // prerequisites
+    'prerequisites'                   => 'Prerequisites',
+
     // bunq
     'bunq_prerequisites_title'        => 'Prerequisites for an import from bunq',
     'bunq_prerequisites_text'         => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.',
 
-    // Spectre:
+    // Spectre
     'spectre_title'                   => 'Import using Spectre',
     'spectre_prerequisites_title'     => 'Prerequisites for an import using Spectre',
     'spectre_prerequisites_text'      => 'In order to import data using the Spectre API, you need to prove some secrets. They can be found on the secrets page.',
diff --git a/resources/lang/id_ID/demo.php b/resources/lang/id_ID/demo.php
index 9f7cb2ca15..7334a1ecf9 100644
--- a/resources/lang/id_ID/demo.php
+++ b/resources/lang/id_ID/demo.php
@@ -26,8 +26,8 @@ return [
     'index'                          => 'Selamat Datang di Firefly III! Di halaman ini Anda mendapatkan gambaran singkat tentang keuangan Anda. Untuk informasi lebih lanjut, lihat Akun → Setelan Akun dan tentu saja halaman Budgets123_4_6_32_23_32_19_7_321Reports. Atau hanya melihat-lihat dan melihat di mana Anda berakhir.',
     'accounts-index'                 => 'Akun aset adalah rekening bank pribadi Anda. Akun pengeluaran adalah akun yang Anda belanjakan, seperti toko dan teman. Akun pendapatan adalah rekening yang Anda terima dari, seperti pekerjaan Anda, pemerintah atau sumber pendapatan lainnya. Pada halaman ini Anda dapat mengedit atau menghapusnya.',
     'budgets-index'                  => 'Halaman ini menunjukkan ikhtisar anggaran Anda. Bagian atas menunjukkan jumlah yang tersedia untuk dianggarkan. Ini dapat disesuaikan untuk segala periode dengan mengklik jumlah di sebelah kanan. Jumlah yang sebenarnya Anda habiskan ditunjukkan di bilah di bawah ini. Di bawah ini adalah biaya per anggaran dan apa yang telah Anda anggarkan untuk mereka.',
-    'reports-index-start'            => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.',
-    'reports-index-examples'         => 'Pastikan untuk memeriksa contoh-contoh ini:  gambaran keuangan bulanan,  ikhtisar keuangan tahunan dan  gambaran umum anggaran.',
+    'reports-index-start'            => 'Firefly III mendukung sejumlah jenis laporan. Baca tentang mereka dengan mengklik -icon di pojok kanan atas.',
+    'reports-index-examples'         => 'Pastikan untuk memeriksa contoh-contoh ini: gambaran keuangan bulanan, ikhtisar keuangan tahunan dan gambaran umum anggaran.',
     'currencies-index'               => 'Firefly III mendukung banyak mata uang. Meski default ke Euro itu bisa diatur ke US Dollar dan banyak mata uang lainnya. Seperti yang bisa Anda lihat, sejumlah kecil mata uang telah disertakan namun Anda dapat menambahkannya sendiri jika menginginkannya. Mengubah mata uang default tidak akan mengubah mata uang dari transaksi yang ada namun: Firefly III mendukung penggunaan beberapa mata uang pada saat bersamaan.',
     'transactions-index'             => 'Biaya ini, deposito dan transfer tidak terlalu imajinatif. Mereka telah dihasilkan secara otomatis.',
     'piggy-banks-index'              => 'Seperti yang bisa Anda lihat, ada tiga celengan. Gunakan tombol plus dan minus untuk mempengaruhi jumlah uang di setiap celengan. Klik nama celengan untuk melihat administrasi masing-masing celengan.',
diff --git a/resources/lang/id_ID/firefly.php b/resources/lang/id_ID/firefly.php
index 3d826fb32c..0929bdded7 100644
--- a/resources/lang/id_ID/firefly.php
+++ b/resources/lang/id_ID/firefly.php
@@ -31,15 +31,15 @@ return [
     'today'                                      => 'hari ini',
     'customRange'                                => 'Rentang khusus',
     'apply'                                      => 'Menerapkan',
-    'select_date'                                => 'Pilih tanggal ..',
+    'select_date'                                => 'Pilih tanggal..',
     'cancel'                                     => 'Membatalkan',
     'from'                                       => 'Dari',
     'to'                                         => 'Untuk',
     'showEverything'                             => 'Tunjukkan semuanya',
     'never'                                      => 'Tak pernah',
     'no_results_for_empty_search'                => 'Pencarian Anda kosong, jadi tidak ada yang ditemukan.',
-    'removed_amount'                             => 'Dihapus: jumlah',
-    'added_amount'                               => 'Ditambahkan: jumlah',
+    'removed_amount'                             => 'Dihapus :amount',
+    'added_amount'                               => 'Ditambahkan :amount',
     'asset_account_role_help'                    => 'Setiap pilihan tambahan yang dihasilkan dari pilihan Anda dapat diatur nanti.',
     'Opening balance'                            => 'Saldo awal',
     'create_new_stuff'                           => 'Buat barang baru',
@@ -56,11 +56,11 @@ return [
     'flash_info'                                 => 'Pesan',
     'flash_warning'                              => 'PERINGATAN!',
     'flash_error'                                => 'Kesalahan!',
-    'flash_info_multiple'                        => 'Ada satu pesan: Ada: hitung pesan',
-    'flash_error_multiple'                       => 'Ada satu kesalahan: Ada: hitung kesalahan',
+    'flash_info_multiple'                        => 'Ada satu pesan|Ada :count pesan',
+    'flash_error_multiple'                       => 'Ada satu kesalahan|Ada :count kesalahan',
     'net_worth'                                  => 'Nilai bersih',
     'route_has_no_help'                          => 'Tidak ada bantuan untuk rute ini.',
-    'two_factor_welcome'                         => 'Halo,: pengguna!',
+    'two_factor_welcome'                         => 'Halo, :user!',
     'two_factor_enter_code'                      => 'Untuk melanjutkan, masukkan kode otentikasi dua faktor Anda. Aplikasi Anda bisa menghasilkannya untuk Anda.',
     'two_factor_code_here'                       => 'Masukkan kode di sini',
     'two_factor_title'                           => 'Dua faktor otentikasi',
@@ -70,8 +70,8 @@ return [
     'two_factor_lost_header'                     => 'Kehilangan autentikasi dua faktor Anda?',
     'two_factor_lost_intro'                      => 'Sayangnya, ini bukan sesuatu yang bisa Anda atur ulang dari antarmuka web. Anda punya dua pilihan.',
     'two_factor_lost_fix_self'                   => 'Jika Anda menjalankan contoh Firefly III Anda sendiri, periksa log di storage / logs untuk mendapatkan petunjuk.',
-    'two_factor_lost_fix_owner'                  => 'Jika tidak, kirimkan email ke pemilik situs, : site_owner dan mintalah mereka untuk menyetel ulang autentikasi dua faktor Anda.',
-    'warning_much_data'                          => ': hari hari data mungkin perlu beberapa saat untuk memuat.',
+    'two_factor_lost_fix_owner'                  => 'Jika tidak, kirimkan email ke pemilik situs, :site_owner dan mintalah mereka untuk menyetel ulang autentikasi dua faktor Anda.',
+    'warning_much_data'                          => ':days hari data mungkin perlu beberapa saat untuk memuat.',
     'registered'                                 => 'Anda telah berhasil mendaftar!',
     'Default asset account'                      => 'Akun aset standar',
     'no_budget_pointer'                          => 'Anda tampaknya belum memiliki anggaran. Anda harus membuat beberapa di halaman budgets. Anggaran dapat membantu Anda melacak pengeluaran.',
@@ -79,7 +79,7 @@ return [
     'Credit card'                                => 'Kartu kredit',
     'source_accounts'                            => 'Akun sumber',
     'destination_accounts'                       => 'Akun tujuan',
-    'user_id_is'                                 => 'Id pengguna Anda adalah : user',
+    'user_id_is'                                 => 'Id pengguna Anda adalah :user',
     'field_supports_markdown'                    => 'Bidang ini mendukung Markdown.',
     'need_more_help'                             => 'Jika Anda memerlukan bantuan lebih banyak menggunakan Firefly III, silakan opsi tiket di Github.',
     'reenable_intro_text'                        => 'Anda juga dapat mengaktifkan panduan pendahuluan.',
@@ -93,47 +93,47 @@ return [
     'cannot_redirect_to_account'                 => 'Firefly III tidak bisa mengalihkan Anda ke halaman yang benar. Permintaan maaf.',
     'sum_of_expenses'                            => 'Jumlah pengeluaran',
     'sum_of_income'                              => 'Jumlah pendapatan',
-    'spent_in_specific_budget'                   => 'Menghabiskan anggaran ": anggaran"',
-    'sum_of_expenses_in_budget'                  => 'Menghabiskan total dalam anggaran ": anggaran"',
+    'spent_in_specific_budget'                   => 'Menghabiskan anggaran ":budget"',
+    'sum_of_expenses_in_budget'                  => 'Menghabiskan total dalam anggaran ":budget"',
     'left_in_budget_limit'                       => 'Kiri untuk dibelanjakan sesuai budget',
     'current_period'                             => 'Periode sekarang',
     'show_the_current_period_and_overview'       => 'Tunjukkan periode dan ikhtisar saat ini',
     'pref_languages_locale'                      => 'Agar bahasa selain bahasa Inggris berfungsi dengan benar, sistem operasi Anda harus dilengkapi dengan informasi lokal yang benar. Jika ini tidak ada, data mata uang, tanggal dan jumlah mungkin salah diformat.',
-    'budget_in_period'                           => 'Semua transaksi untuk anggaran ": nama" antara: start dan: end',
-    'chart_budget_in_period'                     => 'Bagan untuk semua transaksi untuk anggaran ": nama" antara: start dan: end',
-    'chart_account_in_period'                    => 'Bagan untuk semua transaksi untuk akun ": nama" antara: start dan: end',
-    'chart_category_in_period'                   => 'Bagan untuk semua transaksi untuk kategori ": nama" antara: start dan: end',
-    'chart_category_all'                         => 'Bagan untuk semua transaksi untuk kategori ": nama"',
+    'budget_in_period'                           => 'Semua transaksi untuk anggaran ":name" antara :start dan :end',
+    'chart_budget_in_period'                     => 'Bagan untuk semua transaksi untuk anggaran ":name" antara :start dan :end',
+    'chart_account_in_period'                    => 'Bagan untuk semua transaksi untuk akun ":name" antara :start dan :end',
+    'chart_category_in_period'                   => 'Bagan untuk semua transaksi untuk kategori ":name" antara :start dan :end',
+    'chart_category_all'                         => 'Bagan untuk semua transaksi untuk kategori ":name"',
     'clone_withdrawal'                           => 'Kloning penarikan ini',
     'clone_deposit'                              => 'Kloning deposit ini',
     'clone_transfer'                             => 'Kloning transfer ini',
     'multi_select_no_selection'                  => 'Tidak ada yang di pilih',
     'multi_select_all_selected'                  => 'Semua dipilih',
     'multi_select_filter_placeholder'            => 'Menemukan..',
-    'between_dates_breadcrumb'                   => 'Antara: start dan: end',
+    'between_dates_breadcrumb'                   => 'Antara :start dan :end',
     'all_journals_without_budget'                => 'Semua transaksi tanpa anggaran',
     'journals_without_budget'                    => 'Transaksi tanpa anggaran',
     'all_journals_without_category'              => 'Semua transaksi tanpa kategori',
     'journals_without_category'                  => 'Transaksi tanpa kategori',
-    'all_journals_for_account'                   => 'Semua transaksi untuk akun: nama',
-    'chart_all_journals_for_account'             => 'Bagan semua transaksi untuk akun: nama',
-    'journals_in_period_for_account'             => 'Semua transaksi untuk akun: nama antara: start dan: end',
+    'all_journals_for_account'                   => 'Semua transaksi untuk akun :name',
+    'chart_all_journals_for_account'             => 'Bagan semua transaksi untuk akun :name',
+    'journals_in_period_for_account'             => 'Semua transaksi untuk akun :name antara :start dan :end',
     'transferred'                                => 'Ditransfer',
     'all_withdrawal'                             => 'Semua biaya',
     'all_transactions'                           => 'Semua Transaksi',
-    'title_withdrawal_between'                   => 'Semua biaya antara: start dan: end',
+    'title_withdrawal_between'                   => 'Semua biaya antara :start dan :end',
     'all_deposit'                                => 'Semua pendapatan',
-    'title_deposit_between'                      => 'Semua pendapatan antara: start dan: end',
+    'title_deposit_between'                      => 'Semua pendapatan antara :start dan :end',
     'all_transfers'                              => 'Semua transfer',
-    'title_transfers_between'                    => 'Semua transfer antara: start dan: end',
+    'title_transfers_between'                    => 'Semua transfer antara :start dan :end',
     'all_transfer'                               => 'Semua transfer',
-    'all_journals_for_tag'                       => 'Semua transaksi untuk tag ": tag"',
-    'title_transfer_between'                     => 'Semua transfer antara: start dan: end',
-    'all_journals_for_category'                  => 'Semua transaksi untuk kategori: nama',
-    'all_journals_for_budget'                    => 'Semua transaksi untuk anggaran: nama',
-    'chart_all_journals_for_budget'              => 'Bagan semua transaksi untuk anggaran: nama',
-    'journals_in_period_for_category'            => 'Semua transaksi untuk kategori: nama antara: start dan: end',
-    'journals_in_period_for_tag'                 => 'Semua transaksi untuk tag: tag antara: start and: end',
+    'all_journals_for_tag'                       => 'Semua transaksi untuk tag ":tag"',
+    'title_transfer_between'                     => 'Semua transfer antara :start dan :end',
+    'all_journals_for_category'                  => 'Semua transaksi untuk kategori :name',
+    'all_journals_for_budget'                    => 'Semua transaksi untuk anggaran :name',
+    'chart_all_journals_for_budget'              => 'Bagan semua transaksi untuk anggaran :name',
+    'journals_in_period_for_category'            => 'Semua transaksi untuk kategori :name antara :start dan :end',
+    'journals_in_period_for_tag'                 => 'Semua transaksi untuk tag :tag antara :start and :end',
     'not_available_demo_user'                    => 'Fitur yang Anda coba akses tidak tersedia untuk pengguna demo.',
     'exchange_rate_instructions'                 => 'Akun aset "@name" hanya menerima transaksi di @native_currency. Jika Anda ingin menggunakan @foreign_currency sebagai gantinya, pastikan jumlahnya di @native_currency juga diketahui:',
     'transfer_exchange_rate_instructions'        => 'Akun aset sumber "@source_name" hanya menerima transaksi di @source_currency. Akun aset tujuan "@dest_name" hanya menerima transaksi di @dest_currency. Anda harus memberikan jumlah yang ditransfer dengan benar pada kedua mata uang tersebut.',
@@ -142,6 +142,22 @@ return [
     'invalid_locale_settings'                    => 'Firefly III tidak dapat memformat jumlah uang karena server Anda kehilangan paket yang dibutuhkan. Ada instructions bagaimana melakukan ini.',
     'quickswitch'                                => 'Quickswitch',
 
+    // check for updates:
+    'update_check_title'                         => 'Check for updates',
+    'admin_update_check_title'                   => 'Automatically check for update',
+    'admin_update_check_explain'                 => 'Firefly III can check for updates automatically. When you enable this setting, it will contact Github to see if a new version of Firefly III is available. When it is, you will get a notification. You can test this notification using the button on the right. Please indicate below if you want Firefly III to check for updates.',
+    'check_for_updates_permission'               => 'Firefly III can check for updates, but it needs your permission to do so. Please go to the administration to indicate if you would like this feature to be enabled.',
+    'updates_ask_me_later'                       => 'Ask me later',
+    'updates_do_not_check'                       => 'Do not check for updates',
+    'updates_enable_check'                       => 'Enable the check for updates',
+    'admin_update_check_now_title'               => 'Check for updates now',
+    'admin_update_check_now_explain'             => 'If you press the button, Firefly III will see if your current version is the latest.',
+    'check_for_updates_button'                   => 'Check now!',
+    'update_new_version_alert'                   => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
+    'update_current_version_alert'               => 'You are running v:version, which is the latest available release.',
+    'update_newer_version_alert'                 => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
+    'update_check_error'                         => 'An error occurred while checking for updates. Please view the log files.',
+
     // search
     'search'                                     => 'Pencarian',
     'search_query'                               => 'Pertanyaan',
@@ -150,7 +166,7 @@ return [
     'search_box'                                 => 'Pencarian',
     'search_box_intro'                           => 'Selamat datang di fungsi pencarian Firefly III. Masukkan kueri penelusuran Anda di dalam kotak. Pastikan Anda memeriksa file bantuan karena pencariannya cukup canggih.',
     'search_error'                               => 'Kesalahan saat mencari',
-    'search_searching'                           => 'Mencari ...',
+    'search_searching'                           => 'Mencari...',
     'search_results'                             => 'Hasil Pencarian',
 
     // repeat frequencies:
@@ -175,18 +191,18 @@ return [
     'include_old_uploads_help'                   => 'Firefly III tidak membuang file CSV asli yang telah Anda impor sebelumnya. Anda bisa memasukkannya ke dalam ekspor Anda.',
     'do_export'                                  => 'Ekspor',
     'export_status_never_started'                => 'Ekspor belum dimulai',
-    'export_status_make_exporter'                => 'Membuat barang eksportir ...',
-    'export_status_collecting_journals'          => 'Mengumpulkan transaksi Anda ...',
+    'export_status_make_exporter'                => 'Membuat barang eksportir...',
+    'export_status_collecting_journals'          => 'Mengumpulkan transaksi Anda...',
     'export_status_collected_journals'           => 'Mengumpulkan transaksi Anda!',
-    'export_status_converting_to_export_format'  => 'Mengubah transaksi Anda ...',
+    'export_status_converting_to_export_format'  => 'Mengubah transaksi Anda...',
     'export_status_converted_to_export_format'   => 'Mengubah transaksi anda!',
-    'export_status_creating_journal_file'        => 'Membuat file ekspor ...',
+    'export_status_creating_journal_file'        => 'Membuat file ekspor...',
     'export_status_created_journal_file'         => 'Membuat file ekspor!',
-    'export_status_collecting_attachments'       => 'Mengumpulkan semua lampiran Anda ...',
+    'export_status_collecting_attachments'       => 'Mengumpulkan semua lampiran Anda...',
     'export_status_collected_attachments'        => 'Mengumpulkan semua lampiran Anda!',
-    'export_status_collecting_old_uploads'       => 'Mengumpulkan semua unggahan sebelumnya ...',
+    'export_status_collecting_old_uploads'       => 'Mengumpulkan semua unggahan sebelumnya...',
     'export_status_collected_old_uploads'        => 'Mengumpulkan semua upload sebelumnya!',
-    'export_status_creating_zip_file'            => 'Membuat file zip ...',
+    'export_status_creating_zip_file'            => 'Membuat file zip...',
     'export_status_created_zip_file'             => 'Membuat file zip!',
     'export_status_finished'                     => 'Ekspor telah berhasil selesai! Yay!',
     'export_data_please_wait'                    => 'Mohon tunggu...',
@@ -202,23 +218,23 @@ return [
     'rule_priority_down'                         => 'Berikan peraturan kurang prioritas',
     'make_new_rule_group'                        => 'Buat grup aturan baru',
     'store_new_rule_group'                       => 'Simpan grup aturan baru',
-    'created_new_rule_group'                     => 'Kelompok aturan baru ": judul" disimpan!',
-    'updated_rule_group'                         => 'Grup aturan yang berhasil diperbarui ": title".',
-    'edit_rule_group'                            => 'Edit grup aturan ": judul"',
-    'delete_rule_group'                          => 'Hapus grup aturan ": judul"',
-    'deleted_rule_group'                         => 'Grup aturan yang dihapus ": judul"',
+    'created_new_rule_group'                     => 'Kelompok aturan baru ":title" disimpan!',
+    'updated_rule_group'                         => 'Grup aturan yang berhasil diperbarui ":title".',
+    'edit_rule_group'                            => 'Edit grup aturan ":title"',
+    'delete_rule_group'                          => 'Hapus grup aturan ":title"',
+    'deleted_rule_group'                         => 'Grup aturan yang dihapus ":title"',
     'update_rule_group'                          => 'Perbarui grup aturan',
     'no_rules_in_group'                          => 'Tidak ada aturan dalam kelompok ini',
     'move_rule_group_up'                         => 'Pindahkan grup aturan ke atas',
     'move_rule_group_down'                       => 'Pindahkan grup aturan ke bawah',
     'save_rules_by_moving'                       => 'Simpan aturan ini dengan memindahkannya ke grup aturan lain:',
-    'make_new_rule'                              => 'Buat aturan baru di grup aturan ": title"',
+    'make_new_rule'                              => 'Buat aturan baru di grup aturan ":title"',
     'rule_help_stop_processing'                  => 'Saat Anda mencentang kotak ini, nanti aturan dalam grup ini tidak akan dijalankan.',
     'rule_help_active'                           => 'Aturan tidak aktif tidak akan pernah menyala.',
-    'stored_new_rule'                            => 'Aturan baru yang tersimpan dengan judul ": title"',
-    'deleted_rule'                               => 'Aturan yang dihapus dengan judul ": title"',
+    'stored_new_rule'                            => 'Aturan baru yang tersimpan dengan judul ":title"',
+    'deleted_rule'                               => 'Aturan yang dihapus dengan judul ":title"',
     'store_new_rule'                             => 'Simpan peraturan baru',
-    'updated_rule'                               => 'Aturan yang diperbarui dengan judul ": title"',
+    'updated_rule'                               => 'Aturan yang diperbarui dengan judul ":title"',
     'default_rule_group_name'                    => 'Aturan baku',
     'default_rule_group_description'             => 'Semua peraturan Anda tidak ada dalam kelompok tertentu.',
     'default_rule_name'                          => 'Aturan default pertama Anda',
@@ -235,64 +251,64 @@ return [
     'action_value'                               => 'Nilai tindakan',
     'stop_executing_other_actions'               => 'Berhenti mengeksekusi tindakan lainnya',
     'add_rule_action'                            => 'Tambahkan tindakan baru',
-    'edit_rule'                                  => 'Edit aturan ": judul"',
-    'delete_rule'                                => 'Hapus aturan ": judul"',
+    'edit_rule'                                  => 'Edit aturan ":title"',
+    'delete_rule'                                => 'Hapus aturan ":title"',
     'update_rule'                                => 'Perbarui aturan',
     'test_rule_triggers'                         => 'Lihat transaksi yang sesuai',
-    'warning_transaction_subset'                 => 'Untuk alasan kinerja daftar ini terbatas pada: max_num_transactions dan mungkin hanya menampilkan subset dari transaksi yang cocok',
-    'warning_no_matching_transactions'           => 'Tidak ada transaksi yang cocok ditemukan. Harap dicatat bahwa untuk alasan kinerja, hanya yang terakhir: transaksi num_transaksi telah diperiksa.',
+    'warning_transaction_subset'                 => 'Untuk alasan kinerja daftar ini terbatas pada :max_num_transactions dan mungkin hanya menampilkan subset dari transaksi yang cocok',
+    'warning_no_matching_transactions'           => 'Tidak ada transaksi yang cocok ditemukan. Harap dicatat bahwa untuk alasan kinerja, hanya yang terakhir transaksi :num_transactions telah diperiksa.',
     'warning_no_valid_triggers'                  => 'Tidak ada pemicu yang valid.',
-    'apply_rule_selection'                       => 'Terapkan aturan ": judul" untuk pilihan transaksi Anda',
-    'apply_rule_selection_intro'                 => 'Aturan seperti ": judul" biasanya hanya diterapkan pada transaksi baru atau yang telah diperbarui, namun Anda bisa memberi tahu Firefly III untuk menjalankannya pada pilihan transaksi Anda yang ada. Ini bisa berguna bila Anda telah memperbarui peraturan dan Anda memerlukan perubahan yang akan diterapkan pada semua transaksi Anda yang lain.',
+    'apply_rule_selection'                       => 'Terapkan aturan ":title" untuk pilihan transaksi Anda',
+    'apply_rule_selection_intro'                 => 'Aturan seperti ":title" biasanya hanya diterapkan pada transaksi baru atau yang telah diperbarui, namun Anda bisa memberi tahu Firefly III untuk menjalankannya pada pilihan transaksi Anda yang ada. Ini bisa berguna bila Anda telah memperbarui peraturan dan Anda memerlukan perubahan yang akan diterapkan pada semua transaksi Anda yang lain.',
     'include_transactions_from_accounts'         => 'Sertakan transaksi dari akun ini',
-    'applied_rule_selection'                     => 'Aturan ": judul" telah diterapkan pada pilihan Anda.',
+    'applied_rule_selection'                     => 'Aturan ":title" telah diterapkan pada pilihan Anda.',
     'execute'                                    => 'Menjalankan',
-    'apply_rule_group_selection'                 => 'Terapkan grup aturan ": judul" ke pilihan transaksi Anda',
-    'apply_rule_group_selection_intro'           => 'Kelompok aturan seperti ": judul" biasanya hanya diterapkan pada transaksi baru atau yang diperbarui, namun Anda dapat memberi tahu Firefly III untuk menjalankan semua aturan dalam grup ini pada pilihan transaksi Anda saat ini. Ini bisa berguna bila Anda telah memperbarui sekumpulan aturan dan Anda memerlukan perubahan yang akan diterapkan pada semua transaksi Anda yang lain.',
-    'applied_rule_group_selection'               => 'Rule group ": title" telah diterapkan pada pilihan Anda.',
+    'apply_rule_group_selection'                 => 'Terapkan grup aturan ":title" ke pilihan transaksi Anda',
+    'apply_rule_group_selection_intro'           => 'Kelompok aturan seperti ":title" biasanya hanya diterapkan pada transaksi baru atau yang diperbarui, namun Anda dapat memberi tahu Firefly III untuk menjalankan semua aturan dalam grup ini pada pilihan transaksi Anda saat ini. Ini bisa berguna bila Anda telah memperbarui sekumpulan aturan dan Anda memerlukan perubahan yang akan diterapkan pada semua transaksi Anda yang lain.',
+    'applied_rule_group_selection'               => 'Rule group ":title" telah diterapkan pada pilihan Anda.',
 
     // actions and triggers
-    'rule_trigger_user_action'                   => 'Tindakan pengguna adalah ": trigger_value"',
-    'rule_trigger_from_account_starts_choice'    => 'Akun sumber dimulai dengan ..',
-    'rule_trigger_from_account_starts'           => 'Akun sumber dimulai dengan ": trigger_value"',
-    'rule_trigger_from_account_ends_choice'      => 'Akun sumber diakhiri dengan ..',
-    'rule_trigger_from_account_ends'             => 'Akun sumber diakhiri dengan ": trigger_value"',
-    'rule_trigger_from_account_is_choice'        => 'Akun sumber ..',
-    'rule_trigger_from_account_is'               => 'Akun sumber adalah ": trigger_value"',
-    'rule_trigger_from_account_contains_choice'  => 'Akun sumber berisi ..',
-    'rule_trigger_from_account_contains'         => 'Akun sumber berisi ": trigger_value"',
-    'rule_trigger_to_account_starts_choice'      => 'Akun tujuan dimulai dengan ..',
-    'rule_trigger_to_account_starts'             => 'Akun tujuan dimulai dengan ": trigger_value"',
-    'rule_trigger_to_account_ends_choice'        => 'Akun tujuan diakhiri dengan ..',
-    'rule_trigger_to_account_ends'               => 'Akun tujuan diakhiri dengan ": trigger_value"',
-    'rule_trigger_to_account_is_choice'          => 'Akun tujuan ..',
-    'rule_trigger_to_account_is'                 => 'Akun tujuan adalah ": trigger_value"',
-    'rule_trigger_to_account_contains_choice'    => 'Akun tujuan berisi ..',
-    'rule_trigger_to_account_contains'           => 'Akun tujuan berisi ": trigger_value"',
-    'rule_trigger_transaction_type_choice'       => 'Transaksi adalah tipe ..',
-    'rule_trigger_transaction_type'              => 'Transaksi adalah tipe ": trigger_value"',
-    'rule_trigger_category_is_choice'            => 'Kategori adalah ..',
-    'rule_trigger_category_is'                   => 'Kategori adalah ": trigger_value"',
-    'rule_trigger_amount_less_choice'            => 'Jumlahnya kurang dari ..',
-    'rule_trigger_amount_less'                   => 'Jumlahnya kurang dari: trigger_value',
-    'rule_trigger_amount_exactly_choice'         => 'Jumlahnya ..',
-    'rule_trigger_amount_exactly'                => 'Jumlahnya adalah: trigger_value',
-    'rule_trigger_amount_more_choice'            => 'Jumlahnya lebih dari ..',
-    'rule_trigger_amount_more'                   => 'Jumlahnya lebih dari: trigger_value',
-    'rule_trigger_description_starts_choice'     => 'Deskripsi dimulai dengan ..',
-    'rule_trigger_description_starts'            => 'Deskripsi dimulai dengan ": trigger_value"',
-    'rule_trigger_description_ends_choice'       => 'Deskripsi diakhiri dengan ..',
-    'rule_trigger_description_ends'              => 'Deskripsi diakhiri dengan ": trigger_value"',
-    'rule_trigger_description_contains_choice'   => 'Deskripsi berisi ..',
-    'rule_trigger_description_contains'          => 'Deskripsi berisi ": trigger_value"',
-    'rule_trigger_description_is_choice'         => 'Deskripsi adalah ..',
-    'rule_trigger_description_is'                => 'Deskripsi adalah ": trigger_value"',
-    'rule_trigger_budget_is_choice'              => 'Anggaran adalah ..',
-    'rule_trigger_budget_is'                     => 'Anggaran adalah ": trigger_value"',
-    'rule_trigger_tag_is_choice'                 => '(A) tag adalah ..',
-    'rule_trigger_tag_is'                        => 'Tag adalah ": trigger_value"',
+    'rule_trigger_user_action'                   => 'Tindakan pengguna adalah ":trigger_value"',
+    'rule_trigger_from_account_starts_choice'    => 'Akun sumber dimulai dengan..',
+    'rule_trigger_from_account_starts'           => 'Akun sumber dimulai dengan ":trigger_value"',
+    'rule_trigger_from_account_ends_choice'      => 'Akun sumber diakhiri dengan..',
+    'rule_trigger_from_account_ends'             => 'Akun sumber diakhiri dengan ":trigger_value"',
+    'rule_trigger_from_account_is_choice'        => 'Akun sumber..',
+    'rule_trigger_from_account_is'               => 'Akun sumber adalah ":trigger_value"',
+    'rule_trigger_from_account_contains_choice'  => 'Akun sumber berisi..',
+    'rule_trigger_from_account_contains'         => 'Akun sumber berisi ":trigger_value"',
+    'rule_trigger_to_account_starts_choice'      => 'Akun tujuan dimulai dengan..',
+    'rule_trigger_to_account_starts'             => 'Akun tujuan dimulai dengan ":trigger_value"',
+    'rule_trigger_to_account_ends_choice'        => 'Akun tujuan diakhiri dengan..',
+    'rule_trigger_to_account_ends'               => 'Akun tujuan diakhiri dengan ":trigger_value"',
+    'rule_trigger_to_account_is_choice'          => 'Akun tujuan..',
+    'rule_trigger_to_account_is'                 => 'Akun tujuan adalah ":trigger_value"',
+    'rule_trigger_to_account_contains_choice'    => 'Akun tujuan berisi..',
+    'rule_trigger_to_account_contains'           => 'Akun tujuan berisi ":trigger_value"',
+    'rule_trigger_transaction_type_choice'       => 'Transaksi adalah tipe..',
+    'rule_trigger_transaction_type'              => 'Transaksi adalah tipe ":trigger_value"',
+    'rule_trigger_category_is_choice'            => 'Kategori adalah..',
+    'rule_trigger_category_is'                   => 'Kategori adalah ":trigger_value"',
+    'rule_trigger_amount_less_choice'            => 'Jumlahnya kurang dari..',
+    'rule_trigger_amount_less'                   => 'Jumlahnya kurang dari :trigger_value',
+    'rule_trigger_amount_exactly_choice'         => 'Jumlahnya..',
+    'rule_trigger_amount_exactly'                => 'Jumlahnya adalah:trigger_value',
+    'rule_trigger_amount_more_choice'            => 'Jumlahnya lebih dari..',
+    'rule_trigger_amount_more'                   => 'Jumlahnya lebih dari :trigger_value',
+    'rule_trigger_description_starts_choice'     => 'Deskripsi dimulai dengan..',
+    'rule_trigger_description_starts'            => 'Deskripsi dimulai dengan ":trigger_value"',
+    'rule_trigger_description_ends_choice'       => 'Deskripsi diakhiri dengan..',
+    'rule_trigger_description_ends'              => 'Deskripsi diakhiri dengan ":trigger_value"',
+    'rule_trigger_description_contains_choice'   => 'Deskripsi berisi..',
+    'rule_trigger_description_contains'          => 'Deskripsi berisi ":trigger_value"',
+    'rule_trigger_description_is_choice'         => 'Deskripsi adalah..',
+    'rule_trigger_description_is'                => 'Deskripsi adalah ":trigger_value"',
+    'rule_trigger_budget_is_choice'              => 'Anggaran adalah..',
+    'rule_trigger_budget_is'                     => 'Anggaran adalah ":trigger_value"',
+    'rule_trigger_tag_is_choice'                 => '(A) tag adalah..',
+    'rule_trigger_tag_is'                        => 'Tag adalah ":trigger_value"',
     'rule_trigger_has_attachments_choice'        => 'Paling tidak banyak keterikatan ini',
-    'rule_trigger_has_attachments'               => 'Paling tidak: trigger_value attachment (s)',
+    'rule_trigger_has_attachments'               => 'Paling tidak:trigger_value attachment (s)',
     'rule_trigger_store_journal'                 => 'Saat transaksi dibuat',
     'rule_trigger_update_journal'                => 'Saat transaksi diperbarui',
     'rule_trigger_has_no_category_choice'        => 'Tidak memiliki kategori',
@@ -312,23 +328,23 @@ return [
     'rule_trigger_no_notes_choice'               => 'Tidak memiliki catatan',
     'rule_trigger_no_notes'                      => 'Transaksi tidak memiliki catatan',
     'rule_trigger_notes_are_choice'              => 'Catatan adalah..',
-    'rule_trigger_notes_are'                     => 'Catatan adalah ": trigger_value"',
+    'rule_trigger_notes_are'                     => 'Catatan adalah ":trigger_value"',
     'rule_trigger_notes_contain_choice'          => 'Catatan berisi..',
-    'rule_trigger_notes_contain'                 => 'Catatan berisi ": trigger_value"',
+    'rule_trigger_notes_contain'                 => 'Catatan berisi ":trigger_value"',
     'rule_trigger_notes_start_choice'            => 'Catatan dimulai dengan..',
-    'rule_trigger_notes_start'                   => 'Catatan dimulai dengan ": trigger_value"',
+    'rule_trigger_notes_start'                   => 'Catatan dimulai dengan ":trigger_value"',
     'rule_trigger_notes_end_choice'              => 'Catatan diakhiri dengan..',
-    'rule_trigger_notes_end'                     => 'Catatan diakhiri dengan ": trigger_value"',
-    'rule_action_set_category'                   => 'Tetapkan kategori ke ": action_value"',
+    'rule_trigger_notes_end'                     => 'Catatan diakhiri dengan ":trigger_value"',
+    'rule_action_set_category'                   => 'Tetapkan kategori ke ":action_value"',
     'rule_action_clear_category'                 => 'Kategori yang jelas',
-    'rule_action_set_budget'                     => 'Tetapkan anggaran ke ": action_value"',
+    'rule_action_set_budget'                     => 'Tetapkan anggaran ke ":action_value"',
     'rule_action_clear_budget'                   => 'Jelas anggaran',
-    'rule_action_add_tag'                        => 'Tambahkan tag ": action_value"',
-    'rule_action_remove_tag'                     => 'Hapus tag ": action_value"',
+    'rule_action_add_tag'                        => 'Tambahkan tag ":action_value"',
+    'rule_action_remove_tag'                     => 'Hapus tag ":action_value"',
     'rule_action_remove_all_tags'                => 'Hapus semua tag',
-    'rule_action_set_description'                => 'Tetapkan deskripsi ke ": action_value"',
-    'rule_action_append_description'             => 'Tambahkan deskripsi dengan ": action_value"',
-    'rule_action_prepend_description'            => 'Masukan dulu deskripsi dengan ": action_value"',
+    'rule_action_set_description'                => 'Tetapkan deskripsi ke ":action_value"',
+    'rule_action_append_description'             => 'Tambahkan deskripsi dengan ":action_value"',
+    'rule_action_prepend_description'            => 'Masukan dulu deskripsi dengan ":action_value"',
     'rule_action_set_category_choice'            => 'Tetapkan kategori ke..',
     'rule_action_clear_category_choice'          => 'Kosongkan kategori apapun',
     'rule_action_set_budget_choice'              => 'Tetapkan anggaran ke..',
@@ -340,17 +356,17 @@ return [
     'rule_action_append_description_choice'      => 'Tambahkan deskripsi dengan..',
     'rule_action_prepend_description_choice'     => 'Tambahkan deskripsi dengan..',
     'rule_action_set_source_account_choice'      => 'Tetapkan akun sumber ke...',
-    'rule_action_set_source_account'             => 'Tetapkan akun sumber ke: action_value',
-    'rule_action_set_destination_account_choice' => 'Tetapkan akun tujuan ke ...',
-    'rule_action_set_destination_account'        => 'Tetapkan akun tujuan ke: action_value',
-    'rule_action_append_notes_choice'            => 'Tambahkan catatan dengan ..',
-    'rule_action_append_notes'                   => 'Tambahkan catatan dengan ": action_value"',
-    'rule_action_prepend_notes_choice'           => 'Prepend catatan dengan ..',
-    'rule_action_prepend_notes'                  => 'Catatan prepend dengan ": action_value"',
+    'rule_action_set_source_account'             => 'Tetapkan akun sumber ke :action_value',
+    'rule_action_set_destination_account_choice' => 'Tetapkan akun tujuan ke...',
+    'rule_action_set_destination_account'        => 'Tetapkan akun tujuan ke :action_value',
+    'rule_action_append_notes_choice'            => 'Tambahkan catatan dengan..',
+    'rule_action_append_notes'                   => 'Tambahkan catatan dengan ":action_value"',
+    'rule_action_prepend_notes_choice'           => 'Prepend catatan dengan..',
+    'rule_action_prepend_notes'                  => 'Catatan prepend dengan ":action_value"',
     'rule_action_clear_notes_choice'             => 'Hapus catatan apapun',
     'rule_action_clear_notes'                    => 'Hapus catatan apapun',
-    'rule_action_set_notes_choice'               => 'Tetapkan catatan ke ..',
-    'rule_action_set_notes'                      => 'Tetapkan catatan ke ": action_value"',
+    'rule_action_set_notes_choice'               => 'Tetapkan catatan ke..',
+    'rule_action_set_notes'                      => 'Tetapkan catatan ke ":action_value"',
 
     'rules_have_read_warning'                  => 'Sudahkah anda membaca peringatannya?',
     'apply_rule_warning'                       => 'Peringatan: menjalankan aturan (grup) pada banyak pilihan transaksi bisa memakan waktu lama, dan bisa time-out. Jika ya, aturan (grup) hanya akan diterapkan ke subkumpulan transaksi yang tidak diketahui. Ini mungkin akan membuat administrasi keuangan Anda berantakan. Tolong hati-hati.',
@@ -404,11 +420,11 @@ return [
     'pref_home_show_deposits'                  => 'Tampilkan deposito pada layar awal',
     'pref_home_show_deposits_info'             => 'Layar awal sudah menunjukkan rekening pengeluaran Anda. Harus itu juga menunjukkan akun pendapatan Anda?',
     'pref_home_do_show_deposits'               => 'Ya, menunjukkan kepada mereka',
-    'successful_count'                         => 'yang: menghitung sukses',
+    'successful_count'                         => ':count menghitung sukses',
     'list_page_size_title'                     => 'Ukuran halaman',
     'list_page_size_help'                      => 'Setiap daftar hal-hal (rekening, transaksi, dll) menunjukkan paling ini banyak per halaman.',
     'list_page_size_label'                     => 'Ukuran halaman',
-    'between_dates'                            => '(:Mulai dan :akhir)',
+    'between_dates'                            => '(:start dan :end)',
     'pref_optional_fields_transaction'         => 'Bidang opsional untuk transaksi',
     'pref_optional_fields_transaction_help'    => 'Secara default tidak semua bidang diaktifkan saat membuat transaksi baru (karena kekacauan). Di bawah, Anda dapat mengaktifkan bidang ini jika Anda berpikir mereka bisa berguna bagi Anda. Tentu saja, setiap bidang yang dinonaktifkan, tapi sudah diisi, akan terlihat terlepas dari pengaturan.',
     'optional_tj_date_fields'                  => 'Bidang tanggal',
@@ -447,32 +463,32 @@ return [
     'what_is_pw_security'                      => 'Apa itu "memverifikasi keamanan password"?',
     'secure_pw_title'                          => 'Bagaimana memilih sebuah password yang aman',
     'secure_pw_history'                        => 'Pada Agustus 2017 terkenal peneliti keamanan Troy berburu merilis daftar 306 juta password dicuri. password tersebut dicuri selama breakins di perusahaan seperti LinkedIn, Adobe dan Neopets (dan banyak lagi).',
-    'secure_pw_check_box'                      => 'Dengan mencentang kotaknya, Firefly III akan mengirimkan hash SHA1 dari kata sandi Anda ke  situs web dari Troy Hunt  untuk melihat apakah itu ada dalam daftar. Ini akan menghentikan Anda untuk menggunakan kata kunci yang tidak aman seperti yang disarankan di  Publikasi Khusus NIST  atas Subjek ini.',
+    'secure_pw_check_box'                      => 'Dengan mencentang kotaknya, Firefly III akan mengirimkan hash SHA1 dari kata sandi Anda ke situs web dari Troy Hunt untuk melihat apakah itu ada dalam daftar. Ini akan menghentikan Anda untuk menggunakan kata kunci yang tidak aman seperti yang disarankan di Publikasi Khusus NIST atas Subjek ini.',
     'secure_pw_sha1'                           => 'Tapi saya pikir SHA1 rusak?',
-    'secure_pw_hash_speed'                     => 'Ya, tapi tidak dalam konteks ini. Seperti yang bisa Anda baca di  situs web yang merinci bagaimana mereka melanggar SHA1 , sekarang sedikit lebih mudah untuk menemukan "tabrakan": string lain yang menghasilkan sama SHA1-hash Sekarang hanya membutuhkan waktu 10.000 tahun dengan menggunakan mesin GPU tunggal.',
+    'secure_pw_hash_speed'                     => 'Ya, tapi tidak dalam konteks ini. Seperti yang bisa Anda baca di situs web yang merinci bagaimana mereka melanggar SHA1, sekarang sedikit lebih mudah untuk menemukan "tabrakan": string lain yang menghasilkan sama SHA1-hash Sekarang hanya membutuhkan waktu 10.000 tahun dengan menggunakan mesin GPU tunggal.',
     'secure_pw_hash_security'                  => 'Tabrakan ini tidak akan sama dengan kata sandi Anda, juga tidak akan berguna di (situs seperti) Firefly III. Aplikasi ini tidak menggunakan SHA1 untuk verifikasi kata sandi. Jadi aman untuk mencentang kotak ini. Kata sandi Anda hashed dan dikirim melalui HTTPS.',
     'secure_pw_should'                         => 'Haruskah saya mencentang kotaknya?',
-    'secure_pw_long_password'                  => 'Jika Anda baru saja menghasilkan kata sandi penggunaan tunggal yang hebat untuk Firefly III menggunakan beberapa jenis generator kata kunci:  tidak .',
-    'secure_pw_short'                          => 'Jika Anda baru memasukkan kata sandi yang selalu Anda gunakan:  Please yes .',
+    'secure_pw_long_password'                  => 'Jika Anda baru saja menghasilkan kata sandi penggunaan tunggal yang hebat untuk Firefly III menggunakan beberapa jenis generator kata kunci: tidak.',
+    'secure_pw_short'                          => 'Jika Anda baru memasukkan kata sandi yang selalu Anda gunakan: Please yes.',
     'personal_access_token'                    => 'Token akses pribadi',
     'explain_access_token'                     => 'Anda memerlukan token ini untuk melakukan opsi baris perintah, seperti mengimpor atau mengekspor data. Tanpa itu, perintah sensitif semacam itu tidak akan berhasil. Jangan berbagi token akses Anda. Tidak ada yang akan menanyakan token ini, bahkan saya pun tidak. Jika Anda takut kehilangan ini, atau saat Anda paranoid, pulihkan token ini dengan menggunakan tombolnya.',
     'regenerate_access_token'                  => 'Regenerasi token akses',
     'token_regenerated'                        => 'Token baru dihasilkan',
     'change_your_email'                        => 'Ubah alamat email anda',
-    'email_verification'                       => 'Pesan email akan dikirim ke alamat email lama DAN baru Anda. Untuk tujuan keamanan, Anda tidak dapat masuk sampai Anda memverifikasi alamat email baru Anda. Jika Anda tidak yakin apakah instalasi Firefly III Anda bisa mengirim email, tolong jangan gunakan fitur ini. Jika Anda seorang administrator, Anda dapat mengujinya di  Administrasi .',
+    'email_verification'                       => 'Pesan email akan dikirim ke alamat email lama DAN baru Anda. Untuk tujuan keamanan, Anda tidak dapat masuk sampai Anda memverifikasi alamat email baru Anda. Jika Anda tidak yakin apakah instalasi Firefly III Anda bisa mengirim email, tolong jangan gunakan fitur ini. Jika Anda seorang administrator, Anda dapat mengujinya di Administrasi.',
     'email_changed_logout'                     => 'Sampai Anda memverifikasi alamat email Anda, Anda tidak dapat login.',
     'login_with_new_email'                     => 'Anda sekarang bisa masuk dengan alamat email baru Anda.',
     'login_with_old_email'                     => 'Anda sekarang dapat login dengan alamat email lama Anda lagi.',
 
     // attachments
-    'nr_of_attachments'                        => 'Satu lampiran |: hitung lampiran',
+    'nr_of_attachments'                        => 'Satu lampiran |:count lampiran',
     'attachments'                              => 'Lampiran',
-    'edit_attachment'                          => 'Edit lampiran ": nama"',
+    'edit_attachment'                          => 'Edit lampiran ":name"',
     'update_attachment'                        => 'Perbarui lampiran',
-    'delete_attachment'                        => 'Hapus lampiran ": nama"',
-    'attachment_deleted'                       => 'Lampiran yang dihapus ": nama"',
-    'attachment_updated'                       => 'Lampiran yang diperbarui ": nama"',
-    'upload_max_file_size'                     => 'Ukuran file maksimum:: ukuran',
+    'delete_attachment'                        => 'Hapus lampiran ":name"',
+    'attachment_deleted'                       => 'Lampiran yang dihapus ":name"',
+    'attachment_updated'                       => 'Lampiran yang diperbarui ":name"',
+    'upload_max_file_size'                     => 'Ukuran file maksimum: :size',
 
     // transaction index
     'title_expenses'                           => 'Beban',
@@ -486,9 +502,9 @@ return [
     'convert_is_already_type_Withdrawal'       => 'Transaksi ini sudah menjadi penarikan',
     'convert_is_already_type_Deposit'          => 'Transaksi ini sudah menjadi deposit',
     'convert_is_already_type_Transfer'         => 'Transaksi ini sudah di transfer',
-    'convert_to_Withdrawal'                    => 'Convert ": description" ke penarikan',
-    'convert_to_Deposit'                       => 'Convert ": description" ke deposit',
-    'convert_to_Transfer'                      => 'Convert ": description" ke sebuah transfer',
+    'convert_to_Withdrawal'                    => 'Convert ":description" ke penarikan',
+    'convert_to_Deposit'                       => 'Convert ":description" ke deposit',
+    'convert_to_Transfer'                      => 'Convert ":description" ke sebuah transfer',
     'convert_options_WithdrawalDeposit'        => 'Mengkonversi penarikan menjadi deposit',
     'convert_options_WithdrawalTransfer'       => 'Mengkonversi penarikan ke dalam transfer',
     'convert_options_DepositTransfer'          => 'Mengkonversi deposit ke transfer',
@@ -505,12 +521,12 @@ return [
     'convert_please_set_asset_destination'     => 'Silakan pilih akun aset dimana uangnya akan digunakan.',
     'convert_please_set_expense_destination'   => 'Tolong pilih rekening pengeluaran yang akan digunakan untuk uang.',
     'convert_please_set_asset_source'          => 'Silakan pilih akun aset dari mana uang itu berasal.',
-    'convert_explanation_withdrawal_deposit'   => 'Jika Anda mengubah penarikan ini menjadi deposit ,: jumlah akan disetorkan ke  : sourceName  alih-alih diambil darinya.',
-    'convert_explanation_withdrawal_transfer'  => 'Jika Anda mengubah penarikan ini menjadi transfer ,: jumlah akan ditransfer dari  : sourceName  ke akun aset baru, alih-alih dibayar ke  : destinationName .',
-    'convert_explanation_deposit_withdrawal'   => 'Jika Anda mengonversi setoran ini menjadi penarikan ,: jumlah akan dihapus dari  : destinationName  alih-alih ditambahkan ke penarikan tersebut.',
-    'convert_explanation_deposit_transfer'     => 'Jika Anda mengonversi setoran ini menjadi transfer ,: jumlah akan ditransfer dari akun aset pilihan Anda ke  : destinationName  .',
-    'convert_explanation_transfer_withdrawal'  => 'Jika Anda mengubah transfer ini menjadi penarikan ,: jumlah akan beralih dari  : sourceName  ke tujuan baru sebagai biaya, alih-alih  : destinationName  sebagai transfer.',
-    'convert_explanation_transfer_deposit'     => 'Jika Anda mengubah transfer ini menjadi deposit ,: jumlah akan disetorkan ke akun  : destinationName  alih-alih ditransfer ke sana.',
+    'convert_explanation_withdrawal_deposit'   => 'Jika Anda mengubah penarikan ini menjadi deposit, :amount akan disetorkan ke :sourceName alih-alih diambil darinya.',
+    'convert_explanation_withdrawal_transfer'  => 'Jika Anda mengubah penarikan ini menjadi transfer, :amount akan ditransfer dari :sourceName ke akun aset baru, alih-alih dibayar ke :destinationName.',
+    'convert_explanation_deposit_withdrawal'   => 'Jika Anda mengonversi setoran ini menjadi penarikan, :amount akan dihapus dari :destinationName alih-alih ditambahkan ke penarikan tersebut.',
+    'convert_explanation_deposit_transfer'     => 'Jika Anda mengonversi setoran ini menjadi transfer, :amount akan ditransfer dari akun aset pilihan Anda ke :destinationName .',
+    'convert_explanation_transfer_withdrawal'  => 'Jika Anda mengubah transfer ini menjadi penarikan, :amount akan beralih dari :sourceName ke tujuan baru sebagai biaya, alih-alih :destinationName sebagai transfer.',
+    'convert_explanation_transfer_deposit'     => 'Jika Anda mengubah transfer ini menjadi deposit, :amount akan disetorkan ke akun :destinationName alih-alih ditransfer ke sana.',
     'converted_to_Withdrawal'                  => 'Transaksi telah dikonversi menjadi penarikan',
     'converted_to_Deposit'                     => 'Transaksi telah dikonversi menjadi deposit',
     'converted_to_Transfer'                    => 'Transaksi telah dikonversi menjadi transfer',
@@ -530,12 +546,12 @@ return [
     'create_currency'                          => 'Buat mata uang baru',
     'store_currency'                           => 'Simpan mata uang baru',
     'update_currency'                          => 'Perbarui mata uang',
-    'new_default_currency'                     => ': nama sekarang adalah mata uang default.',
-    'cannot_delete_currency'                   => 'Tidak dapat menghapus: nama karena masih digunakan.',
-    'deleted_currency'                         => 'Mata uang: nama dihapus',
-    'created_currency'                         => 'Mata uang: nama dibuat',
-    'updated_currency'                         => 'Mata uang: nama diperbarui',
-    'ask_site_owner'                           => 'Harap bertanya: pemilik untuk menambahkan, menghapus atau mengedit mata uang.',
+    'new_default_currency'                     => ' :name sekarang adalah mata uang default.',
+    'cannot_delete_currency'                   => 'Tidak dapat menghapus :name karena masih digunakan.',
+    'deleted_currency'                         => 'Mata uang :name dihapus',
+    'created_currency'                         => 'Mata uang :name dibuat',
+    'updated_currency'                         => 'Mata uang :name diperbarui',
+    'ask_site_owner'                           => 'Harap bertanya :owner untuk menambahkan, menghapus atau mengedit mata uang.',
     'currencies_intro'                         => 'Firefly III mendukung berbagai mata uang yang dapat Anda atur dan aktifkan di sini.',
     'make_default_currency'                    => 'membuat default',
     'default_currency'                         => 'default',
@@ -548,72 +564,72 @@ return [
     // budgets:
     'create_new_budget'                        => 'Buat anggaran baru',
     'store_new_budget'                         => 'Simpan anggaran baru',
-    'stored_new_budget'                        => 'Anggaran baru tersimpan ": nama"',
-    'available_between'                        => 'Tersedia antara: start dan: end',
+    'stored_new_budget'                        => 'Anggaran baru tersimpan ":name"',
+    'available_between'                        => 'Tersedia antara :start dan :end',
     'transactionsWithoutBudget'                => 'Biaya tanpa anggaran',
-    'transactions_no_budget'                   => 'Biaya tanpa anggaran antara: start dan: end',
-    'spent_between'                            => 'Menghabiskan antara: start dan: end',
+    'transactions_no_budget'                   => 'Biaya tanpa anggaran antara :start dan :end',
+    'spent_between'                            => 'Menghabiskan antara :start dan :end',
     'createBudget'                             => 'Anggaran baru',
     'inactiveBudgets'                          => 'Anggaran tidak aktif',
-    'without_budget_between'                   => 'Transaksi tanpa anggaran antara: start dan: end',
-    'delete_budget'                            => 'Hapus anggaran ": nama"',
-    'deleted_budget'                           => 'Anggaran yang telah dihapus ": nama"',
-    'edit_budget'                              => 'Edit anggaran ": nama"',
-    'updated_budget'                           => 'Anggaran yang diperbarui ": nama"',
+    'without_budget_between'                   => 'Transaksi tanpa anggaran antara :start dan :end',
+    'delete_budget'                            => 'Hapus anggaran ":name"',
+    'deleted_budget'                           => 'Anggaran yang telah dihapus ":name"',
+    'edit_budget'                              => 'Edit anggaran ":name"',
+    'updated_budget'                           => 'Anggaran yang diperbarui ":name"',
     'update_amount'                            => 'Perbarui jumlah',
     'update_budget'                            => 'Perbarui anggaran',
-    'update_budget_amount_range'               => 'Update (expected) jumlah yang tersedia antara: start and: end',
+    'update_budget_amount_range'               => 'Update (expected) jumlah yang tersedia antara :start and :end',
     'budget_period_navigator'                  => 'Navigator periode',
     'info_on_available_amount'                 => 'Apa yang telah tersedia?',
     'available_amount_indication'              => 'Gunakan jumlah ini untuk mendapatkan indikasi berapa total anggaran Anda.',
     'suggested'                                => 'Disarankan',
-    'average_between'                          => 'Rata-rata antara: start dan: end',
+    'average_between'                          => 'Rata-rata antara :start dan :end',
 
     // bills:
     'matching_on'                              => 'Cocok di',
-    'between_amounts'                          => 'antara: rendah dan: tinggi.',
+    'between_amounts'                          => 'antara :low dan :high.',
     'repeats'                                  => 'Berulang',
     'connected_journals'                       => 'Transaksi yang terhubung',
     'auto_match_on'                            => 'Secara otomatis dicocokkan dengan Firefly',
     'auto_match_off'                           => 'Tidak secara otomatis dicocokkan dengan Firefly',
     'next_expected_match'                      => 'Pertandingan yang diharapkan berikutnya',
-    'delete_bill'                              => 'Hapus tagihan ": nama"',
-    'deleted_bill'                             => 'Tagihan yang dihapus ": nama"',
-    'edit_bill'                                => 'Edit tagihan ": nama"',
+    'delete_bill'                              => 'Hapus tagihan ":name"',
+    'deleted_bill'                             => 'Tagihan yang dihapus ":name"',
+    'edit_bill'                                => 'Edit tagihan ":name"',
     'more'                                     => 'Lebih',
     'rescan_old'                               => 'Rescan transaksi lama',
     'update_bill'                              => 'Perbarui tagihan',
-    'updated_bill'                             => 'Diperbarui tagihan ": nama"',
+    'updated_bill'                             => 'Diperbarui tagihan ":name"',
     'store_new_bill'                           => 'Simpan tagihan baru',
-    'stored_new_bill'                          => 'Stored tagihan baru ": nama"',
+    'stored_new_bill'                          => 'Stored tagihan baru ":name"',
     'cannot_scan_inactive_bill'                => 'Tagihan tidak aktif tidak dapat dipindai.',
     'rescanned_bill'                           => 'Rescanned semuanya.',
-    'average_bill_amount_year'                 => 'Jumlah tagihan rata-rata (: tahun)',
+    'average_bill_amount_year'                 => 'Jumlah tagihan rata-rata (:year)',
     'average_bill_amount_overall'              => 'Jumlah tagihan rata-rata (keseluruhan)',
     'not_or_not_yet'                           => 'Belum)',
     'not_expected_period'                      => 'Tidak diharapkan periode ini',
     'bill_is_active'                           => 'Tagihan aktif',
-    'bill_expected_between'                    => 'Diharapkan antara: start dan: end',
+    'bill_expected_between'                    => 'Diharapkan antara :start dan :end',
     'bill_will_automatch'                      => 'Tagihan akan secara otomatis terhubung ke transaksi yang sesuai',
     'skips_over'                               => 'melompati',
 
     // accounts:
-    'details_for_asset'                        => 'Rincian akun aset ": nama"',
-    'details_for_expense'                      => 'Rincian untuk akun biaya ": nama"',
-    'details_for_revenue'                      => 'Rincian untuk akun pendapatan ": nama"',
-    'details_for_cash'                         => 'Rincian untuk rekening kas ": nama"',
+    'details_for_asset'                        => 'Rincian akun aset ":name"',
+    'details_for_expense'                      => 'Rincian untuk akun biaya ":name"',
+    'details_for_revenue'                      => 'Rincian untuk akun pendapatan ":name"',
+    'details_for_cash'                         => 'Rincian untuk rekening kas ":name"',
     'store_new_asset_account'                  => 'Simpan akun aset baru',
     'store_new_expense_account'                => 'Simpan akun pengeluaran baru',
     'store_new_revenue_account'                => 'Simpan akun pendapatan baru',
-    'edit_asset_account'                       => 'Edit akun aset ": nama"',
-    'edit_expense_account'                     => 'Edit akun biaya ": nama"',
-    'edit_revenue_account'                     => 'Edit akun pendapatan ": nama"',
-    'delete_asset_account'                     => 'Hapus akun aset ": nama"',
-    'delete_expense_account'                   => 'Hapus akun pengeluaran ": nama"',
-    'delete_revenue_account'                   => 'Hapus akun pendapatan ": nama"',
-    'asset_deleted'                            => 'Berhasil menghapus akun aset ": nama"',
-    'expense_deleted'                          => 'Akun pengeluaran yang berhasil dihapus ": nama"',
-    'revenue_deleted'                          => 'Berhasil menghapus akun pendapatan ": nama"',
+    'edit_asset_account'                       => 'Edit akun aset ":name"',
+    'edit_expense_account'                     => 'Edit akun biaya ":name"',
+    'edit_revenue_account'                     => 'Edit akun pendapatan ":name"',
+    'delete_asset_account'                     => 'Hapus akun aset ":name"',
+    'delete_expense_account'                   => 'Hapus akun pengeluaran ":name"',
+    'delete_revenue_account'                   => 'Hapus akun pendapatan ":name"',
+    'asset_deleted'                            => 'Berhasil menghapus akun aset ":name"',
+    'expense_deleted'                          => 'Akun pengeluaran yang berhasil dihapus ":name"',
+    'revenue_deleted'                          => 'Berhasil menghapus akun pendapatan ":name"',
     'update_asset_account'                     => 'Perbarui akun aset',
     'update_expense_account'                   => 'Rekening pengeluaran pembaruan',
     'update_revenue_account'                   => 'Perbarui akun pendapatan',
@@ -625,12 +641,12 @@ return [
     'revenue_accounts'                         => 'Akun pendapatan',
     'cash_accounts'                            => 'Akun kas',
     'Cash account'                             => 'Akun kas',
-    'reconcile_account'                        => 'Rekonsiliasi akun ":akun"',
+    'reconcile_account'                        => 'Rekonsiliasi akun ":account"',
     'delete_reconciliation'                    => 'Hapus rekonsiliasi',
     'update_reconciliation'                    => 'Rekonsiliasi pembaruan',
     'amount_cannot_be_zero'                    => 'Jumlah tersebut tidak dapat menjadi nol',
-    'end_of_reconcile_period'                  => 'Akhir periode rekonsiliasi: :periode',
-    'start_of_reconcile_period'                => 'Mulai dari periode rekonsiliasi: :periode',
+    'end_of_reconcile_period'                  => 'Akhir periode rekonsiliasi: :period',
+    'start_of_reconcile_period'                => 'Mulai dari periode rekonsiliasi: :period',
     'start_balance'                            => 'Saldo awal',
     'end_balance'                              => 'Saldo akhir',
     'update_balance_dates_instruction'         => 'Sesuai jumlah dan tanggal di atas pernyataan bank Anda, dan tekan "Mulai rekonsiliasi"',
@@ -648,10 +664,10 @@ return [
     'cash'                                     => 'tunai',
     'account_type'                             => 'Jenis akun',
     'save_transactions_by_moving'              => 'Menyimpan transaksi tersebut(s) dengan memindahkan mereka ke akun lain:',
-    'stored_new_account'                       => 'Akun baru ":nama" disimpan!',
-    'updated_account'                          => 'Memperbarui akun ":nama"',
+    'stored_new_account'                       => 'Akun baru ":name" disimpan!',
+    'updated_account'                          => 'Memperbarui akun ":name"',
     'credit_card_options'                      => 'Pilihan kartu kredit',
-    'no_transactions_account'                  => 'Tidak ada transaksi (dalam periode ini) untuk akun aset ":nama".',
+    'no_transactions_account'                  => 'Tidak ada transaksi (dalam periode ini) untuk akun aset ":name".',
     'no_data_for_chart'                        => 'Tidak ada informasi yang cukup (belum) untuk menghasilkan grafik ini.',
     'select_more_than_one_account'             => 'Silakan pilih lebih dari satu akun',
     'select_more_than_one_category'            => 'Silakan pilih lebih dari satu kategori',
@@ -661,18 +677,18 @@ return [
     'reconcile_has_more'                       => 'Buku Firefly III Anda memiliki lebih banyak uang di dalamnya dari bank Anda klaim Anda harus. Ada beberapa pilihan. Silahkan memilih apa yang harus dilakukan. Kemudian, tekan "Konfirmasi rekonsiliasi".',
     'reconcile_has_less'                       => 'Buku Firefly III Anda memiliki sedikit uang di dalamnya daripada bank Anda klaim Anda harus. Ada beberapa pilihan. Silahkan memilih apa yang harus dilakukan. Kemudian, tekan "Konfirmasi rekonsiliasi".',
     'reconcile_is_equal'                       => 'Buku Firefly III Anda dan pernyataan bank Anda cocok. Tidak ada hubungannya. Silahkan tekan "Konfirmasi rekonsiliasi" untuk mengkonfirmasi masukan Anda.',
-    'create_pos_reconcile_transaction'         => 'Menghapus transaksi yang dipilih, dan membuat koreksi menambahkan :jumlah ke akun aset ini.',
-    'create_neg_reconcile_transaction'         => 'Menghapus transaksi yang dipilih, dan membuat koreksi menghapus: jumlah dari akun aset ini.',
+    'create_pos_reconcile_transaction'         => 'Menghapus transaksi yang dipilih, dan membuat koreksi menambahkan :amount ke akun aset ini.',
+    'create_neg_reconcile_transaction'         => 'Menghapus transaksi yang dipilih, dan membuat koreksi menghapus:amount dari akun aset ini.',
     'reconcile_do_nothing'                     => 'Menghapus transaksi yang dipilih, tetapi tidak benar.',
     'reconcile_go_back'                        => 'Anda selalu dapat mengedit atau menghapus koreksi kemudian.',
     'must_be_asset_account'                    => 'Anda hanya bisa mendamaikan akun aset',
     'reconciliation_stored'                    => 'Rekonsiliasi disimpan',
-    'reconcilliation_transaction_title'        => 'Rekonsiliasi (: dari ke: ke)',
+    'reconcilliation_transaction_title'        => 'Rekonsiliasi (:from ke :to)',
     'reconcile_this_account'                   => 'Rekonsiliasi akun ini',
     'confirm_reconciliation'                   => 'Konfirmasikan rekonsiliasi',
     'submitted_start_balance'                  => 'Saldo awal yang dikirim',
-    'selected_transactions'                    => 'Transaksi yang dipilih (: count)',
-    'already_cleared_transactions'             => 'Sudah dibersihkan transaksi (: count)',
+    'selected_transactions'                    => 'Transaksi yang dipilih (:count)',
+    'already_cleared_transactions'             => 'Sudah dibersihkan transaksi (:count)',
     'submitted_end_balance'                    => 'Saldo akhir yang dikirim',
 
     // categories:
@@ -680,34 +696,34 @@ return [
     'create_new_category'                      => 'Buat kategori baru',
     'without_category'                         => 'Tanpa kategori',
     'update_category'                          => 'Perbarui kategori',
-    'updated_category'                         => 'Kategori yang Diperbarui ": nama"',
+    'updated_category'                         => 'Kategori yang Diperbarui ":name"',
     'categories'                               => 'Kategori',
-    'edit_category'                            => 'Edit kategori ": nama"',
+    'edit_category'                            => 'Edit kategori ":name"',
     'no_category'                              => '(tidak ada kategori)',
     'category'                                 => 'Kategori',
-    'delete_category'                          => 'Hapus kategori ": nama"',
-    'deleted_category'                         => 'Kategori yang dihapus ": nama"',
+    'delete_category'                          => 'Hapus kategori ":name"',
+    'deleted_category'                         => 'Kategori yang dihapus ":name"',
     'store_category'                           => 'Simpan kategori baru',
-    'stored_category'                          => 'Stored new category ": nama"',
-    'without_category_between'                 => 'Tanpa kategori antara: start dan: end',
+    'stored_category'                          => 'Stored new category ":name"',
+    'without_category_between'                 => 'Tanpa kategori antara :start dan :end',
 
     // transactions:
     'update_withdrawal'                        => 'Perbarui penarikan',
     'update_deposit'                           => 'Perbarui setoran',
     'update_transfer'                          => 'Perbarui transfer',
-    'updated_withdrawal'                       => 'Penarikan yang telah diupdate ": deskripsi"',
-    'updated_deposit'                          => 'Deposit Diperbarui ": deskripsi"',
-    'updated_transfer'                         => 'Transfer yang diperbarui ": deskripsi"',
-    'delete_withdrawal'                        => 'Hapus penarikan ": deskripsi"',
-    'delete_deposit'                           => 'Hapus deposit ": deskripsi"',
-    'delete_transfer'                          => 'Hapus transfer ": deskripsi"',
-    'deleted_withdrawal'                       => 'Penarikan yang berhasil dihapus ": deskripsi"',
-    'deleted_deposit'                          => 'Berhasil menghapus deposit ": deskripsi"',
-    'deleted_transfer'                         => 'Berhasil menghapus transfer ": deskripsi"',
-    'stored_journal'                           => 'Berhasil membuat transaksi baru ": deskripsi"',
+    'updated_withdrawal'                       => 'Penarikan yang telah diupdate ":description"',
+    'updated_deposit'                          => 'Deposit Diperbarui ":description"',
+    'updated_transfer'                         => 'Transfer yang diperbarui ":description"',
+    'delete_withdrawal'                        => 'Hapus penarikan ":description"',
+    'delete_deposit'                           => 'Hapus deposit ":description"',
+    'delete_transfer'                          => 'Hapus transfer ":description"',
+    'deleted_withdrawal'                       => 'Penarikan yang berhasil dihapus ":description"',
+    'deleted_deposit'                          => 'Berhasil menghapus deposit ":description"',
+    'deleted_transfer'                         => 'Berhasil menghapus transfer ":description"',
+    'stored_journal'                           => 'Berhasil membuat transaksi baru ":description"',
     'select_transactions'                      => 'Pilih transaksi',
-    'rule_group_select_transactions'           => 'Terapkan ": judul" untuk transaksi',
-    'rule_select_transactions'                 => 'Terapkan ": judul" untuk transaksi',
+    'rule_group_select_transactions'           => 'Terapkan ":title" untuk transaksi',
+    'rule_select_transactions'                 => 'Terapkan ":title" untuk transaksi',
     'stop_selection'                           => 'Berhentilah memilih transaksi',
     'reconcile_selected'                       => 'Mendamaikan',
     'mass_delete_journals'                     => 'Hapus sejumlah transaksi',
@@ -716,8 +732,8 @@ return [
     'no_budget'                                => '(no budget)',
     'no_budget_squared'                        => '(tidak ada anggaran)',
     'perm-delete-many'                         => 'Menghapus banyak barang dalam satu go bisa sangat mengganggu. Harap berhati-hati.',
-    'mass_deleted_transactions_success'        => 'Dihapus: jumlah transaksi.',
-    'mass_edited_transactions_success'         => 'Diperbarui: jumlah transaksi',
+    'mass_deleted_transactions_success'        => 'Dihapus:amount transaksi.',
+    'mass_edited_transactions_success'         => 'Diperbarui:amount transaksi',
     'opt_group_no_account_type'                => '(tidak ada jenis akun)',
     'opt_group_defaultAsset'                   => 'Akun aset standar',
     'opt_group_savingAsset'                    => 'Menyimpan akun',
@@ -730,7 +746,7 @@ return [
     'getting_started'                          => 'Mulai',
     'to_get_started'                           => 'Senang melihat Anda berhasil memasang Firefly III. Untuk memulai dengan alat ini, harap masukkan nama bank dan saldo rekening giro utama Anda. Jangan khawatir jika Anda memiliki banyak akun. Anda bisa menambahkannya nanti. Hanya saja Firefly III butuh sesuatu untuk memulai.',
     'savings_balance_text'                     => 'Firefly III secara otomatis akan membuat rekening tabungan untuk Anda. Secara default, tidak akan ada uang di rekening tabungan Anda, tapi jika Anda memberi tahu Firefly III, saldo itu akan disimpan seperti itu.',
-    'finish_up_new_user'                       => 'Itu dia! Anda dapat melanjutkan dengan menekan  Kirim . Anda akan dibawa ke indeks Firefly III.',
+    'finish_up_new_user'                       => 'Itu dia! Anda dapat melanjutkan dengan menekan Kirim. Anda akan dibawa ke indeks Firefly III.',
     'stored_new_accounts_new_user'             => 'Yay! Akun baru Anda telah disimpan.',
 
     // home page:
@@ -791,12 +807,12 @@ return [
     'errors'                                   => 'Kesalahan',
 
     // reports:
-    'report_default'                           => 'Laporan keuangan standar antara: start dan: end',
-    'report_audit'                             => 'Ikhtisar riwayat transaksi antara: start dan: end',
-    'report_category'                          => 'Kategori laporan antara: start dan: end',
-    'report_account'                           => 'Laporan biaya / pendapatan antara: start dan: end',
-    'report_budget'                            => 'Laporan anggaran antara: start dan: end',
-    'report_tag'                               => 'Tag laporan antara: start dan: end',
+    'report_default'                           => 'Laporan keuangan standar antara :start dan :end',
+    'report_audit'                             => 'Ikhtisar riwayat transaksi antara :start dan :end',
+    'report_category'                          => 'Kategori laporan antara :start dan :end',
+    'report_account'                           => 'Laporan biaya / pendapatan antara :start dan :end',
+    'report_budget'                            => 'Laporan anggaran antara :start dan :end',
+    'report_tag'                               => 'Tag laporan antara :start dan :end',
     'quick_link_reports'                       => 'Tautan langsung',
     'quick_link_default_report'                => 'Laporan keuangan standar',
     'quick_link_audit_report'                  => 'Ikhtisar sejarah transaksi',
@@ -821,9 +837,9 @@ return [
     'difference'                               => 'Perbedaan',
     'money_flowing_in'                         => 'Dalam',
     'money_flowing_out'                        => 'Keluar',
-    'topX'                                     => 'atas :Nomor',
+    'topX'                                     => 'atas :number',
     'show_full_list'                           => 'Tampilkan seluruh daftar',
-    'show_only_top'                            => 'Tampilkan hanya atas :Nomor',
+    'show_only_top'                            => 'Tampilkan hanya atas :number',
     'report_type'                              => 'Tipe laporan',
     'report_type_default'                      => 'Laporan keuangan standar',
     'report_type_audit'                        => 'Gambaran riwayat transaksi (audit)',
@@ -837,13 +853,13 @@ return [
     'report_preset_ranges'                     => 'Rentang pre-set',
     'shared'                                   => 'Bagikan',
     'fiscal_year'                              => 'Tahun fiskal',
-    'income_entry'                             => 'Penghasilan dari akun ": nama" antara: start dan: end',
-    'expense_entry'                            => 'Biaya untuk akun ": nama" antara: start dan: end',
-    'category_entry'                           => 'Biaya dalam kategori ": nama" antara: start dan: end',
-    'budget_spent_amount'                      => 'Biaya anggaran ": anggaran" antara: start dan: end',
-    'balance_amount'                           => 'Biaya dalam anggaran ": anggaran" dibayar dari rekening ": akun" antara: start dan: end',
-    'no_audit_activity'                        => 'Tidak ada aktivitas yang tercatat dalam akun : account_name antara: start and: end.',
-    'audit_end_balance'                        => 'Saldo akun  :account_name di akhir: akhir adalah:: keseimbangan',
+    'income_entry'                             => 'Penghasilan dari akun ":name" antara :start dan :end',
+    'expense_entry'                            => 'Biaya untuk akun ":name" antara :start dan :end',
+    'category_entry'                           => 'Biaya dalam kategori ":name" antara :start dan :end',
+    'budget_spent_amount'                      => 'Biaya anggaran ":budget" antara :start dan :end',
+    'balance_amount'                           => 'Biaya dalam anggaran ":budget" dibayar dari rekening ":account" antara :start dan :end',
+    'no_audit_activity'                        => 'Tidak ada aktivitas yang tercatat dalam akun :account_name antara :start and :end.',
+    'audit_end_balance'                        => 'Saldo akun :account_name di akhir :end adalah :balance',
     'reports_extra_options'                    => 'Pilihan ekstra',
     'report_has_no_extra_options'              => 'Laporan ini tidak memiliki pilihan tambahan',
     'reports_submit'                           => 'Melihat laporan',
@@ -910,22 +926,22 @@ return [
     'balance'                                  => 'Keseimbangan',
     'sum'                                      => 'Jumlah',
     'average'                                  => 'Rata-rata',
-    'balanceFor'                               => 'Saldo untuk: nama',
+    'balanceFor'                               => 'Saldo untuk :name',
 
     // piggy banks:
-    'add_money_to_piggy'                       => 'Tambahkan uang ke celengan ": nama"',
+    'add_money_to_piggy'                       => 'Tambahkan uang ke celengan ":name"',
     'piggy_bank'                               => 'Celengan',
     'new_piggy_bank'                           => 'Celengan baru',
     'store_piggy_bank'                         => 'Simpan celengan baru',
-    'stored_piggy_bank'                        => 'Simpan celengan baru ": nama"',
+    'stored_piggy_bank'                        => 'Simpan celengan baru ":name"',
     'account_status'                           => 'Status akun',
     'left_for_piggy_banks'                     => 'Kiri untuk celengan',
     'sum_of_piggy_banks'                       => 'Jumlah celengan',
     'saved_so_far'                             => 'Disimpan sejauh ini',
     'left_to_save'                             => 'Kiri untuk menyimpan',
     'suggested_amount'                         => 'Jumlah bulanan yang disarankan untuk disimpan',
-    'add_money_to_piggy_title'                 => 'Tambahkan uang ke celengan ": nama"',
-    'remove_money_from_piggy_title'            => 'Hapus uang dari celengan ": nama"',
+    'add_money_to_piggy_title'                 => 'Tambahkan uang ke celengan ":name"',
+    'remove_money_from_piggy_title'            => 'Hapus uang dari celengan ":name"',
     'add'                                      => 'Menambahkan',
     'no_money_for_piggy'                       => 'Anda tidak punya uang untuk dimasukkan ke dalam celengan ini.',
 
@@ -933,8 +949,8 @@ return [
     'max_amount_add'            => 'Jumlah maksimum yang bisa Anda tambahkan adalah',
     'max_amount_remove'         => 'Jumlah maksimal yang bisa Anda hapus adalah',
     'update_piggy_button'       => 'Update celengan',
-    'update_piggy_title'        => 'Update piggy bank ": nama"',
-    'updated_piggy_bank'        => 'Diperbarui piggy bank ": nama"',
+    'update_piggy_title'        => 'Update piggy bank ":name"',
+    'updated_piggy_bank'        => 'Diperbarui piggy bank ":name"',
     'details'                   => 'Rincian',
     'events'                    => 'Acara',
     'target_amount'             => 'Jumlah target',
@@ -942,20 +958,20 @@ return [
     'target_date'               => 'Tanggal target',
     'no_target_date'            => 'Tidak ada tanggal target',
     'table'                     => 'Meja',
-    'delete_piggy_bank'         => 'Hapus celengan ": nama"',
-    'cannot_add_amount_piggy'   => 'Tidak dapat menambahkan: jumlah ke ": name".',
-    'cannot_remove_from_piggy'  => 'Tidak dapat menghapus: jumlah dari ": name".',
-    'deleted_piggy_bank'        => 'Dihapus celengan ": nama"',
-    'added_amount_to_piggy'     => 'Ditambahkan: jumlah ke ": nama"',
-    'removed_amount_from_piggy' => 'Dihapus: jumlah dari ": nama"',
+    'delete_piggy_bank'         => 'Hapus celengan ":name"',
+    'cannot_add_amount_piggy'   => 'Tidak dapat menambahkan:amount ke ":name".',
+    'cannot_remove_from_piggy'  => 'Tidak dapat menghapus:amount dari ":name".',
+    'deleted_piggy_bank'        => 'Dihapus celengan ":name"',
+    'added_amount_to_piggy'     => 'Ditambahkan:amount ke ":name"',
+    'removed_amount_from_piggy' => 'Dihapus:amount dari ":name"',
 
     // tags
-    'delete_tag'                => 'Hapus tag ": tag"',
-    'deleted_tag'               => 'Tag dihapus ": tag"',
+    'delete_tag'                => 'Hapus tag " :tag"',
+    'deleted_tag'               => 'Tag dihapus " :tag"',
     'new_tag'                   => 'Buat tag baru',
-    'edit_tag'                  => 'Edit tag ": tag"',
-    'updated_tag'               => 'Diperbarui tag ": tag"',
-    'created_tag'               => 'Tag ": tag" telah dibuat!',
+    'edit_tag'                  => 'Edit tag " :tag"',
+    'updated_tag'               => 'Diperbarui tag " :tag"',
+    'created_tag'               => 'Tag " :tag" telah dibuat!',
 
     'transaction_journal_information'       => 'Informasi transaksi',
     'transaction_journal_meta'              => 'Informasi meta',
@@ -972,15 +988,15 @@ return [
     'setting_single_user_mode'              => 'Mode pengguna tunggal',
     'setting_single_user_mode_explain'      => 'Secara default, Firefly III hanya menerima satu (1) registrasi: anda. Ini adalah tindakan pengamanan, mencegah orang lain menggunakan contoh Anda kecuali jika Anda mengizinkannya melakukannya. Pendaftaran di masa depan diblokir Bila Anda tidak mencentang kotak ini, orang lain dapat menggunakan contoh Anda dengan baik, dengan asumsi mereka dapat mencapainya (bila terhubung ke internet).',
     'store_configuration'                   => 'Konfigurasi toko',
-    'single_user_administration'            => 'Administrasi pengguna untuk: email',
-    'edit_user'                             => 'Edit pengguna: email',
-    'hidden_fields_preferences'             => 'Tidak semua bidang terlihat sekarang. Anda harus mengaktifkannya di  setelan  Anda.',
+    'single_user_administration'            => 'Administrasi pengguna untuk :email',
+    'edit_user'                             => 'Edit pengguna :email',
+    'hidden_fields_preferences'             => 'Tidak semua bidang terlihat sekarang. Anda harus mengaktifkannya di setelan Anda.',
     'user_data_information'                 => 'Data pengguna',
     'user_information'                      => 'Informasi pengguna',
     'total_size'                            => 'ukuran total',
     'budget_or_budgets'                     => 'anggaran',
     'budgets_with_limits'                   => 'anggaran dengan jumlah yang dikonfigurasi',
-    'nr_of_rules_in_total_groups'           => ': count_rules aturan di: count_groups rule group (s)',
+    'nr_of_rules_in_total_groups'           => ':count_rules aturan di:count_groups rule group (s)',
     'tag_or_tags'                           => 'tag (s)',
     'configuration_updated'                 => 'Konfigurasi telah diperbarui',
     'setting_is_demo_site'                  => 'Situs demo',
@@ -992,10 +1008,10 @@ return [
     'admin_update_email'                    => 'Bertentangan dengan halaman profil, pengguna TIDAK akan diberitahu alamat email mereka telah berubah!',
     'update_user'                           => 'Perbarui pengguna',
     'updated_user'                          => 'Data pengguna telah diubah.',
-    'delete_user'                           => 'Hapus pengguna: email',
+    'delete_user'                           => 'Hapus pengguna :email',
     'user_deleted'                          => 'Pengguna telah dihapus',
     'send_test_email'                       => 'Kirim pesan email percobaan',
-    'send_test_email_text'                  => 'Untuk melihat apakah pemasangan Anda mampu mengirim email, tekan tombol ini. Anda tidak akan melihat kesalahan di sini (jika ada),  file log akan mencerminkan kesalahan . Anda bisa menekan tombol ini sebanyak yang Anda mau. Tidak ada kontrol spam. Pesan akan dikirim ke :email dan akan segera tiba.',
+    'send_test_email_text'                  => 'Untuk melihat apakah pemasangan Anda mampu mengirim email, tekan tombol ini. Anda tidak akan melihat kesalahan di sini (jika ada), file log akan mencerminkan kesalahan. Anda bisa menekan tombol ini sebanyak yang Anda mau. Tidak ada kontrol spam. Pesan akan dikirim ke :email dan akan segera tiba.',
     'send_message'                          => 'Mengirim pesan',
     'send_test_triggered'                   => 'Uji dipicu. Periksa kotak masuk dan file log Anda.',
 
@@ -1004,12 +1020,12 @@ return [
     'create_new_link_type'                  => 'Buat jenis tautan baru',
     'store_new_link_type'                   => 'Simpan jenis tautan baru',
     'update_link_type'                      => 'Perbarui jenis tautan',
-    'edit_link_type'                        => 'Edit jenis tautan ": nama"',
-    'updated_link_type'                     => 'Jenis tautan yang diperbarui ": nama"',
-    'delete_link_type'                      => 'Hapus jenis tautan ": nama"',
-    'deleted_link_type'                     => 'Jenis tautan yang dihapus ": nama"',
-    'stored_new_link_type'                  => 'Simpan jenis tautan baru ": nama"',
-    'cannot_edit_link_type'                 => 'Tidak dapat mengedit jenis tautan ": nama"',
+    'edit_link_type'                        => 'Edit jenis tautan ":name"',
+    'updated_link_type'                     => 'Jenis tautan yang diperbarui ":name"',
+    'delete_link_type'                      => 'Hapus jenis tautan ":name"',
+    'deleted_link_type'                     => 'Jenis tautan yang dihapus ":name"',
+    'stored_new_link_type'                  => 'Simpan jenis tautan baru ":name"',
+    'cannot_edit_link_type'                 => 'Tidak dapat mengedit jenis tautan ":name"',
     'link_type_help_name'                   => 'Yaitu. "Duplikat"',
     'link_type_help_inward'                 => 'Yaitu. "duplikat"',
     'link_type_help_outward'                => 'Yaitu. "diduplikasi oleh"',
@@ -1029,7 +1045,7 @@ return [
     'this_withdrawal'                       => 'Penarikan ini',
     'this_deposit'                          => 'Deposit ini',
     'this_transfer'                         => 'Transfer ini',
-    'overview_for_link'                     => 'Ikhtisar untuk jenis tautan ": nama"',
+    'overview_for_link'                     => 'Ikhtisar untuk jenis tautan ":name"',
     'source_transaction'                    => 'Transaksi sumber',
     'link_description'                      => 'Deskripsi tautan',
     'destination_transaction'               => 'Transaksi tujuan',
@@ -1054,8 +1070,8 @@ return [
     'split_this_withdrawal'                 => 'Pisahkan penarikan ini',
     'split_this_deposit'                    => 'Pisahkan deposit ini',
     'split_this_transfer'                   => 'Pisahkan transfer ini',
-    'cannot_edit_multiple_source'           => 'Anda tidak dapat mengedit transaksi splitted #: id dengan deskripsi ": description" karena berisi beberapa akun sumber.',
-    'cannot_edit_multiple_dest'             => 'Anda tidak dapat mengedit transaksi splitted #: id dengan deskripsi ": description" karena berisi beberapa akun tujuan.',
+    'cannot_edit_multiple_source'           => 'Anda tidak dapat mengedit transaksi splitted #:id dengan deskripsi ":description" karena berisi beberapa akun sumber.',
+    'cannot_edit_multiple_dest'             => 'Anda tidak dapat mengedit transaksi splitted #:id dengan deskripsi ":description" karena berisi beberapa akun tujuan.',
     'cannot_edit_reconciled'                => 'Anda tidak dapat mengedit transaksi #:id dengan deskripsi ":description" karena telah ditandai sebagai didamaikan.',
     'cannot_edit_opening_balance'           => 'Anda tidak dapat mengedit saldo awal akun.',
     'no_edit_multiple_left'                 => 'Anda tidak memilih transaksi yang sah untuk diedit.',
diff --git a/resources/lang/id_ID/form.php b/resources/lang/id_ID/form.php
index e12220a43c..ffccb90c16 100644
--- a/resources/lang/id_ID/form.php
+++ b/resources/lang/id_ID/form.php
@@ -132,43 +132,44 @@ return [
     'include_old_uploads'        => 'Sertakan data yang diimpor',
     'accounts'                   => 'Mengekspor transaksi dari akun ini',
     'delete_account'             => 'Delete account ":name"',
-    'delete_bill'                => 'Hapus tagihan ": nama"',
-    'delete_budget'              => 'Hapus anggaran ": nama"',
-    'delete_category'            => 'Hapus kategori ": nama"',
-    'delete_currency'            => 'Hapus mata uang ": nama"',
-    'delete_journal'             => 'Hapus transaksi dengan deskripsi ": description"',
-    'delete_attachment'          => 'Hapus lampiran ": nama"',
-    'delete_rule'                => 'Hapus aturan ": judul"',
-    'delete_rule_group'          => 'Hapus grup aturan ": judul"',
-    'delete_link_type'           => 'Hapus jenis tautan ": nama"',
-    'delete_user'                => 'Hapus pengguna ": email"',
-    'user_areYouSure'            => 'Jika Anda menghapus pengguna ": email", semuanya akan hilang. Tidak ada undo, undelete atau apapun. Jika Anda menghapus diri Anda sendiri, Anda akan kehilangan akses ke Firefly III ini.',
-    'attachment_areYouSure'      => 'Yakin ingin menghapus lampiran yang bernama ": name"?',
-    'account_areYouSure'         => 'Yakin ingin menghapus akun dengan nama ": nama"?',
-    'bill_areYouSure'            => 'Yakin ingin menghapus tagihan yang bernama ": nama"?',
-    'rule_areYouSure'            => 'Yakin ingin menghapus aturan yang berjudul ": titel"?',
-    'ruleGroup_areYouSure'       => 'Yakin ingin menghapus grup aturan yang berjudul ": titel"?',
-    'budget_areYouSure'          => 'Yakin ingin menghapus anggaran dengan nama ": nama"?',
-    'category_areYouSure'        => 'Yakin ingin menghapus kategori yang bernama ": nama"?',
-    'currency_areYouSure'        => 'Yakin ingin menghapus mata uang dengan nama ": nama"?',
-    'piggyBank_areYouSure'       => 'Yakin ingin menghapus piggy bank yang bernama ": nama"?',
-    'journal_areYouSure'         => 'Yakin ingin menghapus transaksi yang dijelaskan ": description"?',
+    'delete_bill'                => 'Hapus tagihan ":name"',
+    'delete_budget'              => 'Hapus anggaran ":name"',
+    'delete_category'            => 'Hapus kategori ":name"',
+    'delete_currency'            => 'Hapus mata uang ":name"',
+    'delete_journal'             => 'Hapus transaksi dengan deskripsi ":description"',
+    'delete_attachment'          => 'Hapus lampiran ":name"',
+    'delete_rule'                => 'Hapus aturan ":title"',
+    'delete_rule_group'          => 'Hapus grup aturan ":title"',
+    'delete_link_type'           => 'Hapus jenis tautan ":name"',
+    'delete_user'                => 'Hapus pengguna ":email"',
+    'user_areYouSure'            => 'Jika Anda menghapus pengguna ":email", semuanya akan hilang. Tidak ada undo, undelete atau apapun. Jika Anda menghapus diri Anda sendiri, Anda akan kehilangan akses ke Firefly III ini.',
+    'attachment_areYouSure'      => 'Yakin ingin menghapus lampiran yang bernama ":name"?',
+    'account_areYouSure'         => 'Yakin ingin menghapus akun dengan nama ":name"?',
+    'bill_areYouSure'            => 'Yakin ingin menghapus tagihan yang bernama ":name"?',
+    'rule_areYouSure'            => 'Yakin ingin menghapus aturan yang berjudul ":title"?',
+    'ruleGroup_areYouSure'       => 'Yakin ingin menghapus grup aturan yang berjudul ":title"?',
+    'budget_areYouSure'          => 'Yakin ingin menghapus anggaran dengan nama ":name"?',
+    'category_areYouSure'        => 'Yakin ingin menghapus kategori yang bernama ":name"?',
+    'currency_areYouSure'        => 'Yakin ingin menghapus mata uang dengan nama ":name"?',
+    'piggyBank_areYouSure'       => 'Yakin ingin menghapus piggy bank yang bernama ":name"?',
+    'journal_areYouSure'         => 'Yakin ingin menghapus transaksi yang dijelaskan ":description"?',
     'mass_journal_are_you_sure'  => 'Yakin ingin menghapus transaksi ini?',
-    'tag_areYouSure'             => 'Yakin ingin menghapus tag ": tag"?',
+    'tag_areYouSure'             => 'Yakin ingin menghapus tag ":tag"?',
     'journal_link_areYouSure'    => 'Yakin ingin menghapus tautan antara :source and :destination?',
-    'linkType_areYouSure'        => 'Yakin ingin menghapus jenis tautan ": name" (": inward" / ": outward")?',
+    'linkType_areYouSure'        => 'Yakin ingin menghapus jenis tautan ":name" (":inward" / ":outward")?',
     'permDeleteWarning'          => 'Menghapus barang dari Firely bersifat permanen dan tidak dapat dibatalkan.',
     'mass_make_selection'        => 'Anda masih dapat mencegah agar item dihapus dengan menghapus kotak centang.',
     'delete_all_permanently'     => 'Hapus yang dipilih secara permanen',
     'update_all_journals'        => 'Perbarui transaksi ini',
-    'also_delete_transactions'   => 'Satu-satunya transaksi yang terhubung ke akun ini akan dihapus juga. | Semua: menghitung transaksi yang terhubung ke akun ini akan dihapus juga.',
-    'also_delete_connections'    => 'Satu-satunya transaksi yang terkait dengan jenis link ini akan kehilangan koneksi ini. Semua: menghitung transaksi yang terkait dengan jenis link ini akan kehilangan koneksi mereka.',
-    'also_delete_rules'          => 'Aturan satu-satunya yang terhubung ke grup aturan ini akan dihapus juga. Aturan All: count yang terhubung ke grup aturan ini akan dihapus juga.',
-    'also_delete_piggyBanks'     => 'Satu-satunya piggy bank yang terhubung ke akun ini akan dihapus juga. Semua: count piggy bank yang terhubung ke akun ini akan dihapus juga.',
-    'bill_keep_transactions'     => 'Satu-satunya transaksi yang terhubung dengan tagihan ini tidak akan dihapus. Semua: menghitung transaksi yang terhubung ke tagihan ini akan terhindar dari penghapusan.',
-    'budget_keep_transactions'   => 'Satu-satunya transaksi yang terhubung dengan anggaran ini tidak akan dihapus. Semua: menghitung transaksi yang terhubung dengan anggaran ini akan terhindar dari penghapusan.',
-    'category_keep_transactions' => 'Satu-satunya transaksi yang terhubung ke kategori ini tidak akan dihapus. Semua: menghitung transaksi yang terhubung ke kategori ini akan terhindar dari penghapusan.',
-    'tag_keep_transactions'      => 'Satu-satunya transaksi yang terhubung ke tag ini tidak akan dihapus. Semua: menghitung transaksi yang terhubung ke tag ini akan terhindar dari penghapusan.',
+    'also_delete_transactions'   => 'Satu-satunya transaksi yang terhubung ke akun ini akan dihapus juga. | Semua :count transaksi yang terhubung ke akun ini akan dihapus juga.',
+    'also_delete_connections'    => 'Satu-satunya transaksi yang terkait dengan jenis link ini akan kehilangan koneksi ini. Semua :count transaksi yang terkait dengan jenis link ini akan kehilangan koneksi mereka.',
+    'also_delete_rules'          => 'Aturan satu-satunya yang terhubung ke grup aturan ini akan dihapus juga. Aturan All :count yang terhubung ke grup aturan ini akan dihapus juga.',
+    'also_delete_piggyBanks'     => 'Satu-satunya piggy bank yang terhubung ke akun ini akan dihapus juga. Semua :count piggy bank yang terhubung ke akun ini akan dihapus juga.',
+    'bill_keep_transactions'     => 'Satu-satunya transaksi yang terhubung dengan tagihan ini tidak akan dihapus. Semua :count transaksi yang terhubung ke tagihan ini akan terhindar dari penghapusan.',
+    'budget_keep_transactions'   => 'Satu-satunya transaksi yang terhubung dengan anggaran ini tidak akan dihapus. Semua :count transaksi yang terhubung dengan anggaran ini akan terhindar dari penghapusan.',
+    'category_keep_transactions' => 'Satu-satunya transaksi yang terhubung ke kategori ini tidak akan dihapus. Semua :count transaksi yang terhubung ke kategori ini akan terhindar dari penghapusan.',
+    'tag_keep_transactions'      => 'Satu-satunya transaksi yang terhubung ke tag ini tidak akan dihapus. Semua :count transaksi yang terhubung ke tag ini akan terhindar dari penghapusan.',
+    'check_for_updates'          => 'Check for updates',
 
     'email'                 => 'Alamat email',
     'password'              => 'Kata sandi',
diff --git a/resources/lang/id_ID/import.php b/resources/lang/id_ID/import.php
index 6882f12fee..2a0166a207 100644
--- a/resources/lang/id_ID/import.php
+++ b/resources/lang/id_ID/import.php
@@ -32,7 +32,7 @@ return [
     'status_ready_noconfig_text'      => 'Impor sudah siap dimulai. Semua konfigurasi yang perlu Anda lakukan sudah selesai. Untuk benar-benar menjalankan impor, Anda dapat menjalankan perintah berikut di konsol Anda, atau menjalankan impor berbasis web. Bergantung pada konfigurasi Anda, impor konsol akan memberi Anda lebih banyak umpan balik.',
     'status_ready_config'             => 'Download konfigurasi',
     'status_ready_start'              => 'Mulai impor',
-    'status_ready_share'              => 'Harap pertimbangkan untuk mendownload konfigurasi Anda dan membagikannya di   pusat konfigurasi impor  . Ini akan memungkinkan pengguna Firefly III lainnya untuk mengimpor file mereka dengan lebih mudah.',
+    'status_ready_share'              => 'Harap pertimbangkan untuk mendownload konfigurasi Anda dan membagikannya di pusat konfigurasi impor. Ini akan memungkinkan pengguna Firefly III lainnya untuk mengimpor file mereka dengan lebih mudah.',
     'status_job_new'                  => 'Pekerjaan itu baru.',
     'status_job_configuring'          => 'Impor sedang dikonfigurasi.',
     'status_job_configured'           => 'Impor dikonfigurasi.',
@@ -49,39 +49,39 @@ return [
     'status_bread_crumb'              => 'Status impor',
     'status_sub_title'                => 'Status impor',
     'config_sub_title'                => 'Siapkan impor Anda',
-    'status_finished_job'             => 'Transaksi yang diimpor dapat ditemukan di tag : tag .',
-    'import_with_key'                 => 'Impor dengan kunci \': kunci\'',
+    'status_finished_job'             => 'Transaksi yang diimpor dapat ditemukan di tag :tag.',
+    'import_with_key'                 => 'Impor dengan kunci \':key\'',
 
-    // file: upload something:
+    // file, upload something
     'file_upload_title'               => 'Impor setup (1/4) - Upload file Anda',
     'file_upload_text'                => 'Rutin ini akan membantu Anda mengimpor file dari bank Anda ke Firefly III. Silakan periksa halaman bantuan di pojok kanan atas.',
     'file_upload_fields'              => 'Bidang',
     'file_upload_help'                => 'Pilih file anda',
-    'file_upload_config_help'         => 'Jika sebelumnya Anda mengimpor data ke Firefly III, Anda mungkin memiliki file konfigurasi, yang akan menetapkan nilai konfigurasi untuk Anda. Untuk beberapa bank, pengguna lain dengan ramah memberikan  berkas konfigurasi  mereka',
+    'file_upload_config_help'         => 'Jika sebelumnya Anda mengimpor data ke Firefly III, Anda mungkin memiliki file konfigurasi, yang akan menetapkan nilai konfigurasi untuk Anda. Untuk beberapa bank, pengguna lain dengan ramah memberikan berkas konfigurasi mereka',
     'file_upload_type_help'           => 'Pilih jenis file yang akan anda upload',
     'file_upload_submit'              => 'Unggah berkas',
 
-    // file: upload types
+    // file, upload types
     'import_file_type_csv'            => 'CSV (nilai yang dipisahkan koma)',
 
-    // file: initial config for CSV
+    // file, initial config for CSV
     'csv_initial_title'               => 'Penyiapan impor (2/4) - Penyiapan impor CSV dasar',
     'csv_initial_text'                => 'Untuk dapat mengimpor file Anda dengan benar, mohon validasi pilihan di bawah ini.',
     'csv_initial_box'                 => 'Penyiapan impor CSV dasar',
     'csv_initial_box_title'           => 'Opsi penyiapan impor CSV dasar',
     'csv_initial_header_help'         => 'Centang kotak ini jika baris pertama file CSV Anda adalah judul kolom.',
-    'csv_initial_date_help'           => 'Format waktu tanggal di CSV Anda. Ikuti format seperti  laman ini  menunjukkan. Nilai default akan mengurai tanggal yang terlihat seperti ini:: dateExample.',
+    'csv_initial_date_help'           => 'Format waktu tanggal di CSV Anda. Ikuti format seperti laman ini menunjukkan. Nilai default akan mengurai tanggal yang terlihat seperti ini: :dateExample.',
     'csv_initial_delimiter_help'      => 'Pilih pembatas lapangan yang digunakan dalam file masukan Anda. Jika tidak yakin, koma adalah pilihan teraman.',
     'csv_initial_import_account_help' => 'Jika file CSV TIDAK berisi informasi tentang akun aset Anda, gunakan dropdown ini untuk memilih akun mana yang menjadi tempat transaksi di CSV.',
     'csv_initial_submit'              => 'Lanjutkan dengan langkah 3/4',
 
-    // file: new options:
+    // file, new options:
     'file_apply_rules_title'          => 'Terapkan aturan',
     'file_apply_rules_description'    => 'Terapkan peraturan Anda Perhatikan bahwa ini memperlambat impor secara signifikan.',
     'file_match_bills_title'          => 'Cocokkan tagihan',
     'file_match_bills_description'    => 'Cocokkan tagihan Anda dengan penarikan yang baru dibuat. Perhatikan bahwa ini memperlambat impor secara signifikan.',
 
-    // file: roles config
+    // file, roles config
     'csv_roles_title'                 => 'Pengaturan impor (3/4) - Tentukan peran masing-masing kolom',
     'csv_roles_text'                  => 'Setiap kolom dalam file CSV Anda berisi data tertentu. Tolong tunjukkan jenis data yang harus diharapkan oleh importir. Pilihan untuk "memetakan" data berarti Anda akan menghubungkan setiap entri yang ditemukan di kolom ke nilai di database Anda. Kolom yang sering dipetakan adalah kolom yang berisi IBAN dari akun lawan. Itu bisa dengan mudah disesuaikan dengan keberadaan IBAN di database Anda.',
     'csv_roles_table'                 => 'Meja',
@@ -94,7 +94,7 @@ return [
     'csv_roles_submit'                => 'Lanjutkan dengan langkah 4/4',
     'csv_roles_warning'               => 'Paling tidak, tandai satu kolom sebagai kolom jumlah. Sebaiknya pilih juga kolom untuk deskripsi, tanggal dan akun lawan.',
 
-    // file: map data
+    // file, map data
     'file_map_title'                  => 'Pengaturan impor (4/4) - Sambungkan data impor ke data Firefly III',
     'file_map_text'                   => 'Pada tabel berikut, nilai kiri menunjukkan informasi yang Anda temukan di file yang Anda upload. Adalah tugas Anda untuk memetakan nilai ini, jika mungkin, ke nilai yang sudah ada di database Anda. Firefly akan menempel pada pemetaan ini. Jika tidak ada nilai untuk dipetakan, atau Anda tidak ingin memetakan nilai spesifiknya, pilih yang tidak ada.',
     'file_map_field_value'            => 'Nilai lapangan',
@@ -141,20 +141,23 @@ return [
     'column_opposing-number'          => 'Akun lawan (nomor rekening)',
     'column_note'                     => 'Catatan (s)',
 
+    // prerequisites
+    'prerequisites'                   => 'Prerequisites',
+
     // bunq
     'bunq_prerequisites_title'        => 'Prasyarat untuk impor dari bunq',
     'bunq_prerequisites_text'         => 'Untuk mengimpor dari bunq, Anda perlu mendapatkan kunci API. Anda bisa melakukan ini melalui aplikasi.',
 
-    // Spectre:
+    // Spectre
     'spectre_title'                   => 'Impor menggunakan momok',
     'spectre_prerequisites_title'     => 'Prasyarat untuk impor menggunakan momok',
-    'spectre_prerequisites_text'      => 'Untuk mengimpor data menggunakan API momok, Anda perlu membuktikan beberapa rahasia. Mereka dapat ditemukan di  halaman rahasia .',
-    'spectre_enter_pub_key'           => 'Impor hanya akan berfungsi saat Anda memasukkan kunci publik ini di  halaman keamanan  Anda.',
+    'spectre_prerequisites_text'      => 'Untuk mengimpor data menggunakan API momok, Anda perlu membuktikan beberapa rahasia. Mereka dapat ditemukan di halaman rahasia.',
+    'spectre_enter_pub_key'           => 'Impor hanya akan berfungsi saat Anda memasukkan kunci publik ini di halaman keamanan Anda.',
     'spectre_select_country_title'    => 'Pilih negara',
-    'spectre_select_country_text'     => 'Firefly III memiliki banyak pilihan bank dan lokasi dari mana Spectre dapat mendownload data transaksional. Bank-bank ini diurutkan berdasarkan negara. Tolong jangan sampai ada "Negara Palsu" saat Anda ingin menguji sesuatu. Jika Anda ingin mengimpor dari alat keuangan lainnya, mohon gunakan negara imajiner yang disebut "aplikasi keuangan lainnya". Secara default, momok hanya memungkinkan Anda mendownload data dari bank palsu. Pastikan status Anda "Langsung" di  Dasbor  jika ingin men-download dari bank sebenarnya.',
+    'spectre_select_country_text'     => 'Firefly III memiliki banyak pilihan bank dan lokasi dari mana Spectre dapat mendownload data transaksional. Bank-bank ini diurutkan berdasarkan negara. Tolong jangan sampai ada "Negara Palsu" saat Anda ingin menguji sesuatu. Jika Anda ingin mengimpor dari alat keuangan lainnya, mohon gunakan negara imajiner yang disebut "aplikasi keuangan lainnya". Secara default, momok hanya memungkinkan Anda mendownload data dari bank palsu. Pastikan status Anda "Langsung" di Dasbor jika ingin men-download dari bank sebenarnya.',
     'spectre_select_provider_title'   => 'Pilih bank',
-    'spectre_select_provider_text'    => 'Momok mendukung bank atau layanan keuangan berikut yang dikelompokkan di bawah : country . Silakan pilih yang ingin Anda impor.',
+    'spectre_select_provider_text'    => 'Momok mendukung bank atau layanan keuangan berikut yang dikelompokkan di bawah :country. Silakan pilih yang ingin Anda impor.',
     'spectre_input_fields_title'      => 'Masukkan bidang wajib',
-    'spectre_input_fields_text'       => 'Bidang berikut diamanatkan oleh ": provider" (dari: negara).',
+    'spectre_input_fields_text'       => 'Bidang berikut diamanatkan oleh ":provider" (dari :country).',
     'spectre_instructions_english'    => 'Petunjuk ini diberikan oleh momok untuk convencience Anda. Mereka berbahasa Inggris:',
 ];
diff --git a/resources/lang/id_ID/validation.php b/resources/lang/id_ID/validation.php
index 8090ad3e9b..68e8f4f71e 100644
--- a/resources/lang/id_ID/validation.php
+++ b/resources/lang/id_ID/validation.php
@@ -31,72 +31,72 @@ return [
     'file_invalid_mime'              => 'File ":name" adalah tipe ":mime" yang tidak diterima sebagai upload baru.',
     'file_too_large'                 => 'File "; name" terlalu besar.',
     'belongs_to_user'                => 'Nilai dari :attribute tidak diketahui',
-    'accepted'                       => 'Atribut: harus diterima.',
+    'accepted'                       => ':attribute harus diterima.',
     'bic'                            => 'Ini bukan BIC yang valid.',
-    'more'                           => ':atribut harus lebih besar dari nol.',
-    'active_url'                     => ':atribut bukan URL yang valid.',
-    'after'                          => ':atribut harus tanggal setelah :tanggal.',
-    'alpha'                          => ':atribut hanya boleh berisi huruf.',
-    'alpha_dash'                     => ':atribut hanya boleh berisi huruf, angka dan tanda hubung.',
-    'alpha_num'                      => ':Atribut hanya boleh berisi huruf dan angka.',
-    'array'                          => ':atribut harus berupa array.',
-    'unique_for_user'                => 'Sudah ada entri dengan :atribut ini.',
-    'before'                         => ':atribut harus tanggal sebelum :tanggal.',
+    'more'                           => ':attribute harus lebih besar dari nol.',
+    'active_url'                     => ':attribute bukan URL yang valid.',
+    'after'                          => ':attribute harus tanggal setelah :date.',
+    'alpha'                          => ':attribute hanya boleh berisi huruf.',
+    'alpha_dash'                     => ':attribute hanya boleh berisi huruf, angka dan tanda hubung.',
+    'alpha_num'                      => ':attribute hanya boleh berisi huruf dan angka.',
+    'array'                          => ':attribute harus berupa array.',
+    'unique_for_user'                => 'Sudah ada entri dengan :attribute ini.',
+    'before'                         => ':attribute harus tanggal sebelum :date.',
     'unique_object_for_user'         => 'Nama ini sudah digunakan',
     'unique_account_for_user'        => 'Nama akun ini sudah digunakan',
-    'between.numeric'                => ':Atribut harus antara :min dan :maks.',
-    'between.file'                   => ':Atribut harus antara :min dan :maks kilobyte.',
-    'between.string'                 => ':Atribut harus antara :min dan :maks karakter.',
-    'between.array'                  => ':Atribut harus antara :min dan :maks item.',
-    'boolean'                        => 'Bidang :atribut harus benar atau salah.',
-    'confirmed'                      => 'Konfirmasi :atribut tidak cocok.',
-    'date'                           => ':atribut bukan tanggal yang valid.',
-    'date_format'                    => ':atribut tidak cocok dengan the format :format.',
-    'different'                      => ':Atribut dan :other harus berbeda.',
-    'digits'                         => ':Atribut harus angka :digit.',
-    'digits_between'                 => ':Atribut harus antara :min dan :max angka.',
-    'email'                          => ':Atribut harus alamat email yang valid.',
-    'filled'                         => 'Bidang :atribut diperlukan.',
-    'exists'                         => ':Atribut yang dipilih tidak valid.',
-    'image'                          => ':Atribut harus gambar.',
-    'in'                             => ':Atribut yang dipilih tidak valid.',
-    'integer'                        => ':Atribut harus bilangan bulat.',
-    'ip'                             => ':Atribut harus alamat IP yang valid.',
-    'json'                           => ':Atribut harus string JSON yang valid.',
-    'max.numeric'                    => ':Atribut tidak boleh lebih besar dari :max.',
-    'max.file'                       => ':Atribut tidak boleh lebih besar dari kilobyte :max.',
-    'max.string'                     => ':Atribut tidak boleh lebih besar dari karakter :max.',
-    'max.array'                      => ':Atribut tidak boleh memiliki lebih dari item :max.',
-    'mimes'                          => ':Atribut harus jenis file: :values.',
-    'min.numeric'                    => ':Atribut harus sedikitnya :min.',
+    'between.numeric'                => ':attribute harus antara :min dan :max.',
+    'between.file'                   => ':attribute harus antara :min dan :max kilobyte.',
+    'between.string'                 => ':attribute harus antara :min dan :max karakter.',
+    'between.array'                  => ':attribute harus antara :min dan :max item.',
+    'boolean'                        => 'Bidang :attribute harus benar atau salah.',
+    'confirmed'                      => 'Konfirmasi :attribute tidak cocok.',
+    'date'                           => ':attribute bukan tanggal yang valid.',
+    'date_format'                    => ':attribute tidak cocok dengan the format :format.',
+    'different'                      => ':attribute dan :other harus berbeda.',
+    'digits'                         => ':attribute harus angka :digits.',
+    'digits_between'                 => ':attribute harus antara :min dan :max angka.',
+    'email'                          => ':attribute harus alamat email yang valid.',
+    'filled'                         => 'Bidang :attribute diperlukan.',
+    'exists'                         => ':attribute yang dipilih tidak valid.',
+    'image'                          => ':attribute harus gambar.',
+    'in'                             => ':attribute yang dipilih tidak valid.',
+    'integer'                        => ':attribute harus bilangan bulat.',
+    'ip'                             => ':attribute harus alamat IP yang valid.',
+    'json'                           => ':attribute harus string JSON yang valid.',
+    'max.numeric'                    => ':attribute tidak boleh lebih besar dari :max.',
+    'max.file'                       => ':attribute tidak boleh lebih besar dari kilobyte :max.',
+    'max.string'                     => ':attribute tidak boleh lebih besar dari karakter :max.',
+    'max.array'                      => ':attribute tidak boleh memiliki lebih dari item :max.',
+    'mimes'                          => ':attribute harus jenis file: :values.',
+    'min.numeric'                    => ':attribute harus sedikitnya :min.',
     'min.file'                       => 'Atribut harus minimal kilobyte :min.',
-    'min.string'                     => ':Atribut harus minimal karakter :min.',
-    'min.array'                      => ':Atribut harus minimal item :min.',
-    'not_in'                         => ':Atribut yang dipilih tidak valid.',
-    'numeric'                        => ':Atribut harus angka.',
-    'regex'                          => 'Format :atribut tidak valid.',
-    'required'                       => 'Bidang :atribut diperlukan.',
-    'required_if'                    => 'Bidang :atribut diperlukan ketika :other adalah :value.',
-    'required_unless'                => 'Bidang :atribut diperlukan minimal :other adalah dalam :values.',
-    'required_with'                  => 'Bidang :atribut diperlukan ketika :values terdapat nilai.',
-    'required_with_all'              => 'Bidang :atribut diperlukan ketika :values ada.',
-    'required_without'               => 'Bidang :atribut diperlukan ketika :values tidak ada.',
-    'required_without_all'           => 'Bidang :atribut diperlukan ketika tidak ada satupun :values ada.',
-    'same'                           => ':Atribut dan :other harus cocok.',
-    'size.numeric'                   => ':Atribut harus :size.',
-    'size.file'                      => ':Atribut harus kilobyte :size.',
-    'size.string'                    => ':Atribut harus karakter :size.',
-    'size.array'                     => ':Atribut harus berisi item :size.',
-    'unique'                         => ':Atribut sudah diambil.',
-    'string'                         => ':Atribut harus sebuah string.',
+    'min.string'                     => ':attribute harus minimal karakter :min.',
+    'min.array'                      => ':attribute harus minimal item :min.',
+    'not_in'                         => ':attribute yang dipilih tidak valid.',
+    'numeric'                        => ':attribute harus angka.',
+    'regex'                          => 'Format :attribute tidak valid.',
+    'required'                       => 'Bidang :attribute diperlukan.',
+    'required_if'                    => 'Bidang :attribute diperlukan ketika :other adalah :value.',
+    'required_unless'                => 'Bidang :attribute diperlukan minimal :other adalah dalam :values.',
+    'required_with'                  => 'Bidang :attribute diperlukan ketika :values terdapat nilai.',
+    'required_with_all'              => 'Bidang :attribute diperlukan ketika :values ada.',
+    'required_without'               => 'Bidang :attribute diperlukan ketika :values tidak ada.',
+    'required_without_all'           => 'Bidang :attribute diperlukan ketika tidak ada satupun :values ada.',
+    'same'                           => ':attribute dan :other harus cocok.',
+    'size.numeric'                   => ':attribute harus :size.',
+    'size.file'                      => ':attribute harus kilobyte :size.',
+    'size.string'                    => ':attribute harus karakter :size.',
+    'size.array'                     => ':attribute harus berisi item :size.',
+    'unique'                         => ':attribute sudah diambil.',
+    'string'                         => ':attribute harus sebuah string.',
     'url'                            => 'Format atribut tidak valid.',
-    'timezone'                       => ':Atribut harus zona yang valid.',
-    '2fa_code'                       => 'Bidang :atribut tidak valid.',
-    'dimensions'                     => ':Atribut memiliki dimensi gambar yang tidak valid.',
-    'distinct'                       => 'Bidang :atribut memiliki nilai duplikat.',
-    'file'                           => ':Atribut harus berupa file.',
-    'in_array'                       => 'Bidang :atribut tidak ada in :other.',
-    'present'                        => 'Bidang :atribut harus ada.',
+    'timezone'                       => ':attribute harus zona yang valid.',
+    '2fa_code'                       => 'Bidang :attribute tidak valid.',
+    'dimensions'                     => ':attribute memiliki dimensi gambar yang tidak valid.',
+    'distinct'                       => 'Bidang :attribute memiliki nilai duplikat.',
+    'file'                           => ':attribute harus berupa file.',
+    'in_array'                       => 'Bidang :attribute tidak ada in :other.',
+    'present'                        => 'Bidang :attribute harus ada.',
     'amount_zero'                    => 'Jumlah total tidak boleh nol',
     'secure_password'                => 'Ini bukan kata sandi yang aman. Silahkan coba lagi. Untuk informasi lebih lanjut, kunjungi https://goo.gl/NCh2tN',
 ];
diff --git a/resources/lang/nl_NL/auth.php b/resources/lang/nl_NL/auth.php
index 7b7944787e..be5f29709a 100644
--- a/resources/lang/nl_NL/auth.php
+++ b/resources/lang/nl_NL/auth.php
@@ -33,5 +33,5 @@ return [
     */
 
     'failed'   => 'Deze gegevens zijn niet correct.',
-    'throttle' => 'Te veel inlogpogingen. Probeer opnieuw in: seconden seconden.',
+    'throttle' => 'Te veel inlogpogingen. Probeer opnieuw in :seconds seconden.',
 ];
diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php
index ade0081955..5b90aeaf84 100644
--- a/resources/lang/nl_NL/firefly.php
+++ b/resources/lang/nl_NL/firefly.php
@@ -136,12 +136,28 @@ return [
     'journals_in_period_for_tag'                 => 'Alle transacties voor tag :tag tussen :start en :end',
     'not_available_demo_user'                    => 'De functie die je probeert te gebruiken is niet beschikbaar voor gebruikers van de demo.',
     'exchange_rate_instructions'                 => 'Betaalrekening "@naam" accepteert alleen boekingen in @native_currency. Als je @foreign_currency wilt gebruiken moet je ook het bedrag in @native_currency opgeven:',
-    'transfer_exchange_rate_instructions'        => 'Bronbetaalrekening "@source_name" accepteert alleen overschrijvingen in @source_currency. Doelbetaalrekening "@dest_name: accepteert alleen overschrijvingen in @dest_currency. Je moet het juiste bedrag in beide valuta opgeven.',
+    'transfer_exchange_rate_instructions'        => 'Bronbetaalrekening "@source_name" accepteert alleen overschrijvingen in @source_currency. Doelbetaalrekening "@dest_name" accepteert alleen overschrijvingen in @dest_currency. Je moet het juiste bedrag in beide valuta opgeven.',
     'transaction_data'                           => 'Transactiegegevens',
     'invalid_server_configuration'               => 'Ongeldige serverconfiguratie',
     'invalid_locale_settings'                    => 'Firefly III kan geldbedragen niet goed weergeven omdat je server de vereiste software mist. Er zijn instructies hoe dit te doen.',
     'quickswitch'                                => 'Quickswitch',
 
+    // check for updates:
+    'update_check_title'                         => 'Op updates controleren',
+    'admin_update_check_title'                   => 'Controleer automatisch op updates',
+    'admin_update_check_explain'                 => 'Firefly III kan automatisch op updates controleren. Wanneer je deze instelling inschakelt, neemt Firefly III contact op met Github om te kijken of er een nieuwe versie van Firefly III beschikbaar is. Wanneer dit het geval is, ontvang je een melding. Je kan deze melding testen met de knop aan de rechterkant. Geef hieronder aan of je Firefly III wilt laten controleren op updates.',
+    'check_for_updates_permission'               => 'Firefly III kan controleren op updates, maar heeft hiervoor je toestemming nodig. Ga naar de admin om aan te geven of deze functie moet worden ingeschakeld.',
+    'updates_ask_me_later'                       => 'Later vragen',
+    'updates_do_not_check'                       => 'Niet controleren op nieuwe versies',
+    'updates_enable_check'                       => 'Controleren op nieuwe versies',
+    'admin_update_check_now_title'               => 'Op updates controleren',
+    'admin_update_check_now_explain'             => 'Als u op de knop drukt, kijkt Firefly III of je huidige versie de nieuwste is.',
+    'check_for_updates_button'                   => 'Controleer nu!',
+    'update_new_version_alert'                   => 'Er is een nieuwe versie beschikbaar. Je gebruikt v:your_version, de nieuwste versie is v:new_version die werd uitgebracht op :date.',
+    'update_current_version_alert'               => 'Je gebruikt v:version, de nieuwste beschikbare versie.',
+    'update_newer_version_alert'                 => 'Je gebruikt v:your_version, wat nieuwer is dan de nieuwste versie, v:new_version.',
+    'update_check_error'                         => 'Er is een fout opgetreden bij het controleren op updates. Bekijk de logbestanden.',
+
     // search
     'search'                                     => 'Zoeken',
     'search_query'                               => 'Zoekopdracht',
@@ -1056,7 +1072,7 @@ return [
     'split_this_transfer'                   => 'Splits deze overschrijving',
     'cannot_edit_multiple_source'           => 'Je kan transactie #:id met omschrijving ":description" niet splitsen, want deze bevat meerdere bronrekeningen.',
     'cannot_edit_multiple_dest'             => 'Je kan transactie #:id met omschrijving ":description" niet wijzigen, want deze bevat meerdere doelrekeningen.',
-    'cannot_edit_reconciled'                => 'U kunt transactie #:id met omschrijving ": description" niet bewerken omdat deze is gemarkeerd als afgestemd (verrekend).',
+    'cannot_edit_reconciled'                => 'Je kunt transactie #:id met omschrijving ":description" niet bewerken omdat deze is gemarkeerd als afgestemd (verrekend).',
     'cannot_edit_opening_balance'           => 'Je kan het startsaldo van een rekening niet wijzigen via dit scherm.',
     'no_edit_multiple_left'                 => 'Je hebt geen geldige transacties geselecteerd.',
     'cannot_convert_split_journal'          => 'Kan geen gesplitste transactie omzetten',
diff --git a/resources/lang/nl_NL/form.php b/resources/lang/nl_NL/form.php
index 5e92dd9b13..b85de3dd06 100644
--- a/resources/lang/nl_NL/form.php
+++ b/resources/lang/nl_NL/form.php
@@ -169,6 +169,7 @@ return [
     'budget_keep_transactions'   => 'De transactie verbonden aan dit budget blijft bewaard.|De :count transacties verbonden aan dit budget blijven bewaard.',
     'category_keep_transactions' => 'De transactie verbonden aan deze categorie blijft bewaard.|De :count transacties verbonden aan deze categorie blijven bewaard.',
     'tag_keep_transactions'      => 'De transactie verbonden aan deze tag blijft bewaard.|De :count transacties verbonden aan deze tag blijven bewaard.',
+    'check_for_updates'          => 'Op updates controleren',
 
     'email'                 => 'E-mailadres',
     'password'              => 'Wachtwoord',
diff --git a/resources/lang/nl_NL/import.php b/resources/lang/nl_NL/import.php
index 2264666af7..633d1bb239 100644
--- a/resources/lang/nl_NL/import.php
+++ b/resources/lang/nl_NL/import.php
@@ -52,7 +52,7 @@ return [
     'status_finished_job'             => 'De geimporteerde transacties kan je vinden onder tag :tag.',
     'import_with_key'                 => 'Import met code \':key\'',
 
-    // file: upload something:
+    // file, upload something
     'file_upload_title'               => 'Importinstellingen (1/4) - Upload je bestand',
     'file_upload_text'                => 'Deze pagina\'s helpen je bestanden van je bank te importeren in Firefly III. Gebruik de hulp-pagina\'s linksboven voor meer informatie.',
     'file_upload_fields'              => 'Velden',
@@ -61,10 +61,10 @@ return [
     'file_upload_type_help'           => 'Selecteer het type bestand dat je zal uploaden',
     'file_upload_submit'              => 'Bestanden uploaden',
 
-    // file: upload types
+    // file, upload types
     'import_file_type_csv'            => 'CSV (kommagescheiden waardes)',
 
-    // file: initial config for CSV
+    // file, initial config for CSV
     'csv_initial_title'               => 'Importinstellingen (2/4) - Algemene CVS importinstellingen',
     'csv_initial_text'                => 'Om je bestand goed te kunnen importeren moet je deze opties verifiëren.',
     'csv_initial_box'                 => 'Algemene CVS importinstellingen',
@@ -75,13 +75,13 @@ return [
     'csv_initial_import_account_help' => 'Als jouw CSV bestand geen referenties bevat naar jouw rekening(en), geef dan hier aan om welke rekening het gaat.',
     'csv_initial_submit'              => 'Ga verder met stap 3/4',
 
-    // file: new options:
+    // file, new options:
     'file_apply_rules_title'          => 'Regels toepassen',
     'file_apply_rules_description'    => 'Past regels toe tijdens de import. Dit vertraagt de import behoorlijk.',
     'file_match_bills_title'          => 'Match contracten',
     'file_match_bills_description'    => 'Checkt of bestaande contracten matchen met nieuwe uitgaves. Dit vertraagt de import behoorlijk.',
 
-    // file: roles config
+    // file, roles config
     'csv_roles_title'                 => 'Importinstellingen (3/4) - rol van elke kolom definiëren',
     'csv_roles_text'                  => 'Elke kolom in je CSV-bestand bevat bepaalde gegevens. Gelieve aan te geven wat voor soort gegevens de import-routine kan verwachten. De optie "maak een link" betekent dat u elke vermelding in die kolom linkt aan een waarde uit je database. Een vaak gelinkte kolom is die met de IBAN-code van de tegenrekening. Die kan je dan linken aan de IBAN in jouw database.',
     'csv_roles_table'                 => 'Tabel',
@@ -94,7 +94,7 @@ return [
     'csv_roles_submit'                => 'Ga verder met stap 4/4',
     'csv_roles_warning'               => 'Geef minstens de kolom aan waar het bedrag in staat. Als het even kan, ook een kolom voor de omschrijving, datum en de andere rekening.',
 
-    // file: map data
+    // file, map data
     'file_map_title'                  => 'Importinstellingen (4/4) - Link importgegevens aan Firefly III-gegevens',
     'file_map_text'                   => 'In deze tabellen is de linkerwaarde een waarde uit je CSV bestand. Jij moet de link leggen, als mogelijk, met een waarde uit jouw database. Firefly houdt zich hier aan. Als er geen waarde is, selecteer dan ook niets.',
     'file_map_field_value'            => 'Veldwaarde',
@@ -141,11 +141,14 @@ return [
     'column_opposing-number'          => 'Tegenrekening (rekeningnummer)',
     'column_note'                     => 'Opmerking(en)',
 
+    // prerequisites
+    'prerequisites'                   => 'Vereisten',
+
     // bunq
     'bunq_prerequisites_title'        => 'Voorwaarden voor een import van bunq',
     'bunq_prerequisites_text'         => 'Om transacties bij bunq te importeren heb je een API sleutel nodig. Dit kan via de app.',
 
-    // Spectre:
+    // Spectre
     'spectre_title'                   => 'Importeer via Spectre',
     'spectre_prerequisites_title'     => 'Voorwaarden voor een import via Spectre',
     'spectre_prerequisites_text'      => 'Als je gegevens wilt importeren via de Spectre API, moet je een aantal geheime codes bezitten. Ze zijn te vinden op de secrets pagina.',
diff --git a/resources/lang/pl_PL/demo.php b/resources/lang/pl_PL/demo.php
index 1552d2d944..94833ad8f1 100644
--- a/resources/lang/pl_PL/demo.php
+++ b/resources/lang/pl_PL/demo.php
@@ -26,7 +26,7 @@ return [
     'index'                          => 'Witaj w Firefly III! Na tej stronie znajduje siÄ™ szybki przeglÄ…d Twoich finansów. Aby uzyskać wiÄ™cej informacji sprawdź Konta → Konta aktywów oraz oczywiÅ›cie strony Budżety oraz Raporty. Lub po prostu siÄ™ rozejrzyj i zobacz gdzie trafisz w koÅ„cu.',
     'accounts-index'                 => 'Konta aktywów są Twoimi osobistymi kontami bankowymi. Konta wydatków to konta na które wydajesz pieniądze takie jak sklepy oraz przyjaciele. Kona przychodów są kontami, z których otrzymujesz pieniądze takie jak twoja praca, zwrot podatków lub inne źródła przychodów. Na tej stronie możesz je modyfikować oraz usuwać.',
     'budgets-index'                  => 'Ta strona zawiera przegląd budżetów. Górny pasek pokazuje kwotę, która jest dostępna do budżetowania. Można ją dostosować dla dowolnego okresu, klikając kwotę po prawej stronie. Kwota, którą faktycznie wydałeś, jest pokazana na pasku ponizej. Pod tym znajdują się wydatki na budżet oraz co przeznaczyłeś na nie.',
-    'reports-index-start'            => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.',
+    'reports-index-start'            => 'Firefly III obsługuje wiele typów raportów. Możesz przeczytać o nich klikając ikonę  w prawym górnym rogu.',
     'reports-index-examples'         => 'Sprawdź te przykłady: miesięczny przegląd finansowy, roczny przegląd finansowy i przegląd budżetu.',
     'currencies-index'               => 'Firefly obsługuje wiele walut. Chociaż domyślnie jest to euro, można go ustawić na dolara amerykańskiego i wiele innych walut. Jak widać niewielki wybór walut został uwzględniony, ale możesz dodać własne, jeśli chcesz. Zmiana domyślnej waluty nie zmieni waluty istniejących transakcji, jednak: Firefly III obsługuje korzystanie z wielu walut w tym samym czasie.',
     'transactions-index'             => 'Te wydatki, depozyty i transfery nie są szczególnie pomysłowe. Zostały wygenerowane automatycznie.',
diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php
index 7e71eb177d..f61c03df21 100644
--- a/resources/lang/pl_PL/firefly.php
+++ b/resources/lang/pl_PL/firefly.php
@@ -80,7 +80,7 @@ return [
     'source_accounts'                            => 'Konto(a) źródłowe',
     'destination_accounts'                       => 'Konto(a) docelowe',
     'user_id_is'                                 => 'Twój identyfikator użytkownika to :user',
-    'field_supports_markdown'                    => 'To pole obsługuje  Markdown.',
+    'field_supports_markdown'                    => 'To pole obsługuje Markdown.',
     'need_more_help'                             => 'Jeśli potrzebujesz dodatkowej pomocy w korzystaniu z Firefly III, proszę opisz go w zgłoszeniu na Githubie.',
     'reenable_intro_text'                        => 'Możesz także ponownie włączyć samouczek.',
     'intro_boxes_after_refresh'                  => 'Samouczek pojawi się po odświeżeniu strony.',
@@ -121,7 +121,7 @@ return [
     'transferred'                                => 'Przesłano',
     'all_withdrawal'                             => 'Wszystkie wydatki',
     'all_transactions'                           => 'Wszystkie transakcje',
-    'title_withdrawal_between'                   => 'Wszystkie wydatki do :start do :koniec',
+    'title_withdrawal_between'                   => 'Wszystkie wydatki do :start do :end',
     'all_deposit'                                => 'Wszystkie przychody',
     'title_deposit_between'                      => 'Wszystkie przychody do :start do :end',
     'all_transfers'                              => 'Wszystkie transfery',
@@ -142,6 +142,22 @@ return [
     'invalid_locale_settings'                    => 'Firefly III nie może sformatować kwot, ponieważ brakuje wymaganych pakietów na Twoim serwerze. Sprawdźinstrukcje jak je zainstalować (po angielsku).',
     'quickswitch'                                => 'Szybki przełącznik',
 
+    // check for updates:
+    'update_check_title'                         => 'Sprawdź aktualizacje',
+    'admin_update_check_title'                   => 'Automatycznie sprawdzaj dostępność aktualizacji',
+    'admin_update_check_explain'                 => 'Firefly III może automatycznie sprawdzać dostępność aktualizacji. Po włączeniu tej opcji będzie kontaktować się z Githubem w celu sprawdzenia czy dostępna jest nowa wersja Firefly III. Jeżeli będzie, otrzymasz powiadomienie. Możesz przetestować to powiadomienie używając przycisku po prawej stronie. Wskaż proszę czy chcesz, aby Firefly III sprawdzało dostępność aktualizacji.',
+    'check_for_updates_permission'               => 'Firefly III może sprawdzić dostępność aktualizacji, ale potrzebuje Twojej zgody, aby to robić. Przejdź do administracji, aby określić, czy ta funkcja ma być włączona.',
+    'updates_ask_me_later'                       => 'Zapytaj mnie później',
+    'updates_do_not_check'                       => 'Nie sprawdzaj dostępności aktualizacji',
+    'updates_enable_check'                       => 'Włącz sprawdzanie aktualizacji',
+    'admin_update_check_now_title'               => 'Sprawdź dostępność aktualizacji',
+    'admin_update_check_now_explain'             => 'Jeśli naciśniesz przycisk, Firefly III sprawdzi, czy używasz najnowszej wersji.',
+    'check_for_updates_button'                   => 'Sprawdź teraz!',
+    'update_new_version_alert'                   => 'Dostępna jest nowa wersja. Używasz wersji :your_version, najnowsza wersja to :new_version wydana :date.',
+    'update_current_version_alert'               => 'Używasz wersji :version, która jest najnowszą dostępną wersją.',
+    'update_newer_version_alert'                 => 'Używasz wersji :your_version, która jest nowsza niż najnowsza wersja, :new_version.',
+    'update_check_error'                         => 'Wystąpił błąd podczas sprawdzania aktualizacji. Przejrzyj pliki dziennika.',
+
     // search
     'search'                                     => 'Szukaj',
     'search_query'                               => 'Zapytanie',
@@ -667,9 +683,9 @@ return [
     'reconcile_go_back'                        => 'Możesz zawsze zmodyfikować lub usunąć korektę później.',
     'must_be_asset_account'                    => 'Możesz uzgodnić tylko konta aktywów',
     'reconciliation_stored'                    => 'Uzgodnienie zapisane',
-    'reconcilliation_transaction_title'        => 'Reconciliation (:from to :to)',
-    'reconcile_this_account'                   => 'Reconcile this account',
-    'confirm_reconciliation'                   => 'Confirm reconciliation',
+    'reconcilliation_transaction_title'        => 'Uzgodnienie (:from do :to)',
+    'reconcile_this_account'                   => 'Uzgodnij to konto',
+    'confirm_reconciliation'                   => 'Potwierdź uzgodnienie',
     'submitted_start_balance'                  => 'Przesłane saldo początkowe',
     'selected_transactions'                    => 'Wybrane transakcje (:count)',
     'already_cleared_transactions'             => 'Transakcje uzgodnione wcześniej (:count)',
@@ -837,7 +853,7 @@ return [
     'report_preset_ranges'                     => 'Predefiniowane zakresy',
     'shared'                                   => 'Udostępnione',
     'fiscal_year'                              => 'Rok podatkowy',
-    'income_entry'                             => 'Dochód z konta ":nazwa" między: :start a :end',
+    'income_entry'                             => 'Dochód z konta ":name" między: :start a :end',
     'expense_entry'                            => 'Wydatki na konto ":name" między :start a :end',
     'category_entry'                           => 'Wydatki w kategorii ":name" między :start i :end',
     'budget_spent_amount'                      => 'Wydatki w budżecie ":budget" między :start i :end',
@@ -1005,7 +1021,7 @@ return [
     'store_new_link_type'                   => 'Zapisz nowy typ łącza',
     'update_link_type'                      => 'Modyfikuj typ łącza',
     'edit_link_type'                        => 'Modyfikuj typ łącza ":name"',
-    'updated_link_type'                     => 'Zaktualizowano typ łącza ":nazwa"',
+    'updated_link_type'                     => 'Zaktualizowano typ łącza ":name"',
     'delete_link_type'                      => 'Usuń typ łącza ":name"',
     'deleted_link_type'                     => 'Usunięto typ łącza ":name"',
     'stored_new_link_type'                  => 'Zapisz nowy typ łącza ":name"',
diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php
index d00e7bd278..b95f872fc6 100644
--- a/resources/lang/pl_PL/form.php
+++ b/resources/lang/pl_PL/form.php
@@ -165,10 +165,11 @@ return [
     'also_delete_connections'    => 'Jedynie transakcja połączona z tym typem łącza utraci to połączenie. |Wszystkie :count transakcji połączone tym typem łącza utracą swoje połączenie.',
     'also_delete_rules'          => 'Jedynie reguła połączona z tą grupą reguł utraci to połączenie. |Wszystkie :count reguły połączone tą grupą reguł zostaną również usunięte.',
     'also_delete_piggyBanks'     => 'Jedynie skarbonka połączona z tym kontem zostanie również usunięta. |Wszystkie :count skarbonek połączone z tym kontem zostaną usunięte.',
-    'bill_keep_transactions'     => 'Jedyna transakcja związana z tym rachunkiem nie zostanie usunięta. | Wszystkie: transakcje związane z tym rachunkiem zostaną oszczędzone.',
+    'bill_keep_transactions'     => 'Jedyna transakcja związana z tym rachunkiem nie zostanie usunięta. | Wszystkie :count transakcje związane z tym rachunkiem zostaną oszczędzone.',
     'budget_keep_transactions'   => 'Jedynie transakcja związana z tym rachunkiem nie zostanie usunięta. |Wszystkie :count transakcji połączonych z tym rachunkiem zostaną oszczędzone.',
     'category_keep_transactions' => 'Jedynie transakcja związana z tą kategorią nie zostanie usunięta. |Wszystkie :count transakcje połączone z tą kategorią zostaną oszczędzone.',
     'tag_keep_transactions'      => 'Jedynie transakcja połączona z tym tagiem nie zostanie usunięta. |Wszystkie :count transakcji połączonych z tym tagiem zostaną oszczędzone.',
+    'check_for_updates'          => 'Sprawdź aktualizacje',
 
     'email'                 => 'Adres email',
     'password'              => 'Hasło',
diff --git a/resources/lang/pl_PL/import.php b/resources/lang/pl_PL/import.php
index 6961ee5e9a..84d4183933 100644
--- a/resources/lang/pl_PL/import.php
+++ b/resources/lang/pl_PL/import.php
@@ -49,10 +49,10 @@ return [
     'status_bread_crumb'              => 'Status importu',
     'status_sub_title'                => 'Status importu',
     'config_sub_title'                => 'Skonfiguruj import',
-    'status_finished_job'             => 'Zaimportowane transakcje można znaleźć w tagu : tag.',
+    'status_finished_job'             => 'Zaimportowane transakcje można znaleźć w tagu :tag.',
     'import_with_key'                 => 'Import z kluczem \':key\'',
 
-    // file: upload something:
+    // file, upload something
     'file_upload_title'               => 'Konfiguracja importu (1/4) - Prześlij swój plik',
     'file_upload_text'                => 'Ta procedura pomoże Ci importować pliki z twojego banku do Firefly III. Sprawdź stronę pomocy w prawym górnym rogu.',
     'file_upload_fields'              => 'Pola',
@@ -61,10 +61,10 @@ return [
     'file_upload_type_help'           => 'Wybierz typ pliku, który będziesz przesyłać',
     'file_upload_submit'              => 'Prześlij pliki',
 
-    // file: upload types
+    // file, upload types
     'import_file_type_csv'            => 'CSV (wartości oddzielone przecinkami)',
 
-    // file: initial config for CSV
+    // file, initial config for CSV
     'csv_initial_title'               => 'Konfiguracja importu (2/4) - Podstawowa konfiguracja importu CSV',
     'csv_initial_text'                => 'Aby móc poprawnie zaimportować plik, sprawdź poprawność poniższych opcji.',
     'csv_initial_box'                 => 'Podstawowa konfiguracja importu CSV',
@@ -75,13 +75,13 @@ return [
     'csv_initial_import_account_help' => 'Jeśli Twój plik CSV NIE zawiera informacji o Twoich kontach aktywów, użyj tego menu, aby wybrać, do którego konta należą transakcje w pliku CSV.',
     'csv_initial_submit'              => 'Przejdź do kroku 3/4',
 
-    // file: new options:
+    // file, new options:
     'file_apply_rules_title'          => 'Zastosuj reguły',
     'file_apply_rules_description'    => 'Zastosuj swoje zasady. Zwróć uwagę, że znacznie spowalnia to imprtowanie.',
     'file_match_bills_title'          => 'Dopasuj rachunki',
     'file_match_bills_description'    => 'Dopasuj swoje rachunki do nowo utworzonych wypłat. Zwróć uwagę, że znacznie spowalnia to importowanie.',
 
-    // file: roles config
+    // file, roles config
     'csv_roles_title'                 => 'Konfiguracja importu (3/4) - Zdefiniuj rolę każdej kolumny',
     'csv_roles_text'                  => 'Każda kolumna w pliku CSV zawiera określone dane. Proszę wskazać, jakiego rodzaju danych importer powinien oczekiwać. Opcja "mapowania" danych oznacza, że każdy wpis znaleziony w kolumnie zostanie połączony z wartością w bazie danych. Często odwzorowywana kolumna to kolumna zawierająca numer IBAN konta przeciwnego. Można go łatwo dopasować do obecnego numeru IBAN w bazie danych.',
     'csv_roles_table'                 => 'Tabela',
@@ -94,7 +94,7 @@ return [
     'csv_roles_submit'                => 'Przejdź do kroku 4/4',
     'csv_roles_warning'               => 'Zaznacz jedną z kolumn jako kolumnę z kwotami. Wskazane jest również wybranie kolumny dla opisu, daty oraz konta przeciwnego.',
 
-    // file: map data
+    // file, map data
     'file_map_title'                  => 'Ustawienia importu (4/4) - Połącz dane importu z danymi Firefly III',
     'file_map_text'                   => 'W poniższych tabelach lewa wartość pokazuje informacje znalezione w przesłanym pliku. Twoim zadaniem jest zamapowanie tej wartości, jeśli to możliwe, na wartość już obecną w bazie danych. Firefly będzie trzymać się tego mapowania. Jeśli nie ma wartości do odwzorowania lub nie chcesz mapować określonej wartości, nie wybieraj niczego.',
     'file_map_field_value'            => 'Wartość pola',
@@ -141,11 +141,14 @@ return [
     'column_opposing-number'          => 'Konto przeciwne (numer konta)',
     'column_note'                     => 'Uwagi',
 
+    // prerequisites
+    'prerequisites'                   => 'Wymagania',
+
     // bunq
     'bunq_prerequisites_title'        => 'Wymagania wstępne dla importu z bunq',
     'bunq_prerequisites_text'         => 'Aby zaimportować z bunq, musisz uzyskać klucz API. Możesz to zrobić za pomocą aplikacji.',
 
-    // Spectre:
+    // Spectre
     'spectre_title'                   => 'Importuj za pomocÄ… Spectre',
     'spectre_prerequisites_title'     => 'Wymagania wstępne do importowania za pomocą Spectre',
     'spectre_prerequisites_text'      => 'Aby importować dane za pomocą interfejsu Spectre API, musisz udowodnić pewne sekrety. Można je znaleźć na stronie sekretów.',
diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php
index 6abb650075..04c5c453ab 100644
--- a/resources/lang/pl_PL/validation.php
+++ b/resources/lang/pl_PL/validation.php
@@ -29,7 +29,7 @@ return [
     'file_already_attached'          => 'Przesłany plik ":name" jest już dołączony do tego obiektu.',
     'file_attached'                  => 'Pomyślnie wgrano plik ":name".',
     'file_invalid_mime'              => 'Plik ":name" jest typu ":mime", który nie jest akceptowany jako nowy plik do przekazania.',
-    'file_too_large'                 => 'Plik ": nazwa" jest zbyt duży.',
+    'file_too_large'                 => 'Plik ":name" jest zbyt duży.',
     'belongs_to_user'                => 'Wartość :attribute jest nieznana',
     'accepted'                       => ':attribute musi zostać zaakceptowany.',
     'bic'                            => 'To nie jest prawidłowy BIC.',
@@ -40,7 +40,7 @@ return [
     'alpha_dash'                     => ':attribute może zawierać litery, cyfry oraz myślniki.',
     'alpha_num'                      => ':attribute może zawierać jedynie litery oraz cyfry.',
     'array'                          => ':attribute musi być tablicą.',
-    'unique_for_user'                => 'Istnieje już wpis z tym: attribute.',
+    'unique_for_user'                => 'Istnieje już wpis z tym :attribute.',
     'before'                         => ':attribute musi być wcześniejszą datą w stosunku do :date.',
     'unique_object_for_user'         => 'Ta nazwa jest już w użyciu',
     'unique_account_for_user'        => 'Ta nazwa konta jest już w użyciu',
diff --git a/resources/stubs/demo-configuration.json b/resources/stubs/demo-configuration.json
index c69c8bfe71..ed3e7a60b1 100644
--- a/resources/stubs/demo-configuration.json
+++ b/resources/stubs/demo-configuration.json
@@ -1,37 +1,37 @@
 {
-    "has-headers": true,
-    "date-format": "Y-m-d",
-    "delimiter": ",",
-    "import-account": 1,
-    "specifics": [],
-    "column-count": 7,
-    "column-roles": [
-        "account-iban",
-        "opposing-name",
-        "amount",
-        "date-transaction",
-        "description",
-        "category-name",
-        "budget-name"
-    ],
-    "column-do-mapping": [
-        true,
-        true,
-        false,
-        false,
-        false,
-        false,
-        false
-    ],
-    "column-roles-complete": false,
-    "column-mapping-config": {
-        "0": {
-            "NL11XOLA6707795988": 1,
-            "NL81RCQZ7160379858": 3
-        },
-        "1": [],
-        "5": [],
-        "6": []
+  "has-headers": true,
+  "date-format": "Y-m-d",
+  "delimiter": ",",
+  "import-account": 1,
+  "specifics": [],
+  "column-count": 7,
+  "column-roles": [
+    "account-iban",
+    "opposing-name",
+    "amount",
+    "date-transaction",
+    "description",
+    "category-name",
+    "budget-name"
+  ],
+  "column-do-mapping": [
+    true,
+    true,
+    false,
+    false,
+    false,
+    false,
+    false
+  ],
+  "column-roles-complete": false,
+  "column-mapping-config": {
+    "0": {
+      "NL11XOLA6707795988": 1,
+      "NL81RCQZ7160379858": 3
     },
-    "column-mapping-complete": false
+    "1": [],
+    "5": [],
+    "6": []
+  },
+  "column-mapping-complete": false
 }
\ No newline at end of file
diff --git a/resources/views/accounts/reconcile/overview.twig b/resources/views/accounts/reconcile/overview.twig
index abc2fe9af3..78502d20af 100644
--- a/resources/views/accounts/reconcile/overview.twig
+++ b/resources/views/accounts/reconcile/overview.twig
@@ -15,7 +15,7 @@
                 
                 
                 {% for id in transactionIds %}
-                    
+                    
                 {% endfor %}
 
                 
@@ -33,14 +33,14 @@
                     
-                        
+                        
@@ -60,36 +60,36 @@
                     
                 {% endif %}
                 {% if diffCompare != 0 %}
-                
-
-
-
-
-
-
- +
+
+
+ +
-
-

- {{ 'reconcile_go_back'|_ }} -

+

+ {{ 'reconcile_go_back'|_ }} +

{% endif %}
diff --git a/resources/views/admin/link/show.twig b/resources/views/admin/link/show.twig index 3a1dab5af5..3d452df573 100644 --- a/resources/views/admin/link/show.twig +++ b/resources/views/admin/link/show.twig @@ -28,7 +28,8 @@
{{ 'submitted_end_balance'|_ }} (date){{ formatAmountByAccount(account, endBalance)}}{{ formatAmountByAccount(account, endBalance) }}
{{ 'difference'|_ }} {{ formatAmountByAccount(account, difference) }} - +
{% if linkType.editable %}
- - + +
{% endif %}
- +
diff --git a/resources/views/admin/users/delete.twig b/resources/views/admin/users/delete.twig index 80c194816d..64ad1ec1ae 100644 --- a/resources/views/admin/users/delete.twig +++ b/resources/views/admin/users/delete.twig @@ -25,7 +25,8 @@

diff --git a/resources/views/bills/index.twig b/resources/views/bills/index.twig index b262cd604a..5635099605 100644 --- a/resources/views/bills/index.twig +++ b/resources/views/bills/index.twig @@ -8,29 +8,29 @@ {% if bills.count == 0 %} {% include 'partials.empty' with {what: 'default', type: 'bills',route: route('bills.create')} %} {% else %} -
-
-
-
-

{{ title }}

+
+
+
+
+

{{ title }}

-
- -
-
-
- {% include 'list/bills' %} +
+
+ {% include 'list/bills' %} +
- {% endif %} +
+
+{% endif %} {% endblock %} {% block styles %} diff --git a/resources/views/bills/show.twig b/resources/views/bills/show.twig index 4a2542f91b..afde0b88fe 100644 --- a/resources/views/bills/show.twig +++ b/resources/views/bills/show.twig @@ -86,12 +86,12 @@
{% if bill.notes.count == 1 %} - +
-
{{ trans('list.notes') }} {{ bill.notes.first.text|markdown }}
+
{% endif %} diff --git a/resources/views/budgets/income.twig b/resources/views/budgets/income.twig index 50c80832f3..201e2f2a3c 100644 --- a/resources/views/budgets/income.twig +++ b/resources/views/budgets/income.twig @@ -5,7 +5,7 @@ diff --git a/resources/views/budgets/index.twig b/resources/views/budgets/index.twig index f0b12e1493..b340a9ef02 100644 --- a/resources/views/budgets/index.twig +++ b/resources/views/budgets/index.twig @@ -17,10 +17,10 @@ {{ 'budgeted'|_ }}: {{ budgeted|formatAmountPlain }}
- {{ trans('firefly.available_between',{start : periodStart, end: periodEnd }) }}: - {{ available|formatAmountPlain }} - - + {{ trans('firefly.available_between',{start : periodStart, end: periodEnd }) }}: + {{ available|formatAmountPlain }} + +
diff --git a/resources/views/budgets/info.twig b/resources/views/budgets/info.twig index 25a8104b47..6bc6ff6582 100644 --- a/resources/views/budgets/info.twig +++ b/resources/views/budgets/info.twig @@ -5,50 +5,50 @@ - - + + diff --git a/resources/views/budgets/show.twig b/resources/views/budgets/show.twig index f2a1c9e945..4a697a3c6e 100644 --- a/resources/views/budgets/show.twig +++ b/resources/views/budgets/show.twig @@ -122,27 +122,29 @@ {{ limit.spent|formatAmount }} {% if limit.spent > 0 %} - - - {% set overspent = limit.amount + limit.spent < 0 %} + + + {% set overspent = limit.amount + limit.spent < 0 %} - {% if overspent %} - {% set pct = (limit.spent != 0 ? (limit.amount / (limit.spent*-1))*100 : 0) %} -
-
-
-
- {% else %} - {% set pct = (limit.amount != 0 ? (((limit.spent*-1) / limit.amount)*100) : 0) %} -
-
-
- {% endif %} - - + {% if overspent %} + {% set pct = (limit.spent != 0 ? (limit.amount / (limit.spent*-1))*100 : 0) %} +
+
+
+
+ {% else %} + {% set pct = (limit.amount != 0 ? (((limit.spent*-1) / limit.amount)*100) : 0) %} +
+
+
+ {% endif %} + + {% endif %} diff --git a/resources/views/categories/index.twig b/resources/views/categories/index.twig index 8f73c9b307..743d72eede 100644 --- a/resources/views/categories/index.twig +++ b/resources/views/categories/index.twig @@ -6,30 +6,30 @@ {% block content %} {% if categories.count > 0 %} -
-
-
-
-

{{ 'categories'|_ }}

+
+
+
+
+

{{ 'categories'|_ }}

- - -
-
- {% include 'list/categories' %} + + +
+
+ {% include 'list/categories' %}
- {% else %} +
+
+{% else %} {% include 'partials.empty' with {what: 'default', type: 'categories',route: route('categories.create')} %} {% endif %} {% endblock %} diff --git a/resources/views/form/location.twig b/resources/views/form/location.twig index c8201e641f..939bef8ff3 100644 --- a/resources/views/form/location.twig +++ b/resources/views/form/location.twig @@ -2,118 +2,120 @@
{% if env('MAPBOX_API_KEY','') == '' %} -

- {{ trans('firefly.mapbox_api_key')|raw }} -

+

+ {{ trans('firefly.mapbox_api_key')|raw }} +

{% else %}
-
+

{{ 'press_tag_location'|_ }} {{ 'clear_location'|_ }}

- {# latitude #} - {% if old(name~'_latitude') %} - - {% else %} - - {% endif %} + {# latitude #} + {% if old(name~'_latitude') %} + + {% else %} + + {% endif %} - {# longitude #} - {% if old('tag_position_longitude') %} - - {% else %} - - {% endif %} + {# longitude #} + {% if old('tag_position_longitude') %} + + {% else %} + + {% endif %} - {# zoomlevel #} - {% if old('tag_position_zoomlevel') %} - - {% else %} - - {% endif %} - {% if tag.zoomLevel and tag.longitude and tag.latitude %} - - {% else %} - - {% endif %} + {# zoomlevel #} + {% if old('tag_position_zoomlevel') %} + + {% else %} + + {% endif %} + {% if tag.zoomLevel and tag.longitude and tag.latitude %} + + {% else %} + + {% endif %} {% include 'form/feedback' %} {% endif %}
{% if env('MAPBOX_API_KEY','') != '' %} -{% set latitudevar = name~'_latitude' %} -{% set longitudevar = name~'_longitude' %} -{% set zoomlevelvar = name~'_zoomlevel' %} -{% set hastagvar = name~'_has_tag' %} -{% set settagvar = name~'_set_tag' %} -{% set clearvar = name~'_clear_location' %} + {% set latitudevar = name~'_latitude' %} + {% set longitudevar = name~'_longitude' %} + {% set zoomlevelvar = name~'_zoomlevel' %} + {% set hastagvar = name~'_has_tag' %} + {% set settagvar = name~'_set_tag' %} + {% set clearvar = name~'_clear_location' %} - + if (typeof mapboxToken === 'undefined') { + var mapboxToken = 'invalid'; + } + // + document.getElementById('{{ clearvar }}').addEventListener('click', function () { + if (typeof marker !== 'undefined') { + marker.remove(); + $('input[name="{{ hastagvar }}"]').val('false'); + } + return false; + }); + + // set location thing: + function setTagLocation(e) { + $('input[name="{{ latitudevar }}"]').val(e.latlng.lat); + $('input[name="{{ longitudevar }}"]').val(e.latlng.lng); + $('input[name="{{ zoomlevelvar }}"]').val(mymap.getZoom()); + $('input[name="{{ hastagvar }}"]').val('true'); + + // remove existing marker: + if (typeof marker !== 'undefined') { + marker.remove(); + } + // new marker + marker = L.marker([e.latlng.lat, e.latlng.lng]).addTo(mymap); + } + + + console.log({{ longitudevar }}); + + document.addEventListener("DOMContentLoaded", function () { + "use strict"; + + // make map: + mymap = L.map('{{ name }}_map').setView([{{ latitudevar }}, {{ longitudevar }}], {{ zoomlevelvar }}); + + L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', { + attribution: 'Map data © OpenStreetMap contributors, CC-BY-SA, Imagery © Mapbox', + maxZoom: 18, + id: 'mapbox.streets', + accessToken: mapboxToken + }).addTo(mymap); + + mymap.on('contextmenu', setTagLocation); + + // add marker + if (typeof {{ settagvar }} !== 'undefined' && {{ settagvar }} === true) { + marker = L.marker([{{ latitudevar }}, {{ longitudevar }}]).addTo(mymap); + } + + }); + {% endif %} diff --git a/resources/views/form/number.twig b/resources/views/form/number.twig index efffb5b8a0..6951b19328 100644 --- a/resources/views/form/number.twig +++ b/resources/views/form/number.twig @@ -2,7 +2,7 @@
- {{ Form.input('number', name, value, options) }} + {{ Form.input('number', name, value, options) }} {% include 'form/feedback' %}
diff --git a/resources/views/import/bank/form.twig b/resources/views/import/bank/form.twig index 70f99a6790..a7c6507a01 100644 --- a/resources/views/import/bank/form.twig +++ b/resources/views/import/bank/form.twig @@ -34,13 +34,13 @@ {% for remoteAccount in remoteAccounts %} - + {{ remoteAccount.name }} -
{{ remoteAccount.number }} +
{{ remoteAccount.number }} {{ remoteAccount.currency }} diff --git a/resources/views/import/file/initial.twig b/resources/views/import/file/initial.twig index fa2e6121ec..cff85df421 100644 --- a/resources/views/import/file/initial.twig +++ b/resources/views/import/file/initial.twig @@ -79,7 +79,7 @@
diff --git a/resources/views/import/file/map.twig b/resources/views/import/file/map.twig index a2ad9d0010..3a347f8905 100644 --- a/resources/views/import/file/map.twig +++ b/resources/views/import/file/map.twig @@ -48,8 +48,8 @@ {{ Form.select('mapping['~field.index~']['~option~']', - field.options, - job.configuration['column-mapping-config'][field.index][option], {class: 'form-control'}) }} + field.options, + job.configuration['column-mapping-config'][field.index][option], {class: 'form-control'}) }} {% endfor %} diff --git a/resources/views/import/spectre/redirect.twig b/resources/views/import/spectre/redirect.twig new file mode 100644 index 0000000000..e76c8b4bdb --- /dev/null +++ b/resources/views/import/spectre/redirect.twig @@ -0,0 +1,15 @@ + + + + + + + Page Redirection + + + +If you are not redirected automatically, follow this link to Spectre.. + +#} \ No newline at end of file diff --git a/resources/views/import/status.twig b/resources/views/import/status.twig index 2844f818fa..ac042e5dd6 100644 --- a/resources/views/import/status.twig +++ b/resources/views/import/status.twig @@ -63,22 +63,22 @@

{% if job.configuration['has-config-file'] != false %} - + {% endif %}
{% if job.configuration['has-config-file'] != false %} -

-   -

-

- {{ trans('import.status_ready_share')|raw }} -

+

+   +

+

+ {{ trans('import.status_ready_share')|raw }} +

{% endif %}
@@ -149,6 +149,7 @@ var langImportMultiError = '{{ trans('import.status_errors_multi')|escape('js') }}'; var jobStatusUri = '{{ route('import.status.json', [job.key]) }}'; var jobStartUri = '{{ route('import.start', [job.key]) }}'; + var jobConfigureUri = '{{ route('import.configure', [job.key]) }}'; var token = '{{ csrf_token() }}'; var job = {{ job|json_encode|raw }}; diff --git a/resources/views/index.twig b/resources/views/index.twig index bab812d8b9..c763197739 100644 --- a/resources/views/index.twig +++ b/resources/views/index.twig @@ -112,7 +112,8 @@ {# EXPENSE ACCOUNTS #}
@@ -123,7 +124,8 @@ {% if showDeps %}
@@ -146,9 +148,9 @@ {% if start.lte(today) and end.gte(today) %} - var today = {{ today.diffInDays(start) + 1 }}; + var today = {{ today.diffInDays(start) + 1 }}; {% else %} - var today = -1; + var today = -1; {% endif %} diff --git a/resources/views/javascript/variables.twig b/resources/views/javascript/variables.twig index 0da9d3eadf..1bd44157cc 100644 --- a/resources/views/javascript/variables.twig +++ b/resources/views/javascript/variables.twig @@ -1,4 +1,3 @@ - // date ranges var ranges = {} {% for title, range in dateRangeConfig.ranges %} @@ -7,22 +6,22 @@ var ranges = {} // date range meta configuration var dateRangeMeta = { - title: "{{ dateRangeTitle }}", - uri: "{{ route('daterange') }}", - labels: { - apply: "{{ 'apply'|_ }}", - cancel: "{{ 'cancel'|_ }}", - from: "{{ 'from'|_ }}", - to: "{{ 'to'|_ }}", - customRange: "{{ 'customRange'|_ }}" - } +title: "{{ dateRangeTitle }}", +uri: "{{ route('daterange') }}", +labels: { +apply: "{{ 'apply'|_ }}", +cancel: "{{ 'cancel'|_ }}", +from: "{{ 'from'|_ }}", +to: "{{ 'to'|_ }}", +customRange: "{{ 'customRange'|_ }}" +} }; // date range actual configuration: var dateRangeConfig = { - startDate: moment("{{ dateRangeConfig.start }}"), - endDate: moment("{{ dateRangeConfig.end }}"), - ranges: ranges +startDate: moment("{{ dateRangeConfig.start }}"), +endDate: moment("{{ dateRangeConfig.end }}"), +ranges: ranges }; diff --git a/resources/views/json/piggy-banks.twig b/resources/views/json/piggy-banks.twig index d8cc226c5e..478ba1d95b 100644 --- a/resources/views/json/piggy-banks.twig +++ b/resources/views/json/piggy-banks.twig @@ -5,9 +5,10 @@
{% for entry in info %} - {{ entry.name }}
+ {{ entry.name }}
-
+
{% if entry.percentage >=20 %}{{ entry.amount|formatAmountPlain }}{% endif %}
{% if entry.percentage < 20 %} {{ entry.amount|formatAmountPlain }}{% endif %} diff --git a/resources/views/layout/default.twig b/resources/views/layout/default.twig index d01ab308c0..f39e95761a 100644 --- a/resources/views/layout/default.twig +++ b/resources/views/layout/default.twig @@ -185,7 +185,8 @@ - + {% if not shownDemo %} diff --git a/resources/views/list/accounts.twig b/resources/views/list/accounts.twig index 90a031efbb..90c69be280 100644 --- a/resources/views/list/accounts.twig +++ b/resources/views/list/accounts.twig @@ -21,7 +21,14 @@ {% for account in accounts %} -
{% if what == 'asset' %}{% endif %}
+
{% if what == 'asset' %}{% endif %}
{{ account.name }} {% if what == "asset" %} diff --git a/resources/views/list/bills.twig b/resources/views/list/bills.twig index e7bb11c980..e4e8f6afc8 100644 --- a/resources/views/list/bills.twig +++ b/resources/views/list/bills.twig @@ -19,7 +19,9 @@ {% for entry in bills %} -
+
{{ entry.name }} diff --git a/resources/views/list/journals.twig b/resources/views/list/journals.twig index a0b30a4d9b..8cda6503bf 100644 --- a/resources/views/list/journals.twig +++ b/resources/views/list/journals.twig @@ -47,12 +47,14 @@
{{ 'select_transactions'|_ }} + > {{ 'stop_selection'|_ }} {% if showReconcile == true %} {% if moment == 'all' %} - {{ 'reconcile_this_account'|_ }} + {{ 'reconcile_this_account'|_ }} {% else %} - {{ 'reconcile_this_account'|_ }} + {{ 'reconcile_this_account'|_ }} {% endif %} {% endif %}
diff --git a/resources/views/list/piggy-bank-events.twig b/resources/views/list/piggy-bank-events.twig index 89b20f1710..43c815b54a 100644 --- a/resources/views/list/piggy-bank-events.twig +++ b/resources/views/list/piggy-bank-events.twig @@ -1,7 +1,7 @@ {% if showPiggyBank %} - + {% endif %} diff --git a/resources/views/partials/menu-sidebar.twig b/resources/views/partials/menu-sidebar.twig index b73ae95836..205a887c99 100644 --- a/resources/views/partials/menu-sidebar.twig +++ b/resources/views/partials/menu-sidebar.twig @@ -159,7 +159,8 @@ class="fa fa-gear fa-fw"> {{ 'preferences'|_ }}
  • - {{ 'currencies'|_ }} + {{ 'currencies'|_ }} +
  • {% if Auth.user.hasRole('owner') %} diff --git a/resources/views/partials/transaction-row.twig b/resources/views/partials/transaction-row.twig index e969a07888..2b54a0bad0 100644 --- a/resources/views/partials/transaction-row.twig +++ b/resources/views/partials/transaction-row.twig @@ -1,11 +1,11 @@ - {# input buttons #} diff --git a/resources/views/reports/partials/exp-budgets.twig b/resources/views/reports/partials/exp-budgets.twig index 992570d1dc..d1cc577e1d 100644 --- a/resources/views/reports/partials/exp-budgets.twig +++ b/resources/views/reports/partials/exp-budgets.twig @@ -1,7 +1,7 @@
    {{ trans('list.piggy_bank') }}{{ trans('list.piggy_bank') }}{{ trans('list.date') }} {{ trans('list.amount') }}
    {{ line.getBill.name }} -
    +
    {{ trans('firefly.bill_expected_between', {start: line.getPayDate.formatLocalized(monthAndDayFormat), end: line.getEndOfPayDate.formatLocalized(monthAndDayFormat) }) }}
    - + @@ -20,7 +20,7 @@ {{ '0'|formatAmount }} {% else %} {% for expense in entry.spent.per_currency %} - {{ formatAmountBySymbol(expense.sum, expense.currency.symbol, expense.currency.dp) }}
    + {{ formatAmountBySymbol(expense.sum, expense.currency.symbol, expense.currency.dp) }}
    {% endfor %} {% endif %} diff --git a/resources/views/reports/partials/exp-categories.twig b/resources/views/reports/partials/exp-categories.twig index e700cf4268..1ff99b927d 100644 --- a/resources/views/reports/partials/exp-categories.twig +++ b/resources/views/reports/partials/exp-categories.twig @@ -1,7 +1,7 @@
    {{ 'category'|_ }}{{ 'category'|_ }} {{ 'spent'|_ }}
    - + @@ -22,7 +22,7 @@ {{ '0'|formatAmount }} {% else %} {% for expense in entry.spent.per_currency %} - {{ formatAmountBySymbol(expense.sum, expense.currency.symbol, expense.currency.dp) }}
    + {{ formatAmountBySymbol(expense.sum, expense.currency.symbol, expense.currency.dp) }}
    {% endfor %} {% endif %} @@ -31,7 +31,7 @@ {{ '0'|formatAmount }} {% else %} {% for income in entry.earned.per_currency %} - {{ formatAmountBySymbol(income.sum, income.currency.symbol, income.currency.dp) }}
    + {{ formatAmountBySymbol(income.sum, income.currency.symbol, income.currency.dp) }}
    {% endfor %} {% endif %} diff --git a/resources/views/reports/partials/exp-not-grouped.twig b/resources/views/reports/partials/exp-not-grouped.twig index 85a5a667c8..ab4250937c 100644 --- a/resources/views/reports/partials/exp-not-grouped.twig +++ b/resources/views/reports/partials/exp-not-grouped.twig @@ -1,4 +1,3 @@ -
    {{ 'category'|_ }}{{ 'category'|_ }} {{ 'spent'|_ }} {{ 'earned'|_ }}
    @@ -12,19 +11,19 @@ diff --git a/resources/views/reports/partials/top-transactions.twig b/resources/views/reports/partials/top-transactions.twig index e068286fd1..67e9c080a2 100644 --- a/resources/views/reports/partials/top-transactions.twig +++ b/resources/views/reports/partials/top-transactions.twig @@ -17,7 +17,8 @@ - + {% endfor %} diff --git a/resources/views/rules/index.twig b/resources/views/rules/index.twig index 3a8f16d1ce..58a749477f 100644 --- a/resources/views/rules/index.twig +++ b/resources/views/rules/index.twig @@ -107,7 +107,9 @@
    {{ name }} - {% if amounts.spent.per_currency|length == 0%} + {% if amounts.spent.per_currency|length == 0 %} {{ '0'|formatAmount }} {% endif %} {% for expense in amounts.spent.per_currency %} - {{ formatAmountBySymbol(expense.sum, expense.currency.symbol, expense.currency.dp) }}
    + {{ formatAmountBySymbol(expense.sum, expense.currency.symbol, expense.currency.dp) }}
    {% endfor %}
    - {% if amounts.earned.per_currency|length == 0%} + {% if amounts.earned.per_currency|length == 0 %} {{ '0'|formatAmount }} {% endif %} {% for income in amounts.earned.per_currency %} - {{ formatAmountBySymbol(income.sum, income.currency.symbol, income.currency.dp) }}
    + {{ formatAmountBySymbol(income.sum, income.currency.symbol, income.currency.dp) }}
    {% endfor %}
    {{ transaction.date.formatLocalized(monthAndDayFormat) }} {{ transaction|transactionAmount }}{{ transaction|transactionAmount }}
    {# show which transactions would match #} - + {# actually execute rule #} {% endblock %} {% block styles %} - + {% endblock %} diff --git a/resources/views/tags/edit.twig b/resources/views/tags/edit.twig index 5eed6ff416..41d032f2d6 100644 --- a/resources/views/tags/edit.twig +++ b/resources/views/tags/edit.twig @@ -95,7 +95,7 @@ {% endblock %} {% block styles %} - + {% endblock %} diff --git a/resources/views/tags/index.twig b/resources/views/tags/index.twig index 08d8c4156e..e611b43801 100644 --- a/resources/views/tags/index.twig +++ b/resources/views/tags/index.twig @@ -10,25 +10,26 @@ {% else %} {% for period,entries in clouds %} {% if entries|length > 0 %} -
    -
    -
    -
    -

    - {% if period == 'no-date' %}{{ 'without_date'|_ }}{% else %}{{ period }}{% endif %} -

    -
    -
    -

    - {% for tagInfo in entries %} - {{ tagInfo.tag.tag }} - {% endfor %} -

    +
    +
    +
    +
    +

    + {% if period == 'no-date' %}{{ 'without_date'|_ }}{% else %}{{ period }}{% endif %} +

    +
    +
    +

    + {% for tagInfo in entries %} + {{ tagInfo.tag.tag }} + {% endfor %} +

    +
    -
    - {% endif %} + {% endif %} {% endfor %} {# diff --git a/resources/views/tags/show.twig b/resources/views/tags/show.twig index 3f5a81478d..c7820c6beb 100644 --- a/resources/views/tags/show.twig +++ b/resources/views/tags/show.twig @@ -29,22 +29,22 @@
    {% if tag.description %} - - - - + + + + {% endif %} {% if tag.date %} - - - - + + + + {% endif %} @@ -196,7 +196,7 @@ {% endblock %} {% block styles %} - + {% endblock %} {% block scripts %}
    - {{ trans('list.description') }} - {{ tag.description }}
    + {{ trans('list.description') }} + {{ tag.description }}
    - {{ trans('list.date') }} - - {{ tag.date.formatLocalized(monthAndDayFormat) }} -
    + {{ trans('list.date') }} + + {{ tag.date.formatLocalized(monthAndDayFormat) }} +
    {{ trans('list.sum') }}